-
[CS231n] 3강 Loss Functions and OptimizationStudy/CS231n 2020. 10. 24. 11:49
Loss function에 대해서
우리는 앞에서 Linear Classifier에 대해서 배웠다. 여기서 W(가중치)값을 준다는 것을 배웠다.
위 그림을 보자 각 동물에 맞는 score가 다르다. 8.02로 높은 값도 있고 -4.34로 분류를 못한 값도 있다.
최적의 W를 구하기 -> W가 좋은지 나쁜지를 정량화 할 방법이 필요하다. 이것이 바로 Loss function이다.
Loss function을 번역하면 '손실 함수'이다. weight를 입력으로 받아서 weight의 결과가 정답 score값과 얼마나 차이가 나는지 보여주는 역할을 한다.
값이 안좋으면 좋은 쪽으로 찾아가는 과정이 바로 optimization이라고 한다. 이번 강의는 Loss function과 optimization을 중점적으로 다룬다.
< Multi class SVM Loss >
먼저 알아볼 loss는 서포트 벡터 머신(SVM) loss이다. 위 식에서 sj 는 정답이 아닌 score 이고 syi는 정답 클래스 score 이다. safety margin은 여기서 1이다.
정답 클래스 score >= 정답이 아닌 score + safety margin 이면 Loss가 0이다.
Loss가 0이라는 것은 매우 좋다는 걸 의미한다.
위 그림은 SVM loss에 그래프를 볼 수 있다. 모양이 경첩처럼 생겼다고 해서 Hinge loss라는 이름이 붙여졌다.
계산 하는 과정을 예를 들어 설명해보겠다. 고양이를 생각해보자.
고양이와 자동차를 생각해보면 정답이 아닌 클래스 ( 자동차 5.1) - 정답 클래스( 고양이 3.2 ) + 1 값을 loss 로 준다.
고양이와 개구기를 생각해보면 고양이 score >= 개구리 score + 1 하면 고양이 score 가 더 높으므로 loss가 0 이된다.
시그마계산을 하면 2.9 + 0 = 2.9가 나온다.
이 값은 2.9만큼 안좋다는 뜻을 가진 수치다.
자동차와 개구리도 똑같이 계산 하면 다음과 같은 loss값이 나온다. (2.0+0+12.9)/3 = 5.27 이 최종 loss 이다.
여기서 질문들이 있다.
CS231n 강의를 들으면서 가장 인상 깊었던 것은 교수님과 학생들의 질문이다. 배우는 내용은 어느 정도 알고 있었지만 수업시간에 나오는 질문들은 평상시에 공부하면서 이러한 생각을 못해본 부분이라 강의를 들으면서 많은 것을 배우는 중이다.
질문을 정리해보았다.
Q1 : car score을 좀 흔들어주면 loss의 값은 어떻게 되는가?
- 자동차를 만약 -1이 되어서 3.9가 되었다고 생각해보자. 그래도 얘는 loss 가 0이다.
여기서 SVM의 특성이 나온다.
데이터에 민감하지 않고 둔감하다는 것이다.
score의 값은 중요한게 아니다 정답 클래스가 다른 클래스보다 큰지 작은지만 중요한 것이다.
Q2 : loss값의 최솟값과 최댓값을 구하면?
- loss의 최소값은 0이다. 0이 제일 좋은것이다. 최대값은 무한대이다.
Q3 : 초기에 W가 0에 가까우면 모든 score의 값은 0과 비슷하다. 이때 loss값을 구하면?
- loss는 클래스 개수 - 1 값이 나온다. 이는 디버그 용으로 많이 사용한다.
Q4 : Li값을 구하는데 합을 구할 때 j≠yi가 아닌, j를 포함한 모든 값을 다 더하게 되면?
- 모든 loss값에 1이 더해진다. 고양이로 예를 들면 3.2-3.2 +1 = 1이 추가된다. 평균값이 1 증가한다.
loss가 0이 아니고 loss가 1이 가장 좋은 값이 된다.
Q5 : Loss를 계산하는데, 합 대신 평균을 사용하면 Loss값은 어떻게 되는가?
- loss 값을 구하는데 크게 상관이 없다. scale만 작아진다. 합이 아니고 평균값으로 했으니까...
우리가 관심 있는건 정답 클래스의 score와 그렇지 않은 클래스의 차이가 중요하다.
Q6 : 손실 함수를 max(0,sj−syi+1)가 아닌 max(0,sj−syi+1)2을 사용하게 된다면?
- 제곱승을 하게되면? 답은 다르다. 제곱을 하면 non linear 하게 된다. 일반적으론 제곱승을 하지 않고 그냥 사용한다.
numpy를 이용한 SVM Loss Example code 이다.
코드에서 margins[y] = 0을 한 이유는 정답클래스에 대한 손실을 0으로 하여 굳이 전체를 돌 필요가 없게 해준 것이다.
우리가 구하는 W는 unique한 값일까??
결론은 아니다 W의 scale이 변해도 똑같기 때문이다. (2W,3W..)
우리가 model를 만드는 이유는 새로운 값에 대해서 '예측'을 하고 싶은 것이다. 즉 test set에 관심이 더 많다. 하지만
여태까지 W는 train set 에 맞춰져있다. W가 unique하지 않다. test에서는 해당 W가 안맞을 수도 있다는 의미이다.
우리가 구한 train이 파란색이라고 생각하자. 초록색 네모는 예측 하지 못하는 상황이 나온다. 해도 정확도가 낮을 것이다. 이를 과적합(오버피팅, overfitting) 이라고 한다. 여기서 regularization(규제)라는 개념을 생각해보자.
L2 Regularization와 L1 Regularization을 비교하자면 L2는 분류기의 복잡도를 상대적으로 어떤 값이 더 매끄러운지를 측정하고 선호한다. L1은 내가 원하는 특성이 제거되고 L2는 모든 것을 고려한다.
즉 w1는 L1 이 선호하고 w2는 L2이 선호한다.
L1이 복잡하다고 느끼고 측정하는 것은 0이 아닌 요소들의 갯수이고
L2는 w의 요소가 전체적으로 퍼저있을 때 덜 복잡하다고 생각한다.
Linear clssification에서 w가 의미하는것은 x가 ouput class와 얼마나 닮았는지이다. 결국 x의 요소가 특정 요소에 의존하는지 모든 요소에 골고룬 영향을 미치길 원하는지에 따라 L1와 L2를 사용하면 된다.
일반적으로 L2 regularization을 사용하는데 dropout, bach 등 다양한 방법도 있다. 추후에 설명한다.
Softmax 분류기
Multi class SVM에서는 socre에 해석을 고려하지 않았다. 단지 정답인 클래스가 정답이 아닌 클래스 보다 더 높은 스코어만 있으면 상관이 없었다.
softmax에서는 socre 자체에 추가적인 의미를 부여 한다.
softmax를 거치면 확률 분포를 얻을 수 있는데 이 값이 바로 해당 클래스일 확률이 된다.
score -> softmax를 거치고 -> 그 확률 값을 -log 해주면 이 값이 = Loss function 이다.
근데 왜 -log를 취하고 exp를 하는 것일까??
softmax는 multinomial logistic regression이다. 로지스틱 회귀는 시그모이드 함수라고도 불린다.
시그모이드 함수 그래프를 보면 exp 값을 이용하므로 exp 를 사용한다.
-log를 취하는 이유는 그래프를 보면 된다.
softmax 함수에 확률이 들어가면 output이 loss가 나온다. 그럼 -log 그래프에서 x축을 확률, y축을 loss 라고 생각하면 확률이 1에 가까워질수록 ( 우리가 원하는 클래스의 정답률이 100%면 정답률이 1이다.) loss가 0에 가까워지므로 -log를 이용한다.
여기서 질문이 나온다. min,max 값은 무엇인가?
최소는 이론적으로 0이고 최대는 이론적으로 무한대다. -log 그래프를 생각해보자.
SVM과 Softmax의 차이점을 보자. SVM은 정답 score와 정답이 아닌 score의 margin 을 신경썼따.
반면에 softmax는 확률을 구한다.
SVM은 일정 margin 만 넘으면 성능 개선에 신경쓰지 않고 변화가 없다.
하지만 softmax는 확률을 개선하여 더 좋은 성능을 내기 위해 노력한다.
질문이 하나 더있다. 만약 datapoint를 흔들어 주면 어떻게 변화하는가??
앞에서 SVM의 car score 를 조금 변화했을때 정답 클래스 score가 정답이 아닌 클래스 score보다 크면 datapoint가 바뀌어도 결과에는 영향이 없었다. 즉 '둔감'하다고 할 수 있다.
하지만 cross-entropy loss(softmax function)는 확률로 계산 되기 때문에 조금만 데이터가 바뀌어도 바로 확률에 영향을 미친다. 매우 '민감'하다고 할 수 있다.
요약 하면 다음과 같다. full loss 는 regularization을 추가한 것이다.
이제 어떻게 최적의 W를 찾는가에 대한 얘기를 해보자.
Optimization
최적화를 표현하는 직관적인 그림이다. 좋은 위치로 내려간다. 즉 loss가 0인 지점을 찾아가는 것이다.
두가지 방법을 제안한다.
1. Random Search
2. Follow the slope ( GradientDescent)
말 그대로 random 하게 포인트를 찾는 것이다. very bad idea 이다. 사용 하지 말아야 한다.
gradient descent라고 불리는 경사하강법이다. 1차원이면 미분식으로 계산하고 다차원이면 편미분된 벡터의 값으로 표현된다. 수식적으로 하나하나 계산하는 방법을 numerical 방법이라고 한다.
하지만 계산량이 많기 때문에 함수를 일일이 다 계산하지 않는다.
실제 graident를 구현할때는 analytic gradient를 사용한다.
요약을 하면 다음과 같다.
경사하강법의 계산 방법이다. 앞의 부호에 따라 기울기의 방향이 달라짐을 알 수 있다.
step size는 흔히 learning rate라고 불리는 값이다. 이 값의 크기에 따라 얼마나 빠르고 느리게 기울기가 변화함을 알 수 있다.
만약 N이 수천만개 이면 매우 비효율적이지 않을까??
왜냐하면 W가 업데이트 되려면 처음부터 끝가지 계산을 하고 업데이트가 되는데 이게 수천만개가 있다며 계산량이 너무 많을 것이다. 그래서 Stochastic gradient descent(SGD)를 많이 사용한다.
minibatch라는 작은 트레이닝 샘플 집합을 나눠서 학습한다.
대부분 2의 승수로 정해진다.
이미지가 있으면 여려가지 feature 표현을 계산한다. 하나의 특징 벡터로 만든다.
데이터의 좌표계를 바꿈으로써 선형으로 분리 할 수 있다. 어떤 특징 변환이 필요한가를 알아야 한다.
하지만 지금은 feature를 뽑아서 사용하는 것이 아니라 입력된 이미지에서 스스로 feature 뽑아 내도록 한다. 이게 바로 CNN이다. 자세한 설명은 후에 강의에서 알 수 있다.
다음시간에는 neural network와 backpropagation(오차역전파)를 알아보자.
'Study > CS231n' 카테고리의 다른 글
[CS231n] 6강 Training Neural Networks I (0) 2020.11.14 [CS231n] 5강 Convolutional Neural Networks (0) 2020.11.14 [CS231n] 4강 Backpropagation and Neural Networks (0) 2020.10.31 [CS231n] 2강 Image Classification (0) 2020.10.17 [CS231n] 1강 Introduction to Convolutional Neural Networks for Visual Recognition (0) 2020.10.09