สวัสดีครับ/ค่ะ เมื่อประมาณหนึ่งเดือนก่อน ผม/ฉันได้สร้างและเผยแพร่โมเดล text Diffusion ขึ้นมาตั้งแต่ต้น พอช่วงหลังได้ไล่อ่าน GeekNews ก็พลันนึกขึ้นได้ เลยเพิ่งนำมาโพสต์ตอนนี้ครับ/ค่ะ


ที่มาของการสร้าง

หลังจากได้ดู MicroGPT ของ Andrej Karpathy ก็รู้สึกว่า “อ๋อ โค้ดสั้นขนาดนี้ก็อธิบายแก่นสำคัญของ GPT ได้เหมือนกันนะ” พอดีกำลังอยากศึกษา Diffusion อยู่ด้วย จึงเริ่มโปรเจกต์เชิงการศึกษานี้จากความคิดว่า “ถ้าทำโค้ดที่ช่วยให้เข้าใจ Diffusion ได้ด้วยแนวทางแบบเดียวกัน ก็น่าจะสนุกดี”


AR vs Diffusion: ต่างกันอย่างไร?

การสร้างข้อความในยุค LLM แทบทั้งหมดใช้แนวทาง Autoregressive (AR) คือทำนายโทเค็นทีละตัวจากซ้ายไปขวา

Discrete Diffusion กลับกัน โดยวางทั้งซีเควนซ์ไว้พร้อมกัน แล้วค่อย ๆ กู้คืนจาก noise (masking) อย่างเป็นลำดับ

ยกตัวอย่างชื่อ "emma":  
  
Forward (การฝึก - เพิ่ม noise):  
  t=0 :  e m m a   ← ต้นฉบับ  
  t=25:  e _ m a   ← masked บางส่วน  
  t=50:  _ _ m _   ← masked มากขึ้น  
  t=100: _ _ _ _   ← masked ทั้งหมด  
  
Reverse (การสร้าง - ลบ noise):  
  t=100: _ _ _ _   ← เริ่มจากสถานะว่าง  
  t=75:  _ m _ _   ← กู้คืนจากตำแหน่งที่มั่นใจก่อน  
  t=50:  e m _ a  
  t=0 :  e m m a   ← เสร็จสมบูรณ์  

ถ้า AR คือ “การเขียนคำทีละตัวอักษร” Diffusion ก็จะใกล้เคียงกับ “การแก้ปริศนาอักษรไขว้” มากกว่า


โครงสร้างการใช้งาน

มีทั้งหมด 3 เวอร์ชันให้เลือกดูตามระดับความยาก

  • train_minimal.py — 2-layer MLP / ใช้แค่ NumPy (ง่ายที่สุด)
  • train_pure.py — 3-layer MLP + skip connection / ใช้แค่ NumPy
  • train.py — 4-layer Transformer / ใช้ PyTorch

ทั้งสามเวอร์ชันใช้ diffusion loop เดียวกัน ต่างกันเฉพาะสถาปัตยกรรมของ denoiser
ข้อมูลสำหรับการฝึกคือชื่อภาษาอังกฤษ 32,000 ชื่อ และมีพารามิเตอร์ประมาณ 170K~239K

สามารถลองรันได้ทันที:

pip install numpy  # เวอร์ชันขั้นต่ำ  
python train_minimal.py  

ยินดีรับ feedback หรือ PR ครับ/ค่ะ!

ยังไม่มีความคิดเห็น

ยังไม่มีความคิดเห็น