็บฏPythonๅฎ็ฐ็ Hybrid ๆถๆ๏ผ็ปๅ Test Time Training (TTT) ๅ Attention ไธค็ง่ฎฐๅฟๆบๅถใ
python main.py้ฆๆฌก่ฟ่กไผ่ชๅจไป GitHub ไธ่ฝฝ input.txt ๆฐๆฎ้๏ผ32033ไธชไบบๅ๏ผใ
num docs: 32033
vocab size: 27
num params: 1224
=== ๅผๅง Hybrid ้ข่ฎญ็ป ===
Step 100 / 500 | Loss: 3.2978
Step 200 / 500 | Loss: 2.4301
Step 300 / 500 | Loss: 2.4887
Step 400 / 500 | Loss: 2.2724
Step 500 / 500 | Loss: 2.3534
=== ๆจ็็ๆ (temperature=0.5) ===
sample 1: manli
sample 2: dia
sample 3: apellellle
...
sample 20: bakili
ๆฌ้กน็ฎๆ ธๅฟๅๆฐ๏ผTTT๏ผ้ฟ็จ่ฎฐๅฟ๏ผ + Attention๏ผ็ญ็จๆฅ่กจ๏ผ ๅๅฑๆถๆใ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Hybrid ๆถๆ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ โ
โ Token Embedding (wte) โ
โ โ โ
โ โผ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ Layer 0: TTT (้ฟ็จ่ฎฐๅฟ็ฉ้ต) โ โ
โ โ - ็ถๆ็ฉ้ต W ้่พๅ
ฅๅจๆๆดๆฐ โ โ
โ โ - ่ช็็ฃ๏ผ้ๅปบ่พๅ
ฅ x โ โ
โ โ - ้ๅ๏ผ้ฟๆไพ่ตใๅบๅๆจกๅผ โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ โ
โ โผ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ Layer 1: Attention (็ญ็จๆฅ่กจ) โ โ
โ โ - KV Cache ็ผๅญๅๅฒไฟกๆฏ โ โ
โ โ - QยทK^T ่ฎก็ฎๆณจๆๅๅๆฐ โ โ
โ โ - ้ๅ๏ผๅฑ้จไธไธๆใ็ฒพ็กฎๆฃ็ดข โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ โ
โ โผ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ Layer 2: MLP (็นๅพๅๆข) โ โ
โ โ - ไธคๅฑ็บฟๆง + ReLU โ โ
โ โ - ้็บฟๆง็นๅพๆๅ โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ โ
โ โผ โ
โ lm_head โ logits โ softmax โ ้ขๆต โ
โ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
| ็นๆง | TTT ๅฑ | Attention ๅฑ |
|---|---|---|
| ่ฎฐๅฟๆบๅถ | ็ถๆ็ฉ้ต W | KV Cache |
| ๆดๆฐๆนๅผ | ๅจ็บฟๅญฆไน ๏ผๆขฏๅบฆไธ้๏ผ | ่ฟฝๅ ็ผๅญ |
| ้ๅๅบๆฏ | ้ฟ็จไพ่ตใๅบๅๆจกๅผ | ๅฑ้จไธไธๆใ็ฒพ็กฎๆฃ็ดข |
| ่ฎก็ฎๅคๆๅบฆ | O(dยฒ) per token | O(nยทd) per token |
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ exploreGPT ๅฎๆดๆง่กๆต็จ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โโโโโโโโโโโโโโโโโโโโ
โ 1. ๆฐๆฎๅๅค้ถๆฎต โ
โ โ
โ ไธ่ฝฝnames.txt โโโโโโโโ โโโโโโโโโโโโโโโโโโโ
โ ๆๅๅญ็ฌฆ่กจuchars โ โ ๅๅปบ่ฏๆฑ่กจๆ ๅฐ โ
โ ๅฎไนBOSๆ ่ฎฐ โ โ ๅญ็ฌฆโToken ID โ
โ ๆไนฑๆฐๆฎ้กบๅบ โ โโโโโโโโโโโโโโโโโโโ
โโโโโโโโโโโโโโโโโโโโ โ
โโโโโโโโโโโโโโโโโโโ
โ Value็ฑป โ
โ (่ชๅจๅพฎๅๅผๆ) โ
โ - ๅๅ: ่ฎก็ฎๅพ โ
โ - ๅๅ: ้พๅผๆณๅโ
โโโโโโโโโโโโโโโโโโโ
โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ 2. ่ฎญ็ปๅพช็ฏ (500ๆญฅ, Adamไผๅๅจ) โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ โ
โ โโโโโโโโโโโโโโ โโโโโโโโโโโโโโ โโโโโโโโโโโโโโ โ
โ โ ๅไธไธชๅๅญ โโโโโโ โ ๅๅไผ ๆญ โโโโโโโ ่ฎก็ฎๆๅคฑ โ โ
โ โ "anna" โ โ forward() โ โ -log(p) โ โ
โ โโโโโโโโโโโโโโ โโโโโโโโโโโโโโ โโโโโโโโโโโโโโ โ
โ โ โ โ โ
โ โ โโโโโโโโโโโโโโ โโโโโโโโโโโโโโ โ
โ โ โ TTTๅฑ โ โ ๅๅไผ ๆญ โ โ
โ โ โ Attentionๅฑโ โ backward()โ โ
โ โ โ MLPๅฑ โ โ ่ฎก็ฎๆขฏๅบฆ โ โ
โ โ โโโโโโโโโโโโโโ โโโโโโโโโโโโโโ โ
โ โ โ โโโโโโโโโโโโโโ โ
โ โ โโโโโโโโโโโโโโ โ Adamไผๅๅจ โ โ
โ โ โ ๆฎๅทฎ่ฟๆฅ โโโโโโ ๆดๆฐๅๆฐ โ โ
โ โ โโโโโโโโโโโโโโ โ ๅญฆไน ็่กฐๅ โ โ
โ โ โโโโโโโโโโโโโโ โ
โโโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ 3. ๆจ็็ๆ (20ไธชๆ ทๆฌ, ๆธฉๅบฆ้ๆ ท) โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ โ
โ โโโโโโโโโโโ โโโโโโโโโโโ โโโโโโโโโโโ โโโโโโโโโโโ โ
โ โ BOSๅผๅง โโโโโ forward โโโโโ softmax โโโโโ ้ๆ ท โ โ
โ โโโโโโโโโโโ โ ๅๅไผ ๆญโ โ ๆธฉๅบฆ็ผฉๆพโ โ ไธไธไธช โ โ
โ โโโโโโโโโโโ โโโโโโโโโโโ โ token โ โ
โ โโโโโโโโโโโ โ
โ โ โ
โ โโโโโโโโโโโ โ
โ โๆฏๅฆBOS? โโโๅฆโโโ ็ปง็ปญๅพช็ฏ โ
โ โโโโโโโโโโโ โ
โ โ ๆฏ โ
โ โโโโโโโโโโโ โ
โ โ ่พๅบๅๅญ โ โ
โ โโโโโโโโโโโ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
่พๅ
ฅ: "anna"
โ Tokenizer
[BOS, 0, 13, 13, 0, BOS]
โ Token Embedding (wte)
[ๅ้1, ๅ้2, ...]
โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Layer 0: TTT โ
โ 1. RMSNorm โ
โ 2. linear(x, W) โ y โ
โ 3. ่ช็็ฃๆดๆฐ W (้ๅปบ x) โ
โ 4. ๆฎๅทฎ่ฟๆฅ: y + x โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Layer 1: Attention โ
โ 1. RMSNorm โ
โ 2. Q, K, V ๆๅฝฑ โ
โ 3. KV Cache ่ฟฝๅ โ
โ 4. QยทK^T / โd โ ๆณจๆๅๅๆฐ โ
โ 5. softmax โ ๅ ๆๆฑๅ โ
โ 6. ๆฎๅทฎ่ฟๆฅ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Layer 2: MLP โ
โ 1. RMSNorm โ
โ 2. linear โ ReLU โ linear โ
โ 3. ๆฎๅทฎ่ฟๆฅ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ
lm_head โ logits
โ softmax (ๆธฉๅบฆ็ผฉๆพ)
probs: [0.15, 0.10, 0.35, ...]
โ
้ขๆตไธไธไธช token
- ่ชๅจๅพฎๅ (Value็ฑป): ๆ ้ๆๅจๆฑๅฏผ๏ผ่ชๅจๆๅปบ่ฎก็ฎๅพๅนถๅๅไผ ๆญๆขฏๅบฆ
- TTT ๅฑ: ็ถๆ็ฉ้ตๅจๆจ็ๆถๅจๆๆดๆฐ๏ผๅฎ็ฐ้ฟ็จ่ฎฐๅฟ
- Attention ๅฑ: KV Cache ็ผๅญๅๅฒ๏ผๅฎ็ฐ็ญ็จ็ฒพ็กฎๆฃ็ดข
- ๆฎๅทฎ่ฟๆฅ: ๆขฏๅบฆ้กบ็ ๆตๅจ๏ผๆฏๆๆดๆทฑ็ฝ็ป
- ๆธฉๅบฆ้ๆ ท: ๆงๅถ็ๆๆๆฌ็้ๆบๆงๅๅ้ ๆง
- Adam ไผๅๅจ: ๅจ้ + ่ช้ๅบๅญฆไน ็๏ผ่ฎญ็ปๆด็จณๅฎ
ๅจๆทฑๅบฆๅญฆไน ไธญ๏ผๆจกๅ้่ฆ็ฅ้"ๆ็ฆปๆญฃ็กฎ็ญๆกๅทฎๅคๅฐ"ไปฅๅ"ๆ่ฏฅๅพๅช่พนๆน"ใ
data: ๅญๅจๅฝๅ็ๆฐๅผgrad: ๅญๅจๆขฏๅบฆ๏ผๆน่ฟๆนๅ๏ผ๏ผ้่ฟbackward()่ฎก็ฎ- ๆฐๅญฆ่ฟ็ฎ: ้่ฝฝ
+,*,**,log,exp็ญ๏ผๆๅปบ่ฎก็ฎๅพ backward(): ไป Loss ๅผๅง๏ผๅฉ็จ้พๅผๆณๅๅๅไผ ๆญๆขฏๅบฆ
ๆจกๅไธ่ฎค่ฏๅญ็ฌฆ๏ผๅช่ฎค่ฏๆฐๅญใ
uchars = sorted(set(''.join(docs))) # ['a', 'b', 'c', ...]
BOS = len(uchars) # 26 (็นๆฎๆ ่ฎฐ)
vocab_size = 27 # 26ๅญๆฏ + 1ไธชBOSๆ "anna" ๅๆ [BOS, 0, 13, 13, 0, BOS]
ๆ ธๅฟๅๆฐ๏ผ็ถๆ็ฉ้ต W ๅจๆจ็ๆถ็ปง็ปญๅญฆไน
def ttt_step(x, W_hidden, ttt_lr=0.2):
y = linear(x, W_hidden) # ่พๅบ
x_hat = linear(x, W_hidden) # ้ๅปบ่พๅ
ฅ
loss = sum((xh - xi)**2) # ่ช็็ฃๆๅคฑ
loss.backward() # ่ฎก็ฎๆขฏๅบฆ
W_hidden -= ttt_lr * grad # ๆดๆฐ W
return yไธบไปไนๆๆ๏ผ
- ๆฏไธช token ้ฝไผ่ฎฉ W ๅญฆๅฐไธ็นไธ่ฅฟ
- ้ฟๅบๅไธญ๏ผW ็ดฏ็งฏไบๆดไธชๅบๅ็"่ฎฐๅฟ"
- ็ฑปไผผ RNN๏ผไฝๆดๆฐ่งๅๆฏๆขฏๅบฆไธ้
ไผ ็ปๆณจๆๅ๏ผ็ผๅญๅๅฒ K ๅ V๏ผ
def attention_step(q, k_cache, v_cache):
scores = [qยทk / โd for k in k_cache] # ๆณจๆๅๅๆฐ
weights = softmax(scores) # ๅฝไธๅ
return ฮฃ(weights[t] * v_cache[t]) # ๅ ๆๆฑๅfor step in range(500):
# 1. ๅๅไผ ๆญ
logits = forward(token_id, ttt_states, kv_cache)
# 2. ่ฎก็ฎๆๅคฑ
loss = -probs[target].log()
# 3. ๅๅไผ ๆญ
loss.backward()
# 4. Adam ๆดๆฐ๏ผๅธฆๅญฆไน ็่กฐๅ๏ผ
lr_t = lr * (1 - step / 500)
p.data -= lr_t * m_hat / (v_hat**0.5 + eps)for _ in range(block_size):
logits = forward(token_id, ttt_states, kv_cache)
probs = softmax([l / temperature for l in logits])
token_id = random.choices(range(vocab_size), weights=probs)[0]
if token_id == BOS: break
sample.append(it_to_char[token_id])Temperature ๅๆฐ๏ผ
0.1: ไฟๅฎ๏ผ็ๆๅธธ่งๅๅญ0.5: ๅนณ่กก๏ผ้ๅบฆๅ้ ๆง1.0: ็้๏ผ็ๆๅฅๆช็ปๅ
n_embd = 12 # ๅตๅ
ฅ็ปดๅบฆ
block_size = 16 # ๆๅคงไธไธๆ้ฟๅบฆ
vocab_size = 27 # 26ๅญๆฏ + BOS
num_params = 1224 # ๆปๅๆฐ้- ๆฐๆฎ้: karpathy/makemore ็
names.txt - ๆ ทๆฌๆฐ: 32033 ไธชไบบๅ
- ่ชๅจไธ่ฝฝ: ้ฆๆฌก่ฟ่ก่ชๅจ่ทๅ
exploreGPT/
โโโ main.py # ๆ ธๅฟๅฎ็ฐ (~200่ก)
โโโ input.txt # ไบบๅ่ฎญ็ปๆฐๆฎ (่ชๅจไธ่ฝฝ)
โโโ README.md # ๆฌๆๆกฃ
โโโ production.md # ้กน็ฎๅ
จๅฑๆๆกฃ
โโโ schema/ # ไปปๅกๆๆกฃ็ฎๅฝ
โโโ archive/ # ๅทฒๅฎๆไปปๅกๅฝๆกฃ
- ๅขๅ ๅฑๆฐ: ๆทปๅ ๆดๅค TTT/Attention ๅฑ
- ๅขๅคงๅตๅ
ฅ็ปดๅบฆ:
n_embd = 64ๆๆดๅคง - ๆด้ฟ่ฎญ็ป:
num_steps = 2000+ - ๅญฆไน ็่ฐๅบฆ: ไฝๅผฆ่กฐๅใ้ข็ญ็ญ
- ๅคๅฑ TTT: ๅคไธช TTT ๅฑไธฒ่๏ผไธๅๆถ้ดๅฐบๅบฆ