Sekarang, pra-pelatihan model bahasa untuk pemahaman bahasa adalah langkah yang signifikan dalam konteks NLP.
Model bahasa akan dilatih pada korpus besar, dan kemudian kita dapat menggunakannya sebagai komponen dalam model lain yang perlu menangani bahasa (misalnya menggunakannya untuk tugas hilir).
Model Lanugage (LM) menangkap distribusi atas semua kalimat yang mungkin .
Sementara pemodelan bahasa adalah pembelajaran tanpa pengawasan yang khas pada korpus besar -besaran, kami mengubah ini menjadi urutan pembelajaran yang diawasi dalam repo ini.
Model bahasa autoregresif menangkap distribusi pada token berikutnya didasarkan pada semua token sebelumnya. Dengan kata lain, itu terlihat pada token sebelumnya, dan memprediksi token berikutnya.
Tujuan model bahasa autoregresif diekspresikan dalam formula sebagai berikut:
Karena model bahasa autoregresif harus maju atau mundur, hanya informasi konteks uni-directional satu arah yang dapat digunakan. Oleh karena itu, sulit untuk memahami konteks di kedua arah secara bersamaan.
RNNLM, Elmo adalah contoh khas dari model bahasa autoregresif, dan model bahasa LSTM searah/dua arah dicakup dalam repo ini.
Wikipedia secara teratur mendistribusikan seluruh dokumen. Anda dapat mengunduh dump wikipedia Korea di sini (dan dump wikipedia Inggris di sini). Wikipedia merekomendasikan penggunaan pages-articles.xml.bz2 , yang hanya mencakup versi terbaru dari seluruh dokumen, dan sekitar 600 MB terkompresi (untuk bahasa Inggris, pages-articles-multistream.xml.bz2 ).
Anda dapat menggunakan skrip wikipedia_ko.sh untuk mengunduh dump pada dokumen wikipedia Korea terbaru. Untuk bahasa Inggris, gunakan wikipedia_en.sh
contoh:
$ cd build_corpus
$ chmod 777 wikipedia_ko.sh
$ ./wikipedia_ko.sh
Dump yang diunduh menggunakan skrip shell di atas dalam format XML, dan kita perlu parse XML ke file teks. Skrip python WikiExtractor.py di attardi/wikiextractor repo, mengekstrak dan membersihkan teks dari dump.
contoh:
$ git clone https://github.com/attardi/wikiextractor
$ python wikiextractor/WikiExtractor.py kowiki-latest-pages-articles.xml
$ head -n 4 text/AA/wiki_02
<doc id="577" url="https://ko.wikipedia.org/wiki?curid=577" title="천문학">
천문학
천문학(天文學, )은 별이나 행성, 혜성, 은하와 같은 천체와, 지구 대기의 ..
</doc>
Teks yang diekstraksi disimpan sebagai file teks dengan ukuran tertentu. Untuk menggabungkan ini, gunakan build_corpus.py . Output corpus.txt berisi 4.277.241 kalimat, 55.568.030 kata .
contoh:
$ python build_corpus.py > corpus.txt
$ wc corpus.txt
4277241 55568030 596460787 corpus.txt
Sekarang, Anda perlu membagi korpus untuk set kereta dan test-set.
$ cat corpus.txt | shuf > corpus.shuf.txt
$ head -n 855448 corpus.shuf.txt > corpus.test.txt
$ tail -n 3421793 corpus.shuf.txt > corpus.train.txt
$ wc -l corpus.train.txt corpus.test.txt
3421793 corpus.train.txt
855448 corpus.test.txt
4277241 합계
Corpus corpus.txt kami memiliki 55.568.030 kata, dan 608.221 kata unik. Jika frekuensi minimum yang diperlukan untuk memasukkan token dalam kosakata diatur ke 3, kosakata berisi 297.773 kata unik.
Di sini kami menggunakan kereta corpus corpus.train.txt untuk membangun kosa kata. Kosakata yang dibangun oleh Corpus kereta berisi 557.627 kata unik, dan 271.503 kata unik yang muncul setidaknya tiga kali.
contoh:
$ python build_vocab.py --corpus build_corpus/corpus.train.txt --vocab vocab.train.pkl --min_freq 3 --lower
Namespace(bos_token='<bos>', corpus='build_corpus/corpus.train.txt', eos_token='<eos>', is_tokenized=False, lower=True, min_freq=3, pad_token='<pad>', tokenizer='mecab', unk_token='<unk>', vocab='vocab.train.pkl')
Vocabulary size: 271503
Vocabulary saved to vocab.train.pkl
Karena file kosa kata terlalu besar (~ 1.3GB) untuk mengunggah repo ini, saya mengunggahnya ke Google Drive.
vocab.train.pkl : [unduh] $ python lm_trainer.py -h
usage: lm_trainer.py [-h] --train_corpus TRAIN_CORPUS --vocab VOCAB
--model_type MODEL_TYPE [--test_corpus TEST_CORPUS]
[--is_tokenized] [--tokenizer TOKENIZER]
[--max_seq_len MAX_SEQ_LEN] [--multi_gpu] [--cuda CUDA]
[--epochs EPOCHS] [--batch_size BATCH_SIZE]
[--clip_value CLIP_VALUE] [--shuffle SHUFFLE]
[--embedding_size EMBEDDING_SIZE]
[--hidden_size HIDDEN_SIZE] [--n_layers N_LAYERS]
[--dropout_p DROPOUT_P]
optional arguments:
-h, --help show this help message and exit
--train_corpus TRAIN_CORPUS
--vocab VOCAB
--model_type MODEL_TYPE
Model type selected in the list: LSTM, BiLSTM
--test_corpus TEST_CORPUS
--is_tokenized Whether the corpus is already tokenized
--tokenizer TOKENIZER
Tokenizer used for input corpus tokenization
--max_seq_len MAX_SEQ_LEN
The maximum total input sequence length after
tokenization
--multi_gpu Whether to training with multiple GPU
--cuda CUDA Whether CUDA is currently available
--epochs EPOCHS Total number of training epochs to perform
--batch_size BATCH_SIZE
Batch size for training
--clip_value CLIP_VALUE
Maximum allowed value of the gradients. The gradients
are clipped in the range
--shuffle SHUFFLE Whether to reshuffle at every epoch
--embedding_size EMBEDDING_SIZE
Word embedding vector dimension
--hidden_size HIDDEN_SIZE
Hidden size of LSTM
--n_layers N_LAYERS Number of layers in LSTM
--dropout_p DROPOUT_P
Dropout rate used for dropout layer in LSTM
contoh:
$ python lm_trainer.py --train_corpus build_corpus/corpus.train.txt --vocab vocab.train.pkl --model_type LSTM --batch_size 16
Anda dapat memilih nilai parameter Anda sendiri melalui input argumen.
Melatih model dengan GPU tunggal tidak hanya sangat lambat, tetapi juga membatasi penyesuaian ukuran batch, ukuran model, dan sebagainya. Untuk mempercepat pelatihan model dengan beberapa GPU dan menggunakan model besar, yang harus Anda lakukan adalah memasukkan --multi_gpu flag seperti Belows. Untuk detail lebih lanjut, silakan periksa di sini.
Contoh kode ini melatih model LSTM searah pada wikipedia corpus menggunakan pelatihan paralel pada 8 * V100 GPU.
$ python lm_trainer.py --train_corpus build_corpus/corpus.train.txt --vocab vocab.train.pkl --model_type LSTM --multi_gpu
Namespace(batch_size=512, clip_value=10, cuda=True, dropout_p=0.2, embedding_size=256, epochs=10, hidden_size=1024, is_tokenized=False, max_seq_len=32, model_type='LSTM', multi_gpu=True, n_layers=3, shuffle=True, test_corpus=None, tokenizer='mecab', train_corpus='build_corpus/corpus.train.txt', vocab='vocab.train.pkl')
=========MODEL=========
DataParallelModel(
(module): LSTMLM(
(embedding): Embedding(271503, 256)
(lstm): LSTM(256, 1024, num_layers=3, batch_first=True, dropout=0.2)
(fc): Linear(in_features=1024, out_features=512, bias=True)
(fc2): Linear(in_features=512, out_features=271503, bias=True)
(softmax): LogSoftmax()
)
)
Contoh kode ini melatih model dua arah-LSTM pada wikipedia corpus menggunakan pelatihan paralel pada 8 * V100 GPU.
$ python lm_trainer.py --train_corpus build_corpus/corpus.train.txt --vocab vocab.train.pkl --model_type BiLSTM --n_layers 1 --multi_gpu
Namespace(batch_size=512, clip_value=10, cuda=True, dropout_p=0.2, embedding_size=256, epochs=10, hidden_size=1024, is_tokenized=False, max_seq_len=32, model_type='BiLSTM', multi_gpu=True, n_layers=1, shuffle=True, test_corpus=None, tokenizer='mecab', train_corpus='build_corpus/corpus.train.txt', vocab='vocab.train.pkl')
=========MODEL=========
DataParallelModel(
(module): BiLSTMLM(
(embedding): Embedding(271503, 256)
(lstm): LSTM(256, 1024, batch_first=True, dropout=0.2, bidirectional=True)
(fc): Linear(in_features=2048, out_features=1024, bias=True)
(fc2): Linear(in_features=1024, out_features=512, bias=True)
(fc3): Linear(in_features=512, out_features=271503, bias=True)
(softmax): LogSoftmax()
)
)
Model bahasa menangkap distribusi atas semua kalimat yang mungkin. Dan, model bahasa terbaik adalah model yang terbaik memprediksi kalimat yang tidak terlihat. Perplexty adalah pengukuran yang sangat umum tentang seberapa baik distribusi probabilitas memprediksi kalimat yang tidak terlihat.
Perplexity : Probabilitas terbalik dari kalimat yang diberikan, dinormalisasi dengan jumlah kata (dengan mengambil rata -rata geometris)
Seperti yang dapat Anda lihat dari persamaan di atas, kebingungan didefinisikan sebagai likelihood rata-rata rata-rata negatif yang dieksponensial. Dengan kata lain, memaksimalkan probabilitas sama dengan meminimalkan kebingungan.
Dan sekarang, kebingungan adalah metrik yang akan kita gunakan. Kebingungan rendah menunjukkan bahwa distribusi probabilitas baik dalam memprediksi kalimat.
| Model | Kehilangan | Kebingungan |
|---|---|---|
| LSTM searah | 3.496 | 33.037 |
| BIDIRECTIONAL-LSTM | 1.896 | 6.669 |
| BIDIRECTIONAL-LSTM-LARGE ( HIDDEN_SIZE = 1024) | 1.771 | 5.887 |