히비스서커스의 블로그

[CS231n 3] Loss Functions 본문

Theory/Computer Vision

[CS231n 3] Loss Functions

HibisCircus 2021. 1. 13. 01:20
728x90

  내용들은 전적으로 stanford university의 CS231n 2017 3강 강의 내용을 기반으로 작성하였음을 먼저 밝힙니다. 

 

 

이전에 공부한 내용에서는 Linear classification의 모델의 구조를 살펴보았다. 

 

2020/12/30 - [Programming/AIffel] - [Day 2] Terminal & 가상환경, Image Classification

 

[Day 2] Terminal & 가상환경, Image Classification

1. Terminal & 가상환경 1-1. Terminal 운영체제 (OS; Operating System) : 컴퓨터 하드웨어를 관리하는 프로그램으로 작업 관리와 데이터 관리 및 감시하는 제어프로그램과 언어 번역과 서비스 및 문제 처리

biology-statistics-programming.tistory.com

 

$$ f(x,W) = Wx + b $$

W(총 클래스 수X총 픽셀의 수): 가중치, x(총 픽셀의 수X1): 이미지데이터, b(총 클래스 수 X 1): 바이어스

이를 통해 Linear classification 모델이 데이터값과 가중치의 곱의 행렬에 데이터와 의존적이지 않은 값으로 이루어진 바이어스 벡터가 더해지는 형태임을 알 수 있었다.

 

 

 

 

이번에 살펴볼 내용은 가중치의 행렬의 값을 정하는데 중요한 Loss function(손실함수)optimization(최적화)에 대해 살펴보자.

 

 

 

가중치의 행렬어떻게 정하는 것일까?

 

 

일단 가중치 행렬 초깃값을 임의로 지정한다. 가중치 행렬값 중 이미지 분류를 훌륭하게 해낼 수 있는 값이 있을 것이고 안좋은 값이 있을 것이다. 가중치를 입력으로 받아서 각 스코어를 확인하고(해당 클래스 값이 높을수록 좋은 것) 가중치가 지금 얼마나 안좋은지를 정량적으로 말해주는 것이 Loss function인 것이다. 즉, loss fuction 값이 크다면 가중치가 안좋다는 뜻!

 

추가로, 가중치 행렬 중 모든 클래스를 가장 잘 분류해내는 가중치 행렬을 찾는 과정최적화과정을 거쳐 가장 훌륭한 분류 모델을 선정해내는 것이다. 

 

 

 

이제 Loss function종류에 대해 살펴보자.

 

 

- 1. multi-class SVM 모델 

 

가장 먼저 mulit-class SVM모델에서 쓰이는 Loss function을 찾아보자. multi-class SVM모델은 SVM 모델을 기초로 한다. SVM 모델은 아주 간략하게 말하면 이진분류를 하는데 사용된다. 모델로 차원의 수를 증가 시켜가며 두 그룹을 잘 나눌 수 있는 하나의 점(1차원), 선(2차원), 판(3차원), ... 을 찾는 모델이다. 다중 분류 (2개 이상의 분류)를 하기 위해 SVM모델을 발전시킨 모델이 multi-class SVM 모델이다.

 

- Hinge loss  (SVM모델에서 주로 사용하는 loss function)

 

S: 분류기의 출력으로 나온 예측된 스코어 (ex. 클래스1이 고양이, 클래스2가 개이면 S_1=고양이스코어, S_2=개 스코어)

Yi: 이미지의 실제 정답 카테고리로 정답 값 => $s_{y_{i}}$의 값은 트레이닝 셋의 i 번째 이미지의 정답 클래스의 스코어

margin: 큰 영향을 주지 않는 값으로 일종의 텀과 같음 (hinge_loss에서는  L의 정확한 값이 의미가 있는 것이 아니기 때문)

여기서 값이 크면 가중치가 좋지 않다는 것을 의미하는 것이다.

 

 

 

- 계산방법

 

