บันทึก / บทความ

คุยกับ AI ตอนที่ 8: ตาม token ผ่าน Transformer ทีละขั้น

จาก Tokenizer และ Embedding ผ่าน Attention, MLP และ Residual Stream ไปจนถึง Logits, Softmax และการเลือก token ถัดไป

ตอนที่ 8 จาก 11 ตอนในชุด คุยกับ AI: จากการ Train LLM ถึง AGI

บันทึกบทสนทนาระหว่าง นพ.สุทธิศักดิ์ เด่นดวงใจ กับ ChatGPT-5.6 Reasoning Instant จากแชตต้นฉบับ คงคำอธิบายและตัวอย่างของ ChatGPT ไว้ โดยปรับหัวข้อ ตาราง และสัญลักษณ์สมการให้อ่านบนเว็บได้สะดวก

ดูสารบัญทั้งชุด

ผม: เล่าต่อ

ChatGPT-5.6 Reasoning Instant:

ได้ครับ คราวนี้เราจะ ผ่า LLM หนึ่งตัวตั้งแต่ input จน token โผล่บนจอ 🔬🧠

สมมติคุณพิมพ์:

เมืองหลวงของญี่ปุ่นคือ

แล้วโมเดลตอบ:

โตเกียว

สิ่งที่เกิดข้างในไม่ได้เป็น ค้นฐานข้อมูล → เจอ Tokyo แต่เป็น pipeline ประมาณนี้:

Text
 ↓
Tokenizer
 ↓
Token IDs
 ↓
Embeddings
 ↓
Transformer blocks × N
 ↓
Logits
 ↓
Softmax
 ↓
เลือก next token
 ↓
เอา token ใหม่กลับเข้าไป
 ↓
ทำซ้ำ

1. Tokenizer: หั่นข้อความก่อน

LLM ไม่ได้อ่านตัวอักษรแบบมนุษย์โดยตรง

ข้อความ:

The cat is sleeping.

อาจถูกแบ่งประมาณ:

["The", " cat", " is", " sleeping", "."]

แต่คำยาวหรือคำแปลกอาจถูกแยก:

"unbelievable"

→ ["un", "believ", "able"]

ภาษาไทยก็มีความน่าสนใจเพราะเราไม่ได้เว้นวรรคทุกคำ Tokenizer จึงไม่ได้หมายความว่า:

1 token = 1 คำ

เด็ดขาด

Token อาจเป็น:

คำ
ส่วนของคำ
เครื่องหมาย
ช่องว่าง
code fragment
byte sequence
ฯลฯ

จากนั้นแต่ละ token ถูก map เป็น integer:

"The"   → 791
" cat"  → 8415
" is"   → 374

ตัวเลขพวกนี้เรียกว่า Token IDs


2. แต่เลข 8415 ไม่มี "ความหมาย"

ถ้า:

cat = 8415
dog = 5672

ไม่ได้แปลว่า:

8415 ใกล้ 5672
ดังนั้น cat คล้าย dog

ID เป็นแค่ index

เราจึงต้องมี Embedding

ประมาณ:

Token ID 8415
     ↓
Embedding table
     ↓
[0.18, -0.42, 0.73, 0.11, ...]

จาก token หนึ่งตัว กลายเป็น vector ที่มีมิติสูง

เรียกว่า:

Embedding vector


3. Embedding ทำให้ความหมายกลายเป็น geometry

นี่คือแนวคิดที่สวยมากของ neural networks

สิ่งต่าง ๆ ไม่ได้ถูกแทนด้วยคำอธิบาย:

CAT:
animal=true
legs=4
cute=maybe

แต่ถูกแทนใน vector space

เชิงแนวคิด:

             animals
                 ↑
        cat •    │    • dog
                 │
            • tiger
                 │
─────────────────┼────────→ vehicles
                 │
                 │      • car
                 │
                 │    • truck

ของจริงมีหลายพันมิติและ representation เปลี่ยนไปตาม layer ดังนั้นภาพ 2D นี้เป็นเพียง intuition


4. Position ก็ต้องเข้าไปด้วย

ดูสองประโยค:

Dog bites man.

กับ

Man bites dog.

tokens คล้ายกัน แต่ความหมายต่างกันมาก 🐕😱

ดังนั้นโมเดลต้องรู้ตำแหน่ง/ลำดับด้วย

architecture สมัยใหม่มีวิธี encode positional information หลายแบบ เช่น positional encodings หรือเทคนิคเชิง relative/rotary position

conceptually:

dog + position 1
bites + position 2
man + position 3

จึงรู้ว่าใครอยู่ตรงไหนใน sequence


