logo

딥러닝에서 풀링층이란? 📂機械学習

딥러닝에서 풀링층이란?

概要

人工ニューラルネットワークにおけるプーリング層とは、入力データの次元を局所的な単位で減らす関数を指す。指定された領域で最大値のみを残すものを最大値プーリング、指定された領域の平均値を残すものを平均値プーリングという。

定義

m×mm \times m 行列 X=[Xij]\mathbf{X} = [X_{ij}]に対して、次の関数を最大値プーリングmax poolingと呼ぶ。

Pmax:Rn×nRXmax{Xij:1i,jm} \begin{align*} P_{\text{max}} : \mathbb{R}^{n \times n} &\to \mathbb{R} \\ \mathbf{X} &\mapsto \max \left\{ X_{ij} : 1 \le i, j \le m\right\} \end{align*}

次の関数を平均値プーリングaverage poolingと呼ぶ。

Pavg:Rn×nRX1m2i=1mj=1mXij \begin{align*} P_{\text{avg}} : \mathbb{R}^{n \times n} &\to \mathbb{R} \\ \mathbf{X} &\mapsto \frac{1}{m^2} \sum_{i=1}^{m} \sum_{j=1}^{m} X_{ij} \end{align*}

説明

プーリングという名前がついているが、実際にはなくても構わない。上記の定義を見れば、単に最大値や平均とだけ呼んでも同じ意味である。プーリング層とは、入力データを小さな領域に分割し、各領域に対してプーリング演算を適用する関数を指す。すなわち、次のように再定義することができる。kNk \in \mathbb{N}n=kmn = kmに対して、以下のように定義される関数Pmax:M(Rn×n)M(Rm×m)P_{\text{max}} : M(\mathbb{R}^{n \times n}) \to M(\mathbb{R}^{m \times m})最大値プーリング層max pooling layerと呼ぶ。

Y=Pmax(X)Yij=max{X(i1)k+p,(j1)k+q1p,qk}. \begin{align*} \mathbf{Y} &= P_{\max}(\mathbf{X}) \\ Y_{ij} &= \max \{ X_{(i-1)k+p, (j-1)k+q} \mid 1 \le p, q \le k \}. \end{align*}

次のように定義されるPavg:M(Rn×n)M(Rm×m)P_{\text{avg}} : M(\mathbb{R}^{n \times n}) \to M(\mathbb{R}^{m \times m})平均値プーリング層average pooling layerと呼ぶ。

Y=Pavg(X)Yij=1k2p=1kq=1kX(i1)k+p,(j1)k+q \begin{align*} \mathbf{Y} &= P_{\operatorname{avg}}(\mathbf{X}) \\ Y_{ij} &= \dfrac{1}{k^{2}} \sum_{p=1}^{k} \sum_{q=1}^{k} X_{(i-1)k+p, (j-1)k+q} \end{align*}

ジュリアのディープラーニングパッケージFlux.jlで簡単な行列について計算すると以下の通りである。

julia> using Flux

julia> mp = MaxPool((2,2))
MaxPool((2, 2))

julia> ap = MeanPool((2,2))
MeanPool((2, 2))

julia> A = collect(1.0:16.0) |> x->reshape(x, 4,4,1,1)
4×4×1×1 Array{Float64, 4}:
[:, :, 1, 1] =
 1.0  5.0   9.0  13.0
 2.0  6.0  10.0  14.0
 3.0  7.0  11.0  15.0
 4.0  8.0  12.0  16.0

julia> mp(A)
2×2×1×1 Array{Float64, 4}:
[:, :, 1, 1] =
 6.0  14.0
 8.0  16.0

julia> ap(A)
2×2×1×1 Array{Float64, 4}:
[:, :, 1, 1] =
 3.5  11.5
 5.5  13.5