딥러닝에서 풀링층이란?
개요
인공신경망에서 풀링층이란, 입력 데이터의 차원을 국소적인 단위로 줄이는 함수를 말한다. 지정된 영역에서 최댓값만을 남기는 것을 최대값풀링, 지정된 영역의 평균값을 남기는 것을 평균값풀링이라 한다.
정의
$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