5. แล้วเข้า Transformer Block

ตอนนี้เรามี:

Token embeddings
       ↓
┌──────────────────┐
│ Transformer      │
│ Block 1          │
└────────┬─────────┘
         ↓
┌──────────────────┐
│ Transformer      │
│ Block 2          │
└────────┬─────────┘
         ↓
       ...
         ↓
┌──────────────────┐
│ Transformer      │
│ Block N          │
└──────────────────┘

แต่ละ block โดยภาพรวมมีองค์ประกอบสำคัญอย่าง:

Attention
+
MLP / Feed-forward network
+
Normalization
+
Residual connections

architecture จริงแตกต่างกันได้ แต่โครงนี้ใช้เป็น mental model ได้ดี


6. Attention: "ตอนนี้ควรมองอะไร?"

สมมติ:

John gave Peter his book because he trusted him.

ตอนประมวลผลคำต่าง ๆ โมเดลต้องจับความสัมพันธ์ว่า:

he
↓
John?

him
↓
Peter?

Attention ช่วยให้แต่ละตำแหน่งใช้ information จากตำแหน่งอื่น

เราพูดถึง Q K V ไปแล้ว:

Q = Query
K = Key
V = Value

สูตร:

Attention(Q,K,V) = softmax((QKᵀ) / √dₖ) V

ในภาษาโลกมนุษย์:

Query:
ฉันต้องการข้อมูลอะไร?

Key:
ข้อมูลแต่ละตำแหน่งเกี่ยวข้องแค่ไหน?

Value:
ถ้าเกี่ยวข้อง เอาข้อมูลอะไรมาใช้?

7. Multi-Head Attention

ไม่ได้มี attention ชุดเดียว

มีหลาย heads

             ┌→ Head 1
             │
Input ───────┼→ Head 2
             │
             ├→ Head 3
             │
             └→ Head ...

แต่ละ head สามารถเรียนรู้รูปแบบความสัมพันธ์ที่แตกต่างกัน

เชิง intuition อาจมีบาง head ที่ useful สำหรับ:

pronoun → noun

function call → definition

opening bracket → closing bracket

country → capital

subject → verb

แต่ต้องระวังว่าเราไม่สามารถติดป้ายทุก head ได้สวย ๆ ว่า “นี่คือ Country Head” เสมอไป

ของจริง distributed และยุ่งเหยิงกว่านั้น


8. Attention ไม่ใช่ทั้งหมดของ Transformer

ตรงนี้คนมักลืม

มีอีกก้อนใหญ่มากคือ:

MLP / Feed-forward network

ประมาณ:

Representation
     ↓
Linear
     ↓
Activation
     ↓
Linear
     ↓
New representation

ถ้า Attention คล้าย:

เอาข้อมูลจากตำแหน่งอื่นมาประกอบ

MLP สามารถมองแบบหยาบ ๆ ว่า:

ประมวล/transform features ที่ตำแหน่งนั้น

ทั้งสองอย่างทำงานร่วมกันตลอดหลายสิบหรือหลายร้อย layers


9. Residual Stream คือถนนสายหลัก

นี่เป็น concept ที่น่าสนใจมาก

แทนที่จะให้แต่ละ layer ทำลาย representation เดิมแล้วสร้างใหม่หมด:

Layer1 → Layer2 → Layer3

มี residual connection ประมาณ:

x_new = x + f(x)

คือ:

ข้อมูลเดิม ───────────────┐
                          +
Layer คำนวณอะไรใหม่ ─────┘
                          ↓
                  representation ใหม่

แต่ละ layer จึงเหมือนเขียนข้อมูลเพิ่มเติมลงบนกระแส representation

เปรียบได้กับ whiteboard ที่หลายทีมเข้ามาเติม annotation มากกว่าลบกระดานแล้วเขียนใหม่ทุกครั้ง


10. จากคำธรรมดา representation เริ่ม contextualized

สมมติคำว่า:

bank

ใน:

I deposited money at the bank.

กับ:

We sat on the river bank.

ตอนเริ่ม token อาจมี embedding ใกล้เคียงกัน

แต่หลังผ่าน Transformer layers:

bank + money + deposit
        ↓
financial institution

อีกกรณี:

bank + river + water
        ↓
river edge

ดังนั้น representation ของ token ไม่ได้ตายตัว

มันถูก contextualize

นี่คือหนึ่งในความสามารถสำคัญของ Transformer


11. ทีนี้กลับมาที่คำถามญี่ปุ่น

เราให้:

เมืองหลวงของญี่ปุ่นคือ

ผ่าน layers ไปเรื่อย ๆ

