본문 바로가기
AI/밑딥

딥러닝) 활성화 함수 ReLU 계층 , Sigmoid 계층 구현

by 채채씨 2021. 3. 15.
728x90
반응형
1. ReLU 계층 구현 (forward/ backward)

활성화 함수 중 하나인 ReLU함수는 아래와 같다.

ReLU 함수

 

순전파에서 입력이 x > 0이면 역전파에서 upstream 값을 그대로 downstrem으로 보내는 반면, 입력이 x <= 0이면 역전파에서 upstream 값을 downstream으로 보내지 않는다.

 

ReLU 계층의 계산 그래프

 

 

<코드>

 

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

 

 

★핵심은 입력값이 x <= 0인 인덱스를 순전파 때 0으로 만들고, 역전파 때도 0으로 만들어 활성화되지 않도록 만드는 것이다. 

 

 

 

인스턴스 변수 mask는 순전파의 입력인 x의 원소 값이 x <= 0인 인덱스는 True, x > 0인 인덱스는 False로 만든다. 예를 들면 아래와 같다.

 

 

forward에서 x의 원소 중 True값이 있는 인덱스, 즉 x <= 0인 인덱스에는 0값을 대입한다.

backward에서 upstream에서 전파된 dout의 원소 중 Ture값을 가진 인덱스에 0을 대입한다.

 

 

 

 

 

2. Sigmoid 계층 구현 (forward/ backward)

활성화 함수 중 또 다른 함수인 Sigmoid함수는 아래와 같다.

 

Sigmoid 함수

 

아래 그림은 Sigmoid계층의 계산 그래프이다.

 

Sigmoid 계층의 순전파

 

 

Sigmoid 계층의 역전파

 


위에서 미분한 값을 연쇄적으로 곱하면서 아래로 내려오며, '+'노드는 upstream의 값을 그대로 downstream으로 내보낸다.

 

 

역전파의 최종값은 아래와 같이 정리할 수 있다.

 

 

Sigmoid 역전파 최종값

 

 

Sigmoid 역전파 요약

 

 

즉 Sigmoid 계층의 backpropagation은 순전파의 출력값 y만으로 계산할 수 있다.

 

 

<코드>

 

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

 

★핵심은 순전파의 출력값을 out에 담아서 역전파에서 활용하는 것이다.

 

 

 


 

출처: 사이토 고키『밑바닥부터 시작하는 딥러닝』, 한빛미디어(2017), p165-170.

https://www.hanbit.co.kr/store/books/look.php?p_code=B84758311980

 

728x90
반응형

댓글