CNN 역전파를 이해하는 가장 쉬운 방법
The easiest way to understand CNN backpropagation



1. 이 글의 목적과 작성동기

본 문서의 목적은 CNN(Convolution Neural Network)의 역전파Back propagation 알고리즘을 정리하기 위해 간단한 CNN 모델을 정의하고 정의된 모델에 해당하는 수식을 완전히 유도하는 것 입니다. 정식 논문은 현학적 표현 때문에 수학 및 배경지식이 많지 않은 비전공자가 읽기 힘듭니다. 그리고 인터넷에 있는 많은 보조 문서들은 CNN을 전체적으로 조망하지 않고 일부 수식만을 설명 하기 때문에 초심자로써 CNN 역전파 알고리즘에 대해 포괄적으로 이해하기가 매우 어렵습니다. 더구나 그런 문서들은 사용하는 기호와 인덱스 기술 방법이 모두 다르고(수식에 rot180() 이나 flip(), up-sampling()같은 잘모르는 연산자가 등장한다거나, 인덱스를 0부터 쓰는 문서와 1부터 쓰는 문서를 함께 보면 보는 입장에서 매우 혼란스러움), 거의 모두 영어로 되어 있어 초심자의 접근을 더욱 어렵게 만듭니다. 따라서 CNN 역전파 알고리즘을 처음부터 끝까지 하나의 문서에 통일된 기호를 사용하여 기술한 한글 문서가 있으면 좋겠단 생각을 하였고, 이 문서를 작성하게 되었습니다.


2. 이 글을 읽기 위한 요구사항 및 범위

이 글을 읽기 전에 각 층Layer이 벡터로 구성된 가장 기본적인 NN(Neural Network)에서 역전파 알고리즘을 꼭 이해하여야 합니다. 이를 위해서는 Michael Nielsen씨가 쓴 문서[1]에서 2장을 읽어보는 것이 좋습니다. 이 글의 기호 역시 Nielsen 문서와 동일하게 할 것입니다. 그리고 CNN에 대한 전반적인 상황은 이해를 하여야 합니다. 구체적인 수식을 이해할 필요는 없지만 입력의 모양과 필터의 모양 풀링Pooling의 의미 등은 대강 파악하고 있어야 합니다. 마지막으로 이 글의 범위는 각 학습 변수들에 대한 코스트 함수의 편미분 값을 구하는 것까지 입니다. Mini-batch와 SGD(Stochastic Gradient Decent)를 사용하여 실제로 학습 변수를 업데이트하는 것은 포함되지 않습니다.


3. 표기법(Notation)

간단히 표기법을 정리하였습니다. 표기법은 앞서 밝힌 대로 Nielsen 문서와 동일합니다. Nielsen 문서를 대충이라도 읽어 볼 것을 강력히 추천합니다.



4. NN의 역전파 알고리즘 수식

CNN에서 역전파 알고리즘의 수식이 NN에서의 그것과 수학적으로 동일한 것이므로 NN의 수식을 언급하지 않을 수 없습니다. CNN에서의 수식은 각 층의 연결 상태에 따라 내적Dot product이 컨벌루션Convolution 또는 코릴레이션Correlation으로 바뀐 것이기 때문에 우리의 논의는 NN의 수식으로부터 출발합니다. 다음 4개의 수식을 Nielsen 문서에서와 같이 순서대로 (BP1), (BP2), (BP3), (BP4)로 표시합니다.
$$ \delta^{L}_{j} = \frac{ \partial C } { \partial a^{L}_{j} } \sigma'(z^{L}_{j}) $$
(BP1)
$$ \delta^{l}_{j} = \sum_{k} w^{l+1}_{kj} \delta^{l+1}_{k} \sigma'(z^{l}_{j}) $$
(BP2)
$$ \frac{ \partial C } { \partial b^{l}_{j} } = \delta^{l}_{j} $$
(BP3)
$$ \frac{ \partial C } { \partial w^{l}_{jk} } = a^{l-1}_{k} \delta^{l}_{j} $$
(BP4)
(BP1)과 (BP2)를 이용하여 모든 층의 \( \delta \)를 구하고 그 \( \delta \)를 이용하여 (BP3), (BP4)를 통해 코스트함수의 편미분 값을 구할 수 있습니다. CNN에서는 위 수식 중 (BP2), (BP3), (BP4)가 바뀌어야 합니다. 지금부터 그 과정을 설명합니다.


5. CNN의 역전파 알고리즘 수식

5.1 컨벌루션Convolution 과 코릴레이션Correlation

CNN은 입력층과 필터를 컨벌루션 한다고 일반적으로 이야기 합니다. 그런데 조금 자세히 살펴보면 여러 문서 마다 해당 연산을 두 가지로 기술하는 경우가 많습니다. 식(1), (2)가 바로 그것 입니다.[2]
$$ C(x,y)= \sum_{a=0}^{k-1} \sum_{b=0}^{k-1} I(x+a,y+b)F(a,b) $$
식(1)
$$ C(x,y)= \sum_{a=0}^{k-1} \sum_{b=0}^{k-1} I(x-a,y-b)F(a,b) $$
식(2)
위 식에서, \( I \) : 2차원 입력 배열, \( F \) : 필터, \( k \)는 필터의 크기
식(1)을 '코릴레이션'이라 하고 식(2)를 '컨벌루션'이라 합니다. 둘의 차이는 코릴레이션은 필터 \( F \)를 입력 배열 \( I \)에 그대로 겹쳐놓고 같은 위치에 있는 요소끼리 곱해서 다 더하는 것입니다. 반면 컨벌루션은 필터 \( F \)를 180도 회전시켜서 같은 연산을 수행합니다. 컨벌루션의 수학적 정의가 식(3)과 같기 때문에 곱하고자 하는 함수를 반전시켜야 합니다. (\( g \)함수의 \( \tau \)에 –가 곱해짐) 이와 동일한 행위가 2차원 배열에서는 180도 회전하는 것 입니다.
$$ f(t) * g(t) = \int^{\infty}_{-\infty} f(\tau)g(-\tau + t) d\tau $$
식(3)
다음 jupyter 파일에서 연속함수의 컨벌루션과 배열의 180도 회전이 왜 동일한가 실험 해보았습니다. 참고 하세요.

컨벌루션 주피터 파일


식(2)의 인덱스 표현이 왜 필터를 180도 회전시키는 것인지 간단한 예제를 한번 그려 보면 금방 이해가 됩니다. 다음 엑셀파일에는 컨벌루션이 되는 모든 절차를 그려놓은 것입니다.

컨벌루션 그림 엑셀 파일


인덱스 계산과 그림을 함께 보면 180도 회전에 대해 쉽게 이해 할 수 있습니다. 식(2)의 경우는 필터가 입력 배열의 바깥으로 튀어 나가게 되는데, 입력이 없는 부분을 0으로 채우는 제로패딩zero-padding을 써서 문제를 해결합니다. 패딩 크기Padding size도 CNN의 하이퍼 파라메터hyper parameter중 하나입니다. 여기서는 이것을 다룰 목적은 아니므로 컨벌루션과 코릴레이션의 차이만 정확하게 알고 넘어가면 되겠습니다. 문서에 따라 이 둘을 모두 그냥 컨벌루션이라고 칭하는 문서도 많습니다. UFLDL Tutorial[3]에 보면 매트랩의 Conv함수를 사용하면 필터를 회전시키기 때문에 회전시키지 않고 코릴레이션을 하기 위해 일부러 필터를 미리 돌려서 Conv함수에 넘겨주는 것을 확인할 수 있습니다. 컨벌루션과 코릴레이션의 정확한 개념 없이는 이런 부분이 매우 혼란스러울 수 있습니다. 우리 문서에서는 이 둘을 명확하게 구분 하도록 하겠습니다. 즉, 네트워크를 포워드패스Forward pass할 때 코릴레이션을 사용하도록 하겠습니다.


