CS231n - Lecture 3 | Loss Functions and Optimization

kimgaeul02·2023년 3월 21일

CS231n

목록 보기
3/5

본 포스팅은 Standford University의 'CS231n' 강의로 공부한 것을 정리했습니다.

Lecture 3 | Loss Functions and Optimization

Loss function and Optimization

손실함수(Loss function)란, 학습 데이터를 통해 얻은 W(weight matrix)를 사용하여 label을 예측하였을 때 W가 얼마나 못 예측하였는지(badness)를 정량적으로 알려주는 역할이다. 즉, 손실함수가 높을 수록 예측을 못한 것이다. 이러한 손실함수가 낮은 W를 찾아가는 과정을 최적화(Optimization)라고 한다.

Example : 3 training, 3 classes

  • xix_i : input
  • yiy_i : label or target
  • Image Classification 알고리즘의 경우 xix_i는 이미지, yiy_i는 정수값 형태의 정답 카테고리가 된다. (이전 강의에서 사용한 CIFAR-10의 경우 카테고리가 10개이기 때문에 yiy_i는 1~10 사이의 정수값! 프로그래밍 언어에 따라 0~9일 수도 있다.)
  • LiL_i : loss function
  • LL : 최종 loss fuction, 각각 N개의 샘플들의 Loss 평균
  • 해당 함수는 아주 일반적인 공식이다. 다른 손실함수의 예시는 다음과 같다.

1) Multi-class SVM loss

서포트 벡터 머신(support vector machine, SVM)은 기계 학습의 분야 중 하나로 패턴 인식, 자료 분석을 위한 지도 학습 모델이다. 두 카테고리 중 어느 하나에 속한 데이터의 집합이 주어졌을 때, SVM 알고리즘은 주어진 데이터 집합을 바탕으로 하여 새로운 데이터가 어느 카테고리에 속할지 판단하는 비확률적 이진 선형 분류 모델을 만든다. 만들어진 분류 모델은 데이터가 사상된 공간에서 경계로 표현되는데 SVM 알고리즘은 그 중 가장 큰 폭을 가진 경계를 찾는 알고리즘이다. 비선형 분류에서도 사용될 수 있다. 출처

즉, 데이터를 분류하는 최대 결정 경계(decision boundary)를 찾는 알고리즘이다!

  • jj = 정답이 아닌 라벨(정수값)
  • ss = WW를 곱하여 얻게 되는 class score
  • 일정 마진(safety margin) 값은 1
  • case 1) if  syisj+1if\;s_{y_i}\geq s_j+1syisj1s_{y_i}-s_j\geq1(safety margin)로 이해하면 편하다. 즉, 올바른 카테고리 점수와 올바르지 않은 카테고리 점수의 격차가 1이상이면 0을 할당한다.
  • case2 ) 두 카테고리의 점수의 격차가 일정 마진 이하인 경우 syisj+1s_{y_i}-s_j+1을 할당한다.
  • LiL_i : case2의 값을 모두 합친 것이 ii번째 이미지의 최종 Loss가 된다.
  • 이후 전체 트레이닝 데이터셋에서 Loss들의 평균을 구하고, 이것을 수식화 시키면 다음과 같은 if-then으로 표현할 수 있다.

(if:) 정답 클래스의 스코어 점수가 제일 높으면
then, max(0,sjsyj+1)max(0,s_j-s_{y_j}+1)

140~

  • x축: syis_{y_i}
  • y축: Loss
  • 즉, syis_{y_i}sjs_j보다 1(safety margin)만큼은 커야 loss가 0임을 알 수 있다. 그리고 loss가 0이 됐다는 건 클래스를 잘 분류했다는 의미가 된다.

Multi-class SVM loss의 계산 과정은 다음과 같다.

  • cat의 경우 정답 클래스가 아닌 car와 flog 클래스를 우선으로 순회한다.
  • car의 경우, (car 스코어) 5.1 - (cat 스코어) 3.2 + 1 (margin)으로 계산 된다. 이 과정에서 car의 score가 cat보다 높으므로 loss가 발생할 것이라는 예측이 가능하다.
  • flog의 경우, car 스코어가 flog 스코어보다 월등히 높으므로 loss는 0이 된다.
  • 순회를 마치고 모든 loss를 더하면 고양이 이미지에서 2.9 + 0 = 2.9의 손실(loss)이 발생한다.

  • 전체 트레이닝 셋의 LL(최종 loss function) 값은 각 트레이닝 이미지 loss들의 평균이다. 예제의 경우 대략 5.3이 나온다.
  • 이는 해당 분류기가 5.3점 만큼 트레이닝 셋을 잘못 분류하고 있다는 정량적 지표가 된다.

