11-27 00:11
Notice
Recent Posts
Recent Comments
관리 메뉴

Scientific Computing & Data Science

[Artificial Intelligence / Posts] 역전파 (Backpropagation) Part 2. 본문

Artificial Intelligence/Posts

[Artificial Intelligence / Posts] 역전파 (Backpropagation) Part 2.

cinema4dr12 2017. 6. 3. 10:53

by Geol Choi | 


이번 포스팅에서는 지난 포스팅에 이어 역전파(Backpropagation)에 대해 간단한 예제를 통해 좀 더 쉽게, 그리고 딥러닝 예제를 통해 실질적으로 어떻게 작동하는지 자세히 알아보도록 하겠다.

Simple Example

아래 이미지와 같은 실수값 회로(Circuit)이 있다고 가정해 보자.


입력(Input)은 xy, 인데 주어진 값은 각각 3, -1, 8이다. 함수 pqf는 각각 다음과 같다:


\(p=x+y\),  \(q=p+z\),  \(f=\mathrm{exp}(q)\)


따라서, 이 회로에 의한 Forward-pass 과정은 다음과 같으며,

(1) \(p \leftarrow x+y\)

(2) \(q \leftarrow p*z\)

(3) \(f \leftarrow \mathrm{exp}(q)\)


결과를 도식화하면 다음 이미지와 같다:


이제 Backward-pass 연산을 위한 함수의 변수 의존도를 도식화하면,



과 같으며, 각각의 편미분 식은 다음과 같다:


\(\displaystyle{\frac{\partial f}{\partial q}=\mathrm{exp}(q)}\)

\(\displaystyle{\frac{\partial q}{\partial p}}=z\), \(\displaystyle{\frac{\partial q}{\partial z}}=p\)

\(\displaystyle{\frac{\partial p}{\partial x}}=1\), \(\displaystyle{\frac{\partial p}{\partial y}}=1\)


따라서, Backward-pass 연산은 아래 이미지와 같이 f에 대한 q의 미분값을 계산하고 q에 대한 다음 변수의 미분값들을 차례로 곱하면서 계산할 수 있으며 그 결과는 아래 이미지와 같이 도식화할 수 있다.


이며, 이를 해석하면 f의 입력 xy, z에 대한 미분값은 각각 1210.3, 1210.3, 806.9이다.

좀더 간단하게 Forward-pass와 Backward-pass 결과를 아래 이미지와 같이 정리할 수 있다.


More Practical Example

이번에는 좀 더 실제 딥러닝에 가까운 예제를 통해 역전파를 이해해 볼 수 있도록 하겠다.

Batch Size 1개(N = 1), 입력 변수 2개(D = 2), Class 수(K = 3)인 경우를 아래 이미지와 같은 네트워크 구조를 갖는다.



Weights(\(w_{j,i}\))와 Bias(\(b_i\))에 의해 계산된 결과 \(f_i\)는,


\(f_1 = w_{1,1}x_1 + w_{2,1}x_2 + b_1\)

\(f_2 = w_{1,2}x_1 + w_{2,2}x_2 + b_2\)

\(f_3 = w_{1,3}x_1 + w_{2,3}x_2 + b_3\)


또는 간단하게,


\(f_i = \displaystyle{\sum_{j=1}^{2}{w_{j,i}x_j + b_i}}\) for \(i=1,2\)


로 표현할 수 있다. 이를 행렬 형태로는 다음과 같이 표현할 수 있다:


\(\begin{bmatrix}f_1 \\ f_2 \\ f_3\end{bmatrix} = \begin{bmatrix}w_{1,1} & w_{2,1} \\  w_{1,2} & w_{2,2} \\ w_{1,3} & w_{2,3} \end{bmatrix}\begin{bmatrix}x_1 \\ x_2\end{bmatrix} + \begin{bmatrix} b_1 \\ b_2 \\ b_3 \end{bmatrix} \)


\(f_i\)에 대하여 Exponential 함수를 취한 것을 다음과 같이 정의하자:


\(s_i = \mathrm{exp}(f_i)\)


만약 Ground Truth Label을 y라고 하고(본 예제의 경우, Class 개수가 3개 이므로 1, 2, 3 중 하나의 값을 갖는다) 이에 대한 Exponential 함수를 취한 것을 \(s_y\)라고 정의한다:


\(s_y = \mathrm{exp}(s_y)\)


한편, Information Theory에 의하면 "실제(true)" 분포 p와 "계산된(estimated)" 분포 q 사이의 Cross-entropy는,


\(H(p,q) = -\sum_{x}{p(x)\mathrm{log}(q(x))}\)