5.2 예제 CNN 구조

이쯤에서 우리가 예로 들 CNN의 그림을 보도록 하겠습니다. 여기에 제시된 CNN은 어떤 기능을 수행하는 실제적 예가 아니라 인덱스 연산을 직접 해볼 수 있을 정도로 작으면서도 네트워크의 모양은 그럴듯하게 나오는 임의의 예제입니다.




이 모델은 15x15크기의 입력층으로 시작합니다. 그 뒤를 이어 4x4필터를 통해 12x12크기의 출력을 생성하고 이를 다시 2x2 크기로 맥스 풀링하여 6x6 크기의 출력을 만들어내는 컨벌루션층(이하 CONV층)이 있습니다. 다시 한번 3x3필터를 통해 4x4출력을 생성하고 맥스 풀링을 통해 2x2출력을 만들어내는 CONV층 이 있습니다. 그리고 마지막으로 2x2와 3x1이 완전히 연결되어 있는 완전연결층(이하 FC층)이 있습니다. 문제를 간단히 하기 위해 필터는 하나만 사용하고, 입력과 필터의 채널(깊이)수도 1로 둡니다. 그리고 컨벌루션시 필터를 움직이는 스트라이드Stride도 1로 두겠습니다. 각 층은 색으로 구분되어 있으며 각 층의 인덱스가 아래쪽에 표시되어 있습니다. 그리고 각 층의 위쪽에는 역전파 중 사용되는 \( a \), \( z \), \( \delta \)의 차원과 사용되는 행과 열의 인덱스가 표시되어 있습니다. 각 층의 바이어스도 표시되어 있습니다. 컨벌루션층의 바이어스는 배열이 아닌 상수로 표시되어 있습니다. 컨벌루션과 풀링은 이 네트워크에서 쌍으로 짝지어져 있어서 풀링층은 별도의 층 인덱스layer index를 부여하지 않았습니다. 그리고 CONV층의 출력을 \( a \), 그 풀링층의 출력을 \( \tilde{a} \)로 표시했습니다. 2x2 맥스 풀링을 가정하므로 \( \tilde{a} \)의 크기는 \( a \)의 절반입니다. CONV층을 2개 쌓은 이유는 FC층과 CONV층이 만나는 사이, CONV층과 CONV층이 만나는 사이에서 역전파 수식이 어떻게 다른지 살펴보기 위해서 입니다. 이제 이 모델에 대해서 순서대로 각 변수의 편미분 값을 구해보도록 하겠습니다.


5.3 단계별 역전파

식(4)는 예제 CNN의 l번째 CONV 층에서의 가중 합을 코릴레이션을 사용하여 나타낸 것입니다.
$$ z^{l}_{mn}= \sum_{a=0}^{A-1}\sum_{b=0}^{B-1} w^{l}_{ab} a^{l-1}_{(m+a)(n+b)} + b^{l} $$
식(4)
위 식에서 필터 \( \mathbf{w} \)의 크기는 A x B(전술한 바와 같이 인덱스의 대문자로 크기를 나타냄)
식(5)는 마지막 FC층의 가중합을 나타냅니다. 일반적인 NN에서 익숙하던 모습입니다.
$$ z^{L}_{r}= \sum_{q} w^{l+2}_{rq} a^{l+1}_{q} + b^{l+2}_{r} $$
식(5)
이 가중합을 활성화 함수를 통해 활성값으로 만들어 냅니다.
$$ a^{l}_{mn} = \sigma ( z^{l}_{mn} ) $$
식(6)
풀링을 사용한다면 정해진 풀링 유닛 크기만큼 활성값을 평균 내어 하나의 값을 구하거나(mean pooling), 풀링 유닛의 크기에 해당하는 활성값들 중 최대값을 선택(max pooling)하는 것으로 풀링층을 만들어 낼 수 있습니다. 이제 CNN역전파 알고리즘의 단계를 따라 가 보도록 하겠습니다. 지금부터는 그림과 그림의 인덱스와 수식을 함께 보면서 글을 읽어주세요.


단계 0 식(4)를 사용하여 네트워크 전체를 포워드패스 합니다. 마지막 완전연결 되어있는 층은 식(5)를 사용합니다. 단계0은 별 어려움이 없습니다. 열심히 계산만 하면 됩니다.


단계 1 (BP1)을 사용하여 출력층의 \( \delta^{L} \)을 구합니다. 출력층은 \( l+1 \) 번째 층과 완전연결 되어있는 층이므로 기존 역전파식과 달라질 것이 없습니다. 따라서 다음 식(CBP1)을 이용하여 출력층의 \( \delta^{L} \)을 구합니다.
$$ \definecolor{spin}{RGB}{251,0,29} \color{spin} \delta^{L}_{r} = \frac{\partial C}{\partial a^{L}_{r}} \sigma'(z^{L}_{r}) $$
식(CBP1)


단계 2 원래 역전파 알고리즘은 모든 층의 \( \delta \)를 구하고 다시 출력층으로 돌아와 \( \mathbf{w} \)\( \mathbf{b} \)에 대한 편미분을 구하는 순서로 진행되지만 이 글에서는 설명의 편의를 위해 델타를 구한 후 바로 \( \mathbf{w} \)\( \mathbf{b} \)의 편미분을 구하도록 하겠습니다. 이전 단계와 마찬가지로 \( \mathbf{w^{l+2}} \)\( \mathbf{b^{l+2}} \)에 대한 코스트함수의 편미분 값은 기존의 (BP3), (BP4)를 통해 구할 수 있습니다.
$$ \definecolor{spin}{RGB}{251,0,29} \color{spin} \frac{\partial C}{\partial b^{l+2}_{r}} = \delta^{l+2}_{r} $$
$$ \definecolor{spin}{RGB}{251,0,29} \color{spin} \frac{\partial C}{\partial w^{l+2}_{rq}} = \tilde{a}^{l+1}_{q} \delta^{l+2}_{r} $$
위 식에서 \( \delta^{l+2}_{r} \)는 단계 1을 통해서 다 구했고, \( \tilde{a}_{q}^{l+1} \)은 포워드패스 과정에서 이미 모두 구해진 값입니다. \( l+1 \)번째 층의 출력 \( \tilde{a} \)\( o' \) , \( p' \)의 인덱스를 가지는 2차원 배열 형태이지만 그림처럼 1차원 배열로 간주하고 인덱스 \( q \)를 사용했습니다. \( o' \) , \( p' \)\( q \)의 관계는 다음과 같습니다.
$$ q = o'P + p' $$
식(7)




따라서 우리는 \( \delta_r^{l+2} \)\( \mathbf{b}^{l+2} \) 에 대한 편미분 값을, \( \delta_r^{l+2} \)\( \tilde{a}_q^{l+1} \)을 곱하는 것으로 \( \mathbf{w}^{l+2} \) 에 대한 편미분 값을 모두 구할 수 있습니다.


