STEP 6 / 6

訓練+推論

予実差異で前提を毎月修正し精度を上げ、来期予算を立てる

この教材の背骨「GPTの学習ループ ≒ 予実管理のループ」そのもの。1件の名前を取り、次の文字を予測し、損失(クロスエントロピー=予実差異ペナルティ)を測り、backward で原因を遡り、Adam で前提を少し直す。これを1000回繰り返す。

Adam は今回の差異だけで激変させず、過去の勾配の移動平均(m, v)でなめらかに前提を更新する=予算のローリング修正。ブレの大きい科目ほど慎重に直す。

訓練後の推論(L186-200)は、馴染ませた前提で新しい名前を1文字ずつ確率的に生成する。temperature が見積りの保守度のつまみ。この段の用語は損失とソフトマックス+temperature。

実際のコード(microgpt.py L146-200)

この段が、Karpathy のオリジナル200行のどこに当たるか。

m = [0.0] * len(params)   # 1次モーメント(勾配の移動平均)
v = [0.0] * len(params)   # 2次モーメント(勾配²の移動平均)

for step in range(num_steps):                       # 1000回
    doc = docs[step % len(docs)]
    tokens = [BOS] + [uchars.index(ch) for ch in doc] + [BOS]
    losses = []
    for pos_id in range(n):
        token_id, target_id = tokens[pos_id], tokens[pos_id + 1]
        logits = gpt(token_id, pos_id, keys, values)
        probs = softmax(logits)
        losses.append(-probs[target_id].log())      # クロスエントロピー
    loss = (1 / n) * sum(losses)
    loss.backward()                                 # 全パラメータの勾配を算出
    for i, p in enumerate(params):                  # Adam で前提を少し修正
        m[i] = beta1 * m[i] + (1 - beta1) * p.grad
        v[i] = beta2 * v[i] + (1 - beta2) * p.grad ** 2
        m_hat = m[i] / (1 - beta1 ** (step + 1))
        v_hat = v[i] / (1 - beta2 ** (step + 1))
        p.data -= lr_t * m_hat / (v_hat ** 0.5 + eps_adam)
        p.grad = 0

出典: karpathy / microgpt.py (本体は原文ベース、抜粋・コメントは日本語に補足)

この段の用語を1つずつ理解する

触って動かせるデモ+簿記アナロジー+該当コード付き。