8번째 줄: |
8번째 줄: |
| = 사용예 = | | = 사용예 = |
| 각 층을 클래스로 만들고, 해당 레이어의 전방전파, 후방전파 메서드를 만들어 구현한다. | | 각 층을 클래스로 만들고, 해당 레이어의 전방전파, 후방전파 메서드를 만들어 구현한다. |
| + | |
| + | 처음 출발하는 수는 1이다. <math>\frac{\partial L}{\partial L} =1</math>이므로. |
| | | |
| == Relu == | | == Relu == |
60번째 줄: |
62번째 줄: |
| 원리는 다음 affine 계층에서의 역전파를 참고하자. | | 원리는 다음 affine 계층에서의 역전파를 참고하자. |
| | | |
| + | 일반적으로 Cross entropy error층과 함께 사용된다. 교차 엔트로피의 수식은 <math>L=-\sum_{k}t_k \ln y_k</math>이다. 역전파가 들어오면 |
| + | |
| + | === 크로스엔트로피의 역전파 === |
| + | |
| + | * +의 역전파 -1을 그대로 전달하고, |
| + | * 위에 곱해 *의 역전파 두 입력을 바꾸어 각 노드에 <math>-t_k</math>가 전달되고, |
| + | * 위에 곱해 log의 역전파 <math>-\frac{t_k}{y_k}</math>를 전달한다. |
| + | |
| + | === 소프트맥스의 역전파 === |
| + | |
| + | * 입력값으로 <math>-\frac{t_k}{y_k}</math>가 들어오고, |
| + | * 나누어주는 값으론 <math>\frac{t_1+t_2+...}{S}</math>인데, t_k는 정답레이블이므로 다 더하면 1이 된다. 즉, 분모의 시그마로 나누는 과정의 역전파는 <math>\frac{1}{S}</math> |
| + | * 각각의 분자에는 <math>-\frac{t_k}{S y_k}</math>가 들어오고 exp연산에서 <math>y_k -t_k</math>가 결과로 나오게 된다. |
| + | |
| + | === 구현 === |
| + | <syntaxhighlight lang="python"> |
| + | class SoftmasWithLoss: |
| + | def __init__(self): |
| + | self.loss = None # 손실함수값을 저장하기 위한 변수. |
| + | self.y = None # 출력값을 저장하기 위한 변수. |
| + | self.t = None # 정답레이블 |
| + | |
| + | def forward(self, x): |
| + | self.t = t |
| + | self.y = softmax(x) # 이전에 구현한 소프트맥스 함수값을 넣는다. |
| + | self.loss = cross_entrop_error(self.y, self.t) # 오차함수로 오차값을 얻는다. 내 생각엔 backward에서 다뤄도 될 것 같은데.. |
| + | return self.loss # 포워드니까 y값이 나와야 하는 거 아닌감?? |
| + | def backward(self, dout): |
| + | batch_size = self.t.shape[0] # 데이터 갯수 |
| + | dx = (self.y - self.t) / batch_size # 역전파값을 데이터 갯수로 나눈다.(데이터를 여러 개 넣었을 경우.) |
| + | return dx |
| + | </syntaxhighlight> |
| == affine == | | == affine == |
| 딥러닝의 중간 층들에선 행렬 계산이 이루어지는데, 이런 행렬의 곱을 affine변환이라 부른다. 때문에 중간 뉴런들에 대한 층은 어파인층이라 부르고, 이들의 역전파를 통해 어파인층 학습도 가능하다. | | 딥러닝의 중간 층들에선 행렬 계산이 이루어지는데, 이런 행렬의 곱을 affine변환이라 부른다. 때문에 중간 뉴런들에 대한 층은 어파인층이라 부르고, 이들의 역전파를 통해 어파인층 학습도 가능하다. |
83번째 줄: |
117번째 줄: |
| self.db = np.sum(dout, axis=0) # +의 역전파는 그냥 더할 뿐이니, 전파된 값들을 다 더해 하나의 축으로 만든다. | | self.db = np.sum(dout, axis=0) # +의 역전파는 그냥 더할 뿐이니, 전파된 값들을 다 더해 하나의 축으로 만든다. |
| </syntaxhighlight> | | </syntaxhighlight> |
| + | [[분류:딥러닝 이론]] |