단계 3 이제 \( \delta^{l+1} \)을 구할 차례입니다. 그전에 \( l+1 \)번째 층은 CONV층이므로 \( \frac{ \partial C }{ \partial w }\)\( \frac{\partial C }{ \partial b } \)를 먼저 유도하도록 하겠습니다. \( \mathbf{w}^{l+1} \)\( b^{l+1} \)은 CONV층의 학습 변수이므로 FC층의 그것과 연결 양상이 다릅니다. 즉, \( \mathbf{w}^{l+1} \)는 부분적으로만 연결되어 있고, \( b^{l+1} \)은 상수 하나가 모든 뉴런과 연결되어 있습니다.
예제 CNN에 맞춰서 식을 유도하면 인덱스를 p, q, m, n 와 같은 식으로 써야 하는데 이것은 별로 보기 좋지 않기 때문에 다음 그림처럼 익숙한 일반적인 인덱스 i, j를 가지는 부분 모델을 사용하겠습니다. 여기서의 인덱스는 예제 CNN모델과는 아무 상관이 없는 독립적인 인덱스입니다.




\( N \times N \) 크기의 \( l-1 \)번째 입력층에 \( m \times m \) 크기의 필터 \( \mathbf{w} \)를 적용하여 \( (N-m+1) \times (N-m+1) \) 크기의 출력층을 만드는 CONV층 모델입니다. 식(4)를 인덱스에 맞춰 다시 써보면 가중합 \( z_{ij}^l \) 는 식(8)과 같습니다.
$$ z^{l}_{ij} = \sum_{a=0}^{m-1}\sum_{b=0}^{m-1} w^{l}_{ab} a^{l-1}_{(i+a)(j+b)} + b^{l} $$
식(8)
이제 \( \frac{\partial C}{\partial b^{l}} \)은 다음처럼 체인룰로 표시할 수 있습니다.
$$ \frac{\partial C}{\partial b^{l}} = \sum_{i=0}^{N-m}\sum_{j=0}^{N-m} \frac{\partial C}{\partial z^{l}_{ij}} \frac{\partial z^{l}_{ij}}{\partial b^{l}} $$
식(9)
식(9)에서 \( \frac{\partial z^{l}_{ij}}{\partial b^{l} } \) 은 식(8)에 의해 모두 1입니다. 따라서 다시 써보면
$$ \frac{\partial C}{\partial b^{l}} = \sum_{i=0}^{N-m}\sum_{j=0}^{N-m} \frac{\partial C}{\partial z^{l}_{ij}} \frac{\partial z^{l}_{ij}}{\partial b^{l}} = \sum_{i=0}^{N-m}\sum_{j=0}^{N-m} \delta^{l}_{ij} \frac{\partial z^{l}_{ij}}{\partial b^{l} } = \sum_{i=0}^{N-m}\sum_{j=0}^{N-m} \delta^{l}_{ij} $$
식(10)
입니다. (BP3)과 비교해보면 CONV층에서 \( \frac{ \partial C }{ \partial b^{l} } \)\( \mathbf{\delta} \)의 모든 엘리먼트를 다 더하는 것이 됩니다. 따라서 (CBP3)은 다음과 같습니다.
$$ \definecolor{spin}{RGB}{251,0,29} \color{spin} \frac{\partial C}{\partial b^{l}} = \sum_{i=0}^{N-m}\sum_{j=0}^{N-m} \delta^{l}_{ij} $$
(CBP3)
위 식에서 \( N \) : \( l-1 \)번째 층의 가로 세로 크기, \( m \) : 필터 \( \mathbf{w} \)의 가로 세로 크기
이제 \( \frac{\partial C}{\partial w^{l}_{ab}} \)차례입니다. 역시 다음처럼 체인룰을 사용하여 표시할 수 있습니다.
$$ \frac{\partial C}{\partial w^{l}_{ab}} = \sum_{i=0}^{N-m}\sum_{j=0}^{N-m} \frac{\partial C}{\partial z^{l}_{ij}} \frac{\partial z^{l}_{ij}}{\partial w^{l}_{ab}} $$
식(11)
식(11)에서 \( \frac{\partial z^{l}_{ij}}{\partial w^{l}_{ab}} \)은 식(8)에 의해 식(12)가 됩니다.
$$ \frac{\partial z^{l}_{ij}}{\partial w^{l}_{ab}} = a^{l-1}_{(i+a)(j+b)} $$
식(12)
식(11)을 다시 써보면
$$ \frac{\partial C}{\partial w^{l}_{ab}} = \sum_{i=0}^{N-m}\sum_{j=0}^{N-m} \frac{\partial C}{\partial z^{l}_{ij}} a^{l-1}_{(i+a)(j+b)} = \sum_{i=0}^{N-m}\sum_{j=0}^{N-m} a^{l-1}_{(i+a)(j+b)} \delta^{l}_{ij} $$
식(13)
이 됩니다. 식(13)은 바로 \( l-1 \)번째 층 활성값 \( \mathbf{a}^{l-1} \)\( \mathbf{\delta}^{l} \)을 코릴레이션한 것입니다. (BP4)와 비교해보면 (BP4)는 \( a\)\( \delta \)를 행렬곱(열벡터에 행백터를 곱)한 식이고 CONV층에서는 \( a\)\( \delta \)를 코릴레이션 한 것입니다. 따라서 (CBP4)는 다음과 같습니다.
$$ \definecolor{spin}{RGB}{251,0,29} \color{spin} \frac{\partial C}{\partial w^{l}_{ab}} = \sum_{i=0}^{N-m}\sum_{j=0}^{N-m} a^{l-1}_{(i+a)(j+b)} \delta^{l}_{ij} $$
(CBP4)
위 식에서 \( N \) : \( l-1 \)번째 층의 가로 세로 크기, \( m \) : 필터 \( \mathbf{w} \)의 가로 세로 크기
(CBP3)(CBP4)에서 볼 수 있듯이 입력층과 필터의 모양이 꼭 정방형일 필요는 없습니다. 대부분 정방형을 사용하므로 여기서도 정방형으로 가정하고 이야기를 계속하도록 하겠습니다. 이제 남은 것은 \( \delta \)를 구하는 것입니다. \( \delta^{l+1} \)만 구하면 (CBP3), (CBP4)에 의해 \( \frac{\partial C}{\partial b^{l+1}} \)\( \frac{\partial C}{\partial w_{cd}^{l+1}} \)를 구할 수 있습니다.
다시 우리 CNN 모델로 돌아가도록 하겠습니다. \( \delta \)의 정의에 따라 \( \delta^{l+1} \)은 식(14)입니다.
$$ \delta^{l+1}_{op} = \frac{\partial C}{\partial z^{l+1}_{op}} $$
식(14)
체인룰을 적용하면 식(15)와 같습니다.
$$ \delta^{l+1}_{op} = \sum_{r}\sum_{o'}\sum_{p'} \frac{\partial C}{\partial z^{l+2}_{r}} \frac{\partial z^{l+2}_{r}}{\partial \tilde{a}^{l+1}_{o'p'}} \frac{\partial \tilde{a}^{l+1}_{o'p'}}{\partial a^{l+1}_{op}} \frac{\partial a^{l+1}_{op}}{\partial z^{l+1}_{op}} $$
식(15)
식(15)에 있는 인덱스 \( o' \), \( p' \)\( q \)로도 쓸 수 있으므로 인덱스 \( q \)를 쓰면 식(16)처럼 쓸 수 있습니다.
$$ \delta^{l+1}_{op} = \sum_{r}\sum_{q} \frac{\partial C}{\partial z^{l+2}_{r}} \frac{\partial z^{l+2}_{r}}{\partial \tilde{a}^{l+1}_{q}} \frac{\partial \tilde{a}^{l+1}_{q}}{\partial a^{l+1}_{op}} \frac{\partial a^{l+1}_{op}}{\partial z^{l+1}_{op}} $$
식(16)
식(16)에서 \( z_{r}^{l+2} \)은 식(17)와 같습니다.
$$ z_{r}^{l+2} = \sum_{q} w^{l+2}_{rq} \tilde{a}^{l+1}_{q} + b^{l+2}_{r} $$
식(17)
식(17)에 의해 식(15)의 \( \frac{\partial z_{r}^{l+2} }{\partial \tilde{a}^{l+1}_{o'p'}} \)은 인덱스 \( o' \), \( p' \)\( q \)와 같을 때를 제외하고는 모두 0입니다. 따라서 \( \frac{\partial z_{r}^{l+2} }{\partial \tilde{a}^{l+1}_{o'p'}} \)은 식(18)과 같습니다.
$$ \frac{\partial z_{r}^{l+2} }{\partial \tilde{a}^{l+1}_{o'p'}} = \frac{\partial \sum_{q} w^{l+2}_{rq} \tilde{a}^{l+1}_{q} + b^{l+2}_{r} }{\partial \tilde{a}^{l+1}_{o'p'}} = w^{l+2}_{rq} $$
식(18)
위 식에서 \( q=o'P+p' \)
식(18)과와 \( \delta \)의 정의를 적용하여 식(15)를 다시 써보면 식(19)가 됩니다.
$$ \delta^{l+1}_{op} = \sum_{r}\sum_{o'}\sum_{p'} w^{l+2}_{rq} \delta^{l+2}_{r} \frac{\partial \tilde{a}^{l+1}_{o'p'}}{\partial a^{l+1}_{op}} \sigma'(z^{l+1}_{op}) $$
식(19)
식(19)에서 나타나는 인덱스 \( q \)\( 2o'+p' \)이므로 느닷없이 나타난 제3의 인덱스가 아니라 문제가 없습니다.
이제 식(19)에서 \( \frac{\partial \tilde{a}^{l+1}_{o'p'}}{\partial a^{l+1}_{op}} \)를 주목할 필요가 있습니다. (BP2)와 비교해보면
$$ \delta^{l}_{j} = \sum_{k} w^{l+1}_{kj} \delta^{l+1}_{k} \sigma'(z^{l}_{j}) $$
\( \frac{\partial \tilde{a}^{l+1}_{o'p'}}{\partial a^{l+1}_{op}} \) 는 새롭게 생겨난 항이라는 것을 알 수 있습니다. \( \frac{\partial \tilde{a}^{l+1}_{o'p'}}{\partial a^{l+1}_{op}} \) 는 무엇을 하는 것일까요? 무엇을 무엇에 대해 미분한다는 뜻일까요? 미분하면 어떤 현상이 일어나는 것일까요? Max 풀링의 경우를 놓고 생각해보겠습니다. \( l+1 \)층에서 일어나는 풀링은 아래그림과 같습니다. 4개의 뉴런 중 가장 큰 값을 취하고 나머지는 버립니다. 그림에서 풀링에 참가하는 뉴런을 같은색으로 표시했고 그 중 최대값은 조금 진하게 표시했습니다.




