5장-오차역전파법
계산그래프의 역전파
계산그래프의 순전파가 계산 결과를 왼쪽에서 오른쪽으로 전달한 것과 다르게 역전파는 '국소적인 미분'을 순전파와는 반대로 오른쪽에서 왼쪽으로 전달한다. 이것을 전달하는 원리는 연쇄법칙에 따른다. 위의 그림에서 역전파의 계산 절차는 신호 E에 노드의 국소적 미분을 곱한 후 다음 노드로 전달하는 것이다. 이러한 방식으로 계산을 하면 목표로 하는 미분값을 효율적으로 구할 수 있다는 것이 역전파의 핵심이며 어떻게 그게 가능한 건지는 연쇄법칙의 원리로 설명할 수 있다.
연쇄법칙(chain rule)
연쇄법칙의 원리는 생각보다 간단하다. "합성 함수의 미분은 합성 함수를 구성하는 각 함수의 미분의 곱으로 나타낼 수 있다"가 연쇄법칙의 원리이다. 즉, 연쇄법칙은 합성함수의 미분에 대한 성질이다.
역전파
덧셈노드의 역전파를 먼저 생각해 보면, z = x + y라는 식이 있을 때 x와 y 각각의 편미분은 모두 1이다.
상류에서 전해진 미분에 1을 곱하여 하류로 흘려보낸다. 1을 곱하기만 할 뿐이므로 입력된 값을 그대로 다음 노드로 보내게 된다.
곱셈노드의 역전파를 보자면, z = xy라는 식이 있다고 생각해 봤을 때, x와 y 각각의 편미분은 y, x이다. 위의 덧셈노드의 역전파와 비교할 수 있게끔 그림으로 표현해 보면 아래와 같다.
활성화함수 계층구현하기
앞서 살펴본 활성화함수인 ReLU와 Sigmoid 계층을 구현해 볼 예정이다.
3장-신경망
신경망 퍼셉트론을 사용할 때의 단점은 여전히 원하는 결과를 출력하기 위해서는 사람이 수동적으로 가중치 값을 적절히 정해야 한다는 것이다. 신경망이 이 점을 해결해 주는데, 신경망은 가
thinking-potato.tistory.com
ReLU
ReLU의 수식과 미분식, 계산그래프를 보면 다음과 같다.
ReLU 계층을 코드로 구현해 보면 아래와 같다. 해당 클래스는 mask라는 인스턴스 변수를 가지는데, True/False로 구성되어 있는 넘파이 배열이다. 순천파의 입력인 x의 원소값이 0 이하인 인덱스는 True, 그 외 0보다 큰 원소는 False로 유지한다. 순전파 때의 입력값이 0 이하면 역전파 때의 값은 0이 되어야 한다. 그래서 역전파 때는 순전파 때에 만들어둔 mask를 사용하여 True인 곳에는 상류에서 전파된 dout을 0으로 설정한다.
class Relu:
def __init__(self):
self.mask = None
def forward(self,x):
self.mask = (x <= 0)
out = x.copy()
out[self.mask] = 0
return out
def backward(self, dout):
dout[self.mask] = 0
dx = dout
return dx
Sigmoid
먼저, Sigmoid의 수식과 순전파방향의 계산 그래프를 그려보자면 아래와 같다. 수식을 만들기 위한 절차를 나타낸 그림이라고 생각하면 된다.
역전파를 생각해 보면, 순전파 계산그래프의 반대방향으로 가면서 미분해 주면 된다.
또한, 역전파계산의 결과식은 아래와 같이 고쳐쓸 수 있으며, 이를 통해 시그모이드의 역전파는 순전파의 출력인 y만을 가지고 계산할 수 있음을 알 수 있다.
Sigmoid 계층을 파이썬으로 구현해 보면 아래와 같이 작성할 수 있는데, 순전파의 출력을 인스턴스 변수인 out에 보관해 두었다가 역전파 계산 때 그 값을 사용하는 형태이다.
class Sigmoid:
def __init__(self):
self.out = None
def forward(self, x):
out = 1 / (1 + np.exp(-x))
self.out = out
return out
def backward(self, x):
dx = dout * (1.0 - self.out) * self.out
return dx
Softmax-With-Loss 계층
Softmax-with-Loss 계층은 다소 복잡하므로 간소화해서만 보이면 아래와 같다.
오차역전파법 사용
신경망 학습코드를 구현할 때 지금까지와 다른 부분은 오차역전파법으로 기울기를 구한다는 것이다. 4장에서 정리한 부분 중 "기울기를 구하는 부분"에 해당하는 코드를 오차역전파법을 구현해 놓은 코드를 활용하면 된다. 이러한 동작들을 계층으로 모듈화해 둔다면 신경망의 계층을 자유롭게 조합하여 원하는 신경망을 쉽게 만들 수 있다.
2023.03.29 - [딥러닝] - 4장-신경망 학습
4장-신경망 학습
학습 학습(train)이라는 것은 훈련용 데이터로부터 가중치 매개변수의 최적값을 자동으로 획득하는 과정이다. 신경망이 학습할 수 있도록 해주는 지표를 손실함수라고 한다. 결과적으로 손실함
thinking-potato.tistory.com