해당 클래스가 아닌 스코어에서 해당 클래스의 스코어를 빼주고 거기에 마진을 더해준 값과 0 중에 더 큰 값을 선택한 다음

다 더해준다. 이를 각 클래스별로 진행해준다음 평균을 구하면 그것이 L이 되게 하는 방법이다.

 

 

 

다음 6가지의 질문들을 통해서 더욱 자세히 알아보자.

 

Q1. 차에 대한 스코어가 변하면 어떻게 될까?

- Loss는 바뀌지 않는다. 왜냐하면 스코어와의 차이만 고려하는데 차의 스코어는 이미 다른 클래스의 스코어들보다 크기 때문이다.

 

Q2. SVM loss가 가질 수 있는 최대/최솟값은 어떻게 될까?

- 0(최소)에서 무한대(최대)의 값을 가진다. 

- 최소인경우는 모든 클래스에서 정답인 클래스의 스코어가 가장 클 경우이다.

- 최대인 경우는 모든 클래스에서 정답인 클래스의 스코어가 매우 작을 경우이다.

 

Q3. 모든 스코어 s가 거의 0에 가깝고 값이 서로 비슷하다면 어떻게 될까? (스코어들이 다 0이라면 어떻게 될까)

- (클래스의 수) - 1의 값을 가지게 된다. 이는 정답이 아닌 클래스의 스코어들에 대해서만 정답인 클래스의 스코어를 빼주게 되기 때문이다. 모든 스코어가 0이므로 각각의 계산은 max(0-0+1, 0)이 되고 이를 정답이 아닌 클래스에 대해서 반복하므로 최종적으로 (클래스의 수) - 1의 값을 가지게 된다.

=>  이 방법은 디버깅 용으로 사용하여 (클래스의 수) - 1의 값이 나오지 않을 경우 문제가 있다고 판단한다!

 

Q4. 정답인 클래스도 같이 더하면 어떻게 될까?

- loss에 1 증가한다. 추가로 max(정답클래스의 스코어 - 정답클래스의 스코어 + 1, 0) = max(1, 0) = 1 을 더해주기 때문이다.

 

+ 그렇다면 왜 안 더해줄까? 더해준다고 해서 문제가 되지 않지만 loss가 0일 때 가장 좋다는 것을 나타내고 싶어 관례상 사용한다.

 

Q5. loss에서 전체 합을 쓰지 않고 평균을 쓰면 어떻게 될까?

- 스코어의 스케일만 바뀔 뿐 모델의 결과에는 상관이 없다. 왜냐하면 스코어 자체가 영향을 주는 것이 아니라 모든 W에 대해서 비교하는 상대적인 용돋로만 쓰기 때문이다.

 

Q6. 손실함수를 제곱을 하게 된다면 어떻게 될까?

- 결과는 달라질 것이다. 예를 들어 살펴보자 각각 클래스의 losses가 2, 2, 2 여서 L이 2인 가중치와 5, 1, 0 이어서 L이 2인 가중치는 위의 방식대로 하면 L=2로 같다. 하지만 제곱을 하게 될 경우 4, 4, 4가 되고 25, 1, 0이 되어 후자의 경우가 커지게 된다.

- 즉, 큰 losses를 가지는 값에 대해서 더욱 곱절로 큰 losses를 가지게 하기 때문에 결과가 달라질 수 있다.

 

 

그런데 뭔가 이상하다. 우리가 이런 방식으로 최적의 가중치를 구하였다고 해보자. 이 가중치의 값은 우리가 연습했던 training데이터에 대해서만 기가 막히게 잘 맞을 것이다. 하지만 우리가 원하는 것은 이 가중치가 다른 데이터 즉, test 데이터에 대해서 잘 적용하는 것이다.  overffiting되어서는 안된다는 것이다. 

 

- Regularization

