본문 바로가기

Backup/cs231n

cs231n 3강 Loss fn, optimization




저번 시간에 배운내용을 복습해보면 컴퓨터비젼에서 여러 첼린지가 있었습니다.

변형 은패나 은닉 그리고 배경과 구분이 안되는 object들 처럼 어려 문제가 있습니다.

근데 오늘날 기계들을 보면 사람을 넘어서는 이미지 인식 수준을 가지고있습니다.

전통적인 방식과는 달리 data driven 방식을 우리는 사용할거고요

첫번쨰 방법으로 NN에 대해서 학습을 해봤고

또 다른 data driven approach중에 parametrical approach입니다.


이 linear classifer을 보면 고차원 공간에 있는 이미지들 사이에서 class score에 기반해서 구분을 해나가는 과정이라고 해석할수있습니다. 




그래서 이번 시간에서는 우리가 score에 대해 어떤 불만족하는 정도를 정량화하는 loss function에 대해서 정의해보고

loss funtion을 최소화하는 parameter값들을 찾는 과정 optimization 과정을 알아보도록하겠습니다.








설명을 쉽게 하기 위해서 고양이 자동차 개구리 이 세개의 클래스를 가지고 있는 트레이닝 셋이 있다고 가정하겠습니다.

이때 우리는 이 함수을 이용해서 score을 구해보았습니다.

그 스코어가 아래와 같이 나와있는 상태입니다.

이떄 우리는 두가지 loss에 대해서 알아볼텐데 첫번째는 svm을 잉요한 hinge loss가 되겠고 두번째는 softmax을 활용한 cross entropy가 되겠습니다.









우리는 우선 SVM에 대해서 알아볼텐데  우리는 xi가 이미지이고 yi가 레이블일때 우리는 score벡터는 f(xi,w)로 나타낼수있고 

svm loss는 아래와 같이 표현합니다.

이걸 힌지 로스라고 하는데 

0 과 sj-syi+1보다 더 큰값을 취하겠다 라고 하는건데요 

sj는 잘못된 레이블의 스코어 그리고 sy는 재대로된 레이블의 스코어 입니다.

여기서 1이라는건 safty margin이라 합니다.

그러니까 해석해보자면 틀린 레이블들이 스코어에서 맞은 레이블들의 스코어를 뺴서 일을 더한값이 영보다 크면 그 값이 loss가 되고

0보다 작으면 0이 레이블이 된다는 의미입니다.

 




여기서 예을 들어보면요 이 첫번쨰 고양이 이미지에 대해서 스코어들이 이렇게 나와있는데요

맞는 스코어는 3.2가 되겠죠

그래서 5.1-3.2중 max 더하기 -1.7-3.2중 max을 더해서 2.9라는 loss을 얻게 됩니다.




자동차에서는 yi가 4.9가 되겠죠.

그래서 계산을 해보면 loss는 0됩니다.



개구리 같은경우 syi가 -3.1이 됩니다.


그래서 결과적으로 12.9라는 loss을 얻게 됩니다.



그래서 우리는 각 loss을 더한다음에 최종적인 class의 수로 나누어 최종적인 loss는 5.27이 됩니다.    




여기까지 잘 이해했는지 알아보기 위해 질문을 해보면






SVM loss에서 최저값과 최대값은 무엇인가?

최저값은 0이고 최대값은 이 다른형이 무한대가 될수있기 떄문에 무한대가 최대임


일반적으로 Weight을 매우 작은 수로 초기화함.

그럼 score값이 매우 작은 값을 가짐.

loss들도 다 2근처의 값을 가지게 됨.

평균이 2(클래스가 3이기 떄문에)

만약 클래스가 10개면 결과적으로 loss값은 9을 가지게 됨

그래서 초기에 loss값은 class 수 - 1정도 가지게 됨.

이성질을 이용해 초기에 학습이 잘되고있는지 확인해볼수있음 (seraty check라 함)



모든 loss값이 1만큼 증가하게됨.

왜냐면 자기자신의 크래스에 대한 스코어 계산할때 yi-j+1을 하기때문에  +1이 0보다 커서 빠져나옴





