본문 바로가기
AI 수학/최적화

역전파 (Backpropagation) 계산

by 세인트 워터멜론 2021. 3. 31.

선형 레이어(또는 fully-connected layer, 완전 연결 레이어)는 레이어의 모든 뉴런이 이전 레이어의 모든 뉴런과 연결된 레이어이다.

 

 

 

선형 레이어는 다음과 같이 선형 방정식으로 표현할 수 있다.

 

\[ \mathbf{z}^{(l+1) }=W^{(l) } \mathbf{a}^{(l) }+\mathbf{b}^{(l) } \]

 

여기서 위첨자 \(l\)은 \(l\)번째 은닉(hidden) 레이어를 뜻하고 \(W^{(l) }\)은 가중치(weights), \(\mathbf{b}^{(l) }\)는 바이어스를 나타낸다. 레이어의 출력 \(\mathbf{z}^{(l+1) }\)은 활성함수(activation function) \(\sigma^{(l+1)}\)를 통과하여 \(\mathbf{a}^{(l+1)}\)이 된다.

 

\[ \mathbf{a}^{(l+1)}=\sigma^{(l+1) } (\mathbf{z}^{(l+1) }) \]

 

\(\mathbf{a}^{(l+1)}\)은 다시 \(l+1\) 번째 은닉(hidden) 레이어의 입력이 된다. 그림에서 \(\mathbf{x}\)는 입력, \(\hat{\mathbf{y}}\)는 출력, \(L\)은 손실함수(loss function)다. 입력 \(\mathbf{x}\)는 보통 \(\mathbf{a}^{(0)}\)로 두어서 표기의 일관성을 유지하기도 한다.

 

 

전통적으로 신경망은 위 그림과 같이 뉴런과 연결층으로 표시하지만 활성함수를 분명히 표시하고 수식관계를 간편하게 알아보도록 다음과 같은 그림으로 표시하기도 한다.

 

 

신경망을 학습한다는 것은 손실함수 \(L\)이 최소가 되도록 가중치 \(W^{(l) }\)와 바이어스 \(\mathbf{b}^{(l) }\)를 반복적으로 계산한다는 뜻이다. 그러기 위해서는 손실함수에 대한 가중치와 바이어스의 미분이 필요하다.

신경망은 입력 \(\mathbf{x}\)로 부터 각 레이어의 출력 \(\mathbf{a}^{(l)}\)을 거쳐 최종 출력 \(\hat{\mathbf{y}}\)가 산출되는 복합함수(composite)이다. 따라서 손실함수에 대한 가중치와 바이어스의 미분은 연쇄법칙(chain rule)로 구할 수 있다.

 

\[ \begin{align} \frac{dL}{dW^{(l)}} &= \frac{d \mathbf{z}^{(l)}}{dW^{(l)}} \frac{d \mathbf{a}^{(l)}}{d \mathbf{z}^{(l)}} \frac{d \mathbf{z}^{(l+1)}}{d \mathbf{a}^{(l)}} \cdots \frac{d \hat{\mathbf{y}}}{d \mathbf{z}^{(last)}} \frac{dL}{d \hat{\mathbf{y}}} \\ \\ \frac{dL}{d \mathbf{b}^{(l)}} &= \frac{d \mathbf{z}^{(l)}}{d \mathbf{b}^{(l)}} \frac{d \mathbf{a}^{(l)}}{d \mathbf{z}^{(l)}} \frac{d \mathbf{z}^{(l+1)}}{d \mathbf{a}^{(l)}} \cdots \frac{d \hat{\mathbf{y}}}{d \mathbf{z}^{(last)}} \frac{dL}{d \hat{\mathbf{y}}} \end{align} \]

 

비용함수는 항상 스칼라 함수로 주어지므로 위 식에서 \(\frac{dL}{dW^{(l) }}\) 는 행렬, \(\frac{dL}{d \mathbf{b}^{(l) }}\) 와 \(\frac{dL}{d \hat{\mathbf{y}}}\)는 벡터이고, \(\frac{d \mathbf{z}^{(l)}}{dW^{(l) }}\) 의 결과는 3차원 텐서로 나오며, 나머지는 자코비안 행렬이다.

 

 

 

