「残差接続」「x = f(x) + x」「ショートカット/スキップ接続」が、なぜ入力を足し戻すのか分からない。
サブ層の出力 f(x) に、入力 x をそのまま足し戻す(x ← f(x) + x)。元の情報を捨てずに「差分」だけを上乗せでき、逆伝播でも勾配が恒等経路をまっすぐ流れて消えにくくなる。
残高の積み上げそのもの。期末残高 = 期首繰越 + 当期変動。アテンションや MLP が出すのは「当期の調整・変動 f(x)」で、+ x は「前期繰越をそっくり持ち越す」恒等の経路。
もし残差が無ければ、各層が毎回ゼロから残高を作り直すことになり、前の層が積み上げた情報(繰越残高)が消えてしまう。残差接続は「繰越をそのまま残し、変動分だけ足す」ので、層を深く重ねても元の情報が薄れない。
逆伝播の側でも効く。+ x の経路は局所勾配が1(加算の勾配は (1,1))なので、感応度が減衰せず一番奥までまっすぐ届く。差異分析でいえば「繰越経路を通して、末端の原因まで効きがしっかり伝わる」状態。
残差接続は期末残高 = 期首繰越 + 当期変動。サブ層 f(x) は「当期の調整」、+x は「前期繰越をそのまま持ち越す」恒等経路です。 これがあるから層を深く重ねても元の残高が薄れず、逆伝播でも加算の勾配は (1,1) なので感応度が減衰せずまっすぐ奥へ届きます。
⚠️ モデルでは足す前後に rmsnorm が挟まる。「繰越+変動」という骨格の対応に絞った例示。
この簿記アナロジーが、Karpathy のオリジナル200行のどの行に当たるか。
x_residual = x # 期首繰越をとっておく
# ... アテンション / MLP が「当期変動 f(x)」を計算 ...
x = [a + b for a, b in zip(x, x_residual)] # 期末 = 当期変動 + 前期繰越x_residual に入力(繰越)を保存し、サブ層の出力に足し戻す=期末残高=前期繰越+当期変動。加算なので勾配も素通り。
出典: karpathy / microgpt.py (本体は原文ママ、コメントのみ日本語に補足)