- MicroGPT คือ การทำ GPT model ฉบับย่อที่สุด ที่เขียนด้วย Python ล้วนเพียง 200 บรรทัด โดยออกแบบมาเพื่อช่วยให้เข้าใจโครงสร้างแกนหลักของโมเดลภาษาขนาดใหญ่ได้อย่างเป็นภาพ
- ฝึกด้วย ชุดข้อมูลชื่อคน 32,000 รายการเพื่อสร้างชื่อใหม่ และทำให้เห็นกระบวนการ tokenization, การทำนาย, การคำนวณ loss และ backpropagation แบบทีละขั้น
- อธิบายองค์ประกอบสำคัญของ GPT เช่น Softmax, Cross-Entropy Loss, Backpropagation, Embedding, Attention ควบคู่ไปกับโค้ด
- ในกระบวนการฝึกใช้ Adam optimizer เพื่อลด loss ลงเรื่อย ๆ และหลังจากนั้นใช้ การปรับอุณหภูมิ (Temperature Sampling) เพื่อสร้างชื่อที่หลากหลาย
- เป็นสื่อการเรียนรู้เพื่อทำความเข้าใจหลักการทำงานภายในของ LLM โดยอยู่ในรูปแบบที่ ลดทอนอัลกอริทึมแกนหลัก ของโมเดลขนาดใหญ่อย่าง ChatGPT ให้เรียบง่ายลง
ภาพรวมของ MicroGPT
- อธิบายกระบวนการฝึกและ inference ของ GPT model แบบเห็นภาพ โดยอิงจากสคริปต์ Python 200 บรรทัดที่เขียนโดย Andrej Karpathy
- ทำด้วย Python ล้วนโดยไม่พึ่งไลบรารีภายนอก
- มีอัลกอริทึมพื้นฐานแบบเดียวกับโมเดลภาษาขนาดใหญ่อย่าง ChatGPT
- บทความนี้ใช้วิธีอธิบายเชิงภาพที่เป็นมิตรกับผู้เริ่มต้น เพื่อแสดงแต่ละขั้นของโมเดลอย่างเป็นลำดับ
ชุดข้อมูลและเป้าหมายการฝึก
- ใช้ ชื่อคน 32,000 ชื่อ (เช่น emma, olivia, ava เป็นต้น) เป็นข้อมูลฝึก
- แต่ละชื่อถือเป็นหนึ่งเอกสาร และโมเดลจะเรียนรู้รูปแบบตัวอักษรของชื่อ
- หลังฝึกแล้วสามารถสร้างชื่อใหม่ เช่น “kamon”, “karai”, “anna”, “anton”
- โมเดลเรียนรู้ความสัมพันธ์เชิงสถิติระหว่างตัวอักษร ความยาวของชื่อ และรูปแบบเสียงตอนขึ้นต้นและลงท้าย
กระบวนการแปลงข้อความเป็นตัวเลข
- เนื่องจากโครงข่ายประสาทเทียมประมวลผลได้เฉพาะตัวเลข จึงแปลงตัวอักษรแต่ละตัวเป็น integer ID
- a–z กำหนดเป็น 0–25 และ BOS (Beginning of Sequence) กำหนดเป็น 26
- โทเค็น BOS ใช้ระบุจุดเริ่มต้นและจุดสิ้นสุดของชื่อ
- tiktoken ของ GPT-4 ทำ tokenization เป็นหน่วยย่อยของตัวอักษรแทนที่จะเป็นตัวอักษรเดี่ยว แต่หลักการเหมือนกัน
การทำนายโทเค็นถัดไป
- โมเดลจะ ทำนายตัวอักษรถัดไป จากบริบทที่กำหนด
- ตัวอย่าง: [BOS] → “e”, [BOS, e] → “m”, [BOS, e, m] → “m”, [BOS, e, m, m] → “a”
- แต่ละขั้นจะสร้างคู่ของอินพุต (บริบท) และเป้าหมาย (ตัวอักษรถัดไป) ซึ่งเป็นวิธีเดียวกับ ChatGPT
Softmax และการคำนวณความน่าจะเป็น
- เอาต์พุตของโมเดลประกอบด้วย logit 27 ค่า และถูกแปลงเป็นความน่าจะเป็นผ่าน Softmax
- นำแต่ละ logit ไปยกกำลังแล้วหารด้วยผลรวม เพื่อสร้างการกระจายความน่าจะเป็น
- การลบค่าสูงสุดออกก่อนเป็นการทำให้เสถียรเพื่อป้องกัน overflow
- ผลลัพธ์ของ Softmax แสดงความน่าจะเป็นที่แต่ละโทเค็นจะปรากฏเป็นลำดับถัดไป
การคำนวณ loss: Cross-Entropy
- วัดความแม่นยำของการทำนายด้วย −log(p)
- ยิ่งความน่าจะเป็นของคำตอบที่ถูกต้องสูง loss ก็ยิ่งต่ำ และยิ่งเข้าใกล้ 0 loss ก็ยิ่งสูง
- เมื่อ p=1 loss เป็น 0 และเมื่อ p→0 loss จะเข้าใกล้อนันต์
- การฝึกจะดำเนินไปในทิศทางที่ทำให้ loss นี้ต่ำลง
การแพร่ย้อนกลับ (Backpropagation)
- คำนวณว่าแต่ละพารามิเตอร์ส่งผลต่อ loss มากน้อยเพียงใดโดยอิงจากค่า loss
- ทำอนุพันธ์ผ่าน computational graph ที่ประกอบทุกการคำนวณ (add, multiply, exp, log เป็นต้น) เป็นโหนด
- แต่ละโหนดจะเก็บอินพุตและค่าอนุพันธ์เฉพาะที่ แล้วส่งต่อ gradient ย้อนกลับ
- ตัวอย่าง: L = a⋅b + a (a=2, b=3) → gradient ของ a เท่ากับ 4.0 (ผลรวมจากสองเส้นทาง)
- หลักการเดียวกับ
loss.backward() ของ PyTorch
Embedding
- token ID แต่ละตัวจะถูกแปลงเป็น เวกเตอร์ 16 มิติ เพื่อให้เรียนรู้ความหมาย
- ใช้ผลบวกของ token embedding และ positional embedding เป็นอินพุต
- ตัวอักษรเดียวกันอาจมีบทบาทต่างกันตามตำแหน่ง
- หลังฝึกเสร็จ ตัวอักษรที่คล้ายกัน (เช่น สระ) จะมีเวกเตอร์ที่คล้ายกัน
Attention
- แต่ละโทเค็นจะสร้างเวกเตอร์ Query, Key, Value
- คำนวณความเกี่ยวข้องผ่าน dot product ระหว่าง Query และ Key แล้วใช้ Softmax สร้างค่าน้ำหนัก
- นำ Value มาถ่วงน้ำหนักรวมกันแล้วใช้เป็นเอาต์พุต
- ใช้ Causal Mask เพื่อไม่ให้อ้างอิงโทเค็นในอนาคต
- มี attention head 4 หัวทำงานแบบขนานและเรียนรู้รูปแบบที่ต่างกัน
โครงสร้าง GPT ทั้งหมด
- โทเค็นอินพุตจะผ่านขั้นตอนดังนี้
- Embedding + positional embedding
- การทำ normalization แบบ RMSNorm
- Multi-head attention
- การเชื่อมต่อแบบ residual
- MLP (ขยายเป็น 64 มิติ → ReLU → ลดลงเป็น 16 มิติ)
- เชื่อมต่อแบบ residual อีกครั้งแล้วคำนวณ logit เอาต์พุต
- Residual connection ช่วยป้องกัน gradient หาย
- RMSNorm ช่วยคงขนาดของ activation ให้สม่ำเสมอเพื่อให้การฝึกเสถียรขึ้น
ลูปการฝึก
- ฝึกวนซ้ำ 1,000 รอบ
- เลือกชื่อ → tokenize → forward pass → คำนวณ loss → backpropagation → อัปเดตพารามิเตอร์
- ใช้ Adam optimizer
- ทำให้ลู่เข้าอย่างเสถียรด้วย momentum และ adaptive learning rate
- loss ลดลงจากราว 3.3 ไปเป็น 2.37
- ชื่อที่สร้างได้พัฒนาจากการสุ่มไปสู่รูปแบบที่เป็นธรรมชาติมากขึ้นเรื่อย ๆ
Inference และการสุ่มตัวอย่าง
- หลังฝึกแล้ว จะเริ่มจาก BOS และทำนายโทเค็นถัดไปซ้ำ ๆ
- สร้างต่อไปจนกว่า BOS จะปรากฏอีกครั้ง
- ใช้ Temperature เพื่อควบคุมความหลากหลายของการสุ่มตัวอย่าง
- ค่ายิ่งต่ำยิ่งกำหนดแน่นอน (ออกแนวค่าเฉลี่ย), ค่ายิ่งสูงยิ่งสร้างสรรค์แต่ไม่เสถียร
- อุณหภูมิที่เหมาะสำหรับการสร้างชื่ออยู่ที่ประมาณ 0.5
- ตัวอย่างเอาต์พุต: “karai”
ประสิทธิภาพและการขยายขนาด
- MicroGPT คือ การทำ GPT แกนหลักแบบสมบูรณ์ที่ถูกทำให้เรียบง่ายลง
- ความต่างจาก ChatGPT มีเพียงเรื่องขนาด
- จากชื่อ 32,000 ชื่อเป็นโทเค็นระดับล้านล้าน และจากพารามิเตอร์ 4,192 ตัวเป็นหลายแสนล้านพารามิเตอร์
- จากการคำนวณสเกลาร์บน CPU ไปเป็นการคำนวณ tensor บน GPU
- แต่ลูปพื้นฐานยังเหมือนเดิม: tokenize → embedding → attention → ทำนาย → loss → backpropagation → อัปเดต
บทสรุป
- MicroGPT เป็น โมเดลเพื่อการเรียนรู้ ที่ช่วยให้เข้าใจการทำงานภายในของ GPT ได้อย่างเป็นธรรมชาติ
- มันทำให้โครงสร้างอันซับซ้อนของ LLM ขนาดใหญ่เรียบง่ายลง เพื่อให้สามารถ สัมผัสกลไกหลักของ language model ได้โดยตรง
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
มีการบอกว่าเมื่อการฝึกเสร็จสิ้น โมเดลจะสร้างชื่ออย่าง "kamon", "karai", "anna", "anton" แต่จริง ๆ แล้วชื่อเหล่านี้ก็อยู่ในชุดข้อมูลด้วย
น่าจะใช้ชื่ออื่นจะดีกว่า — ลิงก์ชุดข้อมูล
ถึงจะบอกว่าสำหรับมือใหม่ แต่ไม่แน่ใจว่าจะมีมือใหม่สักกี่คนที่เข้าใจคำอธิบายเชิงคณิตศาสตร์แบบนี้ได้
ยกตัวอย่าง ส่วนที่อธิบายสูตร cross-entropy loss รู้สึกว่าซับซ้อนเกินไป
จะลองกลับไปคิดดูอีกที
ส่วนที่ผมยังไม่เข้าใจคือ โมเดลง่าย ๆ แบบนี้กลายเป็นสิ่งที่ ดีบักโจทย์โค้ดแบบใดก็ได้ ได้อย่างไร
เลยสงสัยว่าการอนุมานเชิงสถิติเปลี่ยนเป็น ‘ความสามารถในการให้เหตุผล’ ได้อย่างไร
พอใช้ Claude Code ทุกวัน ตอนนี้ก็เริ่มรู้สึกว่ามันทำได้จริง ๆ
แก่นสำคัญคือ “ถ้าคุณทำนายคำถัดไปที่ถูกต้องได้เสมอ สุดท้ายคุณก็จะตอบทุกคำถามได้ถูกต้อง”
เพราะอย่างนั้น ช่วงหลังเลยพัฒนาไปในทิศทางของการหา ‘คำตอบที่ถูก’ ด้วย แนวทางที่อิงการเสริมแรงเรียนรู้ อย่าง RLHF หรือ RLVR
ในทางคณิตศาสตร์มันใกล้กับ ปัญหาการหาค่าเหมาะที่สุดที่อิงแคลคูลัส มากกว่า
มันไม่ได้เรียนรู้แค่สถิติของข้อความ แต่กำลังค้นหาวิธีแก้ที่ซับซ้อนเพื่อทำนายโทเคนถัดไป
ในโครงข่ายประสาทมีองค์ประกอบเชิงสถิติอยู่ก็จริง แต่ก็มีอะไรมากกว่านั้น คล้ายสมองมนุษย์
ผมอ่านทั้งบทความแล้ว มีส่วนที่เป็นประโยชน์อยู่บ้าง แต่ก็ให้ความรู้สึกแบบ ‘แล้วค่อยไปวาดนกฮูกที่เหลือเอาเอง’
เหมือนส่วนเชื่อมระหว่างแนวคิดหายไป แต่โครงสร้างแบบอินเทอร์แอ็กทีฟก็ดี
น่าจะลงลึกกว่านี้อีกหน่อย
ช่วงนี้กำลังเป็นกระแสหรือเปล่าที่คนจงใจใส่ การสะกดหรือไวยากรณ์ผิด เพื่อแสดงว่าไม่ได้เป็นบทความที่ LLM เขียน
ทั้งในบล็อกของ Karpathy และในบทความนี้ก็เห็นคำผิดอยู่พอสมควร
เขาแค่ค้ำโครงการ Full Self Driving ของ Elon ไว้ได้นาน และก็อยู่ที่ OpenAI ไม่นานด้วย
ช่วงนี้ดูเหมือนแทบจะสนใจแต่ code golf หรือการสร้างคำใหม่
ต้นฉบับอยู่ในบล็อกของ Karpathy — ลิงก์บทความ microGPT
บางคนบอกว่ามันพื้นฐานเกินไป บางคนก็บอกว่าลึกเกินไป
แต่สำหรับคนอย่างผมที่ยังไม่ค่อยรู้ว่าตัวโมเดลทำงานอย่างไร มันเป็น ภาพรวมที่ดี
ถึงจะยังไม่เข้าใจทั้งหมด แต่ก็ดูเป็นจุดเริ่มต้นที่ดีสำหรับการเริ่มเรียนรู้
นี่เป็นหนึ่งใน บทช่วยสอนที่มีประโยชน์ที่สุด ที่ผมเคยเห็นมา
ทั้งที่เดิมไม่ได้เขียนโค้ด ตอนนี้ก็เริ่มเขียนโค้ดเพราะ AI
คำอธิบายเรียบง่ายและชัดเจนมาก เลยช่วยได้มากเวลาอยากคิดว่าจะป้อนอะไรให้ AI
ดูเหมือน T-Mobile จะบล็อกหน้าบล็อกนี้
ลิงก์หน้าแจ้งเตือนการบล็อก
อ่านบทความแล้วเข้าใจว่ามันพิมพ์ชื่อออกมาได้ แต่ก็สงสัยว่าทำไมถึงยก การสร้างชื่อ มาเป็นตัวอย่าง
จะใช้ข้อมูลแบบอื่นก็ได้เหมือนกัน