Q. Car score가 조금 변하면 Loss에는 어떤 변화가 일어날까?
A. 우리가 Car Score를 조금 바꾸더라도 Loss는 변하지 않을 것이다.

SVM Loss는 오직 정답 스코어와 그 외의 스코어와의 차이만 고려했다. 이 경우 Car Score가 다른 스코어에 비해 월등히 높기 때문에 스코어를 조금 바꾼다고 해도 서로 간의 간격(Margin)은 여전히 유지될 것이고 결국 Loss는 변하지 않는다.

Q. SVM Loss가 가질 수 있는 최대/최솟값은 무엇인가?
A. 최솟값은 0이고 최댓값은 무한대이다.

모든 트레이닝 데이터에서 loss가 0이 되는 경우 최솟값은 0이 된다. 그리고 해당 손실 함수가 hinge loss 모양이라는 점을 고려하였을 때, 정답 클래스 스코어가 엄청 낮은 음수 값을 가지고 있다면 Loss는 무한대가 될 것이다.

Q. 모든 스코어 S가 "0에 가깝고", "값이 서로 비슷하다면" Loss는 어떻게 될까?
A. (Number of Calss) - 1

Loss를 계산할 때는 정답이 아닌 클래스를 순회한다. 그러면 (C-1)개의 클래스를 순회하게 된다. 스코어가 거의 비슷하다면 Margin 때문에 1 스코어를 얻게 된다. 그리고 Loss는 C-1을 얻게 된다. 즉, 모든 점수가 0, 0, ... , 0이 될 것이고 1이 (C-1)번 만큼 더해진다.

이는 디버깅 전략으로 유용하다. 트레이닝을 처음 시작할 때 Loss가 C-1이 아니면 버그가 있는 것이기 때문!

Q. Loss 계산에 yiy_i(정답 카테고리)가 포함 된다면?
A. Loss에 1이 더 증가한다. syisyi+1s_{y_i}-s_{y_i}+1이 포함되기 때문에.

Q. Loss를 계산할 때 전체 합이 아닌 평균을 사용하면?
A. 변하는 것은 없다. 클래수의 수는 정해져 있으니, 평균을 취한다는 건 그저 손실 함수를 리스케일 한다는 의미이기 때문에. 단지 스케일만 변할 뿐이다.

Q. 손실함수를 제곱 항으로 바꾼다면?
A. 결과가 바뀐다. 이것은 다른 함수이다.

제곱항을 취하는 것은 좋은 것과 나쁜 것 사이의 트레이드 오프를 비선형적인 방식으로 바꾸는 것이다. 이렇게 하면 손실함수의 계산 자체가 바뀌며, 이를 squared hinge loss라고 부른다.

Hinge loss와 squared hinge loss 중 어떤 loss를 선택하느냐는 에러에 얼마나 신경쓰고 있고, 그것을 어떻게 정량화 할지에 달려있다. 손실함수란 사용자가 알고리즘에게 "어떤 에러를 신경쓰고 있는지", "어떤 에러가 트레이드 오프 되는 것인지"를 알려주는 것이므로 이는 실제 손실함수를 만들 때 고려해야 하는 요소이다.

SVM Loss : Example Code

