반응형
ReLU 계층
활성화 함수로 사용되는 ReLU 수식은 다음과 같습니다.

x에 대한 y의 미분은 다음과 같습니다.

순전파 때의 입력인 x가 0보다 크면 역전파는 상류의 값을 그대로 하류로 흘립니다. 반면, 순전파 때 x가 0 이하면 역전파 때는 하류로 신호를 보내지 않습니다.(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 계층
시그모이드 함수의 수식은 다음과 같습니다.

시그모이드 함수의 순전파를 계산 그래프로 그리면 다음과 같습니다.

역전파의 흐름을 오른쪽에서 왼쪽으로 한 단계씩 짚어보겠습니다.
1단계
'/' 노드를 미분하면 다음 식이 된다.

따라서 상류에서 흘러온 값에 곱해서 하류로 전단하면 계산그래프가 다음과 같습니다.

2단계
'+'노드는 상류의 값을 여과 없이 하류로 흘려 보냅니다.

3단계
'exp' 노드는 y = exp(x) 연산을 수행합니다. 계산 그래프에서는 상류의 값에 순전파 때의 출력을 곱해 하류로 전달합니다.

4단계
'x' 노드는 순전파 때의 값을 서로 바꿔서 곱한다.

중간 단계 노드들을 묶어서 'sigmoid'노드로 대체하면 계산 그래프를 간소화 할 수 있습니다.

간소화 된 식을 한번 더 정리하면 더 간소화 시킬 수 있다.

이처럼 Sigmoid 계층의 역전파는 순전파의 출력(y)만으로 계산할 수 있습니다. 이제 파이썬으로 Sigmoid계층을 구현하겠습니다.
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, dout):
dx = dout * (1.0 - self.out) * self.out
return dx
반응형
'ML & DL > 밑바닥부터 시작하는 딥러닝' 카테고리의 다른 글
[파이썬 딥러닝]순전파와 역전파 기초 (0) | 2023.03.28 |
---|---|
[파이썬 딥러닝] 학습 알고리즘 구현 (0) | 2023.03.24 |
[파이썬 딥러닝] 수치 미분 (0) | 2023.03.22 |
[파이썬 딥러닝] 신경망 학습 (0) | 2023.03.16 |
[파이썬 딥러닝] 신경망 (0) | 2023.03.14 |