본문 바로가기
ML & DL/밑바닥부터 시작하는 딥러닝

[파이썬 딥러닝] 활성화 함수 계층 구현하기

by Glory_Choi 2023. 3. 29.
반응형

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

 

반응형