الآن ، يعد التدريب المسبق لنموذج اللغة لفهم اللغة خطوة مهمة في سياق NLP.
سيتم تدريب نموذج اللغة على مجموعة ضخمة ، وبعد ذلك يمكننا استخدامه كمكون في نماذج أخرى تحتاج إلى التعامل مع اللغة (على سبيل المثال استخدامها للمهام المصب).
يلتقط نموذج Lanugage (LM) التوزيع على جميع الجمل الممكنة .
على الرغم من أن نمذجة اللغة هي تعلم غير خاضع للإشراف على مجموعة ضخمة ، إلا أننا نحول هذا إلى سلسلة من التعلم الخاضع للإشراف في هذا الريبو.
يلتقط نموذج اللغة التلقائية للانحدار التوزيع على الرمز المميز التالي على كل الرمز المميز السابق. بمعنى آخر ، ينظر إلى الرمز المميز السابق ، ويتوقع الرمز المميز التالي.
يتم التعبير عن الهدف من نموذج اللغة التلقائية في صيغة على النحو التالي:
نظرًا لأن نموذج اللغة التلقائية يجب أن يكون إلى الأمام أو للخلف ، يمكن استخدام معلومات السياق أحادي الاتجاه في اتجاه واحد فقط. لذلك ، من الصعب فهم السياق في كلا الاتجاهين في وقت واحد.
RNNLM ، ELMO هي مثال نموذجي لنموذج اللغة التلقائية ، ونماذج لغة LSTM أحادية الاتجاه/ثنائية الاتجاه تتم تغطية في هذا الريبو.
ويكيبيديا توزع بانتظام الوثيقة بأكملها. يمكنك تنزيل Dump Wikipedia الكورية هنا (و Dump English Wikipedia هنا). توصي Wikipedia باستخدام pages-articles.xml.bz2 ، والذي يتضمن فقط أحدث إصدار من المستند بأكمله ، ويبلغ حوالي 600 ميغابايت مضغوطًا (للغة الإنجليزية ، pages-articles-multistream.xml.bz2 ).
يمكنك استخدام برنامج wikipedia_ko.sh لتنزيل Dump على أحدث وثيقة Wikipedia الكورية. للغة الإنجليزية ، استخدم wikipedia_en.sh
مثال:
$ cd build_corpus
$ chmod 777 wikipedia_ko.sh
$ ./wikipedia_ko.sh
التفريغ الذي تم تنزيله باستخدام برنامج SHELL SHELL بتنسيق XML ، ونحن بحاجة إلى تحليل XML إلى ملف نصي. The Python Script WikiExtractor.py في attardi/wikiextractor repo ، يستخرج وينظف النص من التفريغ.
مثال:
$ 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>
يتم حفظ النص المستخرج كملف نصي بحجم معين. لدمج هذه ، استخدم build_corpus.py . يحتوي corpus.txt على 4،277،241 جمل ، 55،568،030 كلمة .
مثال:
$ python build_corpus.py > corpus.txt
$ wc corpus.txt
4277241 55568030 596460787 corpus.txt
الآن ، تحتاج إلى تقسيم المجموعة لتدريب مجموعة واختبار.
$ 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 55،568،030 كلمة ، و 608،221 كلمة فريدة. إذا تم تعيين الحد الأدنى للترددات اللازمة لتضمين رمز في المفردات على 3 ، فإن المفردات تحتوي على 297،773 كلمة فريدة.
هنا نستخدم قطار كوربوس corpus.train.txt لبناء المفردات. تحتوي المفردات التي تم بناؤها بواسطة Train Corpus على 557،627 كلمة فريدة ، و 271،503 كلمة فريدة تظهر ثلاث مرات على الأقل.
مثال:
$ 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
نظرًا لأن ملف المفردات كبير جدًا (~ 1.3 جيجا بايت) لا يمكن تحميله على هذا الريبو ، قمت بتحميله إلى Google Drive.
vocab.train.pkl : [تنزيل] $ 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
مثال:
$ python lm_trainer.py --train_corpus build_corpus/corpus.train.txt --vocab vocab.train.pkl --model_type LSTM --batch_size 16
يمكنك تحديد قيم المعلمات الخاصة بك عبر مدخلات الوسيطة.
إن تدريب نموذج مع وحدة معالجة الرسومات المفردة ليس بطيئًا جدًا فحسب ، بل يحد أيضًا من ضبط حجم الدُفعة وحجم النموذج وما إلى ذلك. لتسريع التدريب النموذجي مع GPU متعددة واستخدام نموذج كبير ، فإن ما عليك فعله هو تضمين -علامة --multi_gpu مثل Belows. لمزيد من التفاصيل ، يرجى التحقق هنا.
يدرب رمز المثال هذا نموذج LSTM أحادي الاتجاه على مجموعة ويكيبيديا باستخدام التدريب الموازي على 8 * V100 وحدات معالجة الرسومات.
$ 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()
)
)
يدرب رمز المثال هذا نموذج LSTM ثنائي الاتجاه على مجموعة ويكيبيديا باستخدام التدريب الموازي على 8 * V100 وحدات معالجة الرسومات.
$ 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()
)
)
يلتقط نموذج اللغة التوزيع على جميع الجمل الممكنة. وأفضل نموذج لغة هو أفضل ما يتنبأ به جملة غير مرئية. يمثل Perplexty قياسًا شائعًا جدًا لمدى جودة توزيع الاحتمال على جمل غير مرئية.
الحيرة : الاحتمال العكسي للجملة المعطاة ، تطبيعها بعدد الكلمات (عن طريق أخذ يعني الهندسة)
كما ترون من المعادلة أعلاه ، يتم تعريف الحيرة على أنها متوسط احتمالية السجل السلبي السلبي. بمعنى آخر ، تعظيم الاحتمال هو نفس الحد من الحيرة.
والآن ، الحيرة هي المقياس الذي سنستخدمه. يشير الحيرة المنخفضة إلى أن توزيع الاحتمال جيد في التنبؤ بالجملة.
| نموذج | خسارة | الحيرة |
|---|---|---|
| أحادي الاتجاه LSTM | 3.496 | 33.037 |
| ثنائية الاتجاه LSTM | 1.896 | 6.669 |
| ثنائي الاتجاه LSTM-LARGE ( HIDDEN_SIZE = 1024) | 1.771 | 5.887 |