logo

딥러닝에서 풀링층이란? 📂머신러닝

딥러닝에서 풀링층이란?

개요

인공신경망에서 풀링층이란, 입력 데이터의 차원을 국소적인 단위로 줄이는 함수를 말한다. 지정된 영역에서 최댓값만을 남기는 것을 최대값풀링, 지정된 영역의 평균값을 남기는 것을 평균값풀링이라 한다.

정의

$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