DL 모델 학습법 III, 역전파 (심화)
역전파 (심화)
1. 손실함수의 기본 가정
note
활성화 함수 입력이 z, 출력이 a
a는 다음 레이어의 입력
l 번째 layer의 출력 matrix 식 : $a^l = \sigma (w^l a^{l-1} + b^l)$
손실함수의 가정 1
학습 데이터 샘플에 대한 신경망의 총 손실은, 각 데이터 샘플에 대한 손실의 합과 같다.
비용함수는 설계하기 나름이지만, 샘플 별 합의 형태로 표현했을 경우에만 역전파 기법을 사용할 수 있다.
이 가정을 통해 우리는 총 손실의 편미분 값을 샘플별 편미분 값으로 계산할 수 있다.
손실함수의 가정 2
각 학습 데이터 샘플에 대한 손실은 a^L에 대한 함수이다.
note : l번째 레이어의 j번째 뉴런에 대한 에러 = $\delta^l_j$
2. 역전파의 기본 방정식
기본 방정식 1
출력층의 error $\delta^L$
출력층의 j 번째 node $z^L_j$에 대한 C의 편미분 값은
$\displaystyle \frac{\partial C}{\partial z^L_j} = \displaystyle \frac{\partial C}{\partial a^L_j} \times \displaystyle \frac{\partial a^L_j}{\partial z^L_j}$
$=\displaystyle \frac{\partial C}{\partial a^L_j} \times \sigma^{\prime} (z^L_j)= \delta^L_j$
$where\;\sigma = activation\;function$
sample에 대한 cost, C는 아래와 같다.
$where\;K = (num\;of\;output\;node)$
$C = \displaystyle \frac{1}{2} \displaystyle \sum_K (y^L_k - a^L_K)^2$
$\displaystyle \frac{\partial C}{\partial z^L_j}$ (C 대입)
$= \displaystyle \frac{\partial}{\partial z^L_j} \left(\displaystyle \frac{1}{2} \displaystyle \sum_K \left(y^L_k - a^L_K \right)^2 \right)$ (a는 활성화함수의 출력값)
$= \displaystyle \frac{\partial}{\partial z^L_j} \left(\displaystyle \frac{1}{2} \displaystyle \sum_K \left(y^L_k - \sigma (z^L_K) \right)^2 \right)$ (각 층의 노드간 연결은 없음)
$= \displaystyle \frac{\partial}{\partial z^L_j} \left(\displaystyle \frac{1}{2} \left(y^L_k - \sigma (z^L_j) \right)^2 \right)$
$= - \left(y_j - \sigma(z^L_j) \right)\sigma^{\prime} \left( z^L_j \right) = \left( a^L_j - y_j \right) \sigma^{\prime} \left( z^L_j \right)$
matrix로 표현하면 아래와 같다.
$\delta^L = \nabla_a C \bigodot \sigma^{\prime} (z^L)$
$\bigodot$은 Hadamard Product로, 벡터 간 연산 중 하나.
같은 위치의 원소의 곱을 출력한다.
기본 방정식 2
l+1 번째 layer error에서의 l 번째 layer의 error
엄청 복잡하지만 천천히 진행해보자
일단 가중치를 곱한 후 합하는 연산으로 인해 Layer 간 관계는 기본적으로 합으로 표현된다. $\left( \sum \right)$
$\delta^l_j$ (l 번째 layer의 j번째 node)
$ = \displaystyle \sum_k \displaystyle \frac{\partial C}{\partial z^{l+1}_k} \frac{\partial z^{l+1}_k}{\partial z^l_j}$
$ = \displaystyle \sum_k \delta^{l+1}_k \frac{\partial z^{l+1}_k}{\partial z^l_k}$
$ = \displaystyle \sum_k \delta_k^{l+1} w_{kj}^{l+1} \sigma^{\prime}(z_j^l)$
$\because z_k^{l+1} = \displaystyle \sum w_{kj}^{l+1} a_j^l + b_k^{l+1} = \displaystyle \sum_j w_{kj}^{l+1} \sigma(z_k^l) + b_k^{l+1} $
$\displaystyle \frac{\partial z_k^{l+1}}{\partial z_k^l} = w_{kj}^{l+1} \sigma^{\prime}(z_k^l)$
$ \delta_k^l = \displaystyle \sum_k \delta_k^{l+1} w_{kj}^{l+1} \sigma^{\prime} (z_j^l) = \sigma^{\prime}(z_j^l) \displaystyle \sum_k \delta_k^{l+1} w_{kj}^{l+1}$
matrix로 표현하면 아래와 같다.
$ \delta^l = \sigma^{\prime} (z^l) \bigodot \left( (w^{l+1})^T \delta^{l+1} \right)$
기본 방정식 3
bias에 대한 Cost의 변화량
$\displaystyle \frac{\partial C}{\partial b^l_j} = \frac{\partial C}{\partial z^l_j} \frac{\partial z^l_j}{\partial b^l_j} = \frac{\partial C}{\partial z^l_j} = \delta^l_j$
$\because \displaystyle \frac{\partial z^l_j}{\partial b^l_j} = 1$
matrix 형태의 식은 아래와 같다.
$\nabla_{b^l} C = \delta^l$
기본 방정식 4
weight에 대한 Cost의 변화량
$\displaystyle \frac{\partial C}{\partial w^l_{jk}} = \frac{\partial C}{\partial z^l_j} \frac{\partial z^l_j}{\partial w^l_{jk}} = \frac{\partial C}{\partial z^l_j} a_k^{l-1} = \delta^l_k a_k^{l-1}$
matrix 형태의 식은 아래와 같다.
$\nabla_{W^l} C = \delta^l \left( a^{l-1} \right)^T $
insight 1 : 뉴런 a의 활성화 정도가 작다면 $(a_k^{l-1})$ 가 작다면 $w^l_{jk}$의 변화가 C에 영향을 주지 않는다.
insight 2 : 출력층에서의 출력값이 거의 0 또는 1일 경우, 관련 뉴런의 가중치, bias는 느리게 학습된다. (이미 잘 맞추는 문제는 더 이상 풀지 않는다)
summary
3. 역전파 알고리즘
Input : $x$
FeedForward : L개의 layer에 대해서 $z^l = w^la^{l-1} + b^l$, $a^l = \sigma(z^l)$을 계산한다.
output error : $\delta^L = \nabla_aC \bigodot \sigma^{\prime}(z^L)$ 계산
역전파 : 2,3,…,l-1 layer에 대해 $\delta^l = \sigma^{\prime} (z^l) \bigodot \left( (w^{l+1})^T \delta^{l+1} \right)$ 계산
output : $\delta^l_j$로 비용함수의 gradient 계산
여기서 나온 gradient를 통해서, 경사하강법에서는 $w^l$을 업데이트한다.
$w^l \rightarrow w^l - \displaystyle \frac{\eta}{m} \sum_x \delta^{x,l}(a^{x,l-1})^T$
$b^l \rightarrow b^l - \displaystyle \frac{\eta}{m} \sum_x \delta^{x,l}$