Receptive Field
受容野とは、ニューラルネットワーク内の1つのユニットに影響を与える入力画像の領域です。深さ、ストライド、膨張率に応じて受容野が広がる仕組みをコードとともに解説します。
畳み込みニューラルネットワーク(CNN)のユニットにおける受容野とは、そのユニットの値に影響を与えうる入力画像の領域です。ネットワークの最初の3 × 3 畳み込み層のユニットは、3 × 3のピクセル領域を認識します。より深い層のユニットは、各層が直前の層の隣接する出力を組み合わせるため、段階的に広い領域を認識します。受容野によって、特徴が利用できるコンテキストの範囲が決まります。バス全体を認識するユニットは、バス全体を見なければなりません。この用語は神経科学に由来し、視野のうち単一ニューロンを駆動する領域を指します。
受容野が拡大する仕組み#
各層は受容野に(k − 1) × jピクセルを追加します。kはカーネルサイズ、jはジャンプ幅で、入力の隣接ユニット間の入力ピクセル上の距離を表します。これは、それまでのすべてのストライドの積に等しくなります。ここから、次の3つの性質が導かれます。
- 小さなカーネルの積み重ね: ストライド1の3 × 3層を3層重ねると、7 × 7の領域を認識します。これは1層の7 × 7層と同じ範囲ですが、重みは49C²個ではなく27C²個です。Cはチャネル数であり、VGGネットワークが3 × 3畳み込みの深い積層を採用した根拠です。
- ストライドとプーリング: ストライド2の層またはプーリング処理を行うたびにジャンプ幅が2倍になるため、後続の層では受容野が2倍の速さで広がります。CNNはこの仕組みによって、特徴マップを縮小しながら数百ピクセルの受容野を実現します。
- ダイレーション: ダイレーションdの拡張(atrous)3 × 3畳み込みでは、サンプリング点の間隔がdピクセルになり、2d + 1ピクセルをカバーします。ダウンサンプリングせずに受容野を拡大できるため、セマンティックセグメンテーションなど、ピクセル単位の高密度なタスクに適しています。
受容野を直接測定すると、これらの規則を確認できます。1つの出力値からバックプロパゲーションを行い、どの入力ピクセルがゼロ以外の勾配を受け取るかを確認します。
import torch
from torch import nn
# Three stacked 3x3 convolutions in three configurations: (stride, dilation)
for name, stride, dilation in (("plain", 1, 1), ("strided", 2, 1), ("dilated", 1, 2)):
convs = [nn.Conv2d(1, 1, 3, stride, padding=dilation, dilation=dilation, bias=False) for _ in range(3)]
for conv in convs:
nn.init.ones_(conv.weight) # positive weights, so no input pixel's gradient cancels out
layers = nn.Sequential(*convs)
# Backpropagate from the central output value; input pixels with nonzero gradient form its receptive field
image = torch.zeros(1, 1, 64, 64, requires_grad=True)
output = layers(image)
output[0, 0, output.shape[2] // 2, output.shape[3] // 2].backward()
rows = image.grad[0, 0].sum(dim=1).nonzero()
size = rows.max().item() - rows.min().item() + 1
print(f"{name}: {size}x{size} pixels")単純な積層では7 × 7、ジャンプ幅が1から2、4へと拡大するストライド付き積層では15 × 15、各層が4ピクセルを追加するダイレーション付き積層では13 × 13と出力されます。
理論上の受容野と実効受容野#
式から求められるのは、ユニットに影響を与えうるすべてのピクセルを含む理論上の受容野です。実効受容野は、各ピクセルが実際にどれほど影響するかを測ります。影響の分布はおおむねガウス形状で中心に集中し、理論上の領域の一部しか占めません。大きなカーネルを使うと実効受容野が広がります。RepLKNetは最大31 × 31のデプスワイズカーネルを使い、小さなカーネルのCNNよりも大幅に大きな実効受容野を報告しました。ビジョンTransformerでは、自己注意により、最初の層から画像内の各パッチが他のすべてのパッチを参照できます。そのため、理論上の受容野はどの深さでも画像全体をカバーします。
受容野と関連用語の比較#
- カーネルサイズ: 1つの畳み込みが自身の入力から読み取るウィンドウの大きさです(例: 3 × 3)。受容野は元の画像における累積領域を指し、3 × 3カーネルを3層重ねるだけで7 × 7になります。
- 特徴マップ: 層の出力グリッドです。受容野は、そのグリッド上の1つの位置に対応する入力領域を表します。
- コンテキストウィンドウ: 言語モデルが一度に読み取るトークン数であり、画像グリッドの受容野に相当するシーケンス上の概念です。
物体検出における受容野#
検出器は、細かい特徴マップから小さな物体を、受容野が大きい粗く深いマップから大きな物体を予測します。特徴ピラミッドネットワーク(FPN)は、深い層のコンテキストを細かいマップに戻して融合します。受容野が物体より小さいと、その一部しか捉えられません。また、小さな物体には細かい解像度の層が引き続き必要です。ストライド32のマップでは、20ピクセルの物体が1つのグリッドセルにも満たないためです。YOLO26はストライド8、16、32のマップから予測します。バックボーンの末尾にはSPPFブロックがあり、ストライド32のマップに対して、それぞれ5 × 5、9 × 9、13 × 13セルに相当するウィンドウで最大プーリングを行います。その後、ストライド32のマップ全体に及ぶ自己注意ブロックを適用します。