로 정의된다. 계산된 Class 분포 q는 \(q = s_y / \sum_{j}{s_j}\)로 계산된다. 반면, 실제 분포 p는 본 예제와 같이 Class 3개가 있는 경우 단 하나의 정답이 있으므로 정답에 해당하는 경우에만 확률이 1이며 나머지는 0이 된다. 가령, 2번째 클래스가 맞는 클래스이면 \(p = [0, 1, 0]\)이 된다. 따라서 이를 일반화하면 \(p_i = \mathbb{1}(y=i)\)이며 \(y=2\)이다. 여기서 \(\mathbb{1}(\mathrm{condition})\)은 괄호 안의 condition을 만족하는 경우에는 1, 그렇지 않은 경우에는 0의 값을 주는 함수이다.

따라서, 다음 식이 성립한다:


\(H(p,q) = \displaystyle{-\sum_{i=1}^{3}{p_i \mathrm{log}(q_i)}} = \displaystyle{-\sum_{i=1}^{3}{\mathbb{1}(y=i)\mathrm{log}(q_i)}} = -\mathrm{log}(q_y) \)


결론적으로, pq 간의 Cross-entropy는,


\(H(p,q) = \displaystyle{-\mathrm{log}\begin{pmatrix}\frac{s_y}{\sum_j{s_j}}\end{pmatrix}}\)


이며, 이를 Data Loss \(L_D\)라고 정의한다.

지금까지의 과정이 꽤 복잡해 보이기는 하나, 다음과 같이 간단히 정리할 수 있다:


(1) \(f_i = \displaystyle{\sum_{j=1}^{D}{w_{j,i}x_j + b_i}}\)

(2) \(s_i = \mathrm{exp}(f_i)\) , \(s_y = \mathrm{exp}(f_y)\)

(3) \(q_{i} = \displaystyle{\frac{s_i}{\sum_{k=1}^{K}{s_k}}}\) , \(q_y = \displaystyle{\frac{s_y}{\sum_{k=1}^{K}{s_k}}}\)

(4) \(L_D = -\mathrm{log}(q_y)\)


지금까지는 Batch Size를 1, 즉 N = 1로 가정하였지만 이를 다중의 Batch Size로 일반화하여 표현할 수 있다:


(1) \(f_{i,j} = \displaystyle{\sum_{k=1}^{D}{x_{i,k}w_{k,j} + b_{i,j}}}\) for i = 1, ... , N , j = 1, ... , K

(2) \(s_{i,j} = \mathrm{exp}(f_{i,j})\) , \(s_{y_i} = \mathrm{exp}(f_{y_i})\)

(3) \(q_{i,j} = \displaystyle{\frac{s_{i,j}}{\displaystyle{\sum_{k=1}^{K}{s_{i,k}}}}}\) , \(q_{y_i} = \displaystyle{\frac{s_{y_i}}{\displaystyle{\sum_{k=1}^{K}{s_{i,k}}}}}\)

(4) \(L_{D_i} = -\mathrm{log}(q_{y_i})\)


위에 정리된 식을 토대로 변수가의 의존성(Dependencies)을 도식화하면 다음 이미지와 같다:


역전파를 하는 목적은 Weights(\(w_{i,k}\))와 Bias(\(b_{i,j}\))의 업데이트 된 변화에 대한 손실함수(\(L_{D_{i}}\))의 변화량을 계산하여 손실함수를 점진적으로 줄여나가 궁극적으로 이를 최소화하는 것이다. 즉,


\(\mathbf{w}^{t+1} \leftarrow \mathbf{w}^{t} - \alpha \nabla_{\mathbf{w}}L\)


여기서, \(\mathbf{w}^{t}\)와 \(\mathbf{w}^{t+1}\)는 각각 현재(Current)의 가중치 벡터, 업데이트 된(Updated) 가중치 벡터이며, \(\alpha\)는 학습률(Learning Rate 또는 Step Size), \(\nabla_{\mathbf{w}}\)는 Weights에 대한 미분(Gradient)을 나타낸다. 사실 Bias는 계산의 편의 상 Weights에 포함하기도 한다. 가령, \(b + w_1 x_1 + w_2 x_2\) 대신 \(w_0 x_0 + w_1 x_1 + w_2 x_2\)(\(x_0 = 1, w_0 = b\))로 표현할 수 있다.


위의 이미지를 따라 \(f_{i,j}\)에 대한 \(L_{D_i}\)의 편미분을 구해본다. Chain Rule에 의해,


\(\displaystyle{\frac{\partial L_{D_i}}{\partial f_{i,k}}} = \displaystyle{\frac{\partial L_{D_i}}{\partial q_{y_i}} \frac{\partial q_{y_i}}{\partial s_{i,k}} \frac{\partial s_{i,k}}{\partial f_{i,k}}}\) ...(1)


으로 표현되며,


