일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- Python
- mnist
- 자전거 여행
- CNN
- backpropagation
- bayesian
- 수달
- 신경망
- neural network
- 역전파법
- 비샤몬당
- 전처리
- deep learning
- 오일러 프로젝트
- 역전파
- 소수
- Convolutional Neural Network
- 오토인코더
- 냥코 센세
- Gram matrix
- project euler
- A Neural Algorithm of Artistic Style
- 베이지안
- 딥러닝
- Autoencoder
- 소인수분해
- SQL
- c#
- 합성곱 신경망
- 히토요시
- Today
- Total
통계, IT, AI
딥러닝: 화풍을 모방하기 (7) - 책 요약: 4. 역전파법 본문
4. 역전파법: backpropagation
4.1 기울기 계산의 어려움
- 3장에서 설명한 경사하강법을 실행하기 위해서는 식 \((1)\)과 같이 \(E_n(\boldsymbol{w})\)에 대한 미분이 필요하다. 단, \(w^{(l),t}_{ji}\)는 \(t\)시점의 파라미터를 나타내며 \(E_n(\boldsymbol{w})\)은 \(n\)번째 미니배치의 오차함수이다.
$$ w^{(l),t+1}_{ji} \leftarrow w^{(l),t}_{ji} - \epsilon \frac{\partial E_n(\boldsymbol{w})}{\partial w^{(l)}_{ji}} \tag{1}\label{(1)}$$
- 그런데 이 미분을 계산하는 것은 입력에 가까운 층일 수록 힘들다. 왜냐하면 \(\boldsymbol{y}(x)\) 안에 \(w^{(l)}_{ji}\)가 활성화 함수가 여려 겹이나 적용된 식 안에 있기 때문이다. 이를 역전파법으로 해결할 수 있다.
4.2. 역전파법 유도
그림 1. Backpropagation 유도
- 다층 신경망으로 일반화된 내용으로 바로 소개한다.
- 오차함수의 파라미터에 대한 미분을 체인룰을 사용하여 식 \((2)\)와 같이 쓸 수 있다.
$$\frac{\partial E(\boldsymbol{w})}{\partial w^{(l)}_{ji}}=\frac{\partial E(\boldsymbol{w})}{\partial u_j^{(l)}}\frac{\partial u_j^{(l)}}{\partial w^{(l)}_{ji}}\tag{2}\label{(2)}$$
- 이때 \(u_j^{(l)}=\sum_{i=1}^{K^{(l-1)}}w_{ji}^{(l)}z_i^{l-1}\)이므로 \(\partial u_j^{(l)}/\partial w^{(l)}_{ji}=z_i^{(l-1)}\)이다. 이제 \(\delta^{(l)}_{j}\)를 식 \((3)\)과 같이 정의한다. 단, \(K^{(l)}\)은 \(l\)번째 층의 노드의 수이다.
$$\delta^{(l)}_{j} \equiv \frac{\partial E_n(\boldsymbol{w})}{\partial u_j^{(l)}} \tag{3}\label{(3)}$$
- 다시 체인룰을 사용하여 \(\delta^{(l)}_{j}\)를 식 \((4)\)와 같이 쓸 수 있다. 그림 1의 붉은 선에서 볼 수 있듯 \(u_j^{(l)}\)은 \(l+1\) 층의 \(u_k^{(l+1)}\)에 영향을 주기 때문이다. 즉, \(l+1\)층의 모든 \(u_k^{(l+1)}\)은 \(u_j^{(l)}\)을 포함한다.
$$\delta^{(l)}_{j}= \sum_{k=1}^{K^{(l+1)}} \frac{\partial E_n(\boldsymbol{w})}{\partial u_k^{(l+1)}}\frac{\partial u_k^{(l+1)}}{\partial u_j^{(l)}} \tag{4}\label{(4)}$$
- \(u_k^{(l+1)}=\sum_{i=1}^{K^{(l)}}w_{kj}^{(l+1)}z_j^{(l)}=\sum_{i=1}^{K^{(l)}}w_{kj}^{(l+1)}f^{(l)}(u_j^{(l)})\)이므로 \(\partial u_k^{(l+1)}/\partial u^{(l)}_{j}=w_{kj}^{(l+1)}f^{(l)'}(u^{(l)}_j)\)이며 식 \((3)\)과 같은 정의를 사용하여 \(\partial E_n(\boldsymbol{w})/\partial u_k^{(l+1)}=\delta^{(l+1)}_{k}\)이다. 이를 식 \((4)\)에 대입하여 식 \((5)\)를 얻는다.
$$\delta^{(l)}_{j}= \sum_{k=1}^{K^{(l+1)}} \delta^{(l+1)}_{k}w_{kj}^{(l+1)}f^{(l)'}(u^{(l)}_j)\tag{5}\label{(5)}$$
- 식 \((2)\)를 식 \((6)\)과 같이 정리하여 역전파법을 유도한다. 단, \(\delta^{(l)}_{j}\)는 식 \((5)\)와 같다.
$$\frac{\partial E(\boldsymbol{w})}{\partial w^{(l)}_{ji}}=\delta_j^{(l)}z_{i}^{(l-1)}\tag{6}\label{(6)}$$
- 왜 이 방법의 이름이 역전파법 Backpropagation인지 \((5)\)에서 알 수 있다. 가장 마지막 층의 \(\delta_j^{(L)}\)을 구하여 \(\delta_j^{(L-1)}\)을 얻고 이를 \(l=2\)층까지 반복하기 때문이다. 각 층의 \(\delta\)를 구하면 바로 \(\partial E(\boldsymbol{w})/\partial w_{ji}^{(l)}\)을 구할 수 있다.
- 이제 \(\delta_j^{(L)}\)을 구해보자. 흥미롭게도 지금까지 제시한 몇가지 오차함수에 대하여 \(\delta_j^{(L)}\)는 같은 형태를 갖는다. 먼저 회귀문제를 살펴보자. 오차함수는 제곱합 \(E(\boldsymbol{w})=\left \| \boldsymbol{y-d} \right \|^2/2\)이며 출력층의 활성화 함수로 항등함수를 선택하는 경우 \(\delta_j^{(L)}\)은 다음과 같다.
$$\delta_j^{(L)}=z_j^{(L)}-d_j=y_j^{(L)}-d_j \tag{7}\label{(7)}$$
- 이진분류 문제이고 오차함수로 \(E(\boldsymbol{w})=d \log y + (1-d)\log(1-y)\)를 사용하며 출력층의 활성화함수로 로지스틱 함수를 사용하는 경우 \(\delta_j^{(L)}\)은 다음과 같다.
$$\delta^{(L)}=-\frac{d}{y}\frac{dy}{du}-\frac{1-d}{1-y}\frac{dy}{du}
=-d(1-y)-(1-d)y=y-d \tag{8}\label{(8)}$$
- 다클래스의 분류문제이고 활성화함수로 소프트맥스 함수를 사용하고 오차함수로 교차 엔트로피를 사용하는 경우 \(\delta_j^{(L)}\)은 다음과 같다.
$$\begin{eqnarray}\delta_j^{(L)}&=&-\sum_{k}d_k\frac{1}{y_k}\frac{\partial y_k}{\partial u_j^{(L)}}
\\ &=&-d_j(1-y_j)-\sum_{k \neq j}d_k(-y_j)=\sum_{k}d_k(y_j-d_j)
\\ &=&y_j-d_j \tag{9}\label{(9)} \end{eqnarray}$$
- 이렇게 회귀, 분류 두 가지 유형에서 \(\delta_j^{(L)}\)은 신경망의 출력과 목표 출력간의 차가 된다.
- 계산을 매트릭스 형태로 구해보자. 이는 GPU나 CPU를 이용한 병렬계산을 고려하면 무척 중요한 요소이다. \(w^{(l)}\)은 \(l\)번째 층의 파라미터를 원소로 갖는 \(K^{(l)} \times K^{(l-1)}\)의 크기의 매트릭스이다. \(b^{(l)}\)은 \(l\)번째 층의 파라미터 특히 bias를 원소로 갖는 \(K^{(l)} \times 1\)의 크기의 매트릭스이다. \(u^{(l)}=w^{(l)}z^{(l-1)}+b^{(l)}1_{1\times N}\)이며 \(K^{(l)} \times N\)의 크기를 갖는다. \(z^{(l)}=f^{(l)}(u^{(l)})\) 즉, \(u^{(l)}\)의 각 원소에 활성화함수를 적용한 것이다. 단, \(z^{(1)}\)은 \(n\)번째 미니배치인 \(x^T_n\)과 같다. \(x_n\)의 각 행은 각 샘플, 각 열은 input을 나타낸다. \(\Delta^{(l)}\)은 \(K^{(l)} \times N\)의 크기를 갖는 매트릭스로 각 열은 각 샘플, \(j\)번째 행은 \(\delta^{(l)}_j\)를 나타낸다. 1
$$\Delta^{(L)}=Y-D^T \tag{10}\label{(10)}$$
$$\Delta^{(l)}=\left( w^{(l+1)T}\Delta^{(l+1)} \right) \odot f^{(l)'}(u^{(l)}), \quad l=L-1, \cdots ,2 \tag{11}\label{(11)}$$
$$\frac{\partial E(\boldsymbol{w})}{\partial w^{(l)}}=\Delta^{(l)}z^{(l-1)T}/N, \quad l=L, \cdots ,2\tag{12}\label{(12)}$$
$$\frac{\partial E(\boldsymbol{w})}{\partial b^{(l)}}=\Delta^{(l)}1_{N \times 1}/N, \quad l=L, \cdots ,2\tag{13}\label{(13)}$$
- 역전파법이 아니더라도 \(\partial E(\boldsymbol{w})/\partial w_{ji}^{(l)}\)를 구하는 것이 불가능하진 않다. 미분의 정의를 이용하여 다음과 같이 구하는 것이 가능하다. 단, 식 \((14)\)에서 \(\epsilon\)은 0보다 큰 작은 수이며 \(\boldsymbol{w} + \epsilon \)은 \(w_{ji}^{(l)}\)에 \(\epsilon\)을 더하는 연산이지만 의미를 살리기 위하여 이렇게 사용한다.
$$\frac{ \partial E(\boldsymbol{w}) }{\partial w_{ji}^{(l)}} \approx \frac{ E(\boldsymbol{w} + \epsilon) - E(\boldsymbol{w}) }{\epsilon} \tag{14} \label{(14)}$$
- 하지만 이 방법은 신경망의 규모가 커질수록 비효율적인 방법이다. 왜냐하면 \(w_{ji}^{(l)}\)를 에 대한 미분을 얻기 위해 모든 파라미터를 사용하여 \(E(\boldsymbol{w})\)를 구해야하기 때문이다.
4.3 기울기 소실 문제
- 식 \((11)\)에 나온 역전파 계산은 선형계산이다. 따라서 각 층의 가중치가 너무 크거나 너무 작다면 \(\delta^{(l)}\)가 각 층을 거쳐 전달되는 도중 급속하게 커지거나, 급속하게 작아지게 된다. 이를 기울기 소실 문제 vanishing gradient problem이라고 부른다. 이는 층이 많을수록 문제가 된다.
- 이를 해결하기 위한 방법이 앞으로 설명할 사전훈련이며 이를 계기로 신경망 연구가 다시 부흥하게 된다.
- 지금까지 정리했던 형태와는 조금 다르다. 즉, 지금까지는 파라미터가 뒤에 나왔는데, 지금부터는 앞에 둔다. [본문으로]
'머신러닝' 카테고리의 다른 글
딥러닝: 화풍을 모방하기 (9) - 책 요약: 5. 자기부호화기 (0) | 2017.04.17 |
---|---|
딥러닝: 화풍을 모방하기 (8) - 연습: 역전파법 (0) | 2017.03.01 |
딥러닝: 화풍을 모방하기 (6) - 연습: 다클래스 분류 문제 (1) | 2017.02.02 |
딥러닝: 화풍을 모방하기 (5) - 연습: 이진 분류 문제 (0) | 2017.02.01 |
딥러닝: 화풍을 모방하기 (4) - 연습: 회귀 문제 (0) | 2017.01.30 |