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