深層学習

Residual Block

入力を恒等ショートカットで足し戻し、主経路には入力からの残差だけを学習させるブロック。勾配の恒等経路、次元合わせの射影、ボトルネックの役割を式と実装で確認する。

  • A|中核
  • 深層学習

数式の記号で止まったら 記号の読み方 (∂・⊙・転置・上付き添字を、読み方から)

ひとことで言うと

Residual Block(残差ブロック)は、入力をそのまま通すショートカットと、入力に対する変化を計算する主経路を足し合わせる部品です。入力を x\mathbf{x}、主経路が表す残差関数を F(x,θ)\mathcal{F}(\mathbf{x}, \theta) とすると、出力は y=F(x,θ)+x\mathbf{y}=\mathcal{F}(\mathbf{x},\theta)+\mathbf{x} です。ここで θ\theta は主経路の学習パラメータです。ブロック全体を一つの写像として見ると、毎回新しい表現をゼロから作るのではなく、入力からの差分を作って足す構造になっています。

既存の設計図に、毎回すべてを書き直すのではなく、変更箇所だけを差分として重ねるイメージです。変更が不要なら主経路の出力をゼロに近づければよく、元の設計図はショートカットからそのまま残ります。

なぜ必要か

通常の積層では、入力 x\mathbf{x} から出力 H(x)\mathcal{H}(\mathbf{x}) までを主経路だけで表現します。これに対して残差ブロックは H(x)=F(x)+x\mathcal{H}(\mathbf{x})=\mathcal{F}(\mathbf{x})+\mathbf{x} と分解し、学習対象を H\mathcal{H} そのものから残差 F=H−x\mathcal{F}=\mathcal{H}-\mathbf{x} に移します。入力をほぼ保つ場面では、主経路が恒等写像を再現する代わりに、残差を小さくすれば済みます。ショートカットの出力と主経路の出力は、加算点で要素ごとに足し合わせます。

観点主経路ショートカット
計算するもの残差 F(x,θ)\mathcal{F}(\mathbf{x},\theta)恒等写像 x\mathbf{x}、または射影
加算前の役割入力に加える変化を作る入力の情報を加算点まで運ぶ
次元変更畳み込み側で設計必要なら 1×11\times1 射影で合わせる

この形の利点は、ブロックを単独で見ても順方向と逆方向に二つの経路があることです。主経路の演算が複雑でも、ショートカットが恒等写像なら入力情報と勾配の通り道が残ります。ここでいう利点は、どんなネットワークでも自動的に精度が上がるという意味ではありません。加算できるテンソル形状、加算位置、活性化の置き方まで含めて、ブロックの定義として確認する必要があります。

仕組み

基本形を、主経路 F\mathcal{F} とショートカット写像 S\mathcal{S} で一般化します。x\mathbf{x} は入力特徴マップ、F(x,θ)\mathcal{F}(\mathbf{x},\theta) は畳み込みや正規化などを含む主経路、S(x)\mathcal{S}(\mathbf{x}) はショートカット、y\mathbf{y} は加算後の出力です。

y=F(x,θ)+S(x)\mathbf{y}=\mathcal{F}(\mathbf{x},\theta)+\mathcal{S}(\mathbf{x})

同じチャネル数・空間サイズなら恒等写像 S(x)=x\mathcal{S}(\mathbf{x})=\mathbf{x} を使えます。このとき損失を LL、加算点から上流へ伝わる勾配を ∂L/∂y\partial L/\partial\mathbf{y} とすると、加算の微分は次の形になります。

∂L∂x=∂L∂y(∂F∂x+I)\frac{\partial L}{\partial\mathbf{x}} =\frac{\partial L}{\partial\mathbf{y}} \left(\frac{\partial\mathcal{F}}{\partial\mathbf{x}}+\mathbf{I}\right)

I\mathbf{I} は恒等写像のヤコビアンです。右辺の ∂L/∂y\partial L/\partial\mathbf{y} は、主経路の微分を通る項に加えて、係数1の恒等経路にもそのまま現れます。したがって主経路の勾配が小さくても、ショートカット側から同じ勾配が入力へ届きます。ブロックを積み重ねた場合も、各ブロックでこの恒等項が連鎖律に残る、という読み方が試験の要点です。

