-
오차역전파법 - 활성화 함수 계층 구현하기1딥러닝 2020. 1. 27. 18:36
계산 그래프를 신경망에 적용해봅시다.
신경망을 구성하는 층 각각은 하나의 클래스로 구현됩니다.
이 글에서는 ReLU와 Sigmoid 계층을 구현하도록 하겠습니다.
ReLU
relu 함수의 수식입니다.
따라서 relu함수의 미분은 아래와 같이 됩니다. 계산 그래프로 함께 보겠습니다.
class Relu: def __init__(self): self.mask = None def forward(self, x): self.mask = (x<=0) out = x.copy() out[self.mask] = 0 # 0보다 작을 경우 0으로 만든다 return out def backward(self, dout): dout[self.mask] = 0 dx = dout return dx
mask는 True/False로 구성된 넘파이 배열입니다.
역전파에서 순전파의 값이 필요하기 때문에 저장을 하는군요.
(backward 구현에서 x의 값이 0 이하이면 0이고 0 초과이면 1이어야 하는데 이 코드는 그런지 잘모르겠습니다.. 아시는 분은 도움 부탁드립니다!)
Sigmoid
sigmoid함수의 수식입니다.
relu처럼 슥탁으로 할 수 있는 미분이 아닌 거 같습니다.
계산 그래프와 함께 보겠습니다.
미분만 알고 있으면 이해하는데 무리가 없을거라 생각됩니다.
구현해보겠습니다.
class sigmid: def __init__(self): self.out = None def forward(self, x): out = 1/(1 + np.exp(-x)) self.out = out return out def backward(self, dout): dx = dout * self.out * (1.0-self.out) return dx
순전파와 역전파 모두 수식 그대로입니다.
역시 순전파의 값을 저장합니다.
[참고]
-밑바닥부터 시작하는 딥러닝
-https://excelsior-cjh.tistory.com/171
반응형'딥러닝' 카테고리의 다른 글
오차역전파법 - Affine 계층 구현하기 (0) 2020.01.31 오차역전파법 - Softmax-with-Loss계층 구현하기 (0) 2020.01.28 오차역전파법 - 덧셈 계층, 곱셈 계층 (0) 2020.01.27 오차역전파법 - 계산 그래프 (0) 2020.01.27 미니배치 학습 구현하기 (0) 2020.01.16