본문 바로가기
딥러닝/딥러닝

[CS231n] Loss Functions and Optimization

by DUSTIN KANG 2020. 9. 8.
  • loss function(손실 함수) : 딥러닝을 통해 최적의 오차를 찾아야 하는데 손실함수는 예측값과 실체 레이블과의 차이를 구하는 함수입니다. 손실함수를 최소화하는 방향으로 Weight를 계산합니다.
  • Optimizer :  손실함수를 최소화 시킬 수 있는 파라미터를 찾는 방법이다. 손실함수의 간격을 Optimizer를 통해 줄일 수 있습니다.
  • Weight의 수정 방향을 결정하는 것을 말합니다.
딥러닝에서는 Loss Function을 최소화하기 위해 Loss function을 미분하여 Gradient을 구하고 경사 하강 방향으로 파라미터 값을 찾기 위해 사용합니다.

Loss Function

이전, 사전적 정의에서도 보았듯이, Loss function(손실 함수)는 W값에 대해 좋은지 나쁜지를 정량화할 수 있는 지표입니다.

손실함수를 공식화하면 다음과 같습니다.

 

최종 Loss(L)은 각 N개의 샘플의 Loss 평균 값을 말합니다.

SVM Loss

만약, 3개의 클래스의 데이터로 Hingle loss를 계산해봅시다.

SVM Loss의 손실 함수를 구하는 방법은 정답 카테고리를 제외한 나머지 카테고리의 합을 구하고 비교하는 방식입니다.

 

위와 같이 3가지 클래스의 손실 값을 구하고 각 클래스의 Loss 평균 값을 구하면 최종 Loss가 됩니다. 결론적으로 15.8 / 3 =5.26이 나오게 됩니다. 이는 이미지를 잘 분류하지 못했다고 판단할 수 있습니다.  0에 근접해야 되기 때문입니다. 손실 함수는 이 뿐만 아니라 다른 공식도 있습니다. 어떤 Loss Function을 사용하느냐에 따라 클래스를 더 좋게 혹은 더 나쁘게 만들 수 있습니다.

def Loss(x, y, W):
	scores = W.dot(x)
    margins = np.maximum(0, scores - scores[y] + 1)
    margins[y] = 0
    loss_i = np.sum(margins)
    return loss_i
  💡 Loss = 0이 되는 W라면?
만약, Loss = 0이 되는 가중치 값이라면 마냥 좋은 것일까요? 그렇지 않습니다. 이러한 경우는 보통 훈련 데이터에만 맞는 손실 함수만 찾기 때문에 테스트 데이터를 넣었을 때 좋지 않는 결과가 나올 수 있습니다. 우리는 훈련 데이터를 이용해 머신러닝 모델을 테스트 데이터에 적용해야하기 때문입니다. 

 

더보기

손실함수의 종류

  • 회귀의 경우 : MSE, MAE
  • 이진 분류의 경우 : Binary_crossentropy
  • 다중 분류의 경우 : Categorical_crossEntropy, Sparse_categorical_crossentropy

 

Regularization

만약, 우리가 의도했던 결과와 다르게 테스트 데이터에서 설명하지 못한다면 어떻게 될까? 이러한 의문점을 해결하기 위해 Regularization 작업을 진행합니다. 

Regularization은 모델의 Overfitting을 예방하기 위해, 즉 훈련 데이터를 덜 복잡하게 만들기 위해 모델에 패널티를 주는 작업입니다.

보편적인 종류로 L2 Regularization, L1 Regularization이 있습니다. 이 둘의 차이는 복잡도를 판단하는 기준에 따라 달라지게 됩니다. 

 

  • L2 Regularization(Ridge, Weight Decay) : 가중치가 치중되어 있으면 복잡하고 분산되어 있으면 덜 복잡하다고 판단합니다.(coarse solution)
  • L1 Regularization(Lasso) :  가중치에 0이 아닌 요소가 많으면 복잡하고 0이 많으면 덜 복잡하다고 판단합니다. (sparse solution)
  • Elastic Net : L2와 L1을 섞었다..
  • 람다 : 람다(알파) 값은 Regularization의 정도를 의미하는 하이퍼 파라미터입니다. 람다 정도가 클수록 회귀 계수를 0으로 수렴시켜 모델의 복잡도를 줄일 수 있습니다. 

 

