入力(文字+位置の埋め込み)を、配賦(linear)・正規化(rmsnorm)・突合(attention)・繰越加算(residual)を通して、最終的に「次の文字のスコア(logits)」まで組み上げる計算体系。
会計で言えば、仕訳から始まった数字が配賦・組替・突合・繰越を経て試算表→財務諸表へ組み上がる工程。残差接続 x = a + b は「前期繰越+当期変動」で、元情報を捨てず差分だけ足す。
この段は3つの用語(線形変換・ReLU・ソフトマックス)に分かれる。発展編のAttention(入金消込の突合)・残差接続もここ。下のコードは骨格の抜粋。
この段が、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 (本体は原文ベース、抜粋・コメントは日本語に補足)
触って動かせるデモ+簿記アナロジー+該当コード付き。