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,)
? BERT', . - .
|
|
(CPU) |
(GPU) |
|
|
|
6 |
3 |
45 |
|
|
125 |
8 |
680 |
DeepPavlov/rubert-base-cased-sentence |
110 |
8 |
680 |
|
|
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 を試す機会があれば、必ずフィードバックを残してください!
私自身、この先どうなるのか気になります。