티스토리 뷰

책 : 밑바닥부터 시작하는 딥러닝 1 chapter 5

 

오차역전파법에 사용하기 위한 활성화 함수를 구현하자. (ReLU, sigmoid)

 

1. ReLU 계층

 

활성화함수로 사용되는 ReLU 함수와 이에 대한 dy/dx는 다음과 같다. 

ReLU
ReLU의 미분

순전파와 역전파의 그림은 다음과 같이 나타낼 수 있다.

ReLU 순전파, 역전파

코드는 다음과 같다. (설명 : 주석 참고)

 

class Relu:
    def __init__(self):
        self.mask = None

    def forward(self, x): # 순전파, x : 입력값 (array)
        self.mask = (x <= 0) # bool 값으로 x 원소 중 0 이하인 것만 True로 갖는다.
        out = x.copy() # x 복사
        out[self.mask] = 0 # x 원소 중 0 이하 것은 0으로 바꾼다.

        return out 

    def backward(self, dout): # 역전파, dout : dL/dy 에 해당하는 입력값
        dout[self.mask] = 0 # 순전파 입력값 x의 원소 중 0이하인 값은 dy/dx=0 => dL/dy * dy/dx =0
        dx = dout # 순전파 입력값 x의 원소 중 0보다 큰 값에서는 dy/dx=1 => dL/dy * dy/dx = dL/dy

        return dx

2. sigmoid 계층

 

sigmoid 함수의 식과 순전파, 역전파 그림은 다음과 같습니다.

sigmoid
sigmoid 순전파, 역전파

(계산 과정은 책 참고, 기존 방법과 동일하게 진행하면 됨)

 

sigmoid의 역전파 결과는 다음과 같이 정리할 수 있습니다.

sigmoid 역전파 결과

코드는 다음과 같습니다.

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

    def forward(self, x): # 순전파, x:입력값(array)
        out = sigmoid(x) # 시그모이드 함수
        self.out = out #self.out = y
        return out

    def backward(self, dout): # 역전파, dout=dL/dy
        dx = dout * (1.0 - self.out) * self.out #정리한 식 이용 

        return dx # 역전파 결과

 

'딥러닝' 카테고리의 다른 글

오차역전파법 구현  (0) 2021.01.14
오차역전파법 - Affine, Softmax 구현  (0) 2021.01.14
오차역전파법 - 계산 그래프  (0) 2021.01.13
신경망 학습 알고리즘 구현  (0) 2021.01.12
신경망 학습 절차  (0) 2021.01.11
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
TAG
more
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함