出力の次元が変わるブロックでは、x\mathbf{x} をそのまま足せません。ショートカットに学習可能な射影 WsW_s を置き、S(x)=Wsx\mathcal{S}(\mathbf{x})=W_s\mathbf{x} として形状を合わせます。畳み込み層では通常、1×11\times1 畳み込みでチャネル数を変え、必要ならストライドで空間サイズも変えます。主経路とショートカットを別々に設計してから、加算時点のバッチ・チャネル・高さ・幅が一致しているかを確認します。

深い畳み込みブロックではボトルネック構成も使われます。主経路を 1×11\times1 畳み込みでチャネル方向に絞り、3×33\times3 畳み込みを狭い表現に対して適用し、最後の 1×11\times1 畳み込みで元の幅へ戻します。中央の計算量の大きい 3×33\times3 演算を低チャネル数で実行できるため、計算とパラメータを抑えやすい、という狙いです。最後に戻した主経路と、元の幅を保つ恒等ショートカットを加算します。ボトルネックはショートカットを細くする仕組みではなく、主経路の内部を細くする仕組みです。

試験でどう問われるか

問われ方正解に寄る条件引っかけ
ブロックの出力式主経路の残差とショートカットを加算する主経路だけを出力とする
逆伝播の経路恒等ショートカットでは勾配に恒等項が加わる勾配も主経路だけを通る
次元が異なる場合射影ショートカットで加算前に形状を合わせる異なるチャネル数をそのまま加算する
ボトルネックの順序1×11\times1 で縮小、3×33\times3、1×11\times1 で復元3×33\times3 を高チャネルのまま3回行う
恒等写像の意味学習パラメータを持たず入力をそのまま渡す恒等写像を「重みが全て学習済み」と解釈する

実装で確かめる

NumPyで、主経路の係数を小さくした一つのスカラー・ブロックを考えます。F(x,θ)=θx\mathcal{F}(x,\theta)=\theta x、損失を L=y2/2L=y^2/2 とすると、解析的には ∂L/∂x=(θ+1)y\partial L/\partial x=(\theta+1)y です。加算の後ろから来た勾配が、主経路の係数 θ\theta と恒等経路の1に分かれて戻ることを確認します。

import numpy as np

x = 2.0
theta = 0.1
y = theta * x + x
dy = y
dx = dy * theta + dy
analytic = (theta + 1.0) * y
print("y:", y)
print("dx:", dx)
print("max error:", abs(dx - analytic))

実行結果は y: 2.2、dx: 2.4200000000000004、max error: 0.0 です。dy * theta だけを書けば主経路の寄与しか残らず、dy が恒等ショートカットから来る寄与です。実際の畳み込み実装では、この加算の前に両経路のテンソル形状を揃えます。

主経路の最後にReLUなどの非線形を置く実装では、加算点の前後で勾配の式が変わります。まずどこで加算したかを特定し、恒等経路が加算点まで本当に恒等かを確認してください。

取り違えやすいもの

用語Residual Blockとの切り分け
Dense layer前の全層出力を結合する接続。残差ブロックの加算とは結合方法が違う
Highway networkゲートで経路の通過量を制御する。恒等ショートカットを単純加算する残差形とは別
Projection shortcut次元を合わせるためのショートカット側の写像。Residual Block全体の名前ではない
Bottleneck block主経路を縮小・演算・復元する内部構成。残差加算の有無とは別の分類軸
Skip connection層を飛び越す接続の一般名。恒等写像に限定されず、Residual Blockはその具体例

想起チェック

Residual Blockの出力を、主経路とショートカットで書くと

y=F(x,θ)+S(x)\mathbf{y}=\mathcal{F}(\mathbf{x},\theta)+\mathcal{S}(\mathbf{x}) です。同じ形状なら S(x)=x\mathcal{S}(\mathbf{x})=\mathbf{x} とできます。

恒等ショートカットが逆伝播で加えるものは何か

加算点から来た勾配に、恒等写像のヤコビアン I\mathbf{I} を掛けた項です。そのため入力勾配には主経路の項だけでなく恒等経路の項も残ります。

主経路とショートカットの形状が違うとき何を置くか

学習可能な射影 WsW_s、畳み込みでは典型的に 1×11\times1 畳み込みを置いて、チャネル数や空間サイズを合わせます。

ボトルネックの3層構成と狙いは何か

1×11\times1 でチャネルを絞り、3×33\times3 を狭い表現に適用し、1×11\times1 で戻します。計算量の大きい中央演算を低チャネル数で行うためです。

出典