Cómo comprimir el modelo de texto rápido 100 veces

El modelo fastText es una de las representaciones vectoriales de palabras más efectivas para el idioma ruso. Sin embargo, su uso práctico sufre debido al impresionante tamaño (varios gigabytes) del modelo. En este artículo, mostramos cómo puede reducir el modelo fastText de 2.7 gigabytes a 28 megabytes sin perder demasiado en su calidad (3-4%). Spoiler: la cuantización y la selección de características funcionan bien, pero las expansiones de matriz no. También publicamos un paquete de Python para esta compresión y ejemplos de un modelo compacto para palabras rusas.



Por qué y de qué se trata


, 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