(microgpt の推論ループ)= # microgpt の推論ループ ## この章で学ぶこと - `temperature`、確率サンプリング、終了条件 - {numref}`microgpt の構造` **B7** に対応する生成フェーズ ## 推論(生成) **学習ループとの主な差分:** | 観点 | 学習ループ(B6) | 推論ループ(B7) | |------|----------------|----------------| | 重みの更新 | Adam で更新あり | 更新なし(固定) | | logits の扱い | `softmax` → 損失計算 | `temperature` 付き `softmax` | | 次トークン | ラベルと比較して損失 | `random.choices` でサンプル | まず **推論(生成)ブロック全体**(`microgpt.py` **L238〜L251**)を引用します。続けて **ブロック図と各ブロックの一行概要**を置き、そのあと行ごとの意味を列挙します。 ```{literalinclude} ../../../src/part3/microgpt.py :language: python :lines: 238-251 :lineno-match: ``` ## 推論ループ内のブロック図と概要 次の図は、上記ソースの制御の流れを **(1)~(7)** の項番号に対応させたものです。外側は **20 本の独立したサンプル**、内側は **`pos_id`** による 1 文字ずつの伸長です。 :::: {container} mermaid-flow-half ```{mermaid} flowchart TB B1["temperature(logits を割る係数)"] B2["推論開始の見出しを print"] B3["for sample_idx in range(20)"] B4["keys/values を層ごとに空で初期化"] B5["token_id = BOS、sample = []"] B6["for pos_id: gpt → logits/temperature → softmax → random.choices"] B7["1 サンプル分の文字列を print"] B1 --> B2 --> B3 --> B4 --> B5 --> B6 B6 -->|次の pos(BOS まで)| B6 B6 -->|1 系列が終わったら| B7 B7 -->|次の sample_idx| B3 ``` ::::
図-1: 推論ループのブロック
**行ごとの意味** - **L238** `temperature` — logits を割ってから `softmax` する際の鋭さ(小さいほど上位に集中、大きいほど分散)。 - **L239** 推論開始の見出しを表示。 - **L240** 20 通りのサンプルをループ(毎回キャッシュを空にして新系列)。 - **L241** 層ごとの K/V リストを初期化。 - **L242** 最初のトークンは `BOS`。 - **L243** 生成した文字を溜めるリスト。 - **L244–L250** 位置ごとに `gpt`→温度付き `softmax`→`random.choices` で 1 トークンサンプル。`BOS` が出たら系列終了、それ以外は `uchars` から文字を復元して `sample` に追加。 - **L251** 生成文字列を表示。 `BOS` から始めて、次の文字を 1 文字ずつ選んでいきます。`temperature` は低いと無難に、高いと少し冒険しやすくなります。つまり、このコードだけで**学習と生成の両方**が見えます。 ```{mermaid} sequenceDiagram participant GL as 生成ループ participant GPT as gpt participant SM as softmax+sample GL->>GPT: 現在の系列で順伝播 GPT->>GL: 次トークンの logits GL->>SM: temperature を反映した確率 SM->>GL: トークンを一つ選び系列へ Note over GL: 終了条件まで繰り返し ```図-2: 生成フェーズ(学習時よりシンプルな往復)。上のブロック図は制御の流れ、この図はデータの往復の補足です。