딥러닝에서 풀링층이란?
概要
人工ニューラルネットワークにおけるプーリング層とは、入力データの次元を局所的な単位で減らす関数を指す。指定された領域で最大値のみを残すものを最大値プーリング、指定された領域の平均値を残すものを平均値プーリングという。
定義
$m \times m$ 行列 $\mathbf{X} = [X_{ij}]$に対して、次の関数を最大値プーリングmax poolingと呼ぶ。
$$ \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と呼ぶ。
$$ \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*} $$
説明
プーリングという名前がついているが、実際にはなくても構わない。上記の定義を見れば、単に最大値や平均とだけ呼んでも同じ意味である。プーリング層とは、入力データを小さな領域に分割し、各領域に対してプーリング演算を適用する関数を指す。すなわち、次のように再定義することができる。$k \in \mathbb{N}$と$n = km$に対して、以下のように定義される関数$P_{\text{max}} : M(\mathbb{R}^{n \times n}) \to M(\mathbb{R}^{m \times m})$を最大値プーリング層max pooling layerと呼ぶ。
$$ \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*} $$
次のように定義される$P_{\text{avg}} : M(\mathbb{R}^{n \times n}) \to M(\mathbb{R}^{m \times m})$を平均値プーリング層average pooling layerと呼ぶ。
$$ \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