【畳み込み/CNN】プーリングとは何か

AI/データサイエンス

これまで、画像処理によく用いられるCNNを開設するために、DNNや畳み込みについて解説してきました。

リンク

今回は畳み込みと並んでCNNの代表的な操作であるプーリングについて解説します。

スポンサーリンク

プーリングとは何か

プーリングは、CNNにおいて、特徴量マップの次元削減(Down sampling)を行う操作の一つです。畳み込みの結果得られた特徴マップのうち、例えば以下のようにウィンドウ(2×2や3×3という単位の範囲)を見て、その中での最大値を抜き出したり(Max Pooling)、その中の値の平均値を取得したり(Average Pooling)します。

上の特徴マップを2×2でMax Pooling及びAverage Poolingした結果を以下に示します。なお、2×2で余ってしまう左端と下端のデータは今回は無視(切り捨て)しています。パディングする方法もあります。

プーリングの役割

上の図からもわかる通り、プーリングは特徴マップの空間的な情報を要約するような役割を果たします。DNNの記事でDNNのデメリットとして位置ずれに弱い点を挙げました。プーリングはまさに位置ずれの影響を軽減する措置であることがわかります。またプーリングは特徴マップの情報量を大きく削減する効果を持ちます(例えば2×2プーリングは情報量を1/4に削減)。

一方プーリングを多用し過ぎると過度に情報量を減らし過ぎたり、特徴マップのサイズをDown Samplingし過ぎることがあるので注意が必要です。

スポンサーリンク

プーリングの種類

上ではMax PoolingとAverage Poolingに言及しましたが、プーリングには他にも種類があります。以下で纏めてみます。

Max PoolingとAverage Pooling

Max Pooling

ウィンドウ内の最大値を取得します。これが一般的に最も頻繁に使用されるプーリング手法です。

Average Pooling

ウィンドウ内の平均値を取得します。

Local PoolingとGlobal Pooling

Local Pooling

Local Poolingは特定の局所的な領域に適用されるプーリングです。上述のMax PoolingやAverage Poolingも、ウィンドウを設定して画像全体の1部領域(2×2/3×3)を対象にプーリングしているので、Local Poolingの一種です。Local Poolingという言葉自体はあまり聞きませんが、後述のGlobal Poolingとの関連で理解してもらえればと思います。

Global Pooling

特徴マップ全体に対して適用されるプーリングです。全体に対してプーリングというのは何の意味があるのか理解しにくいと思います。ここはGlobal Average Poolingの項目で後述します。

Unpooling

これはプーリングの逆操作です。畳み込みの記事で紹介したTransposed Convolutionと同じように、一度プーリングしてDown Samplingした特徴マップを再度Up Samplingする手法です

具体的には以下のように、まずDown Sampling時に、例えば2×2 Max Poolingした際にどの位置のデータを取得したかを記憶しておきます。

そしてUp Sampling時にはその位置情報を使い、プーリング後の値を埋め、それ以外の場所には0を入力します。これがUnpoolingです。

RoI PoolingとRoI Align

RoI(Region of Interest)PoolingとRoI Alignは、物体検出タスクで使用される特殊なタイプのプーリングです。物体検出については今後詳細記事を作成しますが、以下では簡単に説明します。

ROI pooling

RoI Poolingは、Fast R-CNNという物体検出アルゴリズムで導入されました。Fast R-CNNは、入力画像に対して候補となる物体の領域(RoI)を抽出し、それぞれのRoIに対してCNNを適用して特徴を抽出します。しかし、異なるRoIは異なるサイズと形状を持つため、これらを一定のサイズの特徴マップに変換するためにRoI Poolingが使用されます。

ROI Align

RoI AlignはMask R-CNNで導入されました。詳細は非常に難しいので簡単にだけ説明します。RoI Poolingでは、異なるサイズのROIを一定サイズの特徴マップに変換する際に、細かな位置情報を切り捨ててしまうという問題がありました。それに対し、RoI Alignはバイリニア補間(bilinear interpolation)という手法を用いて細かな位置情報を扱う際に切り捨てが発生するケースでも、単に切り捨てるのではなく周辺のピクセルの情報を用いて計算することで精度を向上させました。

プーリングのウィンドウサイズは畳み込みのストライドと一致させる

CNNにおいては’畳み込み‘と’プーリング‘が2つの主要なステップです。これら2つのステップは、多くの場合、相互に関連して動作します。つまり、畳み込みのストライドとプーリングのウィンドウサイズは、一般的に一致するように設定されます。これはなぜでしょうか。

これは、画像の特徴を抽出しDown Samplingする際に、情報の一貫性と完全性を維持するためです。プーリングのウィンドウサイズが畳み込みのストライドと一致すると、Down Samplingされた特徴マップは元の画像の特徴をうまく保持し、それぞれの特徴がどのピクセルに対応するかが明確になります。

たとえば、畳み込みのストライドが2で、プーリングのウィンドウサイズも2の場合、最初の畳み込み操作は画像の左上隅(例えば、ピクセル1,1から2,2まで)を対象とします。その後、同じ領域(ピクセル1,1から2,2まで)がプーリング操作の対象となります。結果として生成された特徴マップのピクセルは、元の画像の同じ領域(1,1から2,2まで)に対応します。

これは直感的に理解しやすく、各特徴が元の画像のどの部分から来たのかを追跡しやすくする助けになります。また、特徴マップが元の画像と密接に関連していると考えることができるため、特徴が何を表しているか理解しやすくなります。

そのため、絶対ではないですが、畳み込みのストライドとプーリングのウィンドウサイズを一致するように設定するということになるのです。

GAP(Global Average Pooling)

GAPは、各チャネルの画素平均値を求め、各チャネルの平均値を要素とするベクトルに変換する作業です。上で説明したように、Global Poolingは画像(ここでは1つのチャネル)全体に対するプーリングをすること、Average Poolingは、プーリング対象の値の平均値を取ることです。

これは何をしているのでしょうか。例えばCNNは入力層付近ではRGBの3チャネルしか存在しなかったりしますが、出力層付近では例えば1000層を超えるチャネルが存在することも多々あります。このとき、Global Poollingをすることで各チャネルが1つの値で表現されます。ベクトルで言えば、1000次元のベクトルを生成することができるということです。

上の図例で言うと、例えば出力層の直前の層が1000チャネル保持していて、うち4つが”右頬”、”右耳”、”左目”、”右目”の4つのチャネルとした時、それぞれのチャネルの平均値を算出することで、”今回の入力画像は右頬っぽさが強い(弱い)”といったことがわかるのです。

コメント

タイトルとURLをコピーしました