-
4. 오차역전파법(3)AI 모델(딥러닝 기초)/4. 오차역전파법 2023. 1. 25. 10:24728x90
※ Affine 계층
- Affine transformation : 신경망의 순전파 때 수행하는 행렬의 곱
- Affine 계층 : 어파인 변환을 수행하는 처리

이 계산 그래프를 통해서 Affine 계층에 대해 알아보자. X,W,Y는 모두 행렬이며, 행렬 연산에 대해 궁금하다면 2장 신경망 부분을 찾아보기를 바란다.
순전파는 단순하게 구현이 가능하지만, 행렬 연산에서 고려할 형상의 중요성 때문에 역전파에서 dot(곱셈) 연산을 하는 경우에는 스칼라값 계산과 같이 단순하게 반대 입력값을 곱해주는 형식을 사용해서는 안된다.
예를 들어, X자리의 역전파를 만들 때를 생각해보자. X*W의 역전파가 (N,3)의 형상일 때 W가 (2,3)의 형상을 가지고 있다면 (N,3)과 (2,3)은 서로 곱셈이 불가능하므로 W를 transpose 시킨 전치행렬로 곱셈 연산을 한다. 그렇다면 (N,3)과 (3,2)가 곱셈 계산을 통해 (N,2)의 형상을 가진 X의 역전파를 만들어낼 수 있다.

위에서 설명한 내용을 식으로 표현하면 이와 같다.
그렇다면 편향 처리는 어떻게 해야할까? N개로 묶어 배치용 Affine 계층을 만들 경우, 순전파에서 편향은 각각의 데이터에 더해진다. 역전파에서는 각 데이터의 역전파 값이 편향의 원소로 모여서 첫 번째 축의 총합으로 나타난다.
때문에 코드 구현 시 np.sum(dY, axis=0)의 형태로 axis를 0으로 설정하여 0번째 축(첫 번째 축)에 대한 총합을 구한다.
class Affine: def __init__(self, W, b): self.W = W self.b = b self.x = None self.dW = None self.db = None def forward(self, x): self.x = x out = np.dot(self.x, self.W) + self.b return out def backward(self, dout): dx = np.dot(dout, self.W.T) self.dW = np.dot(self.x.T, dout) self.db = np.sum(dout, axis=0) return dxAffine 계층을 class 형태로 구현시켜 보았다.
※ Softmax-with-Loss 계층

<밑바닥부터 시작하는 딥러닝> 177p Softmax와 Cross Entropy Error 계층을 합쳐서 순전파와 역전파를 계산한 모습이다. 자세한 사항들은 그림을 따라가면서 미분 계산을 하면 이해할 수 있을 것이다. 그럼 우리는 결과만 살펴보도록 하자.

<밑바닥부터 시작하는 딥러닝> 177p 여기서 순전파는 단순하게 그림만 보면 이해가 가능할 것이고, 역전파에 주목을 해보자. y는 softmax 계층의 출력, t는 정답 레이블이다. 그렇다면 역전파의 최종결과는 softmax 계층의 출력과 정답 레이블의 차분이라고 이해할 수 있다. 신경망의 역전파에서는 이 차분만큼의 오차가 앞 계층에 전해지는 것이다.
그렇다면 이쯤에서 앞서 3장에서 배운 신경망 학습의 목적이 무엇인가 생각해 볼 필요가 있다. 신경망의 출력이 정답 레이블과 최대한 가까워지도록 가중치 매개변수 값을 조정하는 과정을 거쳤던 것을 기억하는가? 이 역전파 결과를 통해 신경망의 출력과 정답 레이블의 오차를 효율적으로 앞 계층에 전달해야 하므로 신경망 학습에서 우리는 신경망의 출력값과 정답 레이블이 최대한 가까워지도록 매개변수를 설정하는 과정을 거쳤던 것이다.
import numpy as np def cross_entropy_error(y, t): delta = 1e-7 return -np.sum(t * np.log(y + delta)) def softmax(a): c = np.max(a) exp_a = np.exp(a-c) sum_exp_a = np.sum(exp_a) y = exp_a / sum_exp_a return y class SoftmaxWithLoss: def __init__(self): self.loss = None self.y = None # softmax 출력값 self.t = None # 정답레이블 def forward(self, x, t): self.t = t self.y = softmax(x) self.loss = cross_entropy_error(self.y, self.t) return self.loss def backward(self, dout=1): batch_size = self.t.shape[0] dx = (self.y - self.t) / batch_size return dx이렇게 Softmax-with-Loss 계층을 구현해 보았다. 주의할 점은 역전파 때 batch_size로 나눠서 데이터 1개당 오차를 앞 계층으로 전파해야 한다는 점이다.
※ 학습과 추론
신경망 추론 : Affine 계층의 출력을 인식 결과로 사용함. 일반적으로 Softmax 계층은 사용하지 않음.
점수 : 신경망에서 정규화하지 않는 출력 결과에서 Softmax 계층 앞의 Affine 계층의 출력을 점수라고 함.
신경망 학습 : Softmax 계층을 필요로함.
728x90'AI 모델(딥러닝 기초) > 4. 오차역전파법' 카테고리의 다른 글
4. 오차역전파법(4) (0) 2023.01.26 4. 오차역전파법(2) (0) 2023.01.24 4. 오차역전파법(1) (0) 2023.01.20