여기서 sum을 하는대신 mean하면 어떻게 될까.

별 의미는 없음

어차피 loss을 최소화하는 parameter을 구하는거기때문에 목적에 대해서는 큰 의미는 없다.


제곱을 사용하면 어떻게 될것이냐?

이 제곱을 하는걸 실제로 squared hinge loss라고 부름 경우에 따라서는 이걸 사용하는 경우도 있음

근데 결과적으로 이렇게 제곱을 하게 되면 상황이 달라짐

non liniear하게 되서 다른 정의가 나옴 




이걸 numpy코드로 보면 다음과 같음.

우선 Weight와 인풋간의 dot연산을 하여 score을 구한후

svm loss을 통해 margins을 구함

그리고 해당되는 라벨은 0으로 세팅

그래고 loss을 구하기 위해 모든 margins값을 더함






그래서 이 loss함수를 수식으로 적으면 이런데 이게 완벽하지 않습니다.

버그가 있는데 예을 들어 loss을 0으로 만드는 그런 parameter을 발견했다고 가정해보겠습니다. 

그러면 loss을 0으로 만든느 값이 uniq 하나요?

아니죠



처음건 우리가 앞에서 계산했던건데 loss가 0이 나왔습니다.

두번째꺼는 우리가 두배을 해준건데 이러면    loss가 똑같이 0이 나옵니다.

그러니까 0이라는 loss을 만드는  weight가 uniq하지 않습니다.



그래서 우리는 람다라는 regularization을 도입하게 됩니다. 



그래서 우리는 람다라는 regularization을 도입하게 됩니다. 

여기서 람다는 W가 얼마나 괜찮은가 측정을 하는 역활을 합니다.

왼쪽을 data loss : 학습한 데이터들을 최적화 하려고 노력하는 것이고 

오른쪽에 regularization 쪽은 test쪽에 최대한 regularization 하려고 노력한 것입니다.


결국 data loss와 regularization loss가 서로 싸우면서 결국 데이터에도 가장 fit하고 그중에서 가장 최적화된 weight값을 추출하게 되는겁니다.

a way of trading off training loss and generalization loss on test set

그래서 regularization 에서 많이 사용되는것들로 이런게 있습니다.


이처럼 regularization 이 들어가면 training error 는 더 커질거다.

training data에  정확도는 더 않좋지만 결과적으로 중요한 test set에 대한 performance는 더 중요해진다.


또 regulation 입장에서는 weight가 모두 0에 가깝기을 원한다 = loss가 작아지니까

weight 입장에서는 weight가 0일수는 없다. 왜냐면 분류을 해야되기 때문에.

그래서 서로 싸우면서 test set에 대해 좀더 일반화된 결과을 냄  






x가 1111일때 

data loss을 구해보면 둘다 결과가 1 

regularization 같은경우 w2을 더 선호함

L2 같은경우 더 작은값이 고르게 퍼져있어야 좋다.

그래서 동일한score라면 최대한 퍼진걸 선호한다.





지금까지는 svm을 통한 hinge loss을 알아봤고 이젠 softmax을 알아보겠습니다.\


multinomial logistic regression 이라고도 하는데  score는 일반적으로 저렇게 합니다.

 정의는 클래스을 숫자에 대해서 다음과 같은 수식을 가지고 저부분이 softmac funtion입니다. 





그래서 하고하는게 제대로된 확율에 대한 Log의 확율은 최대화 시키는게 목표

정확한 클래스의 - log 클래스을 최소화 하는게 목표

수식으론 저리 표현됨

이것을 cross entropy loss라고 함






로그을 취한는 이유는 수학적으로 좀더 나이스하고 편리하기 때문에 취함



정규화 하지 않은 인풋에 대한 값이 중간에  나오고요.   

이을 정규화을 해주지 않으면 가운데와 같은 값.,

softmax로 정규화 해주면 모든값의 합이 1인 확율로 loss을 만듬


최종적으로 loss_i는 0.89입니다.



여기서 또 질문 몇가지가 나오는데