결국 \( \frac{\partial \tilde{a}^{l+1}_{o'p'}}{\partial a^{l+1}_{op}} \)은 max 함수를 미분하는 것입니다. \( \tilde{a}^{l+1}_{o'p'} \)는 식(20)처럼 max함수이기 때문입니다.
$$ \tilde{a}^{l+1}_{o'p'} = \max [ nb( a^{l+1}_{op} ) ] $$
식(20)
여기서 \( nb(a_{op}^{l+1}) \)는 주어진 \( a_{op}^{l+1} \)와 함께 풀링되는 몇 개의 이웃들을 나타냅니다.
예를 들어 \( nb(a_{11}^{l+1}) \)이라면 \( a_{00}^{l+1} \), \( a_{01}^{l+1} \), \( a_{10}^{l+1} \), \( a_{11}^{l+1} \)이 됩니다. 또는 \( nb(a_{01}^{l+1}) \) 라면 결과는 역시 \( a_{00}^{l+1} \), \( a_{01}^{l+1} \), \( a_{10}^{l+1} \), \( a_{11}^{l+1} \)로 같게 됩니다. nb()는 나중에 정식화 하도록 하겠습니다. 그렇다면 \( \frac{\partial \tilde{a}^{l+1}_{o'p'}}{\partial a^{l+1}_{op}} \)라는 항은 분모의 \( a^{l+1}_{op} \)의 이웃들이 분자의 \( \tilde{a}^{l+1}_{o'p'} \)와 아무 상관없는 뉴런들이라면 0이 됩니다. 예를 들면 \( \frac{\partial \tilde{a}^{l+1}_{00}}{\partial a^{l+1}_{02}} = 0\)입니다. 이런 식으로 식(19)는 대부분의 경우 0이 되고 주어진 인덱스 \( o \), \( p \)와 상관 있는 \( o' \), \( p' \)에 대해서만 생각하면 됩니다. 즉, 인덱스 \( o' \), \( p' \)가 다음과 같은 경우를 제외하고는 식(19)는 모두 0입니다.
$$ o' = \lfloor o/2 \rfloor \quad,\quad p' = \lfloor p/2 \rfloor $$
따라서 식(19)는 식(21)로 쓸 수 있습니다.
$$ \delta^{l+1}_{op} = \sum_{r} \left( w^{l+2}_{r,(2\lfloor o/2 \rfloor+\lfloor p/2 \rfloor)} \delta^{l+2}_{r} \right) \frac{\partial \tilde{a}^{l+1}_{\lfloor o/2 \rfloor \lfloor p/2 \rfloor}}{\partial a^{l+1}_{op}} \sigma'(z^{l+1}_{op}) $$
식(21)
식(21)에서 \( \lfloor x \rfloor \)는 x보다 작거나 같은 최대 정수입니다. 숫자 2는 풀링유닛의 행렬 크기입니다. 예를 들어 \( o=1 \), \( p=2 \)인 경우 \( a^{l+1}_{12} \)\( \tilde{a}^{l+1}_{01} \)을 제외한 나머지 \( \tilde{a}^{l+1} \)들과는 아무런 함수 관계가 없습니다. 따라서 \( \frac{\partial \tilde{a}^{l+1}_{\lfloor o/2 \rfloor \lfloor p/2 \rfloor} } {\partial a^{l+1}_{op}} \) 경우 외에 나머지는 모두 0이므로 \( o \), \( p \)에 대한 시그마 기호를 없앨 수 있습니다. 또한 \( w^{l+2}_{rq} \)에서 인덱스 \( q \)를 식(7)에 의해 인덱스 \( q \)대신 \( o \), \( p \)로 나타내었습니다.
식(21)은 좌변에 인덱스 \( o \)\( p \)가 있고, 우변에도 인덱스 \( o \)\( p \)만 남게 되었습니다. (\( r \)은 시그마에 의해 확장되어 사라집니다.) 즉, 식(21)에 \( o \)\( p \)만 집어넣어 계산하면 \( \delta^{l+1}_{op} \)를 구할 수 있게 되었습니다. 그러기 위해서 \( \frac{\partial \tilde{a}^{l+1}_{\lfloor o/2 \rfloor \lfloor p/2 \rfloor} } {\partial a^{l+1}_{op}} \) 만 처리하면 됩니다. 식(20)에 의해 \( \frac{\partial \tilde{a}^{l+1}_{\lfloor o/2 \rfloor \lfloor p/2 \rfloor} } {\partial a^{l+1}_{op}} \) 는 max함수의 미분입니다. Max 함수와 mean함수의 미분은 다음과 같습니다.[4]
$$ g(\mathbf{x}) = max(\mathbf{x}), \quad \frac{\partial g}{\partial x_{i}} = \begin{cases} 1, & \mbox{if } x_{i} = max(\mathbf{x}) \\ 0, & \mbox{ otherwise } \end{cases} $$
식(22)
$$ g(\mathbf{x}) = \frac{\sum_{k=1}^{m} x_{k}}{m}, \quad \frac{\partial g}{\partial x_{i}} = \frac{1}{m} $$
식(23)
max함수의 미분값은 입력되는 변수벡터 \( \mathbf{x} \)중에서 제일 큰 변수로 미분할 때만 1, 나머지 경우 0입니다. mean함수의 경우 어떤 변수로 미분을 해도 미분값은 항상 \( \frac{1}{m} \)입니다. \( m \)은 평균 내는 변수들의 개수입니다. 이제 결론을 내리기 전에 식(21)을 역전파라는 시각에서 전체적으로 다시 조망해보도록 하겠습니다.