def L_i_vectorized(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
  • margins[y] = 0 : max로 나온 결과에서 정답 클래스만 0으로 만들었다. 이는 전체를 순회할 필요가 없게 해주는 일종의 vectorized 기법으로, 전체 합을 구할 때 제외하고 싶은 부분만 0으로 만들어준다.

Q. L = 0인 W를 발견했다고 가정하자. 이러한 W는 하나 밖에 없을까?
아니다. 다른 W도 존재한다.

가령 2W 또한 L = 0의 값을 가진다. (하단 사진 참고)

Regularization

수많은 WW 중에 Loss = 0 이 되는 것을 선택하는 것은 모순이다. 왜냐하면 오직 해당 data의 Loss에만 신경쓰면 과적합(Overfitting)이 발생할 수 있기 때문.

So we don't really care about the training data performance,
we really care about the performance of this classifier on test data.

위 이미지는 과적합이 발생한 데이터셋과 분류기이다. 이러한 문제를 해결하는 방법을 통틀어 Regularization이라고 한다.

예제에서는 손실 함수에 항 R(W)R(W)을 추가하였다.

330~

따라서 Data loss와 Regularization loss라는 두 항을 가진 손실 함수가 완성되었다. 이때 λ\lambda는 하이퍼 파라미터이며 R(W)R(W)과 트레이드오프(trade off) 관계이다.

L2 Regularization (Weight decay)

L2 Regularization이란 가중치 행렬 WW에 대한 Enclidean Norm이다. 간혹 squared norm이라고도 한다. 모델이 트레이닝 데이터에 완벽히 적합하지 못하도록 (과적합 방지 예방) 모델의 복잡도에 패널티를 부여하는 방법이다. 미분을 깔끔하게 하기 위해 1/2 x squared norm을 사용하기도 한다.

  • L2 Regularization : 가중치 행렬 WW의 enclidean norm에 패널티를 주는 것
  • L1 Regularization : L1 norm으로 WW에 패널티를 주는 것
  • Elastic net regularization : L1, L2을 섞은 것
  • Max norm regularizatio : L1, L2 대신에 max norm을 쓰는 것

  • w1w_1, w2w_2를 갖고 Linear classification을 할 때 xxww의 내적을 구한다. (dot product) 이때 xx와의 내적이 1로 같으므로 Linear classification 관점에서 w1w_1, w2w_2는 같다.

예제에서 L2 regression는 w2w_2를 더 선호할 것이다. 왜냐하면 w2w_2의 가중치가 더 작고 더 분산되기 때문이다.

Linear classification에서 W가 의미하는 것은, "얼마나 x가 Output Class와 닮았는지" 이다. 따라서 변동이 심한 어떤 입력 x가 있고 그 x의 특정 요소에만 의존하기 보다 모든 x의 요소가 골고루 영향을 미치는 경우에 L2 Regularization을 통해 더 강인해 질 수 있을 것이다.

  • L1 Regularization은 w1w_1을 선호하며 "복잡도"를 다르게 정의한다. L1 Regularization은 가중치 W에 0의 갯수에 따라 모델의 복잡도를 다룬다.
  • 그러니 "복잡도"를 어떻게 정의하고 측정하느냐는 어떤 문제를 해결하느냐에 따라 달라진다.

2) Multinomial logistic regression (Softmax)

  • Multinomial Logistic regression의 손실함수는 스코어에 추가적인 의미를 부여한다.
  • Softmax 함수는 스코어를 전부 이용하는데, 스코어들에 지수를 취해 양수가 되게 만든다. 그 뒤 지수들의 합으로 다시 정규화 한다.
  • Softmax 함수를 거치면 확률 분포를 얻을 수 있고 해당 클래스일 확률로 표현된다. 확률이기 때문에 0~1 사이의 값을 가지고, 모든 확률의 합은 1이다.

우리가 원하는 것은 정답 클래스의 확률이 1에 가깝게 계산되는 것, 반대로 말하면 loss가 0에 수렴하는 것을 의미한다. loss가 0이 되기 위해서는 정답 score가 무한대에 가깝게 높아야 한다.

예제에서는 정답 클래스인 yiy_i가 선택될 확률을 P(Y=yiX=xi)P(Y=y_i|X=x_i)라고 표현하였다. 이를 최대화 하는 방향으로 WW(weight)를 구하면 되는데, 단순히 이 확률을 높여주는 것보다 log를 취한 값을 최대화 하는 것이 수학적으로 더 쉽다. 따라서 logP(Y=yiX=xi)logP(Y=y_i|X=x_i)로 만들어주고, 이를 최대화 하는 방향으로 WW를 조절한다.

logPlogP를 최대화 하는 건 정답 클래스가 선택될 확률이 높았으면 하는 것인데, loss function은 badness를 측정하는 것이기 때문에 log에 -(마이너스)를 붙여 계산한다. 이제 SVM의 손실함수는 log(P(정답클래스))-log(P(정답 클래스))로 나타나게 된다.

