[CS231n] 3. Loss Functions and Optimization
📗강의노트/CS231n

[CS231n] 3. Loss Functions and Optimization

728x90
반응형
최적의 W를 구하기 

W가 좋은지 나쁜지를 정량화 할 방법이 필요하다. 

W를 입력으로 받고 각 스코어를 확인하여 평가하는 것이 “ Loss Function(손실 함수) ”이다.  

가장 덜 나쁜 W를 구하는 과정이고, 이를 “ 최적화 “ 라고 부른다. 




< Multi class SVM Loss > 



“ Hinge Loss “ 



S_j는 예측된 스코어이다. x축은 S_Yi 로 실제 정답 클래스의 스코어이다. Y 축은 Loss이다. 
( 여기서는 Safety margin = 1 이다 )
-> 우리는 스코어가 정확히 몇인지는 신경쓰지 않는다. 스코어간의 상대적인 차이를 알고싶어 한다. 
(온라인 코스노트)
 
정답 클래스를 제외한 다른 클래스들에 대해 손실함수를 계산 ( 정답이면 0이기에 )

여기서 Loss 는 0 ~ ∞ 까지 이다. 

스코어들이 거의 0에 가깝고 값이 서로 비슷하다면 Loss 는 (Class의 수 -1)의 값을 얻을 것이다. 정답이 아닌 클래스들만을 가지고 이용하기 때문이다. ( 그래서 정답인 클래스의 스코어가 바뀐다고 해서 SVM Loss가 변하진 않는다. )

Loss함수를 최종적으로 합으로 나타내지 않고 평균하는 것은 큰 상관이없다. 그저 리스케일 한 것이다.

Loss 함수를 제곱항으로 바꾸면 결과가 달라질 것이다. + - 의 차이 때문
( 하지만 결과가 안좋은 것들은 더 안좋게 나와서 구분하기가 좋다. 하지만 기존 힌지 함수이면  조금 잘못된 것과 많이 잘못된 것 간의 차이가 별로 나타나지 않을 것 이다.)



코드에서 margins[y]= 0 을 한 이유는 정답클래스에 대한 손실을 0으로 하여 굳이 전체를 돌 필요가 없게 해주는 것이다. 전체 합을 구할 때 제외하고 싶은 부분만 0으로 만들어준다. 


Loss가 0이 되게하는 W는 unique한 것인가?  아니다.
W의 스케일이 변해도 똑같기 때문이다. (2W..)



Loss를 0으로 만드는 W를 구하는 것에 초점을 맞추는 것은 트레이닝 데이터에 너무 맞추려고 하는 것이다. 트레이닝 데이터에 꼭 맞는지는 전혀 신경쓰지는 않아도 된다. 트레이닝 데이터를 이용해 분류기를 찾고 결국엔 테스트 데이터에 적용할 것이기 때문이다. 


새로운 테스트 데이터가 들어왔을 때 성능을 고려하지 않고 트레이닝 데이터에 맞추면, Overfitting 되는 것이다. 

이를 해결하기 위해서 Loss함수에 Regularization 항을 추가한다. 모델이 더 단순한 W를 택하도록 도와준다. 더 일반적인(단순한) 것이 미래에 대해 더 잘 예측할 수 있기 때문이다. 

일반적인 Regularization은 L2 이다. 




x=[1,1,1,1]
w1=[1,0,0,0]
w2=[0.25,0.25,0.25,0.25]

L2는 분류기의 복잡도를 상대적으로 w1, w2중 어떤 값이 더 매끄러운지를 측정한다. W2를 선호한다.
Linear classification에서 w가 의미하는 것은 얼마나 x가 output class와 닮았는지이다. 결국 x의 모든 요소가 영향을 줬으면 하는 것이다. x의 특정 요소에 의존하기 보다는 x의 모든 요소가 골고루 영향을 미치길 원한다면, L2 Reugularization을 통해 더 강인해질 수 있다. 

L1은 정반대이다. w1을 선호하게 됨. L1 Reularization은 가중치 w의 0의 갯수에 따라 모델의 복잡도를 다룬다. 

따라서, L1이 복잡하다고 느끼고 측정하는 것은 “0이 아닌 요소들의 갯수”이고 
L2는 W의 요소가 전체적으로 퍼져있을 때 덜 복잡하다고 생각하게 된다. 
( 모델을 덜 복잡하게 만들기 위한 것이 Regularization의 궁극적인 목표이다 )
= Hypothesis class중에 더 간단한 것을 선택하기 위해서 우리는 model에 Penalty를 주는 것이다. 

L1 : w에 0이 아닌 요소 많으면 -> “ 복잡“ / w에 0이 많으면 -> “ 덜 복잡 “
L2 : w의 요소가 퍼져있을 때 -> “ 덜 복잡 “ / w가 어느 쪽에 치중되어 있으면 -> “ 복잡 "



< Softmax >
 

