ตอนนี้การฝึกอบรมแบบจำลองภาษาก่อนสำหรับการทำความเข้าใจภาษาเป็นขั้นตอนสำคัญในบริบทของ NLP
รูปแบบภาษาจะได้รับการฝึกฝนในคลังข้อมูลขนาดใหญ่และจากนั้นเราสามารถใช้เป็นองค์ประกอบในรุ่นอื่น ๆ ที่ต้องจัดการภาษา (เช่นการใช้มันสำหรับงานดาวน์สตรีม)
รูปแบบ Lanugage (LM) จับ การกระจายผ่านประโยคที่เป็นไปได้ทั้งหมด
ในขณะที่การสร้างแบบจำลองภาษาเป็นการ เรียนรู้ที่ไม่ได้รับการดูแลโดย ทั่วไปเกี่ยวกับคลังข้อมูลขนาดใหญ่ แต่เราเปลี่ยนสิ่งนี้ให้กลายเป็น ลำดับการเรียนรู้ภายใต้การดูแล ใน repo นี้
โมเดลภาษา Autoregressive จับการกระจายผ่านโทเค็นถัดไปจะขึ้นอยู่กับโทเค็นก่อนหน้าทั้งหมด กล่าวอีกนัยหนึ่งมันดูที่โทเค็นก่อนหน้าและทำนายโทเค็นถัดไป
วัตถุประสงค์ของแบบจำลองภาษาแบบอัตโนมัติจะแสดงในสูตรดังนี้:
เนื่องจากรูปแบบภาษาแบบอัตโนมัติควรจะส่งต่อหรือย้อนกลับจึงสามารถใช้ข้อมูลบริบทแบบหนึ่งทิศทางเดียวเท่านั้น ดังนั้นจึงเป็นเรื่องยากที่จะเข้าใจบริบททั้งสองทิศทางพร้อมกัน
Rnnlm, Elmo เป็นตัวอย่างทั่วไปของแบบจำลองภาษาอัตโนมัติและ แบบจำลองภาษา LSTM แบบทิศทางเดียว/ทิศทางแบบสองทิศทาง อยู่ใน repo นี้
Wikipedia จัดจำหน่ายเอกสารทั้งหมดเป็นประจำ คุณสามารถดาวน์โหลด Dump Wikipedia เกาหลีได้ที่นี่ (และ Dump Wikipedia ภาษาอังกฤษที่นี่) Wikipedia แนะนำให้ใช้ pages-articles.xml.bz2 ซึ่งรวมถึงเอกสารทั้งหมดล่าสุดของเอกสารทั้งหมดและมีการบีบอัดประมาณ 600 MB (สำหรับภาษาอังกฤษ, pages-articles-multistream.xml.bz2 )
คุณสามารถใช้สคริปต์ wikipedia_ko.sh เพื่อดาวน์โหลด Dump ในเอกสาร Wikipedia เกาหลีล่าสุด สำหรับภาษาอังกฤษใช้ wikipedia_en.sh
ตัวอย่าง:
$ cd build_corpus
$ chmod 777 wikipedia_ko.sh
$ ./wikipedia_ko.sh
การถ่ายโอนข้อมูลที่ดาวน์โหลดมาโดยใช้เชลล์สคริปต์อยู่ในรูปแบบ XML และเราจำเป็นต้องแยก XML ไปยังไฟล์ข้อความ สคริปต์ Python 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 คำ
ที่นี่เราใช้ Train Corpus corpus.train.txt เพื่อสร้างคำศัพท์ คำศัพท์ที่สร้างโดยคลังรถไฟมีคำที่ไม่ซ้ำกัน 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.3GB) เพื่ออัปโหลดบน repo นี้ฉันจึงอัปโหลดไปยัง 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 เดี่ยวไม่เพียง แต่ช้ามากเท่านั้น แต่ยัง จำกัด การปรับขนาดแบทช์ขนาดของรุ่นและอื่น ๆ ในการเร่งการฝึกอบรมแบบจำลองด้วย GPU หลายตัวและใช้รุ่นขนาดใหญ่สิ่งที่คุณต้องทำคือรวม --multi_gpu Flag เช่นความเชื่อ สำหรับรายละเอียดเพิ่มเติมโปรดตรวจสอบที่นี่
ตัวอย่างรหัสนี้ฝึกอบรมแบบจำลองทิศทางเดียวในคลังข้อมูล Wikipedia โดยใช้การฝึกอบรมแบบขนานใน 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()
)
)
ตัวอย่างรหัสนี้ฝึกอบรมแบบจำลองสองทิศทาง LSTM บนคลังข้อมูลวิกิพีเดียโดยใช้การฝึกอบรมแบบขนานใน 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()
)
)
แบบจำลองภาษาจับการกระจายของประโยคที่เป็นไปได้ทั้งหมด และรูปแบบภาษาที่ดีที่สุดคือรูปแบบที่ดีที่สุดคาดการณ์ประโยคที่มองไม่เห็น Perplexty เป็นการวัดที่พบบ่อยมากว่าการกระจายความน่าจะเป็นที่คาดการณ์ได้ดีเพียงใด
Perplexity : ความน่าจะเป็นแบบผกผันของประโยคที่กำหนดซึ่งเป็นมาตรฐานโดยจำนวนคำ (โดยใช้ค่าเฉลี่ยเรขาคณิต)
อย่างที่คุณเห็นจากสมการข้างต้นความเปรอะเปื้อนถูกกำหนดให้เป็นความน่าจะเป็นบันทึกค่าเฉลี่ยลบค่าเฉลี่ย กล่าวอีกนัยหนึ่งความน่าจะเป็นสูงสุดก็เหมือนกับการลดความงุนงง
และตอนนี้ความงุนงงคือตัวชี้วัดที่เรากำลังจะใช้ ความงุนงงต่ำบ่งชี้ว่าการกระจายความน่าจะเป็นได้ดีในการทำนายประโยค
| แบบอย่าง | การสูญเสีย | ความงุนงง |
|---|---|---|
| ทิศทางเดียว | 3.496 | 33.037 |
| สองทิศทาง | 1.896 | 6.669 |
| แบบสองทิศทาง-ขนาดใหญ่ ( hidden_size = 1024) | 1.771 | 5.887 |