3 คะแนน โดย GN⁺ 2026-03-02 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • โครงสร้างโมเดลภาษาขนาดเล็กที่สุดที่นำกระบวนการทั้งหมดของการฝึกและการอนุมานของโมเดล 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 ความคิดเห็น

 
GN⁺ 2026-03-02
ความคิดเห็นจาก Hacker News
  • มีคนหนึ่งดัดแปลง microgpt เพื่อทำ GPT ขนาดเล็กที่สร้างชื่อภาษาเกาหลีได้
    และยังมีหน้าเว็บที่แสดงภาพกระบวนการทั้งหมดด้วย — สามารถ สำรวจทั้งพายป์ไลน์ ได้ตั้งแต่ tokenizing ไปจนถึง inference
    ลองใช้งานได้โดยตรงที่ English GPT lab

    • ของแบบนี้ทำได้ง่ายมากแม้จะใช้ โมเดลที่เบากว่านี้มาก
      ดูได้จาก PyTorch char_rnn tutorial
    • ผมไม่ได้เกี่ยวข้องกับผู้ทำเว็บไซต์นี้ แต่เป็นเว็บไซต์ที่มีประโยชน์มากสำหรับการเรียนรู้โครงสร้างภายในของ LLM
      อธิบายได้ดีตั้งแต่ tokenizing, embedding, attention, loss·gradient, training, inference, การเปรียบเทียบกับ Real GPT
    • คำว่า “ดัดแปลง” จริง ๆ แล้วก็แทบจะแค่เปลี่ยนรายชื่อชื่อภาษาอังกฤษเป็นชื่อภาษาเกาหลี
      ตัวเว็บไซต์เองก็ใกล้เคียงกับ งานภาพแบบ AI-generated ที่อิงจากบล็อกโพสต์ต้นฉบับมากกว่า
  • ผมพอร์ต microgpt ไปเป็น C++
    ลิงก์โค้ด
    จำนวนบรรทัดโค้ดมากขึ้น 2 เท่า แต่เร็วขึ้น 10 เท่า
    ส่วนที่ยากที่สุดคือการแทนคลาส Value ใน C++ และสุดท้ายก็ใช้ shared_ptr

    • ผมทำ explicit backpropagation โดยไม่ใช้ autodiff และมันเร็วกว่า Python 8 เท่า
  • ผมเคยสงสัยว่า “hallucination” คืออะไรกันแน่
    โมเดลก็แค่สุ่ม token จากการกระจายความน่าจะเป็นเท่านั้น ไม่มีแนวคิดเรื่องความจริง
    ก็เลยเกิดคำถามว่า LLM จะสามารถมี คะแนนความเชื่อมั่นต่อคำตอบของตัวเอง ได้หรือไม่

    • โมเดลสามารถรายงาน confidence ของการกระจายเอาต์พุตได้ แต่ไม่ได้แปลว่ามันถูกปรับเทียบ (calibrated) อย่างแม่นยำจริง
      โมเดลที่ผ่าน pretraining จะมีการปรับเทียบอยู่บ้าง แต่หลัง การทำตามคำสั่ง (post-training) มันจะพัง
      งานวิจัยที่เกี่ยวข้อง: บทความ 1, บทความ 2
    • คะแนนความเชื่อมั่นไม่มีความหมาย ถ้าไม่รู้ วิธีการสุ่มตัวอย่าง ของข้อมูลฝึก
      เหมือนช่วงความเชื่อมั่นในสถิติเมื่อไม่รู้ประชากร ความน่าจะเป็นของ LLM ก็ไม่ได้เชื่อมโยงกับโลกจริง
      สุดท้ายแล้ว LLM ก็เหมือนคนที่อ่านแต่หนังสือโดยไม่เคยมีประสบการณ์กับโลกจริง
    • ในทางปฏิบัติ LLM ส่งคืน การกระจายความน่าจะเป็น แล้วสุ่มจากมันเพื่อสร้าง token
      แต่ความน่าจะเป็นนี้ไม่ใช่ “ความน่าจะเป็นที่จะเป็นความจริง” แต่คือ “ความน่าจะเป็นที่ฉันจะปล่อย token นี้ออกมาในสถานการณ์นี้”
    • มันสร้างได้ก็จริง แต่ เพราะไม่รู้ ‘การกระจายจริง’ ความเชื่อมั่นนั้นจึงไม่มีความหมาย
    • ประโยคอย่าง “ไม่แน่ใจนัก แต่คิดว่าน่าจะเป็นแบบนี้” ไม่ได้แสดงออกมาในผลลัพธ์ แต่มีอยู่ใน กระบวนการอนุมานภายใน
  • ผมแปลง microgpt เป็น Rust เพื่อใช้เรียนรู้
    microgpt-rs
    ส่วนที่ยากที่สุดคือการแทน โครงสร้างกราฟ autograd ด้วย type ของ Rust
    ตอนนี้กำลังปรับให้รันในเบราว์เซอร์ผ่าน WebAssembly และจะเขียนลงบล็อก
    โค้ดของ Karpathy นั้น กะทัดรัดและงดงามราวบทกวี จริง ๆ

    • การ เก็บค่าอนุพันธ์ไว้ในโครงสร้างน้ำหนัก ค่อนข้างเป็นการแฮ็ก แต่คนส่วนใหญ่ก็ทำกันแบบนั้น
    • ผมเองก็อยากลองเขียนมันในภาษาอื่นสักครั้ง
  • โค้ดสวยและอ่านง่าย แต่ถ้ามีคำอธิบายแบบคอมเมนต์ทีละบรรทัดเหมือน backbone.js ก็คงดี
    ดู เอกสาร Backbone

    • ซอร์สโค้ดที่มีคำอธิบายของ Backbone ถูกสร้างด้วย Docco
      โปรเจกต์ Docco ก็เป็นเครื่องมือเจ๋ง ๆ จากผู้สร้างคนเดียวกัน
    • เป็นตัวอย่างของ literate programming ที่สวยมากจริง ๆ
      มี โค้ดเวอร์ชัน HTML ด้วย
    • ยังมี บล็อก walkthrough ของ Karpathy ด้วย
      microgpt blog
    • หรือจะให้ LLM ประสิทธิภาพสูงอธิบายให้ ก็ได้
  • ต้องขอบคุณวิดีโอและโค้ดของ Karpathy ที่ทำให้ผมรู้สึกว่าเพิ่งเข้าใจ gradient descent, backpropagation, chain rule อย่างแท้จริงเป็นครั้งแรก
    ตอนดูแต่คณิตศาสตร์อย่างเดียวมันสับสน แต่พอดูพร้อมโค้ดแล้วทุกอย่างชัดเจนขึ้น
    สำหรับผมมันเป็นประสบการณ์แบบ ความสำเร็จครั้งสำคัญในชีวิต

    • ผมเองก็จะลอง อธิบายมันแบบให้เข้าใจจากสัญชาตญาณ ดู
      อย่างที่ Karpathy บอก ถ้าอยากเข้าใจจริง ๆ ต้อง ลองสอนคนอื่นดู
  • น่าแปลกใจที่โปรเจกต์นี้เพิ่งขึ้น HN ตอนนี้
    ผมทำเวอร์ชัน JS 35 บรรทัดกับเวอร์ชัน Python ชื่อ PicoGPT
    และ รันได้บนเว็บทันที
    มันยังเป็น LLM ขนาดจิ๋วที่รันผ่าน QR code ได้ด้วย

    • ผมก็แปลกใจเหมือนกัน ไม่นึกว่าโปรเจกต์เจ๋ง ๆ แบบนี้จะ ใช้เวลาตั้ง 2 สัปดาห์กว่าจะขึ้นหน้าแรกของ HN
      เธรดที่เกี่ยวข้อง: ลิงก์ 1, ลิงก์ 2
    • จริง ๆ แล้วเคยถูกโพสต์มาก่อนแล้ว — โพสต์ก่อนหน้า
  • ผมทำโค้ด microgpt ให้อยู่ในรูป บล็อกโพสต์แบบภาพประกอบ
    ลิงก์บล็อก
    มันแสดงให้ดูแบบอินเทอร์แอ็กทีฟตามลำดับการไหลของโค้ด

    • เขาบอกว่าหลังฝึกเสร็จมันจะสร้างชื่ออย่าง “kamon”, “karai”, “anna”, “anton” ได้
      แต่จริง ๆ แล้วทั้งสี่ชื่อนี้ มีอยู่ในชุดข้อมูลอยู่แล้ว
    • บทความนี้น่าจะ มีคุณค่าเพียงพอที่จะโพสต์เป็นข่าวแยกบน HN
    • ปกติผมค่อนข้างวิจารณ์บล็อกที่ให้ LLM ช่วยเขียน แต่ชิ้นนี้เป็น ตัวอย่างที่ยอดเยี่ยมจริง ๆ
    • แม้แต่สำหรับผมที่เป็นมือใหม่ด้าน ML มันก็ ช่วยได้พอ ๆ กับต้นฉบับของ Karpathy
    • งานดีมากจริง ๆ
  • ช่วงนี้เทรนด์ ‘micro’ ใน AI น่าสนใจดี
    แทนที่จะขยายโมเดลให้ใหญ่ขึ้นอย่างเดียว โมเดลที่ เล็กและโฟกัสเฉพาะทาง กลับให้ประสิทธิภาพมากขึ้น
    ผมใช้ Gemini Flash สำหรับการวิเคราะห์โดเมนอยู่จริง และอัตราส่วนความเร็วต่อค่าใช้จ่ายก็ดีกว่ามาก
    แค่ความต่างของ latency ก็ทำให้ชนิดของผลิตภัณฑ์ที่สร้างได้เปลี่ยนไปแล้ว

    • แต่กรณีนี้เป็น micro model เพื่อ จุดประสงค์ด้านการเรียนรู้ มากกว่าการใช้งานจริง
  • ถ้าจะเรียกว่า microgpt ก็ดูเล็กกว่า nanogpt เสียอีก เลยคิดว่า picogpt น่าจะเหมาะกว่า
    ถึงอย่างนั้นก็ยังเป็นโปรเจกต์ที่เจ๋งมาก