BERT kecil dan cepat untuk bahasa Rusia

BERT adalah jaringan saraf yang mampu memahami makna teks dalam bahasa manusia dengan cukup baik. Pertama kali muncul pada tahun 2018, model ini merevolusi linguistik komputasi. Versi dasar model membutuhkan waktu lama untuk dilatih terlebih dahulu, membaca jutaan teks dan secara bertahap menguasai bahasa, dan kemudian dapat dilatih lebih lanjut tentang masalah yang Anda terapkan, misalnya, mengklasifikasikan komentar atau menyoroti nama, judul, dan alamat dalam teks. Versi standar BERT cukup besar: beratnya lebih dari 600 megabyte, dan memproses kalimat dalam waktu sekitar 120 milidetik (pada CPU). Dalam posting ini saya mengusulkan versi BERT yang diperkecil untuk bahasa Rusia - 45 megabyte, 6 ms per kalimat. Sudah ada tinybert untuk bahasa Inggris dari Huawei , adaFastText saya kecil , tetapi BERT Rusia (Inggris-) kecil, tampaknya, muncul untuk pertama kalinya. Tapi seberapa baik dia?





Distilasi - cara untuk kecil

Untuk membuat BERT kecil, saya memutuskan untuk melatih jaringan saraf saya menggunakan model yang sudah jadi sebagai guru. Saya akan menjelaskan lebih detail sekarang.





Singkatnya, BERT bekerja seperti ini: pertama, tokenizer membagi teks menjadi token (potongan dengan ukuran mulai dari satu huruf hingga satu kata), embeddings dari tabel diambil dari mereka, dan embeddings ini diperbarui beberapa kali menggunakan self -mekanisme perhatian untuk memperhitungkan konteks (token tetangga). Dalam pra-pelatihan, BERT klasik melakukan dua tugas: menebak token mana dalam kalimat yang diganti dengan token khusus [MASK]



, dan apakah dua kalimat saling mengikuti dalam teks. Seperti yang ditunjukkan kemudian , tugas kedua tidak terlalu diperlukan. Tetapi token [CLS]



yang ditempatkan sebelum awal teks dan penyematan yang digunakan untuk tugas kedua ini terus digunakan, dan saya juga bertaruh untuk itu.





Distilasi adalah cara mentransfer pengetahuan dari satu model ke model lainnya. Ini lebih cepat daripada mempelajari model dari teks saja. Misalnya, teks [CLS] [MASK]



"benar" keputusan - untuk menempatkan token topeng



, tetapi model yang hebat tahu token



,



,



dalam konteks ini juga relevan, dan pengetahuan ini berguna untuk mengajar model kecil. Hal ini dapat disampaikan dengan membuat model kecil tidak hanya memprediksi probabilitas tinggi dari token yang benar



, tetapi mereproduksi seluruh distribusi probabilitas dari kemungkinan token bertopeng dalam teks yang diberikan.





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.





Ada banyak pekerjaan di depan: di satu sisi, saya ingin mengajar BERT kecil untuk menyelesaikan masalah dari RussianSuperGLUE (dan tidak hanya), di sisi lain, saya ingin menyeret model kecil yang bagus untuk pembuatan teks terkontrol ke dalam bahasa Rusia ( Saya sudah mulai melakukan ini untuk T5). Karena itu, sukai posting ini, berlangganan saluran saya tentang NLP , tambahkan masalah menarik di komentar dan di PM, dan jika Anda memiliki kesempatan untuk mencoba rubert-tiny, pastikan untuk meninggalkan umpan balik!

Saya sendiri bertanya-tanya apa yang akan terjadi selanjutnya.








All Articles