How to train ELMo word representations on your own dataset (with GPU)
สอน ELMo ให้รู้จักภาษาไทยกันเถอะ!
** blog นี้ follow วิธีทำตาม github ต้นฉบับ และไม่ได้ให้ training data นะคะ เพียงอธิบายขั้นตอนการทำ/การเตรียมข้อมูล
ก่อนอื่น ELMo embedding คืออะไร? (ต้องไม่ใช่ตัวแดงๆ ข้างบนแน่ๆ ฮ่าๆ)
สั้นๆ คือ ELMo เป็นวิธีทำ word representation โดยดูจาก context (บริบทของคำ) ซึ่งเรียกได้ว่าเป็น state of art ของตอนนี้ ลักษณะมันคือ
- represent แต่ละ character ของคำ จากเดิมที่ represent คำเต็มๆ เลย ทำให้รู้ทั้ง syntax และ semantics (ความหมายของคำ)
- รู้บริบทของภาษา เช่น คำๆ เดียวกัน อาจมีความหมายต่างกันตาม context (polysemy)
ตัว word vector นี้เป็น deep biLM (bidirectional language model) ที่ train บน corpus ขนาดใหญ่ (ภาษาอังกฤษ) ทำให้มันจัดการกับปัญหา NLP ต่างๆ ได้ดี เช่น ตอบคำถาม (question answering), สรุปข้อความ (textual entailment) วิเคราะห์ความรู้สึก (sentiment analysis)
ถ้าอยากศึกษาต่อ เริ่มจาก link นี้ได้ค่ะ
สอน ELMo ให้เรียนรู้ภาษาไทยบ้าง
ʕ/ ·ᴥ·ʔ/ เตรียมข้อมูล
ก่อนอื่น สิ่งที่เราต้องทำคือเตรียมข้อมูลสำหรับ train ELMo 2 อย่าง คือ
1. vocab (.txt file)
คลังคำศัพท์ ที่จะให้ model เรียนรู้ อันนี้สำคัญว่าต้องเริ่มต้นด้วย 3 บรรทัดแรกเป็น mark <S>, </S> และ <UNK>
หลังจากนั้นตามด้วยคำศัพท์ เรียงจากคำที่เจอมากที่สุด ไล่ไปน้อยที่สุด เช่น
<S>
</S>
<UNK>
ฉัน
มะลิ
ชอบ
ชื่อ
แมว
เป็น
ดอกไม้
ของ
ดอก
มาก
สวัสดี
ทุกคน
...
2. trining data (.txt files)
คือประโยคที่ประกอบด้วยคำใน vocab ในหลายๆ บริบท แนะนำว่า
- ให้แบ่งเป็นหลายไฟล์ย่อยๆ เพื่อตอน model หยิบไฟล์มา train จะหยิบสลับไปเรื่อยๆ
- ในแต่ละไฟล์ ก็ให้ shuffle แต่ละบรรทัดด้วย เพื่อไม่ให้เจอคำศัพท์เดิมๆ ติดๆ กัน
ตัวอย่างของไฟล์นึงเช่น
มะลิ เป็น ชื่อ ดอกไม้
แมว ของ ฉัน ชอบ ดอก มะลิ
ฉัน ชอบ แมว มาก
สวัสดี ทุกคน ฉัน ชื่อ มะลิ
...
สุดท้าย จัดโครงสร้างของไฟล์ให้ได้ประมาณนี้
|-- training_data
| |-- training_001.txt
| |-- training_002.txt
| |-- training_003.txt
| |-- training_004.txt
| |-- ...
|-- vocab.txt
ʕ/ ·ᴥ·ʔ/ เริ่ม train model
1. clone github มาที่ local เราก่อน
2. สิ่งที่ต้องมี/ติดตั้ง
- python เวอร์ชัน 3.5 หรือใหม่กว่า
- tensorflow เวอร์ชัน 1.2
- h5py
- อื่นๆ ตาม setup file
pip install tensorflow-gpu==1.2 h5py
python setup.py install
3. แก้ไข parameter ให้ตรงกับข้อมูลตัวเอง ที่ไฟล์ bin/train_elmo.py
หลักๆ คือ
batch_size = 128 # batch size สำหรับแต่ละ GPU
n_gpus = 3 # จำนวน GPUn_train_tokens = 768648884 # จำนวน token หรือคำศัพท์
นอกจากนี้สามารถ fine tuning parameter อื่น ให้เหมาะกับงานตัวเองได้
4. ตอนนี้โครงสร้างของไฟล์จะเป็นประมาณนี้
- สร้าง folder ชื่อ model สำหรับเก็บผลการ train model
- สร้าง folder ชื่อ output สำหรับเก็บ .hdf5 weight ไปใช้ต่อ
|-- bilm-tf (working directory is here)
|-- bilm
|-- training_data
|-- ...
|-- bin
|-- dump_weight.py
|-- train_elmo.py
|-- ...
|-- model
|-- output
|-- test
|-- training_data
| |-- training_001.txt
| |-- training_002.txt
| |-- training_003.txt
| |-- training_004.txt
| |-- ...
|-- vocab.txt
|-- ...
5. รัน แล้วรอผลได้เลย (ยิ่งจำนวน training data มา ยิ่งใช้เวลานานหน่อย)
export CUDA_VISIBLE_DEVICES=0,1,2 (สำหรับ GPU 3 ตัว)python bin/train_elmo.py
--train_prefix='training_data/*'
--vocab_file vocab.txt
--save_dir model
6. เสร็จแล้วแปลง weight ไปเป็น .hdf5 เอาไว้ใช้ต่อไป
python bin/dump_weights.py \
--save_dir model
--outfile output/weights.hdf5
Done! เสร็จเรียบร้อยแล้วค่ะ ต่อไปก็เอาตัว weights.hdf5 ไปใช้ได้เลย
สำหรับ blog นี้ถ้าเขียนส่วนไหนผิดพลาด หรืออยากแชร์อะไรเพิ่มเติม สามารถบอกได้เลยนะคะ ยินดีรับฟังค่ะ ^.^
วันนี้ลาไปก่อนแล้ว บ๊ายบาย~