Loss Function

  • 손실 함수 = Loss Function
  • 신경망 성능의 '나쁨'을 나타내는 지표. 즉, 현재의 신경망이 훈련 데이터를 얼마나 잘 처리하지 못하는지를 나타냄.
    이러한 '나쁨'을 최소로 하는 것은 사실상 '좋음'을 최대로 하는 것과 같으므로, 신경망 학습에서는 손실 함수값이 작아지는 방향으로 학습하게 됨.
    신경망 학습에서는 최적의 매개변수(가중치, 편향)을 탐색할 때 손실함수의 값을 가능한 한 작게 하는 매개변수 값을 찾음.
    찾을 때는 매개변수의 미분(=기울기)을 계산하고, 이 계산값을 단서로 새로 매개변수 값을 갱신해나감. 자세히 말하면 '가중치 매개변수에 대한 손실 함수의 미분=가중치 매개변수의 값을 아주 조금 변화시켰을 때, 손실 함수의 변하는 정도'임. 따라서 이 값이
    음수 : 가중치 매개변수를 양의 방향으로 변화(=값 증가)시켜 손실 함수의 값을 줄임.
    양수 : 가중치 매개변수를 음의 방향으로 변화(=값 감소)시켜 손실 함수의 값을 줄임.
    굳이 손실 함수를 쓰는 이유는, 정확도를 지표로 하면 매개변수의 미분이 대부분의 장소에서 0이 되기 때문임.
    정확도라는 것은 전체 중 얼마나 정확히 인식했냐이므로, 예를 들어 100장이 전체일 때는 32%, 33%와 같은 값만 같게 됨.
    따라서 32%상황에서 매개변수를 조금 변화시켜도 32.0234%같이 안 되고 여전히 32%이거나(이 경우 미분이 0), 33%같이 큰 값으로(=불연속적으로) 값이 변화하므로 최적의 매개변수 값을 찾기에 적합하지 않음.
    딥러닝에 자주쓰이는 손실함수에는 다음과 같은 함수들이 있음.
    1. 평균 제곱 오차 = MSE(Mean Squared Error)
    2. $$ E = \frac{1}{n}\sum_{k=1}^n (y_k-t_k)^2 \qquad y_k\text{ : 신경망의 출력, } t_k\text{ : 정답 레이블, } n\text{ : 데이터의 차원 수} $$
      • 특징
      • 수치예측에 많이 사용됨.
      • 파이썬 구현
      • def mean_squared_error(y, t):
            return ((y-t)**2).mean(axis=None)
        
        # 정답이 '5'인 경우
        t = [0, 0, 0, 0, 0, 1, 0, 0, 0, 0]
        
        # '5'가 제일 높다고 추정함
        y = [0.1, 0.05, 0.05, 0.0, 0.05, 0.6, 0.05, 0.0, 0.1, 0.0]
        
        mean_squared_error(np.array(y), np.array(t))
        0.019750000000000007
        
        # '7'이 제일 높다고 추정함
        y = [0.1, 0.05, 0.05, 0.0, 0.05, 0.0, 0.05, 0.6, 0.1, 0.0]
        
        mean_squared_error(np.array(y), np.array(t))
        0.13899999999999998
        # 값이 작게 나온 것이 정답에 더 가깝다고 판단 가능.
        
    3. 교차 엔트로피 오차 = CEE(Cross Entropy Error)
    4. $$ E = -\sum_{k=1}^n t_k\ln(y_k) \qquad t_k\text{ : 원-핫 인코딩 된 정답 레이블(대부분)} $$
      • 특징
      • 정답 레이블이 원-핫 인코딩이므로, CEE의 값은 정답일 때의 추정값($t_k$가 1일 때의 $y_k$)의 자연로그를 계산한 값과 같음.
        즉, 정답일 때의 출력이 전체 값을 정함.
      • 파이썬 구현
      • def cross_entropy_error(y, t):
            if y.ndim == 1:
                t = t.reshape(1, t.size)
                y = y.reshape(1, y.size)
                
            # 훈련 데이터가 원-핫 벡터라면 정답 레이블의 인덱스로 반환
            if t.size == y.size:
                t = t.argmax(axis=1)
                     
            batch_size = y.shape[0]
            # 정답 레이블이 원-핫 인코딩이 아니라 숫자 레이블로 주어졌을 때의 경우 고려한 구현
            return -np.sum(np.log(y[np.arange(batch_size), t])) / batch_size
        

댓글

이 블로그의 인기 게시물

Backpropagation

SGD = Stochastic Gradient Descent