representation ตำแหน่งสุดท้ายอาจ encode ข้อมูลที่เกี่ยวข้องกับ:

question
capital
Japan
geography
expected answer
Thai language

จากนั้นผ่าน output projection

แล้วได้ตัวเลขสำหรับ token ทุกตัวใน vocabulary

เรียกว่า:

Logits

ประมาณ:

Token             Logit

โตเกียว            15.8
โอซาก้า             9.1
เกียวโต             8.7
กรุงเทพฯ            2.1
แมว                -3.4
banana             -5.7
...

12. Logit ยังไม่ใช่ probability

เราเอา logits ผ่าน Softmax

P_i = exp(z_i) / Σ_j exp(z_j)

แล้วได้ประมาณ:

โตเกียว     94.2%
โอซาก้า      2.8%
เกียวโต      1.9%
อื่น ๆ       1.1%

นี่คือ:

P(next token | context)

หัวใจที่เราเริ่มคุยกันตั้งแต่ตอนแรกกลับมาแล้ว 🔄


13. แล้วเลือก token ไหน?

วิธีง่ายที่สุด:

เลือก token probability สูงสุด

เรียกประมาณว่า greedy decoding

โตเกียว 94%
      ↓
เลือก "โตเกียว"

แต่ถ้าทำอย่างนี้ตลอด output อาจแข็งและ predictable มาก

จึงมี sampling

เช่น:

A    50%
B    30%
C    15%
D     5%

เราสุ่มตาม distribution

A มีโอกาสมากสุด แต่ B/C ก็มีสิทธิ์ถูกเลือก


14. Temperature 🔥

Temperature ปรับความแหลมของ probability distribution

Temperature ต่ำ:

A █████████████████ 90%
B ██                 7%
C █                  2%
D                    1%

output มัก deterministic มากขึ้น

Temperature สูง:

A ███████ 40%
B █████   28%
C ████    20%
D ██      12%

มี diversity มากขึ้น

จึงมี tradeoff:

Low temperature
→ stable
→ predictable

High temperature
→ diverse
→ creative
→ แต่เสี่ยงหลุดมากขึ้น

อย่างไรก็ตาม inference stack สมัยใหม่อาจซับซ้อนกว่าการหมุน temperature อย่างเดียว


15. พอเลือก token แล้ว... ยังไม่จบ

สมมติเลือก:

"โต"

ถ้า tokenizer แบ่ง Tokyo เป็นหลาย token โมเดลต้องทำต่อ:

เมืองหลวงของญี่ปุ่นคือ โต
                     ↓
                  Model
                     ↓
                    เกียว

แล้ว:

เมืองหลวงของญี่ปุ่นคือ โตเกียว
                           ↓
                         Model
                           ↓
                           .

แล้วอาจเลือก end-of-sequence

ดังนั้นการ generate คือ loop:

Context
   ↓
Transformer
   ↓
Next-token probabilities
   ↓
Choose token
   ↓
Append token
   │
   └────────────↺

ทีละ token


16. นี่คือ Autoregressive Generation

คำว่า autoregressive สำคัญมาก

Output ก่อนหน้ากลายเป็น input ของรอบถัดไป

P(x₁,x₂,…,xₙ) = ∏ᵢ P(xᵢ | x₍<ᵢ₎)

จึงประมาณว่า:

Token 1
 ↓
Token 1 + Token 2
 ↓
Token 1 + Token 2 + Token 3
 ↓
...

นี่อธิบายพฤติกรรมแปลก ๆ อย่างหนึ่งได้ด้วย

ถ้าโมเดลเริ่มตอบผิด:

France's capital is Lyon...

token ต่อ ๆ ไปจะถูก condition บน คำตอบผิดที่มันเพิ่งสร้างเอง

มันจึงอาจสร้างเหตุผลรองรับความผิดนั้นต่อไปอย่างสง่างาม 🫠


17. นี่เป็นอีกต้นกำเนิดของ Hallucination

สมมติช่วงแรก distribution สูสี:

Correct path    45%
Wrong path      40%
Other           15%

บังเอิญเลือก wrong path

จากนั้น:

Wrong token
    ↓
กลายเป็น context
    ↓
Next prediction conditioned
on wrong information
    ↓
Wrong path แข็งแรงขึ้น

จึงเกิด snowball effect

นี่เป็นเหตุผลหนึ่งที่ verification และ tool use สำคัญมาก


18. แล้ว ChatGPT หนึ่งคำตอบใช้ Transformer กี่ครั้ง?

ถ้าคำตอบมี 1,000 output tokens โดยหลัก autoregressive generation ต้องทำ decoding step ต่อเนื่องประมาณ 1,000 ครั้ง

