ロシア語用の小さくて高速な BERT

BERTは、人間の言語のテキストの意味を十分に理解できるニューラル ネットワークです。 2018 年に初めて登場したこのモデルは、計算言語学に革命をもたらしました。モデルの基本バージョンは、何百万ものテキストを読んで徐々に言語を習得し、事前トレーニングに長い時間がかかります。その後、コメントの分類や名前、タイトル、住所の強調表示など、独自の適用問題についてさらにトレーニングできます。テキストで。 BERT の標準バージョンは非常に大きく、600 メガバイトを超える重量があり、約 120 ミリ秒 (CPU 上) で文を処理します。この投稿では、ロシア語用の BERT の縮小版 ( 45 メガバイト、1 文あたり 6 ミリ秒)を提案しますHuawei からの英語用tinybertがすでにあります。私の FastText は小さいですが、小さな (英語から) ロシア語の BERT が初めて現れたようです。しかし、彼はどれほど良いのでしょうか。





蒸留 - 少量への道

小さな BERT を作成するために、教師として既製のモデルを使用してニューラル ネットワークをトレーニングすることにしました。これから詳しく説明します。





つまり、BERT は次のように機能します。最初に、トークナイザーはテキストをトークン (1 文字から単語全体のサイズの断片) に分割し、テーブルからの埋め込みをそれらから取得し、これらの埋め込みは自己を使用して数回更新されます。 - コンテキスト (隣接するトークン) を考慮に入れるための注意メカニズム。事前トレーニングでは、古典的な BERT は 2 つのタスクを実行します。文内のどのトークンが特別なトークンに置き換えられた[MASK]



か、および 2 つの文がテキスト内で互いに続いているかどうかを推測します。それは次のように後に示された、2番目のタスクは本当に必要ありません。しかし、[CLS]



この 2 番目のタスクで使用された、テキストの先頭に置かれ、その埋め込みに使用されたトークンは引き続き使用され、私もそれに賭けました。





蒸留は、知識をあるモデルから別のモデルに移す方法です。テキストのみからモデルを学習するよりも高速です。たとえば、[CLS] [MASK]



「正しい」決定 - to put in place the mask tokenというテキストです



が、優れたモデルはトークン











このコンテキストでも関連性があり、この知識は小さなモデルを教えるのに役立ちます。これは、小さなモデルで正しいトークンの高い確率を予測するだけでなく



、指定されたテキスト内のマスクされたトークンの確率分布全体を再現することによって伝達できます。





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.





多くの作業が待っています: 一方で、私は小さな BERT に、RussianSuperGLUE (だけでなく) の問題を解決するよう教えたいと思います。私はすでにT5のためにこれを始めています)。したがって、この投稿のように、NLP に関する私のチャンネルを購読しコメントや PM に興味深い問題を追加してください。rubert-tiny を試す機会があれば、必ずフィードバックを残してください!

私自身、この先どうなるのか気になります。








All Articles