인공지능/머신러닝

[머신러닝 - Python] SIgmoid 계층 구현 (Sigmoid Class Implementation)

바보1 2022. 8. 20. 16:19

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

 

순전파의 출력 값을 저장했다가, 다시 이용하는 모습을 볼 수 있습니다.