STEP 5 / 6

モデル本体(Transformer)

試算表→財務諸表を組み上げる計算体系(科目間の関係)

入力(文字+位置の埋め込み)を、配賦(linear)・正規化(rmsnorm)・突合(attention)・繰越加算(residual)を通して、最終的に「次の文字のスコア(logits)」まで組み上げる計算体系。

会計で言えば、仕訳から始まった数字が配賦・組替・突合・繰越を経て試算表→財務諸表へ組み上がる工程。残差接続 x = a + b は「前期繰越+当期変動」で、元情報を捨てず差分だけ足す。

この段は3つの用語(線形変換・ReLU・ソフトマックス)に分かれる。発展編のAttention(入金消込の突合)・残差接続もここ。下のコードは骨格の抜粋。

実際のコード(microgpt.py L92-144)

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

def linear(x, w):                      # 行列×ベクトル=配賦
    return [sum(wi * xi for wi, xi in zip(wo, x)) for wo in w]
def softmax(logits): ...               # 指数→合計で割り構成比へ
def rmsnorm(x): ...                     # ベクトルの大きさを揃える正規化

def gpt(token_id, pos_id, keys, values):
    tok_emb = state_dict['wte'][token_id]          # 文字の埋め込み
    pos_emb = state_dict['wpe'][pos_id]            # 位置の埋め込み
    x = [t + p for t, p in zip(tok_emb, pos_emb)]
    for li in range(n_layer):
        # 1) アテンション(過去の文字との突合)
        x_residual = x
        q = linear(rmsnorm(x), state_dict[f'layer{li}.attn_wq'])
        k = linear(rmsnorm(x), state_dict[f'layer{li}.attn_wk'])
        v = linear(rmsnorm(x), state_dict[f'layer{li}.attn_wv'])
        # ... softmax(q·k / sqrt(d)) で過去の v を加重平均 ...
        x = [a + b for a, b in zip(x, x_residual)]  # 残差接続=前期繰越+変動
        # 2) MLP
        x_residual = x
        x = [xi.relu() for xi in linear(rmsnorm(x), state_dict[f'layer{li}.mlp_fc1'])]
        x = linear(x, state_dict[f'layer{li}.mlp_fc2'])
        x = [a + b for a, b in zip(x, x_residual)]
    return linear(x, state_dict['lm_head'])         # 次の文字のスコア

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

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

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