5.3.1 역전파의 직관적 이해

유명한 CS231n강의 "Intuitive understanding of backpropagation"[5] 장을 보면 식(24)와 같은 함수의 편미분을 예를들어 역전파를 설명하고 있습니다.
$$ f(x,y) = \frac{x+\frac{1}{1+e^{-y}}}{\frac{1}{1+e^{-x}}+(x+y)^2} $$
식(24)
강의에서는 위 식의 \( x=3 \), \( y=-4 \)에서의 그래디언트gradient를 구하는 것을 보여줍니다. 식(24)를 \(x\), \(y\)에 대해 편미분하기 위해서 체인룰을 써야하는데 이를 위해 부분함수들을 아래 그림과 같이 정의 하도록 하겠습니다.




정의된 가장 외부 함수 \( n \), \( d \)에 대해서 체인룰을 적용해 가면서 미분을 해보면 각각 식(25), (26)이 됩니다.
$$ \frac{\partial f}{\partial x} = \frac{\partial f}{\partial n} \frac{\partial n}{\partial x} + \frac{\partial f}{\partial d} \frac{\partial d}{\partial h_1} \frac{\partial h_1}{\partial h_2} \frac{\partial h_2}{\partial h_3} \frac{\partial h_3}{\partial h_4} \frac{\partial h_4}{\partial x} + \frac{\partial f}{\partial d} \frac{\partial d}{\partial h_5} \frac{\partial h_5}{\partial h_6} \frac{\partial h_6}{\partial x} $$
식(25)
$$ \frac{\partial f}{\partial y} = \frac{\partial f}{\partial n} \frac{\partial n}{\partial g_1} \frac{\partial g_1}{\partial hg2} \frac{\partial g_2}{\partial g_3} \frac{\partial g_3}{\partial g_4} \frac{\partial g_4}{\partial y} + \frac{\partial f}{\partial d} \frac{\partial d}{\partial h_5} \frac{\partial h_5}{\partial h_6} \frac{\partial h_6}{\partial y} $$
식(26)
함수가 좀 복잡해서 꽤 긴 체인이 되었는데요, 아마 CS231n에서도 좀 실제적인 예를 보이기 위해 조금 복잡한 함수를 선택해서 설명을 하고 있는 것 같습니다. 미분 체인을 보면 전체 미분을 완성하기 위해 각 부분함수를 미분해서 지금까지 미분해온 체인에다 곱하는 것이라는 것을 알 수 있습니다. 즉, 각 부분함수에 대한 미분을 할 수 있으면 전체 함수의 미분을 손쉽게 끝낼 수 있습니다. CS231n에서는 다음과 같이 이야기합니다. "Notice that backpropagation is a beautifully local process.". 좀 더 직관적인 이해를 위해 회로도식으로 살펴보도록 하겠습니다.




위 그림에서 \( x=3 \), \( y=-4 \)를 대입하고 왼쪽에서 오른쪽으로 연산을 진행해 나가면 마지막에 \( f \)의 값을 구할 수 있습니다. 1.546입니다. 방금 우리가 한 것을 포워드 패스라 합니다. 포워드 패스과정에서 계산된 값을 검은색 글씨로 화살표 위쪽에 적었습니다. 이제 오른쪽에서 왼쪽으로 진행하면서 부분함수들에 대한 미분만 계산해 보겠습니다. 우선 처음 \( f \)\( f \)에 대해 미분하면 1입니다. 붉은색으로 1을 표시했습니다. \( f \)노드에서 위쪽 패스를 따라 가보겠습니다. 패스를 따라가다 보면 만나는 \( f \)에 대한 변수는 \( n \)입니다. 따라서 \( n \)\( f \)의 함수 관계만을 생각하면서 \( f \)\( n \)에 대해 미분하겠습니다. \(f=n/d \)이고 \( \frac{\partial f}{\partial n}=\frac{1}{d} \)이므로 \( \frac{\partial f}{\partial n}=\frac{1}{1.952} \approx 0.512 \)입니다. 이제 아래쪽 패스를 따라 가보겠습니다. 아래쪽 패스를 따라가면 \( n \)의 변수인 \( g_{1} \)을 만나게 됩니다. \( n=3+g_{1} \)이므로 \( \frac{\partial n}{\partial g_1}= 1 \)입니다. 따라서 \( \frac{\partial f}{\partial n} \frac{\partial n}{\partial g_1} \approx 0.512 \) 임을 알 수 있습니다. 지금 우리는 부분함수의 미분만을 수행하면서 점점 식(26)의 미분체인 앞부분을 만들어 가고 있습니다. 한번만 더 해보겠습니다. \( g_1= \frac{1}{g_2} \) 이므로 \( \frac{\partial g_1}{\partial g_2} = \frac{\partial \left( \frac{1}{g_2} \right) }{g_2} = \frac{0 \cdot g_2 - 1 \cdot 1}{ g_{2}^{2} } = - \frac{1}{g^2_{2}} = - \frac{1}{55.6^2} \approx -0.0003235 \)입니다. 따라서 미분체인은 \( \frac{\partial f}{\partial n} \frac{\partial n}{\partial g_1} \frac{\partial g_1}{\partial g_2} =0.512×-0.0003235 \approx -0.000166 \) 로 계산됩니다. 이렇게 모든 패스에 대해 부분함수의 미분을 계산하고 앞에서 계산해둔 값에 그 값을 곱해나가는 작업을 반복적으로 하면서 전체 미분을 완성할 수 있습니다. 모든 계산이 끝난 후 \( \frac{\partial f}{\partial x} \)를 구하기 위해서 파란색 패스의 백워드 패스값을 모두 더하면 됩니다. \( \frac{\partial f}{\partial y} \)를 구하기 위해서는 초록색 패스의 백워드 패스값을 다 더하면 됩니다. 실제로 더해보면 \( \frac{\partial f}{\partial x}=1.584+0.512+(-0.0359) \approx 2.06 \), \( \frac{\partial f}{\partial y}=1.584+(-0.00906) \approx 1.575 \) 이고, 이 값은 CS231n에서 파이썬 코드[6]로 구한 값과 거의 일치합니다. (회로도의 숫자는 제가 탁상용 계산기로 계산하면서 소수점 이하 숫자를 대충 반올림해서 오차가 좀 많이 생겼습니다.)
역전파라는 과정을 통해서 미분값을 구하는 과정이 바로 위의 과정입니다. 이제 역전파의 구조를 이해 했으므로 식(16)과 식(21)이 다음 그림처럼 보이게 됩니다.




