BERT petit et rapide pour le russe

BERT est un réseau de neurones capable de comprendre assez bien le sens des textes en langage humain. Apparu pour la première fois en 2018, ce modèle a révolutionné la linguistique informatique. La version de base du modèle prend beaucoup de temps à pré-former, à lire des millions de textes et à maîtriser progressivement la langue, puis elle peut être davantage entraînée sur votre propre problème appliqué, par exemple, classer des commentaires ou mettre en évidence des noms, des titres et des adresses. dans le texte. La version standard de BERT est assez volumineuse : elle pèse plus de 600 mégaoctets, et traite la phrase en 120 millisecondes environ (sur le CPU). Dans cet article, je propose une version réduite de BERT pour le russe - 45 mégaoctets, 6 ms par phrase. Il y a déjà un tinybert pour l'anglais de Huawei , il y amon diminutif FastText , mais le petit BERT (anglais-) russe, semble-t-il, est apparu pour la première fois. Mais à quel point est-il bon ?





Distillation - la voie du petit

Pour créer un petit BERT, j'ai décidé de former mon réseau de neurones en utilisant des modèles prêts à l'emploi en tant qu'enseignants. Je vais vous expliquer plus en détail maintenant.





En bref, BERT fonctionne comme ceci : tout d'abord, le tokenizer divise le texte en jetons (pièces dont la taille varie d'une lettre à un mot entier), les incrustations de la table en sont extraites, et ces incrustations sont mises à jour plusieurs fois à l'aide du self. -mécanisme d'attention pour prendre en compte le contexte (tokens voisins). En pré-formation, le BERT classique effectue deux tâches : il devine quels jetons d'une phrase ont été remplacés par un jeton spécial [MASK]



et si deux phrases se suivent dans le texte. Comme il a été montré plus tard , la deuxième tâche n'est pas vraiment nécessaire. Mais le jeton [CLS]



qui est placé avant le début du texte et dont l'encastrement a été utilisé pour cette deuxième tâche continue d'être utilisé, et j'ai aussi fait un pari dessus.





La distillation est un moyen de transférer des connaissances d'un modèle à un autre. C'est plus rapide que d'apprendre le modèle à partir de texte uniquement. Par exemple, le texte [CLS] [MASK]



"bonne" décision - mettre en place le jeton de masque



, mais un grand modèle sait que les jetons



,



,



dans ce contexte aussi, sont pertinents, et cette connaissance est utile pour enseigner le petit modèle. Cela peut être véhiculé en faisant en sorte que le petit modèle non seulement prédise la forte probabilité du jeton correct



, mais reproduise toute la distribution de probabilité des jetons masqués possibles dans le texte donné.





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.





Il y a beaucoup de travail à faire : d'une part, je veux apprendre à un petit BERT à résoudre des problèmes de RussianSuperGLUE (et pas seulement), d'autre part, je veux faire glisser de bons petits modèles pour une génération de texte contrôlée en russe ( J'ai déjà commencé à le faire pour T5). Par conséquent, aimez ce post, abonnez-vous à ma chaîne sur la PNL , ajoutez des problèmes intéressants dans les commentaires et en MP, et si vous avez la chance d'essayer rubert-tiny, alors assurez-vous de laisser des commentaires !

Je me demande moi-mĂŞme ce qui va se passer ensuite.








All Articles