Doctor AI

Dr. Savath Saypadith

240 ບົດຄວາມ

ຝັນຮ້າຍຂອງການຕັດຄຳພາສາລາວ: ຄວາມທ້າທາຍລະດັບປາບຊຽນໃນວົງການ NLP

ໂພສເມື່ອ # Natural Language Processing # Word Segmentation # Deep Learning # LLMs

ຝັນຮ້າຍຂອງການຕັດຄຳພາສາລາວ: ເປັນຫຍັງການບໍ່ມີຍະຫວ່າງຈຶ່ງເປັນອຸປະສັກໃຫຍ່ໃນ 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. ແຕ່ວິທີການເຫຼົ່ານີ້ມັກຈະຫຼົ້ມເຫຼວຢ່າງໜັກໜ່ວງໃນພາສາລາວ ເນື່ອງຈາກສອງປັດໄຈຫຼັກຄື:

  1. Out of Vocabulary (OOV): ຄຳສັບໃໝ່ໆ, ຊື່ສະເພາະບຸກຄົນ, ຫຼື ສະຖານທີ່ ເຊັ່ນ: “ນ້ອງນິວຂັບລົດໄປບ້ານດົງໂດກ” (ນິວ ແລະ ດົງໂດກ ອາດຈະບໍ່ມີໃນວັດຈະນານຸກົມ).
  2. Structural Ambiguity (ຄວາມກຳກົວທາງໂຄງສ້າງ): ຄຳບາງຄຳສາມາດຖືກຕັດໄດ້ຫຼາຍຮູບແບບແລ້ວມີຄວາມໝາຍຕ່າງກັນ ທັງໝົດຂຶ້ນກັບບໍລິບົດ. ຕົວຢ່າງຄລາສສິກ: “ຕາກົມ”
    • ການຕັດແບບທີ 1: ຕາ / ກົມ (Round eyes)
    • ການຕັດແບບທີ 2: ຕາກ / ລົມ (Drying in the wind - ມັກພົບໃນພາສາເວົ້າ ຫຼື ການສະກົດແບບດັ້ງເດີມ)

ການໃຊ້ພຽງແຕ່ 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 ທີ່ບໍ່ມີຄວາມໝາຍເລີຍ. ສົມມຸດປະໂຫຍກໃນບົດຄວາມຂ່າວ: “ການສັນຈອນຢູ່ເສັ້ນທາງແຄມຂອງ”

ຜົນກະທົບຄື: ລາຄາແພງຂຶ້ນ, 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)

ສະຫຼຸບແລ້ວ, ເຖິງແມ່ນວ່າການບໍ່ມີຍະຫວ່າງໃນພາສາລາວຈະເປັນອຸປະສັກທີ່ຊັບຊ້ອນ ແລະ ຫຍຸ້ງຍາກ (ຝັນຮ້າຍ), ແຕ່ດ້ວຍເຕັກນິກທາງຄະນິດສາດ ແລະ ສະຖາປັດຕະຍະກຳເຊັ່ນ CRF ຮ່ວມກັບ Neural Networks ທີ່ທັນສະໄໝ ພວກເຮົາສາມາດຍົກລະດັບຂີດຄວາມສາມາດຂອງ NLP ສໍາລັບພາສາລາວໃຫ້ສາມາດແຂ່ງຂັນ ແລະ ນຳໃຊ້ໄດ້ຈິງໃນຍຸກຂອງ Generative AI. ມັນບໍ່ແມ່ນພຽງແຕ່ການຝຶກໂມເດວໃຫມ່, ແຕ່ແມ່ນການວິທະຍາສາດການເຂົ້າໃຈໂຄງສ້າງ ແລະ ບໍລິບົດພາຍໃນພາສາແມ່ຂອງພວກເຮົາເອງ.