microgpt
(karpathy.github.io)- โครงสร้างโมเดลภาษาขนาดเล็กที่สุดที่นำกระบวนการทั้งหมดของการฝึกและการอนุมานของโมเดล GPT มาทำไว้ใน ไฟล์เดียว Python ล้วน ยาว 200 บรรทัด
- รวมทั้งชุดข้อมูล, tokenizer, เอนจินการหาอนุพันธ์อัตโนมัติ, โครงข่ายประสาทแบบคล้าย GPT-2, ตัวปรับเหมาะ Adam, และ ลูปการฝึกกับการอนุมาน ไว้ครบถ้วน
- ฝึกจากชุดข้อมูลชื่อคนเพื่อสร้างชื่อใหม่ พร้อมเผยให้เห็นหลักการแกนกลางของ GPT ผ่าน autograd และโครงสร้าง Transformer ที่เขียนขึ้นเอง
- ต่างจาก LLM ขนาดใหญ่ตรงที่ ทำงานด้วย Python ล้วนโดยไม่มี dependency เหลือไว้เฉพาะสาระเชิงอัลกอริทึมล้วนๆ
- หากเข้าใจ microgpt ก็จะช่วยให้เข้าใจ โครงสร้างอัลกอริทึมพื้นฐานของโมเดลขนาดใหญ่อย่าง ChatGPT ได้
ภาพรวมของ microgpt
- microgpt คือการทำ GPT แบบมินิมัลที่เขียนด้วย โค้ด Python 200 บรรทัด โดยไม่มีการพึ่งพาไลบรารีภายนอก
- ครอบคลุมทั้งชุดข้อมูล, tokenizer, autograd, โครงสร้างแบบคล้าย GPT-2, ตัวปรับเหมาะ Adam, และลูปการฝึกกับการอนุมาน
- เป็นโปรเจกต์เชิงศิลป์ที่ Karpathy สร้างขึ้นเพื่อ ย่อ LLM ให้เหลือระดับแก่นแท้ และอยู่บนแนวทางเดียวกับ micrograd, makemore, nanogpt เป็นต้น
- โค้ดทั้งหมดมีให้บน GitHub Gist, เว็บเพจ และ Google Colab
ชุดข้อมูล
- ใช้ไฟล์ข้อความที่มี ชื่อประมาณ 32,000 รายการ โดยหนึ่งบรรทัดต่อหนึ่งชื่อ
- แต่ละชื่อถือเป็นหนึ่งเอกสาร และโมเดลจะเรียนรู้แพตเทิร์นนี้เพื่อ สร้างชื่อใหม่
- ตัวอย่างผลลัพธ์หลังฝึก: kamon, ann, karai, jaire, vialan เป็นต้น
Tokenizer
- เป็น tokenizer แบบอิงตัวอักษรอย่างง่ายที่ กำหนด ID จำนวนเต็มให้กับตัวอักษรแต่ละตัวที่ไม่ซ้ำกัน
- มีทั้งหมด 27 โทเคน รวมตัวอักษร a–z และโทเคน BOS(beginning of sequence)
- แต่ละเอกสารถูกห่อในรูปแบบ
[BOS, e, m, m, a, BOS]เพื่อใช้ในการฝึก
การหาอนุพันธ์อัตโนมัติ (Autograd)
- คลาส
Valueใช้ ติดตามค่าสเกลาร์และกราเดียนต์ พร้อมสร้างกราฟการคำนวณ - เก็บ ค่าอนุพันธ์เฉพาะที่ (local gradient) ของโอเปอเรชันพื้นฐาน เช่น การบวก การคูณ การยกกำลัง ลอการิทึม เอ็กซ์โปเนนเชียล และ ReLU
- เมธอด
backward()จะ ใช้ chain rule เพื่อทำ backpropagation - เป็นการนำอัลกอริทึมเดียวกับ
.backward()ของ PyTorch มา เขียนเองโดยตรงในระดับสเกลาร์
การกำหนดค่าเริ่มต้นของพารามิเตอร์
- โมเดลมีพารามิเตอร์ประมาณ 4,192 ตัว
- ประกอบด้วย embedding table, น้ำหนัก attention, น้ำหนัก MLP, output projection เป็นต้น
- พารามิเตอร์แต่ละตัวถูกกำหนดค่าเริ่มต้นด้วย ค่าสุ่มจากการแจกแจงแบบเกาส์เซียน
สถาปัตยกรรมโมเดล
- เป็นรูปแบบที่ย่อมาจากโครงสร้าง GPT-2 โดยใช้ RMSNorm, ReLU, และ residual connection
- องค์ประกอบหลัก:
- ขั้น embedding: รวม token embedding และ positional embedding
- multi-head attention: คำนวณเวกเตอร์ Q, K, V แล้วใช้ KV cache เพื่ออาศัยข้อมูลของโทเคนก่อนหน้า
- บล็อก MLP: โครงข่าย feedforward 2 ชั้นสำหรับการคำนวณเชิงเฉพาะที่
- ขั้น output: สร้าง logit สำหรับขนาดคำศัพท์ (27)
- KV cache เปิดใช้งานอยู่แม้ระหว่างการฝึก และ backpropagation จะไหลผ่าน cache ได้
ลูปการฝึก
- ในแต่ละสเต็ปจะเลือกเอกสารแล้วทำ tokenization เป็นรูป
[BOS, ... , BOS] - โมเดลทำนายความน่าจะเป็นของโทเคนถัดไป และคำนวณ cross-entropy loss
- หลังคำนวณกราเดียนต์ด้วย
loss.backward()แล้วจะอัปเดตพารามิเตอร์ด้วย ตัวปรับเหมาะ Adam - ใช้ learning rate แบบลดลงเชิงเส้น (linear decay)
- ภายใน 1,000 สเต็ป ค่า loss ลดลงประมาณ 3.3 → 2.37
การอนุมาน (Inference)
- หลังฝึกเสร็จจะ เริ่มจากโทเคน BOS เพื่อสร้างชื่อใหม่
- ในแต่ละขั้นจะสุ่มโทเคนถัดไปตามความน่าจะเป็นจาก softmax
- ใช้ค่า temperature เพื่อปรับระดับความสร้างสรรค์ (ยิ่งต่ำยิ่งอนุรักษ์นิยม ยิ่งสูงยิ่งหลากหลาย)
- ตัวอย่างผลลัพธ์: kamon, ann, karai, jaire, vialan, karia, yeran, anna เป็นต้น
วิธีรัน
- รันได้ถ้ามี Python เท่านั้น (
python train.py) - ฝึกเสร็จภายในประมาณ 1 นาที และจะแสดงค่า loss ออกมาเป็นลำดับขั้น
- สามารถรันแบบเดียวกันได้ใน Colab notebook
ขั้นการพัฒนาโค้ด
- ขยายทีละขั้นตั้งแต่
train0.pyถึงtrain5.py- Bigram → MLP → Autograd → Attention → Multi-head → Adam
- แต่ละขั้นสามารถดูได้จากรีวิชันของ build_microgpt.py ใน Gist
ความต่างจาก LLM จริง
- ข้อมูล: microgpt ใช้ชื่อ 32K รายการ ส่วน LLM จริงใช้โทเคนระดับล้านล้าน
- Tokenizer: ระดับตัวอักษร vs. subword แบบ BPE
- Autograd: Python ระดับสเกลาร์ vs. การคำนวณ tensor บน GPU
- สถาปัตยกรรม: พารามิเตอร์ 4K vs. พารามิเตอร์ระดับหลายแสนล้าน
- การฝึก: วนเอกสารเดี่ยวซ้ำๆ vs. การฝึกแบบ batch ขนาดใหญ่และ mixed precision
- การปรับเหมาะ: Adam แบบง่าย vs. hyperparameter และ scheduling ที่ปรับละเอียดอย่างมาก
- ขั้นหลังการฝึก: พัฒนาต่อเป็นรูปแบบ ChatGPT ผ่านขั้น SFT และ RL
- โครงสร้างพื้นฐานการอนุมาน: การกระจายงานบน GPU, การจัดการ KV cache, quantization, speculative decoding เป็นต้น
สรุป FAQ
- โมเดลคือ ฟังก์ชันทางคณิตศาสตร์ ที่แปลงโทเคนอินพุตให้เป็นความน่าจะเป็นของโทเคนถัดไป
- มันไม่ได้ “เข้าใจ” แต่ทำนายผ่าน การเรียนรู้กฎเชิงสถิติ
- นี่คือการย่อ ลูปการทำนายโทเคนแบบเดียวกับ ChatGPT ลงมาในรูปแบบเล็กลง
- “hallucination” เป็น ผลลัพธ์ตามธรรมชาติของการสุ่มเชิงความน่าจะเป็น
- แม้จะช้า แต่ก็ จำลองอัลกอริทึมแกนกลางของ LLM ได้อย่างครบถ้วน
- หากต้องการผลลัพธ์ที่ดีขึ้น สามารถปรับจำนวนสเต็ปการฝึก ขนาดโมเดล และชุดข้อมูลได้
- หากเปลี่ยนชุดข้อมูล ก็สามารถเรียนรู้แพตเทิร์นหลากหลายได้ เช่น ชื่อเมือง, ชื่อโปเกมอน, บทกวี เป็นต้น
microgpt เป็นโมเดลเชิงการศึกษาและเชิงทดลองที่นำอัลกอริทึมแกนหลักทั้งหมดของ LLM มาเขียนในหน่วยที่เล็กที่สุด และเป็นตัวอย่างที่เผยให้เห็นกลไกการทำงานของโมเดลภาษาขนาดใหญ่อย่างครบถ้วน
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
มีคนหนึ่งดัดแปลง microgpt เพื่อทำ GPT ขนาดเล็กที่สร้างชื่อภาษาเกาหลีได้
และยังมีหน้าเว็บที่แสดงภาพกระบวนการทั้งหมดด้วย — สามารถ สำรวจทั้งพายป์ไลน์ ได้ตั้งแต่ tokenizing ไปจนถึง inference
ลองใช้งานได้โดยตรงที่ English GPT lab
ดูได้จาก PyTorch char_rnn tutorial
อธิบายได้ดีตั้งแต่ tokenizing, embedding, attention, loss·gradient, training, inference, การเปรียบเทียบกับ Real GPT
ตัวเว็บไซต์เองก็ใกล้เคียงกับ งานภาพแบบ AI-generated ที่อิงจากบล็อกโพสต์ต้นฉบับมากกว่า
ผมพอร์ต microgpt ไปเป็น C++
ลิงก์โค้ด
จำนวนบรรทัดโค้ดมากขึ้น 2 เท่า แต่เร็วขึ้น 10 เท่า
ส่วนที่ยากที่สุดคือการแทนคลาส Value ใน C++ และสุดท้ายก็ใช้ shared_ptr
ผมเคยสงสัยว่า “hallucination” คืออะไรกันแน่
โมเดลก็แค่สุ่ม token จากการกระจายความน่าจะเป็นเท่านั้น ไม่มีแนวคิดเรื่องความจริง
ก็เลยเกิดคำถามว่า LLM จะสามารถมี คะแนนความเชื่อมั่นต่อคำตอบของตัวเอง ได้หรือไม่
โมเดลที่ผ่าน pretraining จะมีการปรับเทียบอยู่บ้าง แต่หลัง การทำตามคำสั่ง (post-training) มันจะพัง
งานวิจัยที่เกี่ยวข้อง: บทความ 1, บทความ 2
เหมือนช่วงความเชื่อมั่นในสถิติเมื่อไม่รู้ประชากร ความน่าจะเป็นของ LLM ก็ไม่ได้เชื่อมโยงกับโลกจริง
สุดท้ายแล้ว LLM ก็เหมือนคนที่อ่านแต่หนังสือโดยไม่เคยมีประสบการณ์กับโลกจริง
แต่ความน่าจะเป็นนี้ไม่ใช่ “ความน่าจะเป็นที่จะเป็นความจริง” แต่คือ “ความน่าจะเป็นที่ฉันจะปล่อย token นี้ออกมาในสถานการณ์นี้”
ผมแปลง microgpt เป็น Rust เพื่อใช้เรียนรู้
microgpt-rs
ส่วนที่ยากที่สุดคือการแทน โครงสร้างกราฟ autograd ด้วย type ของ Rust
ตอนนี้กำลังปรับให้รันในเบราว์เซอร์ผ่าน WebAssembly และจะเขียนลงบล็อก
โค้ดของ Karpathy นั้น กะทัดรัดและงดงามราวบทกวี จริง ๆ
โค้ดสวยและอ่านง่าย แต่ถ้ามีคำอธิบายแบบคอมเมนต์ทีละบรรทัดเหมือน backbone.js ก็คงดี
ดู เอกสาร Backbone
โปรเจกต์ Docco ก็เป็นเครื่องมือเจ๋ง ๆ จากผู้สร้างคนเดียวกัน
มี โค้ดเวอร์ชัน HTML ด้วย
microgpt blog
ต้องขอบคุณวิดีโอและโค้ดของ Karpathy ที่ทำให้ผมรู้สึกว่าเพิ่งเข้าใจ gradient descent, backpropagation, chain rule อย่างแท้จริงเป็นครั้งแรก
ตอนดูแต่คณิตศาสตร์อย่างเดียวมันสับสน แต่พอดูพร้อมโค้ดแล้วทุกอย่างชัดเจนขึ้น
สำหรับผมมันเป็นประสบการณ์แบบ ความสำเร็จครั้งสำคัญในชีวิต
อย่างที่ Karpathy บอก ถ้าอยากเข้าใจจริง ๆ ต้อง ลองสอนคนอื่นดู
น่าแปลกใจที่โปรเจกต์นี้เพิ่งขึ้น HN ตอนนี้
ผมทำเวอร์ชัน JS 35 บรรทัดกับเวอร์ชัน Python ชื่อ PicoGPT
และ รันได้บนเว็บทันที
มันยังเป็น LLM ขนาดจิ๋วที่รันผ่าน QR code ได้ด้วย
เธรดที่เกี่ยวข้อง: ลิงก์ 1, ลิงก์ 2
ผมทำโค้ด microgpt ให้อยู่ในรูป บล็อกโพสต์แบบภาพประกอบ
ลิงก์บล็อก
มันแสดงให้ดูแบบอินเทอร์แอ็กทีฟตามลำดับการไหลของโค้ด
แต่จริง ๆ แล้วทั้งสี่ชื่อนี้ มีอยู่ในชุดข้อมูลอยู่แล้ว
ช่วงนี้เทรนด์ ‘micro’ ใน AI น่าสนใจดี
แทนที่จะขยายโมเดลให้ใหญ่ขึ้นอย่างเดียว โมเดลที่ เล็กและโฟกัสเฉพาะทาง กลับให้ประสิทธิภาพมากขึ้น
ผมใช้ Gemini Flash สำหรับการวิเคราะห์โดเมนอยู่จริง และอัตราส่วนความเร็วต่อค่าใช้จ่ายก็ดีกว่ามาก
แค่ความต่างของ latency ก็ทำให้ชนิดของผลิตภัณฑ์ที่สร้างได้เปลี่ยนไปแล้ว
ถ้าจะเรียกว่า microgpt ก็ดูเล็กกว่า nanogpt เสียอีก เลยคิดว่า picogpt น่าจะเหมาะกว่า
ถึงอย่างนั้นก็ยังเป็นโปรเจกต์ที่เจ๋งมาก