Overfitting을 방지하는 요소들 중 L1과 L2 이외에도 Dropout, Early Stopping등이 있습니다. 

 

Softmax

Softmax는 멀티 클래스에 데이터를 분류하는 또 다른 모델입니다.  클래스 별 확률 분포를 사용해 예측 값을 구합니다. 

지수를 취한 후 모든 점수를 양수로 만들고 그 지수들의 합으로 다시 정규화를 합니다. 이를 통해 확률 분포를 얻어 1에 가장 가까운 값을 계산하게 됩니다. 그리고 Cross Entropy Loss 는 `-log(정답 클래스의 확률)`입니다.

 

최적화(Gradient)

 최적화는 골짜기에서 밑으로 내려가는 것과 비슷합니다. 예측 함수를 하나의 경사를 말하며 Gradient의 방향으로 Loss가 어떻게 변하는지 계산합니다. 즉, Gradient를 통해 loss를 변화 시킬 수 있는 거죠.  내려가는 방법으로 2가지가 있습니다.

Random Search

샘플링한 W를 계산해 모든 loss를 비교하며 가장 작은 loss일 때  어떤 W가 가장 좋은지 확인하는 방법입니다. 하지만 이 방법은 많은 계산량이 필요하기 때문에 단점이 존재합니다. 

Follow the Slope(Gradient Descent, 경사하강법)

Gradient Descent 방식은 두 발로 경사를 느낀 후 어느방향으로 갈지 정하는 방식으로 선형 분류에 많이 됩니다. 

Gradient Descent는 함수의 최소값을 찾기 위해 Gradient 방향을 반대로 이동하는 방법입니다. 

 

Gradient Descent는 Loss function의 최소값을 찾기 위해 Gradient(기울기)의 반대 방향으로 하강하는 방법을 의미합니다. 여기서 Gradient는 Weight의 편미분을 한 값을 의미합니다. 네, 가중치 갱신은 편미분을 Chain Rule에 적용하여 가중치가 갱신됩니다. 

 

 

편미분(partial derivative)은 원하는 한 가지 변수만 미분을 하고 나머지를 상수로 취급하는 것을 말한다. 주로 변수가 x와 y중에서 어떤 변수로 미분해야 하는지를 정해야 하기 때문에 편미분을 사용한다. 이때, ∂ (round, `/partial`)을 사용한다.

 

경사하강법에는 두가지 주의할 점이 있습니다.

  1. Step Size(Learning Rate)
  2. Local Minima

Learning Rate

Learning Rate는 경사하강법을 통해 한 번 이동하는데 얼마나 크게 이동하는지 보폭 정도(Step Size)를 의미합니다.

만약 Stepsize가 크다면 빠르게 최소점에 도달할 수 있지만 수렴하지 못할 수도 있다는 단점이 있습니다. 한편 Stepsize가 너무 작은 경우도 최적의 x값을 구하는데 시간이 오래걸릴 수 있다는 단점이 있습니다.

 

이 문제를 해결하기 위해 두 가지 방법이 존재합니다.

  • Learing Rate Decay : 처음엔 학습률을 크게 정했다가 점점 감소하는 방법
  • Learing Rate Scheduling : 0에서 시작해서 Warm-up Step을 처음에 준 다음 조금씩 내려가는 방법

 

Local Minima

Gradient Descent는 시작 위치가 매번 다르기 때문에 Lcoal Minima에 빠져 나오지 못하는 경우도 있습니다.

Local Minima 문제를 해결하기 위해 Momentum, Adgrad, RMSprop, Adam 등 Optimizer를 적용하는 방법이 있습니다. 

여러 Optimzier 중 가장 Best라고 단정 지을 수는 없습니다. 문제에 맞게 여러개의 옵티마이저를 적용해보면서 비교해보는게 좋습니다.

 


☕️ 포스팅이 도움이 되었던 자료

오늘도 저의 포스트를 읽어주셔서 감사합니다.

설명이 부족하거나 이해하기 어렵거나 잘못된 부분이 있으면 부담없이 댓글로 남겨주시면 감사하겠습니다.