딥러닝에서 더 자주쓰는 개념 
이전에 Multi class SVM에서는 score에 해석을 고려하지 않았다. 단지 정답인 클래스가 정답이 아닌 클래스들 보다 더 높은 스코어를 내기 원했다. 




softmax에서는 score 자체에 추가적인 의미를 부여한다. 
softmax를 거쳐 확률 분포를 얻을 수 있고, 바로 해당 클래스일 확률이 되는 것이다. 

Loss는 “ -log(정답클래스확률)”이 된다. Log를 최대화시키는 것이 그냥 확률값을 최대화 시키는 것 보다 쉽다. 그래서 log를 쓴다. 하지만 loss function은 얼마나 나쁜지를 봐야하기 때문에 -log를 이용한다. 


스코어가 있으면 -> softmax를 거치고 -> 나온 확률 값에 -log를 추가  = Loss Function




 이를 softmax or multinomial logistic regression 이라고 한다. 


softmax의 최대/최솟값은 ?  0 ~ ∞ 이다. 
  
 Log를 0으로 만드려면 입력값( 정답 스코어)은 극단적을 높아야한다. 무한대에 가까울 정도로

log안의 확률이 0, 1이 될 확률이 실제로 드물기 때문에 이론적으로 0 ~ ∞ 라고 말한다. 





SVM은 정답 스코어와, 정답이 아닌 스코어 간의 “마진(margin)”을 신경썼다.

반면에 Softmax (crossentropy loss)는 확률을 구해서 정답클래스(-log)에 신경을 쓴다.

softmax는 최대한 확률을 1로 끌어올리려고 할 것 이다.  

SVM의 경우에는 일정 선(margins)을 넘기만 하면 더 이상 성능 개선에 신경쓰지 않는다.
하지만 Softmax는 더더더 좋은 성능을 내기 위해 노력할 것이다. 
이것이 바로 "두 손실 함수간의 차이”이다!





어떻게 Loss를 최소화하는 W를 찾을 수 있을까 ??
바로 “최적화(Optimization)”를 이용하면 된다.

골짜기에서 바닥으로 내려가는 것이다. 


1. 임의 선택을 할 수 있다. ( 가능은 하나 매우 bad )

2.Follow the slope ( GradientDescent )





Slope(기울기)란 어떤 함수에 대한 미분값이다.

gradient는 벡터 x의 각 요소의 편도함수들의 집합이다. (입력과 갯수 같음)




Gradient의 각 요소가 말해주는 것은 우리가 그 쪽 방향으로 조금 이동했을 때 Loss가 어떻게 변하는지이다. 이를 유한 차분법으로 계산 가능하다. 

Loss가 조금 감소했다. 계속 반복하여 gradient를 계산하는 것이다. 
하지만 실제로는 이런식으로는 계산하지 않는다. 왜냐하면 하나의 gradient를 얻기 위해 수천개의 함수값을 일일이 다 계산해야하기 때문이다. 

Loss 를 미분하여 Gradient를 구할 수 있다. 




실제 gradient를 구현할때는 분석적인 방법을 이용한다. ( 하나씩 찾는 행위 X )

Gradient가 함수에서 증가하는 방향이기 때문에, -gradient를 해야 내려가는 방향이 된다. 
Learning_rate(step_size)와 곱해져서 빼주게 된다. 

가장 기본적인 알고리즘은 바로 매 스텝 아래로 내려가는 것이다.




Cifar-10 같은 경우는 데이터가 너무 커서 loss를 구하기에 수백만번의 계산이 필요하다. 매우 느릴 것 이다. 

그래서 SGD를 쓴다. 전체 데이터 셋의 gradient와 loss를 계산하기 보다는 Minibatch라는 작은 트레이닝 샘플 집합을 나눠서 학습하는 것이다. 2의 승수로 정해진다. 

이를 통해 Loss의 전체 합의 “ 추정치 “ 와 실제 gradient의 “ 추정치 “를 계산하는 것이다. 




첫 째, 이미지가 있으면 여러가지 특징 표현을 계산하는 것이다. 이미지의 모양새와 관련있을 수도.
하나의 특징 벡터로 만든다. 





데이터의 좌표계를 바꿈으로써 선형으로 분리할 수 있다. 이런 기법들은 문제를 풀 수 있도록 하려면 어떤 특징 변환이 필요한가를 알아내는 것들이다. 




색에 해당하는 픽셀을 양동이에 넣고, 양동이들로 이미지의 색을 유추할 수 있다. 




CNN, DNN이 기존 방식과 유일하게 다른점이 있다면 이미 만들어 놓은 특징들을 쓰기보다는 데이터로부터 특징들을 직접 학습하려 한다는 것이다. 그렇기에 raw 픽셀이 CNN에 그대로 들어가고 여러 레이어를 거쳐서 데이터를 통한 특징 표현을 직접 만들어낸다. 따라서 Linear classifier만 훈련하는게 아니라 가중치 전체를 한꺼번에 학습하는 것이다. 









728x90
반응형