PyCon JP 2025 登壇準備ログ #02 – LLM学習 vs 推論、RAGの役割整理と MiniGPT 実装レビュー

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:今回は“非ニューラル”

  • TfidfVectorizertfidf は統計計算。
  • 類似度は L2正規化済み X @ q(= コサイン)。
  • 活性化/勾配/最適化は登場しない

llm/model.py チェックポイント

  • 良い点:Pre-LN、GELU、因果マスク、残差+Dropout、最終LN。

  • 改善のタネ

    1. Weight Tyingself.head.weight = self.tok_emb.weight
    2. SDPA(PyTorch2):scaled_dot_product_attention(..., is_causal=True) で高速・省メモリ化。
    3. 半精度時のマスク:torch.finfo(att.dtype).min を使うと安全。

次の一手(TODO)

  • [ ] AttentionをSDPAに差し替え
  • [ ] Weight tyingの導入&学習確認
  • [ ] RAGのTop-k後のプロンプト整形を固定テンプレ化(出典表記の自動付与)
  • [ ] generate()top_p / repetition_penalty を追加

Comments

Copied title and URL