최대와 최소는 무엇인가?

결과적으로 확율이 1에 가까울테고  최소값은 0

잘맞출때는 확율이 0에 가까울테고 무한



우리가 처음에 W의 초기값을 0과 같은 값을 넣는다

그럼 이때는 처음에 score가 0가까울테고

중간에 exp값은 1에 각각같다울테고

이걸 확율로 난타내면 각각 1/3에 가까울것이다.

그래서 -log(1/3)이 값이 될겁니다.


그래서 이것도 학습을 시작하기 전에 sanity check용으로 사용할수있음



종합적으로 이것을 softmax와 svm을 비교해본건데

각각에 대한 score가 다음과 같이 동일하게 나오게 되고요.

제일 밑에 파란색을 ground truth라 가정하고 계산하면

힌지로스는 1.58이 나오고

cross-entropy는 0.452가 나옴니다.   






그래서 비교가 되고있는데

실제로는 cross entropy가 가장 많이 사용되고있습니다.

어떤 데이터들을 가지고 있고 이 데이터을 약간씩 바꾸면 양쪽 loss에 대해서 어떻게 바뀌냐라고 질문을 하는건데

이쪽에 보면 svm loss는 끝에 +1이라는 safety margin을 통해 어떤 robustness을 제공하고있어서 잘 안바뀌고

cross entropy같은경우 모든 인자들을 고려하기 때문에 변화을 하게됨.

정리하자면 svm같은 경우 좀 둔감함. 값들이 변하더라도 전혀 변하지 않음

softmax는 민감하고 모든 데이터들을 봐서 변함



이제 최적화 해가는 과정입니다.

앞에내용을 정리하는 과정인데 

우리는 dataset x y라는걸 가지고있고

scorefuntion은 w을 x에 곱해준거

loss function들은 softmax인경우는 이런식 svm은 저런식으로 그리고 

regularization 까지 해주면 저렇게 full loss로 표현



여기서 유념할 부분은 data랑 상관없고 W만의 함수입니다.

즉 W에만 영향을 받는다






일단 W을 어떻게 잘 찾을수있을까 하는건데 

절대로 하면 안되는게 random search입니다.

random하게 되면 15% 정확도을 얻습니다.


state of the art는 95%


optimization과정은 산속에서 눈을 가리고 최저점을 향해 헤매는 과정이라 보면 된다.




실질적인 절략은 경사을 따라 내려가는 전략

1차원에 경우는 이렇게 함수을 미분한 과정통해 우리가 기울기을 구하여 최정화시킵니다.

이런건 numerical gradient을 통해 구합니다.

다차원에 경우에는 vector형태로 우리가 기울기을 계산하게 되고요




이와같은 예을 상정한다면, 현재 weight을 다음과 같이 주어졌고 loss는 다음과 같다 하겠습니다,

첫번째 차원에 대해서 아주 작은 값을 더했더니 loss값이 조금 내려간걸 볼수가 있습니다.



이떄 기울기을 수식을 통해 구해보면 기울기가 -2.5가 됨을 알수있습니다.

기울기가 음수라는건 downward 즉 기울기가 w가 늘어나면 loss에 음에영향 을 준다는걸 의미합니다,



두번째 차원에 작은 수 h을 더해서 똑같이 구해봤더니 loss가 증가됨을 확인할수있습니다,

이번엔 기울기가 늘어나면 upward의 영향을 가지고 있다는 의미입니다.

다음은 loss의 변화가 없고 이때의 기울기는 0 없다라는 의미가 되겠습니다.


결정적으로 우리가 이렇게 일일히 수식을 통해 미분값을 계산을 해가면서 기울기을 구하는것은 안좋다.

이러면 평가을 하면서 각각의 기울기을 구하는것은 매우매우 느리게 됩니다. 

우리가 원하는건 w가 변할때 L가 얼마큼 변하냐 이걸 원하는겁니다.

미분만 알면 쉽게 구할수있는겁니다.

뉴튼과 라이프니츠가 미분을 쉽게 구해주는 방법을 고안해내주셨습니다.