연쇄법칙으로 위 식을 이용하여 미분을 구할 때는 수식의 맨 오른쪽부터 왼쪽으로 이동하며 계산하는 역전파(backpropagation)가 유리하다. 왜냐하면 비용함수가 스칼라이므로 맨 오른쪽 미분의 결과는 벡터이기 때문이다. 왼쪽으로 이동하며 계산하게 되면 항상 행렬과 벡터의 곱인 \(\frac{d\mathbf{z}}{d\mathbf{a}} \delta\), \(\frac{d\mathbf{a}}{d\mathbf{z}}\delta \) 의 형태로 미분을 계산할 수 있다.

 

 

선형 레이어는 \(\mathbf{z}=W\mathbf{a}+\mathbf{b}\)의 형태이므로 연쇄법칙 수식에 나오는 구성 성분을 차례로 계산해보자.

먼저 자코비안 항이다.

 

\[ \begin{align} \frac{d\mathbf{z}}{d \mathbf{a}} &= W^T \\ \\ \frac{d\mathbf{z}}{d \mathbf{b}} &= I \end{align} \]

 

\(\mathbf{a}=\sigma(\mathbf{z})\)는 활성함수에 따라 계산이 달라지는데, 만약 활성함수로 ReLU를 사용한다면 다음과 같이 된다.

 

\[ \frac{d\mathbf{a}}{d \mathbf{z}} = \begin{bmatrix} \frac{d\sigma_1}{dz_1} & & 0 \\ & \ddots & \\ 0 & & \frac{d\sigma_k}{dz_k} \end{bmatrix}, \ \ \ \frac{d\sigma_i}{dz_i}= \begin{cases} 1, & z_i > 0 \\ 0, & \mbox{else } \end{cases} \]

 

만약 sigmoid를 사용한다면 다음과 같이 된다.

 

\[ \frac{d\mathbf{a}}{d \mathbf{z}} = \begin{bmatrix} \frac{d\sigma_1}{dz_1} & & 0 \\ & \ddots & \\ 0 & & \frac{d\sigma_k}{dz_k} \end{bmatrix}, \ \ \ \frac{d \sigma_i}{dz_i} = - \frac{ \exp{(-z_i)}}{1+\exp{(-z_i)}}\sigma_i \]

 

\(\frac{d\mathbf{z}}{dW}\)는 벡터를 행렬로 미분하는 것으로서 정의에 의해서 \(k\)번째 깊이(depth)축의 행렬은 다음과 같이 계산하면 된다.

 

\[ \begin{align} \frac{dz_k}{d W} &= \frac{d}{dW} \left( w_{k1} a_1 + w_{w2} a_2 + \cdots + w_{kn} a_n \right) \\ \\ & = \begin{bmatrix} \gets 0 \to \\ \vdots \\ \mathbf{a}^T \\ \vdots \\ \gets 0 \to \end{bmatrix} \end{align} \]

 

여기서 \(w_{ij}\)는 행렬 \(W\)의 성분이고 \(z_k\)는 벡터 \(\mathbf{z}\)의 \(k\)번째 성분이다. 계산 결과 \(k\)번째 깊이(depth)축의 행렬은 \(k\)번째 행을 제외하고는 모두 \(0\)의 값을 갖는다. 따라서 \( \frac{d\mathbf{z}}{dW}\)와 벡터 \(\delta\)의 곱은 결과가 행렬로 나오며 다음과 같이 계산된다.

 

\[ \frac{d\mathbf{z}}{dW} \delta = \begin{bmatrix} \delta_1 \mathbf{a}^T \\ \vdots \\ \delta_k \mathbf{a}^T \\ \vdots \\ \delta_m \mathbf{a}^T \end{bmatrix} = \delta \mathbf{a}^T \]

 

여기서 \(\delta =[\delta_1 \ \ \cdots \ \ \delta_m ]^T\)이다.

3차 텐서와 행렬의 곱이 좀 복잡하게 느껴지겠지만 다음과 같이 생각하면 쉽다.

먼저 벡터와 벡터의 곱은 다음과 같다. 각 벡터의 성분과 성분을 곱한 후 더한다.

 

행렬과 벡터의 곱은 다음과 같다. 행렬의 성분인 열벡터와 벡터의 성분을 곱한 후 더한다.

 

3차 텐서와 벡터의 곱은 다음과 같다. 텐서의 성분인 행렬과 벡터의 성분을 곱한 후 더한다.

 

 

 

 

 

댓글