\(\displaystyle{\frac{\partial L_{D_i}}{\partial q_{y_i}} = \frac{\partial {[-\mathrm{log}(q_{y_i})]}}{\partial q_{y_i}} = -\frac{1}{q_{y_i}} = -\frac{\sum_{j}{s_{i,j}}}{s_{y_i}} }\) ...(2)


\(\displaystyle{\frac{\partial q_{y_i}}{\partial s_{i,k}} = \frac{\partial}{\partial s_{i,k}} \begin{bmatrix}\frac{s_{y_i}}{\sum_{j}{s_{i,j}}}\end{bmatrix} = \frac{ \frac{\partial s_{y_i}}{\partial s_{i,k}} \begin{pmatrix}\sum_{j}{s_{i,j}}\end{pmatrix} - s_{y_i}\frac{\partial}{\partial s_{i,k}}\begin{pmatrix}\sum_{j}{s_{i,j}}\end{pmatrix}  }{\begin{pmatrix}\sum_{j}{s_{i,j}}\end{pmatrix}^2}}\) ...(3)


이다. 식(3)의 분자에서


\(\displaystyle{\frac{\partial s_{y_i}}{\partial s_{i,k}} = \delta_{y_i , (i,k)}}\) ...(4)



\(\displaystyle{\frac{\partial}{\partial s_{i,k}}\begin{bmatrix}\sum_{j}{s_{i,j}}\end{bmatrix} = 1}\) ...(5)


이므로, 식(3)은 다음과 같이 표현할 수 있다:


\(\displaystyle{\frac{\partial q_{y_i}}{\partial s_{i,k}} = \frac{\delta_{y_i , (i,k)}\begin{pmatrix}\sum_{j}{s_{i,j}}\end{pmatrix} - s_{y_i}}{\begin{pmatrix}\sum_{j}{s_{i,j}}\end{pmatrix}^2}}\) ...(6)


여기서,


\(\delta_{y_i , (i,k)} = \begin{cases} \begin{matrix} = 0 & \mathrm{if}\,y_i \neq (i,k) \end{matrix} \\ \begin{matrix} = 1 & \mathrm{if} \, y_i = (i,k) \end{matrix} \end{cases}\)


또한,


\(\displaystyle{\frac{\partial s_{i,k}}{\partial f_{i,k}} = \frac{\partial}{\partial f_{i,k}}\begin{pmatrix}\mathrm{exp}(f_{i,k})\end{pmatrix} = \mathrm{exp}(f_{i,k})\frac{\partial f_{i,k}}{\partial f_{i,k}} = \mathrm{exp}(f_{i,k}) = s_{i,k}}\) ...(7)


으로 표현되므로, 식(2), 식(6), 식(7)을 식(1)에 대입하면 다음과 같이 표현할 수 있다:


\(\displaystyle{\frac{\partial L_{D_i}}{\partial f_{i,k}} = \frac{\partial D_i}{\partial q_{y_i}} \frac{\partial q_{y_i}}{\partial s_{i,k}} \frac{\partial s_{i,k}}{\partial f_{i,k}} \\ \,\,\,\,\,\,\,\,\,\,\,=  -\frac{\begin{pmatrix}\sum_{j}{s_{i,j}}\end{pmatrix}}{s_{y_i}} \frac{\delta_{y_i,(i,k)} \begin{pmatrix}\sum_{j}{s_{i,j}}\end{pmatrix} - s_{y_i}}{\begin{pmatrix}\sum_{j}{s_{i,j}}\end{pmatrix}^2} s_{i,k} \\ \,\,\,\,\,\,\,\,\,\,\, = -\frac{\delta_{y_i , (i,k)} s_{i,j}}{s_{y_i}} + \frac{s_{i,k}}{\begin{pmatrix}\sum_{j}{s_{i,j}}\end{pmatrix}} \\ \,\,\,\,\,\,\,\,\,\,\, = \mathbb{1}(y_i = (i,k)) + q_{i,k}}\) ...(8)


마지막으로 식(8)에 \(\partial f_{i,k} / \partial \mathbf{w}\)을 곱하여 손실함수 \(L_{D_i}\)의 가중치 변수 \(w_{m,n}\)에 대한 미분값을 계산할 수 있다:


\(\displaystyle{\frac{\partial L_{D_i}}{\partial f_{i,k}} \frac{\partial f_{i,k}}{\partial w_{m,n}}} = \nabla_{\mathbf{w}}L_{D_i}\) ...(9)

맺음말

이번 포스팅에서는 역전파의 원리에 대해 좀 더 수식적으로 설명하고자 노력하였다. 조만간 다음 포스팅을 통해 딥러닝의 실질적인 코드를 통해 Forward-pass와 Backward-pass에 대하여 다룰 수 있도록 하겠다. 다음 포스팅에서는 아마도 딥러닝을 전반적으로 이해할 수 있는 기회가 될 수 있을 것으로 생각한다.

Comments