ひとことで言うと
プーリング層は、特徴マップ上の局所窓をstride幅で動かし、窓内の値を1つに集約して空間解像度を下げます。最大値なら強い反応を残し、平均値なら反応の総量をならします。通常はチャネルごとに独立して処理するため、チャネル数を増やす層ではありません。
小さな地域ごとに「いちばん目立つ店」を記録するのが最大値プーリング、地域全体の「平均的なにぎわい」を記録するのが平均プーリングです。記録する地域を重ねずに進めれば、地図は粗くなりますが、細かな位置を少し変えても地域の代表値は保ちやすくなります。
なぜ必要か
畳み込みの出力をそのまま次段へ渡すと、縦横の要素数と計算量が大きいままです。プーリングは学習する重みを持たず、局所窓の集約だけで表現を小さくし、後段の計算とメモリを抑えます。
strideを窓の大きさと同じにすると、隣り合う窓を重ねずに縮小できます。strideを1にしても、縦横サイズは窓とpaddingの条件次第です。プーリングだから必ず半分になるわけではありません。
| 設定 | 空間サイズへの作用 |
|---|---|
| strideを大きくする | 窓を遠くへ動かすため、出力を粗くしやすい |
| strideを1にする | 窓を細かく走査し、縮小率を抑えやすい |
| paddingを加える | 境界を含めて窓を置けるが、出力形状も変わる |
仕組み
入力をチャネルごとの特徴マップ 、窓を 、出力を とします。最大値プーリングと平均プーリングは、集約演算だけが異なります。
は出力上の位置、 はその位置に対応する入力窓、 は窓の要素数です。最大値は窓内の強い特徴を残すので、特徴が窓のどこにあるかを少し変えても同じ値になりやすい一方、最大でない反応は捨てます。平均値は複数の反応を残しますが、突出した反応は薄まります。この局所的な位置ずれへの頑健さは、厳密な位置情報を保持する性質ではなく、粗い位置で存在を表す性質です。
2次元の高さ方向について、入力サイズを 、窓の高さを 、paddingを 、strideを とすると、通常の切り捨て設定では出力高さは次で決まります。 は出力高さ、 は小数点以下を切り捨てる演算です。
幅方向も同じ計算です。PyTorchの MaxPool2d ではstrideの既定値がkernel sizeで、paddingを使う最大値プーリングでは窓の外側を負の無限大として扱います。ceil_mode=True なら切り上げを使います。
プーリング自体に重みやbiasはなく、学習パラメータは増えません。ただし最大値の選択位置は逆伝播で勾配を受け取る場所を決めます。したがって「パラメータがない」と「学習時に何も計算しない」は同じではありません。
試験でどう問われるか
| 問われ方 | 正解に寄る条件 | 引っかけ |
|---|---|---|
| 最大値と平均値の比較 | 最大値は強い反応を残し、平均値は窓内をならす | 平均値も最大反応をそのまま保持すると考える |
| 出力サイズの計算 | kernel sizeだけでなくstride、padding、切り捨て/切り上げを見る | プーリングなら常に縦横1/2になるとする |
| パラメータ数 | 通常のpoolingは学習パラメータを持たない | 出力チャネル数ぶん重みが増えるとする |
| 位置ずれへの性質 | 局所窓内の位置変化を吸収しやすいが、位置情報を完全には保たない | どんな移動にも不変だとする |
| 畳み込みとの置換 | stride付き畳み込みで縮小を担える場合がある | 常に同じ演算・同じ表現になるとする |
実装で確かめる
NumPyで2×2窓をstride 2で動かし、最大値と平均値の違いを確認します。
import numpy as np
x = np.array([[1., 2., 0., 4.],
[3., 1., 5., 2.],
[0., 6., 2., 1.],
[4., 1., 3., 0.]])
windows = [x[r:r+2, c:c+2] for r in (0, 2) for c in (0, 2)]
max_pool = np.array([w.max() for w in windows]).reshape(2, 2)
avg_pool = np.array([w.mean() for w in windows]).reshape(2, 2)
print(max_pool)
print(avg_pool)
このコードの出力は最大値が [[3. 5.] [6. 3.]]、平均値が [[1.75 2.75] [2.75 1.5 ]] です。
取り違えやすいもの
| 用語 | プーリングとの切り分け |
|---|---|
| stride付き畳み込み | 学習するカーネルで特徴抽出と縮小を同時に行う。poolingは固定の集約で、置換しても意味は同じとは限らない |
| 最大値プーリング | 窓内の最大値だけを出力する。強い反応の検出に寄る |
| 平均プーリング | 窓内の平均を出力する。反応をならして残す |
| padding | 入力の周囲を補う設定。poolingの集約規則そのものではない |
想起チェック
最大値プーリングと平均プーリングの違いは何か
最大値プーリングは窓内の最大値を、平均プーリングは窓内の値の平均を出力します。前者は強い反応を残し、後者は反応をならします。
プーリングの出力サイズを決める設定は何か
kernel size、stride、paddingが基本です。ceil_mode のように切り上げを選ぶ設定もあるため、窓の大きさだけでは決まりません。
プーリング層に学習パラメータはあるか
通常の最大値・平均プーリングには学習する重みやbiasはありません。ただし最大値の選択位置など、順伝播と逆伝播の計算はあります。