이제 다시 max함수 또는 mean함수의 미분으로 돌아오겠습니다. 식(22),(23)에서 이미 두 함수의 미분을 알아보았습니다. 두 함수 모두 여러 개의 입력(변수 벡터)를 받아들여서 출력으로 하나의 값만을 내놓는 함수입니다. 아래 그림은 max함수의 경우를 예를 들어 설명한 것입니다. 위 그림에서 풀링 레이어 앞까지 미분체인에 의한 미분값 \( \sum_{r} w_{rq}^{l+2} \delta_r^{l+2} \)는 모두 계산이 된 상태입니다. max함수를 미분하면 미분 결과는 미분하는 변수가 max함수로 입력된 변수중 최대일 경우는 1, 나머지는 0이 됩니다. 따라서 최대일 경우 앞쪽 미분 체인의 결과 \( \sum_{r} w_{rq}^{l+2} \delta_{r}^{l+2} \)에 1을 곱해서 해당 입력 패스쪽으로 보내고, 그렇지 않으면 0을 곱해서 해당 입력 패스쪽으로 보내는 결과를 낳게 됩니다. 아래 그림은 그 과정을 보여주고 있습니다.




마치 특정 위치로 경로를 지정해서 값을 보내주는 것 같습니다. 그래서 CS231n에서도 이를 그래디언트를 라우트route한다라고 이야기합니다“The max gate routes the gradient.”. Mean풀링의 경우는 다음 그림처럼 앞쪽 미분체인의 계산 값에 "1/[입력의 개수 또는 풀링유닛의 크기]"를 곱한 값을 모든 입력으로 뿌려주는 형태가 될 것입니다.[7] 이상과 같은 과정을 up-sampling이라 합니다. up-sampling은 행렬의 모양을 맞추기 위해 인위적으로 이루어지는 것이 아니라 풀링 레이어의 미분 과정에서 자연스럽게 나타나게 됨을 알 수 있습니다.




Up-sampling 까지 이야기 했으므로 식(21)을 이제 행렬 형태로 쓸 수 있습니다.
$$ \mathbf{\delta}^{l+1} = \mbox{Upsampling}[ (\mathbf{w}^{l+1})^{T} \mathbf{\delta}^{l+2} ] \odot \sigma'(\mathbf{z}^{l+1}) $$
식(27)
식(21)과 식(27)을 비교하면 다음과 같습니다.
$$ \definecolor{freq}{RGB}{45,177,93} \definecolor{spin}{RGB}{251,0,29} \definecolor{signal}{RGB}{18,110,213} \delta^{l+1}_{op} = \color{signal} \sum_{r} \left( w^{l+2}_{r,(2\lfloor o/2 \rfloor+\lfloor p/2 \rfloor)} \delta^{l+2}_{r} \right) \color{spin} \frac{\partial \tilde{a}^{l+1}_{\lfloor o/2 \rfloor \lfloor p/2 \rfloor}}{\partial a^{l+1}_{op}} \color{freq} \sigma'(z^{l+1}_{op}) $$
$$ \definecolor{black}{RGB}{0,0,0} \definecolor{freq}{RGB}{45,177,93} \definecolor{spin}{RGB}{251,0,29} \definecolor{signal}{RGB}{18,110,213} \mathbf{\delta}^{l+1} = \color{spin} \mbox{Upsampling}[ \color{signal} (\mathbf{w}^{l+2})^{T} \mathbf{\delta}^{l+2} \color{spin} ] \color{black} \odot \color{freq} \sigma'(\mathbf{z}^{l+1}) $$
같은 역할을 하는 부분을 색깔로 표시했습니다. 뭔가 복잡하게 많은 과정을 거쳤지만 결과만 놓고 본다면 풀링레이어에 의해 upsampling되는 점만 제외하면 기존의 (BP2)와 크게 다른 것이 없는 식이 되었습니다. \(l+1\)번째 층이 \(l\)번째 층과의 코릴레이션 연산에 의해 출력이 계산되는 CONV층이기는 하지만 이 층에 풀링레이어가 없다면 \(l+2\)번째 층과 그냥 완전 연결된 층이기 때문에 이는 당연한 결과 입니다. 즉, 델타를 구하는 BP2는 똑같고 CONV층이기 때문에 BP3, BP4만 달라지게 됩니다.(앞에서 CBP3, CBP4로 유도했습니다.) 그럼에도 불구하고 꽤 장황하게 일련의 미분 과정을 자세히 설명한 이유는 같은 논리를 그대로 (\(l+1\)번째 층이 CONV층인) \(l\)번째 층에 적용했을 때 결과가 좀 달라지게 되는데 그 과정을 잘 이해하기 위함입니다. 어떻게 달라지는지는 단계4에서 자세히 알아보겠습니다. 이제 마지막으로 앞에서 이야기했던 \(nb()\)를 정식화하여 단계3을 마무리 하도록 하겠습니다. 지금까지의 논의를 다시 식으로 써보면 \( \delta^{l+1}_{op} \)를 구하는 과정은 식(28)과 같습니다.
$$ \definecolor{spin}{RGB}{251,0,29} \color{spin} \delta^{l+1}_{op} = \sum_{r} \left( w^{l+2}_{r,(s \lfloor o/s \rfloor + \lfloor p/s \rfloor )} \delta^{l+2}_{r} \right) \frac{ \partial \tilde{a}^{l+1}_{\lfloor o/s \rfloor \lfloor p/s \rfloor} }{ \partial a^{l+1}_{op} } \sigma'(z^{l+1}_{op}) $$
식(28)
$$ \definecolor{spin}{RGB}{251,0,29} \color{spin} \frac{ \partial \tilde{a}^{l+1}_{\lfloor o/s \rfloor \lfloor p/s \rfloor} }{ \partial a^{l+1}_{op} } = \begin{cases} 1, & \mbox{if } a^{l+1}_{op} = max( nb(a^{l+1}_{op}) ) \\ 0, & \mbox{ otherwise } \end{cases} $$
$$ \definecolor{spin}{RGB}{251,0,29} \color{spin} nb(a^{l+1}_{op}) \equiv a^{l+1}_{t \in R_{1} , u \in R_{2}} \\ \color{spin} R_{1} = [o-(o\%s), \quad o-(o\%s)+(s-1)] \\ \color{spin} R_{2} = [p-(p\%s), \quad p-(p\%s)+(s-1)] $$
위 식에서, \( s \)는 풀링레이어 가로 세로 크기
\( nb(a^{l+1}_{op}) \)는 식(28)의 인덱스 범위 \( R_{1} \), \( R_{2} \)에 포함되는 인덱스를 가지는 \( a^{l+1}_{op} \)들을 가리킵니다. 예를 들어 \( a^{l+1}_{21} \)에 대해 \( nb(a^{l+1}_{op}) \)\( R_{1}=[2, 3] \), \( R_{2}=[0, 1] \) 이므로 \( a_{20}^{l+1}, a_{21}^{l+1}, a_{30}^{l+1}, a_{31}^{l+1} \)이 되고 이 4개의 뉴런은 \( a_{21}^{l+1} \) 과 함께 풀링되는 4개의 뉴런들이라는 것을 알 수 있습니다. 이제 \( \delta_{op}^{l+1} \)를 완전히 구했으므로 (CBP3), (CBP4)를 이용하여 \( \frac{\partial C}{\partial b^{l+1}} , \frac{\partial C}{\partial w^{l+1}_{ab}} \) 을 구할 수 있습니다. \( l+1 \)층에서의 (CBP3), (CBP4)은 식(29)과 같습니다.
$$ \definecolor{spin}{RGB}{251,0,29} \begin{align*} \color{spin} \frac{\partial C}{\partial b^{l+1}} & \color{spin} = \sum_{o=0}^{M'-C} \sum_{p=0}^{N'-D} \delta^{l+1}_{op} \\ \color{spin} \frac{\partial C}{\partial w^{l+1}_{cd}} & \color{spin} = \sum_{o=0}^{M'-C} \sum_{p=0}^{N'-D} \tilde{a}^{l}_{(o+c)(p+d)} \delta^{l+1}_{op} \end{align*} $$
식(29)
단계3은 무척 길었습니다. 하지만 처음으로 CONV층의 미분을 완성하였습니다. 이제 남은 것은 l층에 대해 지금까지 했던 내용을 반복하는 것입니다.


