ข้ามไปยังเนื้อหาหลัก

[LLM 1/10] Continue Pretraining: สอนความรู้ใหม่ให้ LLM ภาษาไทย

· อ่าน 4 นาที
Kobkrit Viriyayudhakorn
CEO, iApp Technology

โมเดลภาษาขนาดใหญ่ที่เก่งภาษาไทยระดับหนึ่ง มักจะ "ไม่รู้จัก" ความรู้เฉพาะทางขององค์กรคุณเลย — ไม่รู้ระเบียบราชการไทย ไม่รู้ศัพท์เฉพาะในวงการของคุณ ไม่รู้เอกสารภายในบริษัท บทความนี้จะสอนวิธีแก้ที่ตรงที่สุด คือ Continue Pretraining (CPT) ตั้งแต่สมการ ไปจนถึงโค้ดที่รันจบได้จริงบน Colab ฟรีภายในราว 15 นาที

Open in Colab01_continue_pretraining.ipynb

1. ปัญหา (Problem statement)

ลองนึกภาพว่าคุณเอา Qwen3-0.6B มาถามว่า "ตามระเบียบสำนักนายกรัฐมนตรี การจัดซื้อจัดจ้างโดยวิธีเฉพาะเจาะจงทำได้เมื่อใด" โมเดลจะตอบได้อย่างมั่นใจ และตอบผิด เพราะมันไม่เคยเห็นเอกสารราชการไทยมากพอ

หลายคนพยายามแก้ด้วยการทำ fine-tuning ด้วยคู่ถาม-ตอบไม่กี่พันตัวอย่าง แล้วพบว่าไม่ได้ผล เหตุผลคือ SFT สอน "รูปแบบการตอบ" ไม่ได้สอน "ความรู้" ถ้าโมเดลไม่เคยมีความรู้นั้นอยู่ในน้ำหนัก (weights) การสอนให้มันตอบด้วยน้ำเสียงที่ถูกต้องก็แค่ทำให้มันมั่นใจเวลาโกหกเท่านั้น

ความรู้ใหม่เข้าสู่โมเดลได้ 3 ทาง และเลือกผิดคือสาเหตุที่โปรเจกต์ LLM ส่วนใหญ่ล้มเหลว:

วิธีเหมาะกับต้นทุนตอนใช้งาน
RAGความรู้ที่เปลี่ยนบ่อย ต้องอ้างอิงแหล่งที่มาค้นทุกครั้ง + prompt ยาว
Continue Pretrainingความรู้เฉพาะทางจำนวนมาก ที่ค่อนข้างนิ่งไม่มี (อยู่ในน้ำหนักแล้ว)
SFTรูปแบบ น้ำเสียง โครงสร้างคำตอบไม่มี

บทความนี้คือทางที่สอง

2. เราจะทำอะไร (Solution)

เราจะเอาโมเดล base (ยังไม่ผ่าน instruction tuning) มาเทรนต่อด้วย objective เดียวกับตอน pretrain เป๊ะ ๆ คือทายคำถัดไป บนข้อความดิบภาษาไทยในโดเมนที่เราสนใจ ไม่มี label ไม่มีคู่ถาม-ตอบ มีแค่ข้อความล้วน ๆ

แต่หัวใจของบทความนี้ไม่ใช่ "เทรนแล้วเก่งขึ้น" — มันคือสิ่งที่แลกมา:

แนวคิดหลักของบทนี้

CPT ซื้อความแม่นในโดเมน ด้วยการจ่ายความสามารถทั่วไปที่หายไป มันคือการแลกเปลี่ยน ไม่ใช่ของฟรี และ "อัตราแลกเปลี่ยน" ถูกควบคุมด้วยตัวเลขตัวเดียวชื่อ replay ratio

ปรากฏการณ์ที่โมเดลลืมสิ่งที่เคยทำได้ เรียกว่า catastrophic forgetting เราจะไม่พูดลอย ๆ แต่จะวัดมันออกมาเป็นตัวเลข แล้วหาจุดที่ยอมรับได้

3. สมการ (Equation)

3.1 Objective ของ CPT

LCPT(θ)=ExDdomain[t=1xlogpθ(xtx<t)]\mathcal{L}_{\text{CPT}}(\theta) = -\mathbb{E}_{x\sim\mathcal{D}_{\text{domain}}}\left[\sum_{t=1}^{|x|}\log p_\theta(x_t \mid x_{<t})\right]
  • xtx_t = token ตำแหน่งที่ tt
  • x<tx_{<t} = token ทั้งหมดก่อนหน้า
  • pθp_\theta = ความน่าจะเป็นที่โมเดลทำนาย

สมการนี้เหมือนกับตอน pretrain ทุกประการ สิ่งเดียวที่เปลี่ยนคือข้อมูล นี่คือเหตุผลที่ CPT ไม่ต้องการ label — ข้อความเองคือเฉลย

3.2 Perplexity: หน่วยวัดของเรา

PPL(D)=exp ⁣(1NiLCPT(x(i)))\text{PPL}(\mathcal{D}) = \exp\!\left(\frac{1}{N}\sum_{i}\mathcal{L}_{\text{CPT}}(x^{(i)})\right)

แปลเป็นภาษาคน: "โดยเฉลี่ยแล้ว โมเดลกำลังลังเลอยู่ระหว่างกี่ตัวเลือก" PPL = 20 คือลังเลประมาณ 20 คำ, PPL = 5 คือมั่นใจกว่ามาก ยิ่งต่ำยิ่งดี

3.3 สมการที่สำคัญที่สุดในบทนี้ — Replay Mixing

Dmix=λDdomain+(1λ)Dgeneral\mathcal{D}_{\text{mix}} = \lambda\,\mathcal{D}_{\text{domain}} + (1-\lambda)\,\mathcal{D}_{\text{general}}

λ\lambda คือสัดส่วนข้อมูลโดเมนในแต่ละ batch

  • λ=1.0\lambda = 1.0 → ข้อมูลโดเมนล้วน → เก่งโดเมนเร็วที่สุด และลืมเร็วที่สุด
  • λ=0.5\lambda = 0.5 → ผสมครึ่งต่อครึ่ง → ช้ากว่าแต่ลืมน้อยกว่ามาก

อย่า hardcode ค่านี้ จงกวาดหาค่ามัน แล้วเลือกจุดที่คุณยอมรับได้

เนื้อหาเต็มอยู่ในคอร์ส

บทความนี้คือประมาณ 30% แรกของบทเรียน — ส่วนที่เหลือ (การเตรียมสภาพแวดล้อม, การเตรียมข้อมูล, โค้ดหลัก, ผลลัพธ์จริง และบทสรุป) อยู่ในคอร์ส LLM Finetuning ซึ่งเรียนฟรี เพียงเข้าสู่ระบบด้วย Google

อ่านเนื้อหาเต็มในคอร์ส →