ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 오차역전파법 - Softmax-with-Loss계층 구현하기
    딥러닝 2020. 1. 28. 17:35

    그림1

     

    잠시 앞의 내용복습을 하겠습니다!

    신경망은 그림1과 같은 층들이 여러 개 있는 것입니다. (그림이 조금 엉망이네요...ㅎㅎ)

    이때 그림1의 h() 함수를 활성화 함수라고 하죠.

    활성화 함수에는 계단, 시그모이드, ReLu 등 이 있습니다.

    출력층의 활성화 함수는 항등함수와 소프트맥스 함수가 있습니다.

     

     

     

    그림2

     

    이제는 각 층을 하나의 클래스로 구현한다고 했습니다. (그림2)

    그래서 이제는 소프트맥스함수를 구현해봅시다.

    학습과정이므로 손실함수가 필수입니다. 그러므로 손실 구현도 같이 하겠습니다.

     

    !

    신경망에서 수행하는 작업은 학습과 추론 두 가지입니다. 추론에서 답을 하나만 낼 때는

    소프트맥스 함수가 필요없습니다.

    소프트맥스 함수는 입력값을 출력의 합이 1이 되도록 정규화하는 함수이기 때문입니다. (입력값과 출력값이 비례합니다)

    즉, 소프트맥스 함수의 입력값만 봐도 정답이 무엇인지 알 수 있기 때문이죠.

    !

     

     

     

    구현하기 전에 계산 그래프를 한 번 볼까요!

    그림3

     

    그림3의 Softmax의 입출력만 봅시다.

    순전파는 그렇다치고.. 역전파는 값이 생각보다 너무 심플합니다.

    왜??

    미분을 하면 그렇게 되지 않을까요?...ㅎ

    사실은 이렇게 값이 나오도록 의도했다고 합니다.

    왜??

    신경망 학습의 목적은 신경망의 출력이 정답 레이블과 가까워지도록 가중치 매개변수의 값을 조정하는 것입니다.

    그래서 출력과 정답의 오차는 매우 중요한 정보이죠.

    저 y-t는 이 정보를 아주 적나라하게 담고 있습니다.

    즉, 값이 이렇게 나올 필요가 있었던거죠.

     

     

    예시)

    정답레이블(0, 1, 0) , 출력(0.3, 0.2, 0.5) ---->의미 : 정답에 20%의 가능성만 두고있음.

    y - t = (0.3, -0.8, 0.5) ------>의미 : 오차가 크네.. -> 내가 생각을 잘못하고 있었구나

     

     

    손실함수는 설명이 필요없겠쥬

     

    <코드>

    class SoftmaxWithLoss:
        def __init__(self):
            #손실함수, 출력, 정답레이블
            self.loss = None
            self.y = None
            self.t = None
    
        def forward(self, x, t):
            self.t = t
            self.y = softmax(x)
            self.loss = cross_entropy_error(self.y, self.t)
            return self.loss
    
        def backward(self):
            batch_size = self.t.shape[0]
            dx = (self.y - self.t)/batch_size
    
            return dx

     

     

     

     

     

     

     

    Softmax-with-Loss 계산 그래프

     

     

     

     

     

     

     

     

     

    [참고]

    -밑바닥부터 시작하는 딥러닝

    -https://excelsior-cjh.tistory.com/171

Designed by Tistory.