ຝັນຮ້າຍຂອງການຕັດຄຳພາສາລາວ: ຄວາມທ້າທາຍລະດັບປາບຊຽນໃນວົງການ NLP
ຝັນຮ້າຍຂອງການຕັດຄຳພາສາລາວ: ເປັນຫຍັງການບໍ່ມີຍະຫວ່າງຈຶ່ງເປັນອຸປະສັກໃຫຍ່ໃນ NLP
ສຳລັບນັກພັດທະນາປັນຍາປະດິດ (AI) ແລະ ວິສະວະກອນຂໍ້ມູນ ໃນໂລກຕາເວັນຕົກ, ການປະມວນຜົນພາສາທຳມະຊາດ (NLP) ອາດຈະເລີ່ມຕົ້ນດ້ວຍການໃຊ້ text.split(" ") ເພື່ອແຍກປະໂຫຍກອອກເປັນຄຳໆ. ແຕ່ສຳລັບນັກພັດທະນາໃນປະເທດລາວ, ການບໍ່ມີຍະຫວ່າງລະຫວ່າງຄຳ (Zero-width boundary) ໃນການຂຽນພາສາລາວ ແມ່ນ “ຝັນຮ້າຍ” ທີ່ແທ້ຈິງ. ມັນເຮັດໃຫ້ເຖິງແມ່ນແຕ່ວຽກທີ່ພື້ນຖານທີ່ສຸດ ເຊັ່ນ: ການນັບຈຳນວນຄຳ (Word Count) ຫຼື ການວິເຄາະຄວາມຮູ້ສຶກ (Sentiment Analysis) ກາຍເປັນບັນຫາທີ່ຊັບຊ້ອນໃນລະດັບ Sequence Labeling Problem.
ບົດຄວາມນີ້ຈະພາທ່ານເຈາະເລິກລົງໄປໃນສະຖາປັດຕະຍະກຳ (Architecture), ທິດສະດີທາງຄະນິດສາດ ແລະ ການແກ້ໄຂບັນຫາ Tokenization ຂັ້ນສູງ ສຳລັບພາສາລາວ ໂດຍສະເພາະ.
ເປັນຫຍັງ Dictionary-based ປົກກະຕິຈຶ່ງບໍ່ພຽງພໍ?
ໃນຍຸກທຳອິດ, ວິທີການແຂ່ງຂັນການຕັດຄຳມັກຈະໃຊ້ Dictionary-Based Algorithm ເຊັ່ນ: Maximal Matching ຫຼື Longest Matching. ແຕ່ວິທີການເຫຼົ່ານີ້ມັກຈະຫຼົ້ມເຫຼວຢ່າງໜັກໜ່ວງໃນພາສາລາວ ເນື່ອງຈາກສອງປັດໄຈຫຼັກຄື:
- Out of Vocabulary (OOV): ຄຳສັບໃໝ່ໆ, ຊື່ສະເພາະບຸກຄົນ, ຫຼື ສະຖານທີ່ ເຊັ່ນ: “ນ້ອງນິວຂັບລົດໄປບ້ານດົງໂດກ” (ນິວ ແລະ ດົງໂດກ ອາດຈະບໍ່ມີໃນວັດຈະນານຸກົມ).
- Structural Ambiguity (ຄວາມກຳກົວທາງໂຄງສ້າງ): ຄຳບາງຄຳສາມາດຖືກຕັດໄດ້ຫຼາຍຮູບແບບແລ້ວມີຄວາມໝາຍຕ່າງກັນ ທັງໝົດຂຶ້ນກັບບໍລິບົດ.
ຕົວຢ່າງຄລາສສິກ: “ຕາກົມ”
- ການຕັດແບບທີ 1:
ຕາ/ກົມ(Round eyes) - ການຕັດແບບທີ 2:
ຕາກ/ລົມ(Drying in the wind - ມັກພົບໃນພາສາເວົ້າ ຫຼື ການສະກົດແບບດັ້ງເດີມ)
- ການຕັດແບບທີ 1:
ການໃຊ້ພຽງແຕ່ Greedy Search ເພື່ອຊອກຫາຄຳທີ່ຍາວທີ່ສຸດ ຈະບໍ່ສາມາດແຍກແຍະບໍລິບົດໄດ້, ເຮັດໃຫ້ Error Propagation ລາມໄປເຖິງຂະບວນການຖັດໄປ (ເຊັ່ນ: ການແປພາສາ).
ສະຖາປັດຕະຍະກຳຂັ້ນສູງ: Sequence Labeling ດ້ວຍ BiLSTM-CRF
ເພື່ອແກ້ໄຂບັນຫາການຂາດຍະຫວ່າງ, ນັກວິໄຈໃນວົງການ NLP ຈຶ່ງປ່ຽນບັນຫາການ “ຕັດຄຳ” ໃຫ້ກາຍເປັນບັນຫາການ “ຕິດປ້າຍກຳກັບລຳດັບຕົວອັກສອນ” (Character-level Sequence Labeling) ໂດຍໃຊ້ລະບົບແທັກ BI (Begin, Inside) ຫຼື BIES (Begin, Inside, End, Single).
ແທນທີ່ຈະເບິ່ງຫາຄຳ ພວກເຮົາຕ້ອງປະເມີນຄວາມໜ້າຈະເປັນ (Probability) ທີ່ຕົວອັກສອນໃດໜຶ່ງຈະເປັນຈຸດເລີ່ມຕົ້ນຂອງຄຳໃໝ່.
Conditional Random Fields (CRF)
CRF ເປັນຊັ້ນການຮຽນຮູ້ທາງສະຖິຕິທີ່ສາມາດຈົດຈຳກົດເກນຂອງການປ່ຽນແປງ (Transition Rules) ຂອງ Tags ໄດ້. ຕົວຢ່າງ: ແທັກ I (Inside) ບໍ່ສາມາດເກີດຂຶ້ນກ່ອນແທັກ B (Begin) ຂອງຄຳດຽວກັນໄດ້. CRF ຈະຄຳນວນຫາລຳດັບ(Sequence) ທີ່ດີທີ່ສຸດດວ້ຍການໃຊ້ Viterbi Algorithm ສຳລັບການຖອດລະຫັດ (Decoding).
ຕົວຢ່າງການນຳໃຊ້ Pytorch ສຳລັບ BiLSTM-CRF Model
ເຮົາມາເບິ່ງໂຄງສ້າງລະຫັດ (PyTorch) ຂອງສະຖາປັດຕະຍະກຳ BiLSTM-CRF ສຳລັບການຕັດຄຳພາສາລາວ:
import torch
import torch.nn as nn
from torchcrf import CRF
class LaoWordSegmenter(nn.Module):
def __init__(self, vocab_size, embedding_dim, hidden_dim, num_tags):
super(LaoWordSegmenter, self).__init__()
# ປ່ຽນຕົວອັກສອນລາວ (Characters) ເປັນ Vector
self.embedding = nn.Embedding(vocab_size, embedding_dim)
# Bi-directional LSTM ເພື່ອເຂົ້າໃຈບໍລິບົດທັງໜ້າ ແລະ ຫຼັງ
self.lstm = nn.LSTM(embedding_dim, hidden_dim // 2,
num_layers=1, bidirectional=True, batch_first=True)
# Map Hidden states ໄປຫາ Tag space (B, I, E, S)
self.hidden2tag = nn.Linear(hidden_dim, num_tags)
# ຊັ້ນ CRF ສຳລັບການຈັດການ Transition probabilities ຂອງ Tags
self.crf = CRF(num_tags, batch_first=True)
def forward(self, x):
# x: Sequence of Lao characters
embeds = self.embedding(x)
lstm_out, _ = self.lstm(embeds)
emissions = self.hidden2tag(lstm_out)
return emissions
def loss(self, x, tags, mask=None):
emissions = self.forward(x)
# Sequence Log Likelihood ເພື່ອອັບເດດນ້ຳໜັກໃນໄລຍະການຝຶກ
return -self.crf(emissions, tags, mask=mask, reduction='mean')
def decode(self, x, mask=None):
emissions = self.forward(x)
# Viterbi decoding algorithm ສຳລັບຫາລຳດັບແທັກທີ່ດີທີ່ສຸດ
return self.crf.decode(emissions, mask=mask)
ໃນຕົວແບບນີ້, BiLSTM ຈະດູດຊັບຂໍ້ມູນບໍລິບົດຂອງປະໂຫຍກທາງໜ້າແລະຫຼັງ (ເຊັ່ນ ຖ້າມີຄຳວ່າ “ໂຮງໝໍ”, ແນວໂນ້ມທີ່ຄຳຕໍ່ໄປຈະເປັນ “ແມ່ລາວ” ຫຼື “ມະໂຫສົດ” ກໍຈະຖືກໃຫ້ຄ່ານ້ຳໜັກສູງຂຶ້ນ), ສ່ວນ CRF ຈະຈັດການບໍ່ໃຫ້ໂມເດວປ່ອຍແທັກທີ່ຜິດຕໍ່ຫຼັກໄວຍາກອນອອກມາ.
ຍຸກຂອງ LLMs: ບັນຫາ Byte-Pair Encoding (BPE) ສຳລັບພາສາລາວ
ໃນຍຸກປັດຈຸບັນທີ່ Large Language Models (LLMs) ເຊັ່ນ GPT-4 ຫຼື LLaMA ກາຍເປັນມາດຕະຖານ. ການຕັດຄຳອາດຈະຖືກຈັດການດ້ວຍອັນກໍຣິທຶມ Byte-Pair Encoding (BPE). ແຕ່ BPE ກໍຍັງປະສົບກັບບັນຫາໃຫຍ່ເມື່ອເຈິພາສາລາວ.
ເນື່ອງຈາກພາສາລາວບໍ່ມີຍະຫວ່າງ ແລະ ວັນນະຍຸດ, ສະຫຼະ (ເຊັ່ນ ໄ, ໃ, ໂ, ຳ) ສາມາດປະສົມກັນໄດ້ຫຼາກຫຼາຍ, BPE tokenizers ສ່ວນໃຫຍ່ຈຶ່ງມັກຈະຊອຍພາສາລາວອອກເປັນລະດັບຕົວອັກສອນ (Character-level) ຫຼື Sub-word ທີ່ບໍ່ມີຄວາມໝາຍເລີຍ. ສົມມຸດປະໂຫຍກໃນບົດຄວາມຂ່າວ: “ການສັນຈອນຢູ່ເສັ້ນທາງແຄມຂອງ”
- Tokenizer ຂອງພາສາອັງກິດອາດຈະໄດ້:
The,traffic,on,the,Mekong,road(6 Tokens) - Tokenizer ທີ່ບໍ່ໄດ້ Optimize ສຳລັບພາສາລາວອາດຈະໃຊ້ເຖິງ 25-30 Tokens! ເພາະມັນແຍກ
ກ,າ,ນ,ສ,ັ,ນ,ຈ,ອ,ນອອກຈາກກັນ.
ຜົນກະທົບຄື: ລາຄາແພງຂຶ້ນ, Inference ຊ້າລົງ, ແລະ Context Window ເຕັມໄວຂຶ້ນຫຼາຍ.
ການແກ້ໄຂ: Custom Pre-Tokenization
ສຳລັບນັກພັດທະນາ AI ທີ່ຢາກສ້າງ LLM ສຳລັບພາສາລາວ, ການໃຊ້ Pre-tokenizer ຮ່ວມກັບ BPE ແມ່ນສິ່ງຈຳເປັນ. ກ່ອນຈະປ້ອນຂໍ້ມູນເຂົ້າ BPE, ຄວນນຳໃຊ້ Dictionary + Machine Learning Boundary Predictor ມາແຊກ (Inject) ຍະຫວ່າງຊ່ອງວ່າງສະເໝືອນ (Virtual spaces ຫຼື <sep>) ເຂົ້າໄປໃນລະຫວ່າງຄຳກ່ອນ. ຕົວຢ່າງ:
ການ<sep>ສັນຈອນ<sep>ຢູ່<sep>ເສັ້ນທາງ<sep>ແຄມຂອງ
ການເຮັດແບບນີ້ຈະຊ່ວຍໃຫ້ BPE ຝຶກຝົນ (Train) ວັດຈະນານຸກົມ Sub-word ໄດ້ຢ່າງມີປະສິດທິພາບຫຼາຍຂຶ້ນ, ສ້າງ Token ທີ່ຖືຄວາມໝາຍຖືກຕ້ອງ, ແລະ ຫຼຸດຂະໜາດ Sequence Length ໄດ້ເກືອບ 400%.
ສິ່ງທີ່ຄວນຈື່ (Key Takeaways)
- ພາສາລາວບໍ່ມີຍະຫວ່າງ: ນີ້ເຮັດໃຫ້ການໃຊ້ Tokenizer ທົ່ວໄປລົ້ມເຫຼວ ແລະ ຕ້ອງອາໄສ Character-level Sequence Labeling ແທນ.
- BiLSTM-CRF ແມ່ນສະຖາປັດຕະຍະກຳພື້ນຖານທີ່ແຂງແກ່ນ: ມັນແກ້ໄຂບັນຫາຄວາມກຳກົວ (Ambiguity) ດ້ວຍການເຂົ້າໃຈບໍລິບົດທັງໜ້າແລະຫຼັງ ພ້ອມທັງຄວບຄຸມກົດເກນການຕໍ່ກັນຂອງແທັກ.
- BPE ໃນ LLMs ເປັນດາບສອງຄົມ: ຫາກບໍ່ມີ Pre-tokenization ທີ່ດີມາຊ່ວຍຕັດຄຳລາວກ່ອນ, ມັນຈະເຮັດໃຫ້ໂມເດວເຮັດວຽກຊ້າ, ແພງ, ແລະ Context ເຕັມໄວ.
- Deep Learning ຕ້ອງການ Data ທີ່ສະອາດ: ການປັບປຸງຝັນຮ້າຍນີ້ຮຽກຮ້ອງໃຫ້ Local Developers ໃນລາວ ຮ່ວມກັນສ້າງວັດຈະນານຸກົມ OOV ທີ່ທັນສະໄໝ ແລະ ສ້າງ Labeled Data Quality ທີ່ສູງ.
ສະຫຼຸບແລ້ວ, ເຖິງແມ່ນວ່າການບໍ່ມີຍະຫວ່າງໃນພາສາລາວຈະເປັນອຸປະສັກທີ່ຊັບຊ້ອນ ແລະ ຫຍຸ້ງຍາກ (ຝັນຮ້າຍ), ແຕ່ດ້ວຍເຕັກນິກທາງຄະນິດສາດ ແລະ ສະຖາປັດຕະຍະກຳເຊັ່ນ CRF ຮ່ວມກັບ Neural Networks ທີ່ທັນສະໄໝ ພວກເຮົາສາມາດຍົກລະດັບຂີດຄວາມສາມາດຂອງ NLP ສໍາລັບພາສາລາວໃຫ້ສາມາດແຂ່ງຂັນ ແລະ ນຳໃຊ້ໄດ້ຈິງໃນຍຸກຂອງ Generative AI. ມັນບໍ່ແມ່ນພຽງແຕ່ການຝຶກໂມເດວໃຫມ່, ແຕ່ແມ່ນການວິທະຍາສາດການເຂົ້າໃຈໂຄງສ້າງ ແລະ ບໍລິບົດພາຍໃນພາສາແມ່ຂອງພວກເຮົາເອງ.