ひとことで言うと
受容野(receptive field)は、ある出力の1画素が入力画像のどの範囲から情報を受け取れるかを表します。局所的な演算でも層を重ねれば、後段の1画素は前段の複数画素を経由して、より広い入力範囲に結び付きます。
小さな窓から街を観察する人を、層ごとに後ろへ下げていくイメージです。1枚の窓は小さくても、前の人が見た範囲を次の人がまとめて見るため、最後の人の視野は広がります。
なぜ必要か
分類なら画像全体、検出なら物体の輪郭、時系列に近い空間処理なら広い文脈が必要です。最終出力の解像度だけを見ていると、その画素が本当に必要な範囲を見ているか判断できません。受容野は、ネットワークが局所情報だけで答えているのか、タスクの文脈まで届いているのかを設計段階で点検する物差しです。
理論上の受容野は「影響し得る範囲」です。重みが小さい経路や入力の状態によって、実際の出力変化に強く寄与する範囲はそれより狭くなります。したがって、理論値が入力サイズに達しただけで「画像全体を十分に理解した」とは判断しません。必要な対象の大きさと、実効的に寄与している範囲を分けて見ます。
| 設計で確認するもの | 受容野から読めること |
|---|---|
| 理論受容野 | 出力画素に影響し得る入力範囲 |
| 実効的な寄与範囲 | 実際に出力変化へ強く効いている範囲 |
| タスクの対象サイズ | 必要な文脈を覆えているかの基準 |
仕組み
空間の1方向について、層 のカーネル幅を 、ストライドを 、ダイレーションを とします。ダイレーションはカーネル点の間隔です。層 の実効カーネル幅は なので、受容野 と、隣接出力画素が入力上で離れる間隔(ジャンプ) は次で更新します。
、 は入力画素を基準にした初期値です。ストライドが1なら、各層の増分はその時点のジャンプに比例します。先にストライドを置くと後段のカーネルがより大きな入力間隔をまたぐため、受容野の広がりが線形に加速します。ダイレーションは層内の点を飛ばして参照するため、パラメータ数を増やさずに増分だけを大きくできます。
なお、パディングは受容野の大きさの再帰式を直接増やしませんが、端の出力が実データではなくパディング領域を含むかどうかを変えます。サイズ計算では kernel_size、stride、padding、dilation が別々に効くため、出力サイズと受容野を同じ式だと思わないことが要点です。
試験でどう問われるか
| 問われ方 | 正解に寄る条件 | 引っかけ |
|---|---|---|
| 多層の受容野を計算 | と を層ごとに更新する | 全層のカーネル幅を単純加算する |
| ストライドの影響 | 次層以降の増分に、それまでの が掛かる | 現在の層のカーネル幅だけを見る |
| ダイレーションの影響 | を とみなす | 点数が のままなので受容野も不変とする |
| 端の画素を評価 | パディングを含む理論範囲と実入力の範囲を区別する | 全出力画素が同じ実データ範囲を持つとする |
実装で確かめる
次のコードは、2方向が同じ設定の層列について と を追跡します。(k, s, d) は順にカーネル幅、ストライド、ダイレーションです。
layers = [(3, 1, 1), (3, 2, 1), (3, 1, 2)]
r, j = 1, 1
for k, s, d in layers:
r += d * (k - 1) * j
j *= s
print(r, j)
実行結果は 3 1、5 2、13 2 です。3層目はカーネルの点数が3のままでも、ダイレーション2によって幅5相当を参照し、ジャンプ2も受け継ぐため受容野が8広がります。
取り違えやすいもの
| 用語 | 受容野との切り分け |
|---|---|
| 出力サイズ | 出力の縦横の画素数。受容野は各画素が見得る入力範囲で、別の指標です |
| カーネル幅 | 1層が直接参照する幅。受容野は前段を含めた合成結果です |
| ジャンプ | 隣接する出力画素の入力上の間隔。受容野そのものではありません |
| 実効的な受容野 | 理論範囲のうち、実際の出力変化へ強く寄与する範囲。理論値と一致するとは限りません |
想起チェック
受容野の再帰式で、ストライドはどこに効くか
現在の受容野の増分ではなく、次層以降の入力上の間隔 を広げます。そのため早い層のストライドほど後段へ累積します。
ダイレーション2、カーネル幅3の実効幅はいくつか
です。参照する点の数は3ですが、点と点の間隔が広がっています。
理論受容野が十分な大きさでも確認すべきことは何か
理論値は影響し得る範囲なので、重みや入力に依存した実効的な寄与範囲がタスクの対象を覆うかを別に確認します。