So komprimieren Sie das fastText-Modell 100 Mal

Das fastText-Modell ist eine der effektivsten Vektordarstellungen von Wörtern für die russische Sprache. Die praktische Anwendung leidet jedoch unter der beeindruckenden Größe des Modells (mehrere Gigabyte). In diesem Artikel zeigen wir, wie Sie das fastText-Modell von 2,7 Gigabyte auf 28 Megabyte reduzieren können, ohne zu viel an Qualität zu verlieren (3-4%). Spoiler: Quantisierung und Merkmalsauswahl funktionieren gut, Matrixerweiterungen jedoch nicht. Wir veröffentlichen auch ein Python- Paket für diese Komprimierung und Beispiele für ein kompaktes Modell für russische Wörter.



Warum und worum geht es?


, fastText: fastText , . unsupervised — n-. navec — glove- . .


: ? , — , , (, 300-), - . , ( ). , , , , , . , , (, ) . , , "" .


— , ELMO BERT. , fastText. fastText' — ( , ) n- ( ) . , , , , . fastText , n- .


fastText Facebook AI Research. :


def embed(word, model):
    if word in model.vocab:
        #       
        # return model.vectors[word]
        result = model.vectors_vocab[word]
    else:
        result = zeros()
    n = 1
    for ngram in get_ngrams(word, model.min_n, model.max_n):
        result += model.vectors_ngrams[hash(ngram)]
        n += 1
    return result / n

: — "" ( ), n-. , , , — - , , , n-. , , , , .


fastText : fastText ( Python ), Gensim ( Python). , Gensim.


, Gensim , . model.vectors_vocab model.vectors_ngrams model.vectors, "" , n-. model.vectors_vocab , model.vectors_ngrams .



FastText ( ) . : , n-, . n- , , fastText hashing trick: , n-, n-. , ( , ), . , ruscorpora_none_fasttextskipgram_300_2_2019 RusVectores 2 , 330 .


, — n- — fastText . 2 500 , . " + n- ", ; . , , . " ", . 16 2 , 94% , n-, ( gensim).


, fastText, — " " , ( , ) . "" n- . (, , self-supervized) .


, . fasttext — 300. (SVD), n*300 n*k k*300. k — . ( , , ), , ( 300 — ).


— "" , . 32- . 16-, , . float' Python , , . 8 256 . , 256 , , . ( ) , .


, 300 32- 300 8- . ? , , — ! , 300- 100 3- , 3- . , , 3- , 3- . product quantization, . , navec , glove- , 25 50 . , fasttext . - .



. ruscorpora_none_fasttextskipgram_300_2_2019 c 300- , 165K 2000K n- (n 3 5), . " " 2.7 . gensim, ( gensim==3.8.1). , n- ( , ).


: , adjust_vectors, n-. , . ruscorpora_none_fasttextskipgram_300_2_2019 gensim, - , adjust_vectors . : intrinsic evalution ( ) . . , , , , gensim. : , , .


, sys.getsizeof ( , numpy-), numpy.ndarray.nbytes ( , ), gc.get_referents "" . , ( save gensim, , , pickle) , , , .


, , . 80 , ( 10 ) . pymorphy2, , ; . , 54 fastText, 26 — . .


, . intrinsic evaluation: , . , : , , NER, .. , .. . .


intrinsic : hj, ae rt RUSSE, simlex965 ( sl) — RusVectores ( ). hj sl , . ae rt , 2*ROC_AUC-1, ROC AUC . , ae rt precision, . .



: vectors_vocab ( , ), vectors vectors_ngrams 32 16 . , 2.7 1.28 . , . n- (1.14 ) (136 ).


: TruncatedSVD scikit-learn. : 8% . .


, , . navec, ( ). : ( float int) 99.6% . , 96%. . : , , (!) , 256 . 12 ( 25 ), 94 , 75%. .


— n-, .. . , . , 128 (x10, 16- ) 95%, 25 — 82%. , .


n- ? . , . : - , n- ( ), . ( ) , "" 450 ( ). 45- 93.6% .


, : , fastText-, " " . (20 , 100 n-, 100- ), 28 ( 100 !), 96.15% . . , 36 .


. — , — . , : . , , , n-.



, "" : - .


( 36 15 -, ). , , .



!


RAM 80 . ?


, , . . , , n- . , (.. n-) , . , , , , , n- — , .



, , . .



, 80 . : . , , , — n-, , . .



, intrinsic evaluation. , . — n-. , OOV , -.



, intrinsic evaluation . , , . , , , intrinsic evaluation .



, , .



Fasttext — , , -, , . — — 100 , . 96% , 3% .


PyPI. 13, 28, 51 180- — ruscorpora_none_fasttextskipgram_300_2_2019 RusVectores.


. , -, ODS.


All Articles