TL;DR
- LLM学習では「損失→勾配→最適化(AdamW)」が必須。推論は前向きのみ。
- **RAG(TF-IDF+コサイン)**は“統計+線形代数”で完結。勾配・活性化・最適化は使わない。
- 自作 MiniGPT(Pre-LN, GELU)は構成OK。改善候補:weight tying と SDPA(scaled dot-product attention)。
今日やったこと
- Autogradノード(
AccumulateGrad,PowBackward0,MulBackward0,AddBackward0,SumBackward0)をLLM学習時の逆伝播由来として整理。 - 「勾配/微分/最適化は学習のみ、推論とRAGは不要」を表で整理。
- LLMの推論フロー(tokenize → 前向き → softmax → サンプリング → 自己回帰)を擬似コード化。
llm/model.pyをレビュー:Pre-LN/Multi-Head Attention/GELU/最終LN/語彙ヘッド。Conv/BatchNormは不使用で正しい。- RAG側は TF-IDF行列 × クエリベクトルでコサイン類似度Top-k取得に限定する方針を確認。
技術メモ
LLM:学習・推論のちがい
| 要素 | 学習 | 推論 |
|---|---|---|
予測(model(x)) |
使う | 使う |
| 損失(CE) | 使う | 使わない |
勾配(backward()) |
使う | 使わない(no_grad) |
| 最適化(AdamW等) | 使う | 使わない |
# 推論:自己回帰の最小例
@torch.no_grad()
def generate(model, tok, prompt, max_new=128, temperature=1.0, top_k=None, eos=None):
model.eval()
ids = torch.tensor([tok.encode(prompt)], dtype=torch.long)
for _ in range(max_new):
x = ids[:, -model.block_size:]
logits, _ = model(x) # (B,T,V)
logits = logits[:, -1, :] / max(temperature, 1e-8)
if top_k:
th = torch.topk(logits, top_k).values[:, [-1]]
logits[logits < th] = float("-inf")
probs = torch.softmax(logits, dim=-1)
next_id = torch.multinomial(probs, 1)
ids = torch.cat([ids, next_id], dim=1)
if eos is not None and next_id.item() == eos: break
return tok.decode(ids[0].tolist())
RAG:今回は“非ニューラル”
TfidfVectorizerの tf と idf は統計計算。- 類似度は L2正規化済み X @ q(= コサイン)。
- 活性化/勾配/最適化は登場しない。
llm/model.py チェックポイント
-
良い点:Pre-LN、GELU、因果マスク、残差+Dropout、最終LN。
-
改善のタネ:
- Weight Tying:
self.head.weight = self.tok_emb.weight - SDPA(PyTorch2):
scaled_dot_product_attention(..., is_causal=True)で高速・省メモリ化。 - 半精度時のマスク:
torch.finfo(att.dtype).minを使うと安全。
- Weight Tying:
次の一手(TODO)
- [ ] AttentionをSDPAに差し替え
- [ ] Weight tyingの導入&学習確認
- [ ] RAGのTop-k後のプロンプト整形を固定テンプレ化(出典表記の自動付与)
- [ ]
generate()にtop_p/repetition_penaltyを追加

Comments