log는 단조증가함수이다.

  • 스코어를 지수화 하여 (class score인 ss에 exp를 취한다) 양수로 만든 뒤에 총합이 1이 되도록 정규화 한다. 그리고 정답 스코어에만 -log를 씌여준다. 이것을 softmax 또는 다항 로지스틱 회귀(multinomial logistic regression)이라고 한다.

Q. Softmax loss의 최대/최솟값은?
A. 최솟값은 0이고 최댓값은 무한대이다.

정답 클래스의 확률은 1이 되기를 원하고 정답이 아닌 클래스는 0이 되기를 원한다. log 안에 있는 어떤 값은 결국 1이 되어야 하는 것이다. log(1)=0log(1)=0, log(1)=0-log(1)=0이다.

Q. Loss가 0이 되려면 실제 스코어는 어떤 값이어야 할까?
A. 정답 스코어가 무한대에 가깝게 높아야 한다.

지수화와 정규화 과정을 거치기 때문에 확률 1(정답)과 0(그 외)를 얻으려면 정답 클래스의 스코어는 양의 무한대가 되어야 하고 나머지는 음의 무한대가 되어야 한다. 하지만 컴퓨터는 무한대 계산을 잘 못하기 때문에 Loss가 0이 되는 경우는 없을 것이다. (유한 정밀도) 이론적으로 해석하면 0은 "최소 loss"라고 보면 된다.

log(0)log(0)은 음의 무한대, log(0)-log(0)은 양의 무한대가 된다. 하지만 이러한 경우 또한 발생하지 않을 것이다. 확률이 0이 되려면 esyi=0e^{s{y_i}}=0이 되어야 하는데 이것이 가능한 경우는 정답 클래스의 스코어가 음의 무한대일 때 뿐이기 때문이다. 이 또한 "유한 정밀도"를 가지고는 최댓값(무한대), 최솟값(0)에 도달할 수 없기 때문에 불가능하다.

Q. ss가 모두 0 근처에 모여있는 작은 수일 때 loss는?
log(1/C)-log(1/C) (=log(C)log(C))가 된다.

s=0s=0이면 exp를 취한 빨간색 상자에 해당하는 값이 모두 1이 될 것이다. 이 값에 normalize를 취하면 각 클래스에 대한 확률이 1/C가 되므로 loss는 log(1/C)-log(1/C)가 되는 것이다.

이는 softmax를 사용할 때 첫 번째 단계에서 해볼만한 좋은 디버깅 전략이다. log(c)가 아니면 무엇인가 잘못 되었음을 의미한다.

multi-class SVM loss vs softmax loss

Linear Classification의 설정은 둘 다 같은 조건이고, 행렬 W와 입력이 불가능하다는 것도 같다. 다만 두 손실함수는 "badness"를 측정하기 위해 스코어를 해석하는 방식에 차이가 있다.

SVM (hinge loss)

  • 정답 스코어와 정답이 아닌 스코어 간의 마진(margins)에 집중
  • 정답 스코어가 정답이 아닌 스코어보다 정해진 마진만큼 크기만 하면 loss를 0으로 계산하였다. max(0,sjsyi+1)max(0,s_j-s_{y_i+1})
  • 일정 마진을 넘기기만 하면 성능 개선에 신경쓰지 않는다.

Softmax (cross-entropy loss)

  • 확률을 구하여 log(정답클래스)-log(정답클래스)에 집중
  • 정답 클래스가 선택될 확률이 1로부터 얼마나 멀리 있느냐에 따라 loss를 계산하였다. 즉, 정답 클래스에 선택될 확률이 1에 가까우면 loss는 0에 가까워지고, 1로부터 멀어지면 loss는 점점 커지는 모습을 보여주었다.
  • Cross-entropy loss를 사용하면 정답 클래스를 선택할 확률이 1에 가까워지도록 weight를 조절하는 특징을 보였다. (계속하여 성능을 높이려고 한다.)

정리

  • 우리에게 데이터셋 x와 y가 있다.
  • 우리에게 사용할 스코어 함수는:
  • 우리가 사용할 손실 함수는:

step1. Score Function