แต่ใช้ KV cache เพื่อไม่ต้องคำนวณ Key/Value ของ token เก่าทุกอย่างใหม่ตั้งแต่ศูนย์

Prompt
 ↓
Prefill
 ↓
KV Cache
 ↓
Generate token 1
 ↓
update cache
 ↓
Generate token 2
 ↓
update cache
 ↓
...

ขั้นแรกที่ประมวลผล prompt จำนวนมากเรียกโดยทั่วไปว่า prefill

จากนั้นเข้าสู่ decode


19. Prefill กับ Decode มีลักษณะ workload ต่างกัน

Prefill

อ่าน context จำนวนมากพร้อมกัน:

100,000 input tokens
       ↓
Transformer

มี parallelism สูง

Decode

สร้าง:

token
↓
token
↓
token
↓
token

มี dependency ตามลำดับ

จึงเป็นหนึ่งในเหตุผลที่ generation latency มีธรรมชาติไม่เหมือนการประมวลผล prompt


20. ตอนนี้เราสามารถตาม token ตั้งแต่เกิดจนตายได้แล้ว

"เมืองหลวงของญี่ปุ่นคือ"
           │
           ▼
       TOKENIZER
           │
           ▼
       Token IDs
           │
           ▼
       EMBEDDINGS
           │
           ▼
    Position information
           │
           ▼
┌──────────────────────────┐
│ Transformer Block 1      │
│ Attention + MLP          │
├──────────────────────────┤
│ Transformer Block 2      │
│ Attention + MLP          │
├──────────────────────────┤
│           ...            │
├──────────────────────────┤
│ Transformer Block N      │
└────────────┬─────────────┘
             ▼
          LOGITS
             │
             ▼
          SOFTMAX
             │
             ▼
 P(next token | context)
             │
             ▼
        DECODING
             │
             ▼
          "โตเกียว"
             │
             └────────↺

นี่คือ LLM core ที่อยู่กลางระบบทั้งหมดที่เราเล่ามา

แต่ตอนนี้มีเรื่องหนึ่งที่ควรแก้ mental model เพิ่มอีกชั้น:

ChatGPT, Claude, Gemini หรือ coding agent ที่เราใช้งาน ไม่จำเป็นต้องเท่ากับ Transformer ก้อนนี้เพียงก้อนเดียว

สิ่งที่เราเรียกว่า “AI model” ในชีวิตประจำวันอาจอยู่ในระบบที่มี routing, reasoning, context construction, retrieval, memory, tool execution, verification และ serving infrastructure ล้อม neural network อยู่

ดังนั้นตอนต่อไปที่คุ้มมากคือการแยกสามคำที่คนชอบใช้ปนกัน:

LLM vs Model vs AI System/Agent

แล้วเราจะเอาสิ่งที่เรียนมาทั้งหมดประกอบเป็นภาพเดียว ตั้งแต่คุณกด Send ใน ChatGPT จนข้อความแรกเริ่มไหลกลับมาบนหน้าจอครับ 🧠 → 🏭 → 📱


← ตอนก่อนหน้า: LLM จำ เรียนรู้ หรือเดาคำตอบ

ตอนถัดไป: จาก LLM สู่ระบบ AI และ Agent →

อ่านทั้งชุด

  1. คุยกับ AI ตอนที่ 1: การ Train LLM คืออะไร
  2. คุยกับ AI ตอนที่ 2: ทาย token ถัดไป แล้วเขียนโปรแกรมได้อย่างไร
  3. คุยกับ AI ตอนที่ 3: Context, Attention และความจำระหว่างคุย
  4. คุยกับ AI ตอนที่ 4: ทำไมคิดนานขึ้นจึงอาจตอบได้ดีขึ้น
  5. คุยกับ AI ตอนที่ 5: GPU, VRAM และโครงสร้างพื้นฐานที่ใช้ฝึก LLM
  6. คุยกับ AI ตอนที่ 6: จาก Base Model มาเป็น Assistant
  7. คุยกับ AI ตอนที่ 7: LLM จำ เรียนรู้ หรือเดาคำตอบ
  8. คุยกับ AI ตอนที่ 8: ตาม token ผ่าน Transformer ทีละขั้น (ตอนนี้)
  9. คุยกับ AI ตอนที่ 9: จาก LLM สู่ระบบ AI และ Agent
  10. คุยกับ AI ตอนที่ 10: เพิ่ม compute ให้ตอนฝึกหรือตอนตอบ
  11. คุยกับ AI ตอนที่ 11: จาก LLM ที่เก่งขึ้นไปสู่คำถามเรื่อง AGI

กลับไปหน้าบันทึกและบทความ