단계 4 이제 \( \delta^{l} \)을 구할 차례입니다. 이 층에서는 BP3과 BP4뿐만 아니라 BP2까지 수정이 되게 됩니다. 대부분의 내용이 단계3과 동일하나 \( l \)층은 \( l+1 \)층이 역시 CONV층이라는 점이 다릅니다. 단계3에서는 \( l+1 \)층은 CONV층, \( l+2 \)층은 FC층이었습니다. 아무튼 \( \delta_{mn}^{l} \)은 체인룰을 이용하여 식(30)과 같이 쓸 수 있습니다.
$$ \delta^{l}_{mn} = \frac{\partial C}{\partial z^{l}_{mn} } = \sum_{m'} \sum_{n'} \sum_{o} \sum_{p} \frac{\partial C}{\partial z^{l+1}_{op}} \frac{\partial z^{l+1}_{op}}{\partial \tilde{a}^{l}_{m'n'}} \frac{\partial \tilde{a}^{l}_{m'n'}}{\partial a^{l}_{mn}} \frac{\partial a^{l}_{mn}}{\partial z^{l}_{mn}} $$
식(30)
식(30)을 역전파의 관점에서 보면 다음 그림과 같습니다. 즉, 단계3에서의 과정이 그대로 반복됨을 알 수 있습니다.




위 식에서 \( z^{l+1}_{op} \)는 식(31)과 같습니다.
$$ z^{l+1}_{op} = \sum_{c=0}^{C-1} \sum_{d=0}^{D-1} \left[ w^{l+1}_{cd} \tilde{a}^{l}_{(o+c)(p+d)} \right] + b^{l+1} $$
식(31)
이제 앞 단계에서와 같은 논리로 \( \frac{\partial z^{l+1}_{op}}{\partial \tilde{a}^{l}_{m' n'}} \)는 식(32)인 경우를 제외하고 모두 0이라는 것을 알 수 있습니다.
$$ m'=o+c \\ n'=p+d $$
식(32)
식(32)에 의해 \( c=m'-o \), \( d=n'-p \) 이므로 \( \frac{\partial z^{l+1}_{op}}{\partial \tilde{a}^{l}_{m' n'}} \)은 식(33)과 같습니다.
$$ \frac{\partial z^{l+1}_{op}}{\partial \tilde{a}^{l}_{m' n'}} = w^{l+1}_{(m'-o)(n'-p)} $$
식(33)
이제 식(33)의 결과를 이용하여 식(30)을 다시 써보면 식(34)과 같습니다.
$$ \delta^{l}_{mn} = \frac{\partial C}{\partial z^{l}_{mn} } = \sum_{m'} \sum_{n'} \sum_{o} \sum_{p} w^{l+1}_{(m'-o)(n'-p)} \delta^{l+1}_{op} \frac{\partial \tilde{a}^{l}_{m'n'}}{\partial a^{l}_{mn}} \frac{\partial a^{l}_{mn}}{\partial z^{l}_{mn}} $$
식(34)
이제 여기서 다시 풀링레이어에 대한 미분 \( \frac{\partial \tilde{a}^{l}_{m'n'}}{\partial a^{l}_{mn}} \)을 처리하도록 하겠습니다. 역시나 이 미분은 \( m'= \lfloor \frac{m}{2} \rfloor \), \( n'= \lfloor \frac{n}{2} \rfloor \) 인 경우를 제외하고는 모두 0입니다. 따라서 식(34)는 식(35)가 됩니다.
$$ \delta^{l}_{mn} = \sum_{o} \sum_{p} w^{l+1}_{(\lfloor m/2 \rfloor -o)(\lfloor n/2 \rfloor -p)} \delta^{l+1}_{op} \frac{\partial \tilde{a}^{l}_{\lfloor m/2 \rfloor, \lfloor n/2 \rfloor}}{\partial a^{l}_{mn}} \sigma'(z^{l}_{mn}) $$
식(35)
식(35)를 식(21)과 비교해보겠습니다.
$$ \definecolor{black}{RGB}{0,0,0} \definecolor{spin}{RGB}{251,0,29} \delta^{l+1}_{op} = \color{spin} \sum_{r} \left( w^{l+2}_{r,(2\lfloor o/2 \rfloor+\lfloor p/2 \rfloor)} \delta^{l+2}_{r} \right) \color{black} \frac{\partial \tilde{a}^{l+1}_{\lfloor o/2 \rfloor \lfloor p/2 \rfloor}}{\partial a^{l+1}_{op}} \sigma'(z^{l+1}_{op}) $$
$$ \definecolor{black}{RGB}{0,0,0} \definecolor{spin}{RGB}{251,0,29} \delta^{l}_{mn} = \color{spin} \sum_{o} \sum_{p} \left( w^{l+1}_{(\lfloor m/2 \rfloor -o)(\lfloor n/2 \rfloor -p)} \delta^{l+1}_{op} \right) \color{black} \frac{\partial \tilde{a}^{l}_{\lfloor m/2 \rfloor \lfloor n/2 \rfloor}}{\partial a^{l}_{mn}} \sigma'(z^{l}_{mn}) $$
비교해보면 대부분 같지만 \( w \)\( \delta \)사이에서 일어나는 연산이 달라진 것을 확인할 수 있습니다. \( w \)\( \delta \)사이에서 일어나는 연산은 어디에서 많이 본 듯합니다. 앞서 살펴본 식(2)를 다시 보겠습니다.
$$ C(x,y)= \sum_{a=0}^{k-1} \sum_{b=0}^{k-1} I(x-a,y-b)F(a,b) $$
우리가 앞서 살펴본 컨벌루션식인 식(2)와 \( \delta^{l}_{mn} \)을 구할 때 \( w \)\( \delta \)사이에서 일어나는 연산이 정확하게 동일하다는 것을 알 수 있습니다. 즉, \( \mathbf{\delta}^{l+1} \)을 180도 돌려서 \( \mathbf{w}^{l+1} \)에 full 컨벌루션 하는 것입니다. \( \mathbf{w}^{l+1} \)은 3x3이고 , \( \mathbf{\delta}^{l+1} \)은 4x4입니다. 이를 full 컨벌루션 하면 6x6이 되고, 이것이 \( \frac{\partial \tilde{a}^{l}_{\lfloor m/2 \rfloor \lfloor n/2 \rfloor}}{\partial a^{l}_{mn}} \)에 의해 up-sampling되면 12x12가 되어 \( \delta^{l} \)의 차원과 딱 맞게 됩니다. 단계3과 마찬가지로 이제 식(35)을 행렬형태로 써보면 식(36)과 같습니다.
$$ \definecolor{black}{RGB}{0,0,0} \definecolor{green}{RGB}{45,177,93} \definecolor{red}{RGB}{251,0,29} \definecolor{blue}{RGB}{18,110,213} \mathbf{\delta}^{l} = \color{red} \mbox{Upsampling} [ \color{blue} \mathbf{w}^{l+1} * \mathbf{\delta}^{l+1} \color{red} ] \color{black} \odot \color{green} \sigma'(\mathbf{z}^{l}) $$
식(36)
행렬형태로 적으면 간결한 맛은 있지만, 내부적으로 무슨 일이 일어나고 있는지 한눈에 알 기가 힘들어진다는 단점이 있습니다. 그래서 본 글에서는 좀 복잡하지만 인덱스 형태의 식을 고집하였습니다. 단계3의 말미에도 언급하였지만 만약 풀링레이어가 없이 CONV층과 CONV층이 결합된 경우라면 어떻게 될까요? 그럼 식(35)은 식(37)와 같은 간단한 컨벌루션 연산만 남게 됩니다.
$$ \delta^{l}_{mn} = \sum_{o} \sum_{p} \left( w^{l+1}_{(m - o)(n - p)} \delta^{l+1}_{op} \right) \sigma'(z^{l}_{mn}) $$
식(37)
정리하면 식(38)과 같이 \( \delta^{l}_{mn} \)을 구할 수 있습니다.
$$ \definecolor{spin}{RGB}{251,0,29} \color{spin} \delta^{l}_{mn} = \sum_{o} \sum_{p} \left( w^{l+1}_{(\lfloor m/s \rfloor - o)(\lfloor n/s \rfloor - p)} \delta^{l+1}_{op} \right) \frac{ \partial \tilde{a}^{l}_{\lfloor m/s \rfloor \lfloor n/s \rfloor } }{ \partial a^{l}_{mn} } \sigma'(z^{l}_{mn}) $$
식(38)
$$ \definecolor{spin}{RGB}{251,0,29} \color{spin} \frac{ \partial \tilde{a}^{l}_{\lfloor m/s \rfloor \lfloor n/s \rfloor} }{ \partial a^{l}_{mn} } = \begin{cases} 1, & \mbox{if } a^{l+1}_{op} = max( nb(a^{l}_{mn}) ) \\ 0, & \mbox{ otherwise } \end{cases} $$
$$ \definecolor{spin}{RGB}{251,0,29} \color{spin} nb(a^{l}_{mn}) \equiv a^{l}_{t \in R_{1} , u \in R_{2}} \\ \color{spin} \begin{align*} R_{1} & = [m-(m\%s), \quad m-(m\%s)+(s-1)] \\ \color{spin} R_{2} & = [n-(n\%s), \quad n-(n\%s)+(s-1)] \end{align*} $$
위 식에서, \( s \)는 풀링레이어 가로 세로 크기
이제 다음 (CBP3), (CBP4)를 이용해 \( \frac{\partial C}{\partial b^{l}} \), \( \frac{\partial C}{\partial w^{l}_{ab}} \) 을 모두 구할 수 있습니다.
$$ \definecolor{spin}{RGB}{251,0,29} \begin{align*} \color{spin} \frac{\partial C}{\partial b^{l}} & \color{spin} = \color{spin} \sum_{m=0}^{I-A} \sum_{n=0}^{J-B} \delta^{l}_{mn} \\ \color{spin} \frac{\partial C}{\partial w^{l}_{ab}} & \color{spin} = \color{spin} \sum_{m=0}^{I-A} \sum_{n=0}^{J-B} \tilde{a}^{l-1}_{(m+a)(n+b)} \delta^{l}_{mn} \end{align*} $$


