5.5 활성화 함수 계층 구현하기

2024. 11. 17. 13:07스터디/24-2 스터디 _ 밑바닥부터 시작하는 딥러닝

신경망을 구성하는 층(계층) 각각을 클래스 하나로 구현

활성화 함수(ReLU, Sigmoid) 계층 구현

 

 

 

 

5.5.1 ReLU 계층

 

-ReLU 수식

- ReLU 미분

(순전파 때의 입력 x) >0 : 역전파는 상류의 값을 그대로 하류로 흘림(=1을 보냄)

(순전파 때의 입력 x) <=0 : 역전파 때는 하류로 신호를 보내지 않음(=0을 보냄)

 

 

 

-ReLU 계층의 계산 그래프

 : 전자는 1을 보내고(그대로 보내고), 후자는 0을 보낸다.(신호를 보내지 않는다.)

 

 

 

-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

값이 0 이하인 원소들은 모두 0으로 변경함.

값이 0 초과인 원소들은 그대로 유지함.

 

 

 

-def forward(self, x) 세부

self.mask = (x <= 0)

배열의 각 원소가 0 이하이면 TRUE, 0 초과 이면 FALSE 인 배열을 self .mask에 저장

self .mask의 배열은 TRUE 또는 FALSE 중 한 개로 나타내지는 원소들로 구성됨

out = x.copy()

x 배열의 복사본을 out에 저장

그러므로 out을 수정하더라도 원본인 x에는 영향을 주지 않음

out[self.mask] = 0

self .mask에서 TRUE인 원소들을 모두 0으로 바꿈

 

-IF 순전파 때의 입력 값 <= 0, 역전파 때의 값=0

-> 역전파 시, 순전파 때의 mask 써서 원소가 TRUE 인 곳에서는 상류에서 전파된 dout를 0으로 설정함

 

 

 

 

5.5.2 Sigmoid 계층

 

-Sigmoid 수식

 

 

 

-Sigmoid 계층의 계산 그래프(순전파)

-'exp' 노드 : y=exp(x) 계산 수행

-'/' 노드 : y=1/x 계산 수행

 

 

 

-Sigmoid 계층의 계산 그래프(역전파)

 

1단계)  '/' 노드

  • 상류에서 흘러온 값 * -y^2(순전파의 출력 제곱 후 마이너스 붙인 값) 를 하류로 전달

 

2단계) '+' 노드

  • 상류의 값을 그대로 하류로 전달

 

3단계) 'exp' 노드

  • 상류의 값 * 순전파 때의 출력 을 하류로 전달

y=exp(x) 연산 수행함

 

4단계) 'x' 노드

  • 순전파 때의 값을 '서로 바꿔' 곱한 후 하류로 전달

 

 

 

-역전파의 최종 출력인 이 값이 하류 노드로 전파됨

-순전파의 입력 x와 출력 y만으로 계산 가능

 

--> 계산 그래프의 중간 과정을 모두 묶어 'Sigmoid' 노드 하나로 대체 가능

 

 

 

-Sigmoid 계층의 역전파는 순전파의 출력(y)만으로 계산할 수 있음(x 없이도 가능함)

 

-->

 

 

 

-Sigmoid 계층 구현- 코드

class Sigmoid:
    def __init__(self):
        self.out = None

    def forward(self, x):
        out = sigmoid(x)
        self.out = out
        return out

    def backward(self, dout):
        dx = dout * (1.0 - self.out) * self.out  # (1-y)*y

        return dx

(1.0 - self.out) * self.out = (1-y)*y

순전파의 출력을 out(인스턴스 변수)에 보관했다가, 역전파 계산 때 그 값을 사용함