미분의 공식을 우리는 강력한 도구로 사용해서 일일히 numerical 방법으로 기울기을 구하지 않고 간단한 미분식을 이용하자.

이방법을 analytic gradient





실제로 미분식을 이용하면 다음과 같이 편미분값들을 구할수있는것이고 


정리해서 말하자면 numerical은 근사치이고 느리다. 반면에 코드로 작성하기 쉽습니다.

그리고 analitic은 빠르고 정확한데 에러가 늘어날 경우가 많습니다.

결론적으로 말하면 다 analitic  gradient을 쓰면 됩니다.

그리고 중간중간에 계산이 잘되고있는지 체크을 해줍니다.

loss함수을 넘겨줘서 gradient을 구하고 

여기서 스템사이즈만큼 곱해서 기존의 weight을 업데이트 시켜줍니다.




그래서 이렇게 orignal의  weignt가 주어졌을때 이을 음의 gradient방향으로 업데이트 해가면서 최적화을 해나가는것이 gradient decent가 되겟습니다. 


 





앞에서 봤던 내용은 full gradient descent방법입니다.

우리가 보다 현실에서보다 많이 사용되는 방법은 

mini-batch 방법이 되겠습니다.

trainingset에서 일부만을 사용해서 보다 속도와 효율성을 높이는 방법의 최적화가 되겠습니다.

트레이닝셋의 일부만을 활용해서 gradient을 계산하고 이을통해 parameter을 업데이트해주고

또 다른 셋의 mini-batch을 이용해 parameter을 업데이트 하는 방법을 계속해서 반복하는 과정입니다,

일반적으로 mini-batch사이즈는 32 64 128개의 사이즈을 가지게 되고요.

alex net에서는 256개의 minibatch을 사용했다합니다.

여기서 minibatch size는 하이퍼파라미라 까지 취급해서 사용하지 않고 그냥 나의 gpu memory 상태에 따라 잘 분배해서 사용하면 됩니다.




이제부터는 cnn을 하기전에 일반적인 image classify을 어떻게 해왓는지을 봐보겠습니다.

기존의 방식도 linearal classifier을 이용했었는데

original image에다가 linear classify을 적용하지는 않았습니다.

히스토그램이나 코드형태로 feature을 추출합니다.

그리고나서 이거을 concate하고  이것을 linear clasifier에 넣어줬습니다,




처음은 color histogram에다가 feature가 되었습니다.

bin이 몇개인지을 아래에서 count하게 됩니다.





두번쨰 추출하는 방법은 hog shift가 되겠습니다.

오른쪽 방식과 같이 8*8 픽셀로 구성된 구역을 보면서 

그 엣지들의 방향을 총 9가지의 방향의 엣지의 bin으로 나눠서 

그 9가지의 bin에 몇개가 속하는가을 기준으로해서 

edge의 의존도을 추출해내는 것입니다.



그리고 세번째 예로는 bag of word

이미지의 여러 지점들을 보고 이 작은 지점의 patch을 frequency라던가 color라던가의 vector로 기술하게 됩니다,

그래서 이것을 사전화 하여서 이 사전중에서 test할 이미지와 가장 유사하게 생긴 feature vector을 찾습니다.

그래서 이 feature vector을 찾고 이을 concatenation해서 linear classify을 한 방법이 되겠습니다.




기존의 방식을들을 보면 어떤식으로던 feature extraction 해줘서 linearclassify을 해줍니다

우리가 이제 하려는 딥러닝은 feature 추출을 우리가 임의적으로 하지 않습니다.

feature추출을 기존방식에서 사람이 인위적으로 해줬었는데 딥러닝에서는 그냥 function에 넣어줘서 하는 방법입니다.





'Backup > cs231n' 카테고리의 다른 글

cs231n 6강 Training NN part 2  (0) 2017.12.05
cs231n 5강 Training NN part 1  (0) 2017.12.05
cs231n 7강 CNN  (0) 2017.11.02
cs231n 4강 Backpropagation and NN part 1  (0) 2017.10.20
cs231n 2강 Image classification pipeline  (0) 2017.10.16