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