Maksim Sekretov ได้ปล่อย transformer ขนาดเล็กที่เขียนด้วย pure-JavaScript ซึ่งทำงานบน Node.js และแสดงค่า scalar, weight และ gradient ทุกตัวในขณะที่กำลังฝึกฝน repo tiny-language-model-neuro-js ช่วยให้ใครก็ตามสามารถเริ่มต้นด้วยโมเดลแบบสุ่ม ป้อน prompt เช่น “can human read ?” ดูมันล้มเหลว จากนั้นรันคำสั่งฝึกฝนเพียงคำสั่งเดียวแล้วดูคำตอบที่ถูกต้องขึ้นมา
ทำไมเดโม LLM ส่วนใหญ่ถึงซ่อนคณิตศาสตร์ไว้เบื้องหลัง
บทเรียนเรื่องโมเดลภาษาทั่วไปมักพึ่งพา TensorFlow หรือ PyTorch เฟรมเวิร์กเหล่านั้นจะสร้าง computation graphs และคำนวณ gradient ให้โดยอัตโนมัติอยู่เบื้องหลัง ทำให้ผู้เรียนเห็นเพียงโค้ดระดับสูง (high-level code) และกราฟความสูญเสีย (loss curves) เท่านั้น การทำงานเบื้องหลัง—ไม่ว่าจะเป็นวิธีที่แต่ละ token กลายเป็น embedding, วิธีการคำนวณ attention scores หรือวิธีที่ gradient ไหลย้อนกลับผ่านเมทริกซ์แต่ละตัว—ล้วนไม่สามารถมองเห็นได้
สิ่งที่โมเดล JavaScript นี้ทำแตกต่างออกไป
การนำเสนอของ Sekretov ตัดทอนทุกอย่างลงจนเหลือเพียงสคริปต์ Node.js เพียงไฟล์เดียวโดยไม่มี dependency อื่นๆ ขั้นตอนการฝึกฝน (training pipeline) เป็นไปตามลำดับที่เข้าใจง่าย:
- Tokenization
- Embeddings
- Causal transformer blocks
- Multi-head self-attention
- Feed-forward networks (FFN)
- Language-model head และ softmax
- Cross-entropy loss
- Backpropagation
การรัน node src/train.js --generalize --adaptive-teach จะเริ่มลูปการฝึกฝนแบบเต็มรูปแบบ เนื่องจากโค้ดเป็น JavaScript ธรรมดา tensor แต่ละตัวจึงเป็นเพียง array ง่ายๆ, การคูณเมทริกซ์แต่ละครั้งคือลูปที่ชัดเจน และ gradient ทุกตัวจะอยู่ติดกับ weight ต้นทางของมัน
จากการสุ่มเดา สู่คำตอบที่ถูกต้อง
เมื่อเริ่มโมเดล พารามิเตอร์ทั้งหมดจะเป็นการสุ่ม การถามว่า “can human read ?” จะได้คำตอบที่อ่านไม่รู้เรื่อง หลังจากผ่านช่วง pre-training สั้นๆ และการทำ supervised fine-tuning (SFT) หนึ่งรอบ prompt เดิมก็จะให้คำตอบที่สมเหตุสมผล สัญญาณจากครู (teacher signal)—ซึ่งก็คือลำดับ token ที่ถูกต้องที่ป้อนผ่าน loss function—จะแพร่กระจายย้อนกลับผ่าน embeddings, attention heads และชั้น FFN เพื่ออัปเดตค่า scalar แต่ละตัวตามลำดับ
การจัดการกับปัญหาการลืมข้อมูลเก่าอย่างรุนแรง (catastrophic forgetting)
การรันในช่วงแรกแสดงให้เห็นปัญหาคลาสสิก: การเรียนรู้ข้อเท็จจริงใหม่ทำให้ข้อมูลที่เคยเรียนรู้ไปแล้วหายไป Sekretov แก้ปัญหานี้ด้วยการทำ rehearsal—คือการนำตัวอย่างเก่ากลับมานำเสนอใหม่ในขณะที่กำลังป้อนข้อมูลใหม่เข้าไป การฝึกฝนจะหยุดลงก็ต่อเมื่อทุก target token มีความน่าจะเป็นอย่างน้อย 95% และผ่านการตรวจสอบติดต่อกันสิบครั้ง ลูปที่เรียบง่ายนี้แสดงให้เห็นถึงความท้าทายหลักในการวิจัยโดยไม่ต้องใช้ไลบรารีภายนอกใดๆ
ใครจะได้ประโยชน์ และใครที่อาจถูกมองข้าม
โปรเจกต์นี้ไม่ได้มาแข่งกับ LLM เชิงพาณิชย์ที่ทำงานบนพารามิเตอร์ระดับพันล้านและคลัสเตอร์ GPU ช่องว่างด้านประสิทธิภาพทำให้มันไม่เหมาะสำหรับงานระดับ production แต่กลับทำให้โมเดลนี้กลายเป็นสื่อการสอนที่โปร่งใส นักเรียน นักเล่น (hobbyists) และนักวิจัยที่ประสบปัญหาในการมองเข้าไปในเฟรมเวิร์กแบบกล่องดำ (black-box) ตอนนี้มี sandbox ที่คณิตศาสตร์คือโค้ดที่จับต้องได้จริงๆ
สิ่งที่ยังขาดหายไปและทิศทางในอนาคตของโปรเจกต์
เนื่องจากการนำเสนอถูกออกแบบมาให้เรียบง่ายที่สุด จึงทำให้โค้ดอ่านง่ายแต่ก็จำกัดความสามารถในการขยายขนาด (scalability)
สิ่งที่น่าติดตามต่อไป
repository นี้เปิดเป็นสาธารณะบน GitHub แล้ว
บทสรุป: ด้วยการตัดทอน transformer ลงจนเหลือเพียง pure JavaScript ทำให้ Sekretov เปลี่ยนเทคโนโลยีที่ขึ้นชื่อเรื่องความซับซ้อนและคลุมเครือ ให้กลายเป็นสคริปต์ที่อ่านง่ายและแก้ไขได้ สิ่งที่ต้องแลกมาคือความเร็ว แต่สิ่งที่ได้รับคือความเข้าใจ—ตอนนี้ใครๆ ก็สามารถเฝ้าดูโมเดลภาษาเรียนรู้ ลืม และเรียนรู้ใหม่ได้ ทีละ scalar
