BERT pequeño y rápido para ruso

BERT es una red neuronal capaz de comprender bastante bien el significado de los textos en el lenguaje humano. Aparecido por primera vez en 2018, este modelo revolucionó la lingüística computacional. La versión básica del modelo tarda mucho en prepararse previamente, leer millones de textos y dominar gradualmente el idioma, y ​​luego se puede entrenar más en su propio problema aplicado, por ejemplo, clasificando comentarios o resaltando nombres, títulos y direcciones. en el texto. La versión estándar de BERT es bastante grande: pesa más de 600 megabytes y procesa la oración en aproximadamente 120 milisegundos (en la CPU). En esta publicación propongo una versión reducida de BERT para ruso : 45 megabytes, 6 ms por oración. Ya hay un tinybert para inglés de Huawei , haymi diminutivo FastText , pero el pequeño (inglés) ruso BERT, al parecer, apareció por primera vez. ¿Pero qué tan bueno es él?





Destilación: el camino a lo pequeño

Para crear un pequeño BERT, decidí entrenar mi red neuronal usando modelos prefabricados como profesores. Lo explicaré con más detalle ahora.





En resumen, BERT funciona así: primero, el tokenizador divide el texto en tokens (piezas que varían en tamaño desde una letra hasta una palabra completa), se toman de ellos incrustaciones de la tabla y estas incrustaciones se actualizan varias veces usando el -mecanismo de atención para tener en cuenta el contexto (tokens vecinos). En el entrenamiento previo, el BERT clásico realiza dos tareas: adivina qué fichas de una oración fueron reemplazadas por una ficha especial [MASK]



y si dos oraciones se sucedieron en el texto. Como se mostró más adelante , la segunda tarea no es realmente necesaria. Pero se [CLS]



sigue utilizando la ficha que se coloca antes del comienzo del texto y cuya incrustación se utilizó para esta segunda tarea, y también hice una apuesta por ella.





La destilación es una forma de transferir conocimientos de un modelo a otro. Es más rápido que aprender el modelo solo a partir del texto. Por ejemplo, el texto [CLS] [MASK]



"correcta" la decisión - para poner en marcha el testigo de la máscara



, pero un gran modelo sabe fichas



,



,



en este contexto, también son relevantes, y este conocimiento es útil para enseñar pequeño modelo. Se puede transmitir haciendo que el modelo pequeño no solo prediga la alta probabilidad del token correcto



, sino que reproduzca la distribución de probabilidad completa de los posibles tokens enmascarados en el texto dado.





bert-multilingual (), , , , . 120 , , , 30. 768 312, – 12 3. bert-multilingual, – .





BERT , , . , : RuBERT (, ), LaBSE (, ), Laser (, ) USE (, ). , , [CLS]



, . translation ranking ( LaBSE). , , CLS-, – Laser. T5. , :





  • ( full word masks).





  • Translation ranking LaBSE: , . hard negatives, .





  • bert-base-multilingual-cased ( , .. ).





  • CLS- ( ) DeepPavlov/rubert-base-cased-sentence ( ).





  • CLS- ( ) CLS- LaBSE.





  • CLS- ( ) LASER.





  • CLS- ( ) USE.





  • T5 ( ) CLS-.





, , ablation study . Colab, learning rate . , , . - : ., OPUS-100 Tatoeba, 2.5 . , , . , rubert-tiny ( ), Huggingface.





?

Python transformers sentencepiece, . , 312- CLS- .





# pip install transformers sentencepiece
import torch
from transformers import AutoTokenizer, AutoModel
tokenizer = AutoTokenizer.from_pretrained("cointegrated/rubert-tiny")
model = AutoModel.from_pretrained("cointegrated/rubert-tiny")
# model.cuda()  # uncomment it if you have a GPU

def embed_bert_cls(text, model, tokenizer):
    t = tokenizer(text, padding=True, truncation=True, return_tensors='pt')
    with torch.no_grad():
        model_output = model(**{k: v.to(model.device) for k, v in t.items()})
    embeddings = model_output.last_hidden_state[:, 0, :]
    embeddings = torch.nn.functional.normalize(embeddings)
    return embeddings[0].cpu().numpy()

print(embed_bert_cls(' ', model, tokenizer).shape)
# (312,)
      
      



. () , . , Huggingface (, ).





? BERT', . - .









(CPU)





(GPU)









cointegrated/rubert-tiny





6





3





45





bert-base-multilingual-cased





125





8





680





DeepPavlov/rubert-base-cased-sentence





110





8





680





sentence-transformers/LaBSE





120





8





1.8





sberbank-ai/sbert_large_nlu_ru





420





16





1.6





Colab (Intel(R) Xeon(R) CPU @ 2.00GHz Tesla P100-PCIE) c 1. , GPU , .. .





, rubert-tiny CPU 20 , Heroku ( , , ). , . , - .





BERT – . – , . , feature extractors, – KNN.





RussianSuperGLUE, , , . RuSentEval, , , , - . . , . :





STS: ( ). , " " "- " 4 5 . . , LaBSE, 77%, – 65%, , 40 .





Paraphraser: , . : , , . 43% (, ).





XNLI: , . , " " " , ", . – . DeepPavlov ( ), .





SentiRuEval2016: . , , . , 5, .





OKMLCup: . ROC AUC, bert-base-cased-multilingual.





Inappropriateness: , . , 68% AUC ( , , 79%).





: , 18 68 . , . , . KNN ( ). LaBSE 75%, – 68%, DeepPavlov – 60%, – 58%, – 56%. .





: , , – . LaBSE, ( , ).





factRuEval-2016: (, , ). , F1 ( , ). , NER : 43%, – 67-69%.





RuDReC: . , : 58% 62-67%.





, NER, : CLS . , LS- , ( , ). . , , .





, LaBSE : 6 10 . LaBSE-en-ru, 99 , . 1.8 0.5 , , , . rubert-tiny DeepPavlov Sber, .





, . , , , , . BERT , : https://huggingface.co/cointegrated/rubert-tiny.





Hay mucho trabajo por delante: por un lado, quiero enseñar un pequeño BERT para resolver problemas de RussianSuperGLUE (y no solo), por otro lado, quiero arrastrar buenos modelos pequeños para la generación controlada de texto al ruso ( Ya comencé a hacer esto para T5). Por lo tanto, como esta publicación, suscríbase a mi canal sobre PNL , agregue problemas interesantes en los comentarios y en PM, y si tiene la oportunidad de probar rubert-tiny, ¡asegúrese de dejar comentarios!

Yo mismo me pregunto qué pasará a continuación.








All Articles