5.4 정리

꽤 길게 이야기를 했습니다. 하지만 이 긴 이야기를 세 줄로 정리하면 다음과 같습니다.

"코스트의
[1] \( \mathbf{w} \)에 대한 편미분이 FC에서는 \( \mathbf{a} \)\( \mathbf{\delta} \)의 행렬곱으로 계산되나 CONV에서는 \( \mathbf{a} \)\( \mathbf{\delta} \)의 코릴레이션으로 계산된다.
[2] \( b \)에 대한 편미분이 FC에서는 \( \delta_{i} \)이던 것이 CONV에서는 모든 \( \delta_{ij} \)의 합으로 계산된다.
[3] 역전파되는 \( \mathbf{a} \)에 대한 편미분이 FC에서는 \( \mathbf{w} \)\( \mathbf{\delta} \)의 행렬곱이던 것이 CONV에서는 \( \mathbf{w} \)\( \mathbf{\delta} \)의 컨벌루션으로 계산된다."

이제 이상의 논의를 일반적인 인덱스를 써서 식 4개로 정리하도록 하겠습니다.

(CBP1)=(BP1)

(CBP2)

CONV-POOL-FC 인 경우

$$ \delta^{l}_{ij} = \sum_{k} \left( w^{l+1}_{k,(s\lfloor i/s \rfloor+\lfloor j/s \rfloor)} \delta^{l+1}_{k} \right) \frac{\partial \tilde{a}^{l}_{\lfloor i/s \rfloor \lfloor j/s \rfloor}}{\partial a^{l}_{ij}} \sigma'(z^{l}_{ij}) $$

CONV-POOL-CONV 인 경우

$$ \delta^{l}_{ij} = \sum_{o} \sum_{p} \left( w^{l+1}_{(\lfloor i/s \rfloor -o)(\lfloor j/s \rfloor -p)} \delta^{l+1}_{op} \right) \frac{\partial \tilde{a}^{l}_{\lfloor i/s \rfloor \lfloor j/s \rfloor}}{\partial a^{l}_{ij}} \sigma'(z^{l}_{ij}) $$
위 식에서,
$$ \frac{ \partial \tilde{a}^{l}_{\lfloor i/s \rfloor \lfloor j/s \rfloor} }{ \partial a^{l}_{ij} } = \begin{cases} 1, & \mbox{if } a^{l}_{ij} = max( nb(a^{l}_{ij}) ) \\ 0, & \mbox{ otherwise } \end{cases} $$
$$ nb(a^{l}_{ij}) \equiv a^{l}_{t \in R_{1} , u \in R_{2}} \\ \begin{align*} R_{1} & = [i-(i\%s), \quad i-(i\%s)+(s-1)] \\ R_{2} & = [j-(j\%s), \quad j-(j\%s)+(s-1)] \end{align*} $$

(CBP3)

$$ \frac{\partial C}{\partial b^{l}} = \sum_{i=0}^{N-m} \sum_{j=0}^{N-m} \delta^{l}_{ij} $$

(CBP4)

$$ \frac{\partial C}{\partial w^{l}_{ab}} = \sum_{i=0}^{N-m} \sum_{j=0}^{N-m} a^{l-1}_{(i+a)(j+b)} \delta^{l}_{ij} $$
위 식에서,
\( N \): \( l-1 \)층의 가로, 세로크기,
\( m \): \( l-1 \)층과 \( l \)층을 연결하는 필터의 가로, 세로크기


6. 결론

우리는 CNN의 역전파 수식을 유도하면서 다음과 같은 사실을 알게 되었습니다. 최대한 자세하게 설명하기 위해 내용이 장황해진 것 같은 느낌이 듭니다. 장황한 설명임에도 불구하고 위 내용을 다 이해했다면 딥러닝 라이브러리를 쓰지 않고 python, numpy만으로 CNN을 구현할 수 있게 됩니다. CS231n에서 (https://youtu.be/ue4RJdI8yRA?list=PLlJy-eBtNFt6EuMxFYRiNRS07MCWN5UIA) im2col을 이용하여 CONV층에 대한 구현을 일반적인 FC층과 동일하게 구현하는 예제를 볼 수 있습니다. 얼마전 출판된 "밑바닥부터 시작하는 딥러닝"에서도 동일한 예를 볼 수 있습니다. 그렇게 구현하는것도 좋겠지만 속도가 좀 느려도 실제로 컨벌루션, 코릴레이션 연산을 명시적으로 수행하는 코드를 만들어보는 것도 좋을 것 같습니다. CS231n에서 숙제로 for 루프를 이용해서 구현하라고 한다네요. 아마 누군가가 코드를 구현해서 공유해주실것으로 생각합니다. 내용 중 오류가 있다면 꼭 연락 주시면 감사하겠습니다.


7. 참고문헌