바위타는 두루미
CS231n 한글 정리 | Lecture 3 | Loss Fuctions and Optimization ( SVM Loss & Softmax ) 본문
CS231n 한글 정리 | Lecture 3 | Loss Fuctions and Optimization ( SVM Loss & Softmax )
DoRoMii 2020. 3. 5. 17:57Stanford University에서 2017년에 강의한 영상을 보며 정리한 자료입니다.
Link : https://www.youtube.com/playlist?list=PL3FW7Lu3i5JvHM8ljYj-zLfQRF3EO8sYv
자료출처 : http://cs231n.stanford.edu/slides/2017/cs231n_2017_lecture3.pdf
참조 : https://github.com/insurgent92/CS231N_17_KOR_SUB/blob/master/kor/Lecture%203%20%20%20Loss%20Functions%20and%20Optimization.ko.srt
지난시간에는 임의의 W 행렬을 가지고 Linear Classification을 진행했는데요
임의로 정한 것이기 때문에 스코어는 좋을 수도, 나쁠 수도 있습니다.
위의 사진에서는 고양이 이미지의 경우에는 car의 스코어가 가장 높습니다. 잘못된 분류죠
하지만, 자동차 이미지의 경우에는 자동차의 스코어가 가장 높습니다. 좋은 분류입니다.
이렇게 스코어를 눈으로 훑으면서 어느게 좋고 어느게 나쁜지를 살펴보기만 하는것은 좋지 않습니다.
이런 알고리즘을 만들고, 어떤 W가 가장 좋은지를 결정하기위해 좋다,나쁘다를 정량화 할 방법이 필요합니다. W가 얼마나 거지같은지 정량적으로 알려주는 함수를 손실함수(Loss Fuction)이라고 합니다.
이번강의에서는 몇가지 손실함수에 대해 알아보겠습니다.
우선 Linear Classification에서 W와 X로 구성된 함수f 기억나시나요?
X는 입력데이터고, W는 가중치입니다. 이 둘을 입력받아 예측값 y를 반환하는 함수였습니다.
손실함수 L_i는 예측함수f와 정답값 Y를 입력받아 이 W가 얼마나 구리게 예측하는지 정량화 시키는 함수라고 보시면 됩니다.
최종Loss는 N개의 샘플들의 Loss의 평균값을 의미합니다.
결국 우리는 이 Loss함수를 이용해 Loss를 최소화하는 어떤 W를 찾아야 할것입니다.
positive와 negative로 분류하기만 하는 SVM 모델을 일반화 시켜 여러개의 클레스를 다룰 수 있도록 하는 Loss함수입니다.
Loss함수를 구하는 방식을 살펴보겠습니다.
우선 "정답인 카테고리의 스코어 (True score)"와 "나머지 카테고리의 스코어(False score)"들을 나누고 True score - False score 를 봐서 safety margin 이상이라면 Loss는 0이 됩니다. (예제에서는 safety margin을 1로 설정했습니다.)
그 차이가 safety margin보다 작다면, (즉 False score가 True score보다 크거나, True가 False보다 크지만 그 차이가 safety margin보다 작다면 ) 그것은 잘못된 경우니까 Loss가 생기고 여기서 Loss는 False score - True score + safety margin으로 구할 수 있습니다.
아래의 예제를 보시면 이해가 더 잘될 겁니다.
ex 1
ex 2
이렇게 Loss를 구할 수 있고, 최종 Loss는 각 Loss값을 더한것에 input의 갯수(3개)를 나누어서 구할 수 있습니다.
즉 정리를 하자면, 우리는 정답인 카테고리의 스코어가 다른 스코어에 비해 얼마나 더 큰 스코어를 가지고 있는지, 그 상대적인 차이가 궁금한것이고 그 차이를 보여주는게 Loss함수라고 볼 수 있을것입니다.
여기 흥미로운 사실이 있습니다. 손실함수라는 것이 분류기에서 우리가 어떤 W를 찾고있는지를 말해주는 것이라면, Loss가 0인것을 선택하는 것은 모순이 아닐까요?
왜냐하면 우리는 오직 데이터의 loss만 신경쓰고 있고, 분류기에게 트레이닝 데이터에 꼭 맞는 W를 찾으라는 말과 같아 보입니다. 그러니 분류기에게 트레이닝 데이터의 loss에만 신경쓰게 한다면 우리가 원하는 값을 찾지 못할 수도 있을 것입니다.
여기 예시가 있습니다. 파란점(train set)들에 피팅되게 선을 예측한다면 초록네모(test set)에 들어왔을때 원하지 않는 결과 값을 얻을 수 있을 것입니다. 오히려 의도했던 것은 초록색 선일 것입니다.
그래서 보통 이를 해결하는 방법을 통틀어 Regularizaion이라고 합니다.
이는 모델이 더 단순한 W를 선택하도록 도와줍니다.
그래서 Regularizaion은 모델이 더 복잡해지지 않도록 도와주며, 모델에 soft한 제약을 추가한다고 볼 수 있습니다. "만약 너가 복잡한 모델을 계속 쓰고싶으면, 이 패널티를 감수해야 할꺼야!"라고 하는것과 같은거죠.
Regularizaion에는 다양한 종류가 있습니다.
가장 보편적인것은 L2 Regularizaion(Weight decay)입니다. L2 Regularization은 Euclidean Norm에 패널티를 주는 것입니다.
또다른 방식으로는 L1 Regularization도 있습니다. 이것은 W를 희소행렬이 될 수 있도록 합니다. Elastic net이라고 L1과 L2 를 짬뽕해둔 것도 있으며, Max Norm도 있습니다.
하지만 Regularization기법중 특히 딥러닝에 관련된 기법들을 더 배우게 될 것입니다. Dropout이나 Batch Normalization, Stochastic depth와 같은 최근의 멋있는 기법들 말입니다.
L1과 L2는 어떻게 모델이 복잡하다고 인지하는 걸까요?
여기 예시가 있습니다.
트레이닝데이터 x가 있고, 서로다른 W행렬 w1과 w2가 있습니다.
이걸가지고 Linear classification을 할때 우리는 x와 w의 내적을 구합니다.
Linear classification의 관점에서는 w1과 w2는 같습니다.
하지만 L2에서는 w1과 w2 중 어느것이 더 좋은 W라고 인지할까요?
L2에서는 w2를 선호합니다. 왜냐하면 L2는 분류기의 복잡도를 각 값들이 얼마나 차이가 없는지로 비교합니다.
Linear classificaion에서 W는 얼마나 x가 output class와 비슷한지를 계산합니다.
따라서 L2는 변동이 심한 어떤 입력 x 가 있고 그 특정요소에 의존하기 보다는 모든 x의 요소가 골고루 영향을 미치길 원할때 사용합니다.
L1은 어떨까요? L1은 w1을 선호합니다. 왜냐하면 L1은 행렬에서 0이 아닌 요소가 많을때 복잡하다고 생각합니다.
따라서 우리가 어떤 문제를 가지고 있고, 우리가 그 문제에서 '복잡하다'를 어떻게 정의할 것인지를 고민하여 적절한 Regularizaion 을 사용해야할 것입니다.
Softmax는 스코어를 가지고 클래스별 확률 분포를 계산하는 방식입니다.
스코어를 모두 이용하고, 각 스코어에 지수를 취해 양수가 되게 만든 후, 지수들의 합으로 정규화 시킵니다. 그래서 softmax 함수를 거치게 되면 결국 확률분포를 얻을 수 있고 그것이 바로 해당 클래스일 확률이 되는 것입니다.
확률이기 때문에 0에서 1사이의 값이고, 모든 확률들의 합은 1이 되겠죠
그러면 우리가 원하는 것은 정답 클래스에 해당하는 클래스의 확률이 1에 가깝게 계산되는 것입니다. 그렇게 되면 Loss는 -log(정답클래스 확률) 이 될 것입니다.
손실함수는 "얼마나 좋은지"가 아니라 "얼마나 구린지"를 측정하는 것이기 때문에 log에 -를 붙이는 겁니다. 그러면 0에 가까울수록 loss값은 무한대로 커질거고 1에 가까울수로 loss는 0에 가까워 지겠죠. 우리는 이것을 Softmax 또는 Multinomial Logistic Regressison (다항 로지스틱 회귀) 라고 합니다.
그렇다면 softmax의 최댓값과 최솟값은 얼마일까요? 이론적으로는 최댓값은 무한대, 최솟값은 0이 될 것입니다. 하지만 컴퓨터는 무한대 연산을 잘 못하기 때문에(유한 정밀도 때문에) Loss가 0인경우는 절대 없을 것입니다.
만약 스코어들이 모두 0근처에 모여있는 작은 수 일때 Loss는 어떻게 될까요? 디버깅할때 이 사실은 매우 유용한데요. 스코어들이 매우 비슷하다면 -log ( 1/class갯수) 가 되겠죠. log는 분자와 분모를 뒤집을 수 있으니까 log ( class의 갯수 )가 될 것입니다. 그렇지 않으면 뭔가 잘못된 것이겠죠?
그렇다면 지금까지 배운 두 손실함수를 한번 비교해 보겠습니다.
이 두 손실함수의 가장 큰 차이점은 "얼마나 구린지"를 측정하기 위해 스코어를 해석하는 방식이 조금 다르다는 것입니다.
SVM에서는 정답 스코어와, 정답이 아닌 스코어 간의 마진(margin)을 신경썼습니다.
반면 Softmax는 확률을 구해서 -log(정답클래스의 확률)에 신경을 썼습니다.
그러면 이전 예제에서 car클래스에서 car의 스코어는 다른 클래스보다 훨씬 높았습니다.
그래서 car스코어가 조금 변한다고 해서 SVM Loss가 변하거나 하진 않았죠, 왜냐하면 SVM은 정답과 그 외의 클래스의 margin만 관심 있기 때문이죠.
이런점에서 softmax는 상당히 다릅니다. softmax는 언제나 확률을 1로 만들려고 노력할 것이기 때문에 정답 스코어가 충분히 높고 다른 클래스 스코어가 충분히 낮아도 최대한 정답 클래스에 확률을 몰아 넣으려고 함으로써 정답 클래스는 무한대로, 그외의 클래스는 음의 무한대로 보내려고 할 것입니다.
즉, SVM은 일정 margin만 넘기면 더이상 성능 개선에 신경을 쓰지 않지만, softmax는 성능을 계속해서 좋게 만들려고 노력할 것입니다.
이것이 매우 흥미로운 차이점인 것이죠.
실제 딥러닝에서는 이 두 손실함수간의 성능차이는 엄청나게 크지는 않지만 그래도 차이를 알고 있다는 것은 유용할 것입니다.
자, 그럼 이제는 어떻게 실제 Loss를 줄이는 W를 찾을 수 있는걸까요?
우리는 이 방법을 '최적화 (Optimization)' 이라고 합니다.
최적화에 대한 것은 다음 게시물에서 이어집니다.