입력 x로부터 스코어를 얻기 위해 Linear Classifier를 사용한다.

step2. Loss Function

모델 예측 값이 정답 값에 비해 얼마나 "badness"한지 측정한다.

1) SVM Loss
2) Softmax

step3. Regularization

이때 모델의 "복잡함"과 "단순함"을 통제하기 위하여 손실 함수에 regularization의 term을 추가한다. 이것이 Supervised leraning에 관한 전반적인 개요이다. 이러한 과정을 통해 최종 손실 함수가 최소가 되게 하는 가중치이자 파라미터인 행렬 WW를 구하게 된다.

Q. 어떻게 실제 Loss를 줄이는 WW를 찾을 수 있을까?
A. Optimization!

Optimization

560~

Random search(임의 탐색)란 임의로 샘플링한 다량의 WW를 모아 Loss를 계산한 뒤 어떤 WW가 가장 적합한지 살펴보는 방식이다.

CIFAR-10 dataset을 이용하여 Linear classfier을 학습시킨 결과 15%의 정확도를 보였다. 이와 같이 정확도가 매우 낮으므로 실제로 사용하기에 부적절하다.

2) Follow the slope

Follow the slope는 지역적인 기하학적 특성(local geometry)을 이용한 전략이다.

경사(slope)는 어떤 함수에 대한 미분값을 의미한다. 고등 수학에서는 1차원에서 함수의 미분을 이용하여 점의 기울기를 바로 구할 수 있었다. 하지만 앞으로 다루게 되는 문제들은 대부분 스칼라(값이 하나)가 아닌 벡터 값을 가지므로 위의 개념을 다변수로 확장시켜야 한다.

따라서 고차원에서는 Gradient라는 개념을 이용하게 되는데 이는 다변량 미적분(multi-variable functions)에서 사용되는 개념이다.

Gradient?

  • Gradient는 벡터 x의 각 요소 편도함수들의 집합이다. (변수 하나가 아닌 여러 개의 경우를 일반화 한 ) Gradient의 모양은 x와 같으며 만약 입력이 3개라면 gradient도 3개가 된다.
  • Gradient는 입력값 x와 같은 차원을 가지며, 각 차원에 대한 편미분으로 구성되어 있기 때문에 해당하는 좌표 방향으로 움직였을 때 함수의 기울기를 알려준다.
  • Gradient 계산에는 크게 두 가지 방법이 있다.

1) 수치 gradient
2) 해석 gradient

수치적 미분 - 유한 차분법(finite difference methods)

유한 차분법이란 유한한 차이(finite difference)를 이용하여 수치적으로 gradient를 계산하는 방법이다. 딥러닝 알고리즘으로 gradient를 계산하고 파라미터 백터를 반복적으로 업데이트 할 때 사용한다.


  • 우리가 해야 할 일은 gradient "dwdw"를 구하는 것이다. 모양은 WW와 동일하다. 이때 gradient의 각 요소는 특정 방향으로 조금 이동하였을 때 Loss가 어떻게 변하는지 알려준다. 이를 유한 차분법으로 계산하면 다음과 같다.

  1. W의 첫번째 요소 (0.34)에 아주 작은 값 hh(eg.0.0001)를 더한다. (first dim)
  2. 다시 Loss를 계산한다. 첫 번째 요소를 조금 움직이자 Loss가 1.2534에서 1.25322로 감소하였음을 알 수 있다.
  3. (하단 이미지 참고) 극한식을 이용하여 FDM으로 근사시킨 gradient를 계산한다.
  4. 다음 요소에서 이 과정을 반복한다.

  • 이것은 오랜 시간이 소요되기 때문에 CNN와 같이 큰 함수에서 사용하기에 부적절한 방법이다. 해석적으로 푸는 것이 수치적으로 푸는 것보다 정확하고, 계산 속도가 빠르다.
  • 코드가 잘 작동하는지 확인하기 위해 사용 가능하다. (gradient check)

해석적 미분

W의 모든 원소를 순회하는 것이 아니라 gradient를 나타내는 식을 찾아내고 한 번에 dwdw를 계산하는 방법.


660

작년에 머신러닝을 독학하며 정리한 노션인데 경사하강법에 대한 내용이 있어 링크를 남겨둔다! (1110) 03. 선형 회귀

0개의 댓글