우리가 앞서 구한 부분은 loss에서 data loss에 해당한다. 하지만 data loss만 커질 경우 overffiting 이 될 수 있으므로 regularization을 해주어야 한다. 말 그래도 모든 데이터에 대한 분류가 일반화 될 수 있도록 모난 부분을 다듬어 준다고 생각하면 된다.

 

 

간단하게 생각해보면 데이터를 분류할 수 있는 가중치 값은 정말 많이 있는데 Data loss가 작게하는 값을 취하면 모델이 복잡해지고 과적합이 되기 쉽다. 이를 방지하기 위한 것이 Regularization 으로 모델을 단순하게 해주는 것이다. 이는 오컴의 면도날 법칙과도 흡사하다.

여기에는 L1 Regularization과 L2 Regularization 이 존재하는데 전자는 가중치 행렬의 원소들을 대부분을 0으로 만들어주는 방식이고 후자는 가중치 행렬의 원소들의 크기 전체를 각각 줄여주는 방식이다.

 

 

 

- 2. softmax Classifier (Multinomial Logistics Regression)

mulit-SVM Classification에서 hinge loss의 L 값 자체는 의미를 가지지 않는다. 하지만 softmax function 에서는 L 값 자체가 의미를 가진다. 수식을 이용해서 스코어를 가지고 클래스 별 확률분포를 계산한다. 이때 사용하는 것이 softmax라고 한다. 

 

 

- 계산방법

스코어들에 지수를 취해 양수로 만든 다음 지수들의 합으로 정규화를 거치면 이것이 바로 클래스별 확률이 되는 것이다.

결론적으로 우리가 원하는 것은 정답 클래스의 확률이 1이 나오게 하는 것이다. 

 

log를 통해 최대화를 시키면 확률값을 최대화 시키는 것보다 쉬워 log를 사용한다. 하지만 log는 단조증가 함수이므로 클래스를 잘 구별하면 큰 값을 가지게 되는데 loss 함수의 L값은 작아야 하는 것이므로 -를 붙여주게 되는 것이다.

 

요약하자면 스코어가 있다면 softmax 함수를 거치고 나온확률 값에 -log를 취해주면 된다.

예제를 통해서 확인해보자.

 

 

 

가중치의 고양이 스코어가 3.2였고 이를 $e^{x}$의 함수에 넣어주어 24.5가 되었다. 차와 개구리의 스코어에 대해서도 동일하게 해준다음 변형된 세 수의 합으로 각각을 나누어준다.(normalize해준다.) 그럼 각각이 확률이 되는데 여기서 log를 씌워준다. 이때, 스코어의 값이 컸다면 이 값이 커지므로 -를 취하여 값이 작아지게 하는 것이다.

 

 

이것도 각각의 질문을 답하여 자세히 알아보자.

 

Q1. softmax loss의 최대값과 최소값은 어떻게 될까?

- 최소값은 0이고 최대값은 무한대이다.

- 최소값은 확률이 1일 때 이것을 -log에 넣어주면 0이 된다.

- 최대값은 확률이 0일 때 이것을 -log에 넣어주면 무한대가 된다.

 

Q2. S가 모두 0근처에 모여있는 작은 수 일때 loss는 어떻게 될까?(스코어가 모두 0이라면 loss 는 어떻게 될까?)

- log(클래스의 수)가 된다.

- 왜냐하면, 각각의 스코어가 동일한 크기일 것이기 때문에 각각의 확률값이 1 / (클래스의 수)이 될 것이고 

- 따라서, -log(1/(클래스의 수))가 되어 최종적으로 log(클래스의 수)이 된다.

 

 

 

요약해서 multi-class SVM loss와 softmax loss의 차이점을 살펴보자면

SVM은 일정 선인 margins을 넘기기만 하면 더 이상 성능 개선에 신경을 쓰지 않지만

softmax의 경우에는 더--욱 성능을 높이려고 할 것이다. 

 

 

 

 

 

 

2021년 1월 11일 

(2021년 1월 23일 복습 후 최종 수정)

 

 

히비스서커스

728x90