3秒でわかる
CNNで特徴マップを縮小する層。位置が少しずれても同じ特徴として拾えるようにし、あわせて以降の計算量も大きく減らします。
もう少し詳しく
どういうものか
プーリング層は、畳み込みニューラルネットワーク(CNN)で畳み込み層の出力を一定の窓ごとにまとめ、小さな特徴マップへ縮める層です。窓の中の最大値を取る最大値プーリングと、平均を取る平均値プーリングが代表的です。2かける2の窓を2つ飛ばしで動かすと、縦横がそれぞれ半分になります。
なぜ必要か
理由は2つあります。1つは計算量とパラメータの削減です。特徴マップが半分になると、以降の層の計算量はおよそ4分の1になります。もう1つは位置ずれへの強さです。猫の耳が数ピクセル右にずれても、窓の中の最大値はほとんど変わりません。この性質を平行移動不変性と呼び、少ない学習データでも汎化しやすくなります。
具体例
import torch
import torch.nn as nn
x = torch.randn(1, 16, 32, 32) # バッチ1, チャネル16, 32x32
pool = nn.MaxPool2d(kernel_size=2, stride=2)
print(pool(x).shape) # torch.Size([1, 16, 16, 16])
# 分類器の直前で空間方向を1点に潰すやり方もよく使われる
gap = nn.AdaptiveAvgPool2d(1)
print(gap(x).shape) # torch.Size([1, 16, 1, 1])チャネル数は変わらず、縦横だけが縮む点に注目します。
つまずきやすいところ
プーリング層には学習するパラメータがありません。ここを畳み込み層と混同すると、モデルのパラメータ数を数えるときに合いません。もうひとつは、位置情報が失われる副作用です。物体がどこにあるかを出力する検出やセグメンテーションでは、プーリングを重ねすぎると輪郭がぼやけます。近年のモデルがストライド付き畳み込みで代用したり、最後に大域平均プーリングだけを使ったりするのはこのためです。
覚え方
畳み込みが「何があるかを見つける層」、プーリングが「どこにあったかを少しぼかす層」と捉えると、役割の違いが整理できます。
似た用語との違い
| 層 | 学習するパラメータ | 主な役割 |
|---|---|---|
| 畳み込み層 | あり | 特徴を抽出する |
| プーリング層 | なし | 縮小して位置ずれに強くする |
| 全結合層 | あり | 抽出した特徴から出力を決める |
窓の大きさと移動幅をそろえるかどうかで、重なりを持たせることもできます。ただし実務では2かける2で2つ飛ばしという設定がほとんどで、そこから外す場面は多くありません。