1. Sigmoid 함수
sigmoid 함수는 다음과 같습니다.
\(y = \frac{1}{1 + exp(-x)}\)
이때 sigmoid 함수를 계산 그래프로 표현하면 아래의 사진과 같습니다.
숝
sigmoid에는 +, * 말고 새로운 exp, / 노드가 추가 되었습니다.
이때 주의해야 할 점은 계산 할 때는 국소적 미분으로 계산해야 한다는 점입니다.
해당 노드는 해당 노드의 미분 값만 계산해야 합니다.
1 단계
/ 노드, 즉 \(y = \frac{1}{x}\)를 미분하면 다음 식이 됩니다.
\(\frac{\partial y}{\partial x} = -\frac{1}{x ^ 2} = -y^2\)
따라서 상류에서 흘러온 값에 \(-y^2\)을 곱해서 하류로 보냅니다.
여기서 주의해야 할 점은 순전파때 사용했던 1 + exp(-x)는 하나의 변수로 봐야한다는 점입니다.
해당 노드를 \(y = \frac{1}{1 + exp(-x)}\)라고 보면 안 되고, 1 + exp(-x)를 하나의 변수로 보고 계산해야 합니다.
2 단계
이때 + 는 그냥 상류에서 내려온 값을 하류로 흘러보냅니다.
3 단계
exp의 미분은 exp입니다.
하지만 이때의 입력 x는 간단하게 -x 이므로 역전파의 값에 exp(-x)를 곱하여 흘려보내면 됩니다.
4 단계
* 노드에서는 서로의 값을 바꿔서 곱하면 됩니다.
따라서 -1을 곱하면 됩니다.
따라서 계산 그래프는 다음과 같습니다.
하지만 \(y^2exp(-x)\)는 \(y(1-y)\)와 같습니다.
따라서 순전파의 출력 값을 저장했다가, 역전파 때 그대로 사용합니다.
2. SIgmoid 계층 구현
class Sigmoid:
def __init__(self) -> None:
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
순전파의 출력 값을 저장했다가, 다시 이용하는 모습을 볼 수 있습니다.
'인공지능 > 머신러닝' 카테고리의 다른 글
[머신러닝 - 이론] Polynomial Regression (다항 회귀) (0) | 2022.10.18 |
---|---|
[머신러닝 - 이론] Linear Regression (선형 회귀) (0) | 2022.10.18 |
[머신러닝 - Python] ReLU 계층 구현 (ReLU class implementation) (0) | 2022.08.20 |
[머신러닝 - Python] 덧셈, 곱셈 노드 오차 역전파 구현 (Addition, Multiplication Back Propagation Implementation) (0) | 2022.08.13 |
[머신러닝 - 이론] 오차 역전파, 오류 역전파 (Back Propagation) (0) | 2022.08.13 |