본문 바로가기
CS231n 공부하기

Lecture 3 | Loss fn, optimization

by 고공이 2020. 10. 19.

유투브 강의: www.youtube.com/watch?v=KT4iD6yiqwo&list=PL1Kb3QTCLIVtyOuMgyVgT-OeW0PYXl3j5&index=2

참고 사이트: cding.tistory.com/2

 

스코어에 대해 불만족을 정량화하는 로스펑션

로스펑션을 최소화하는 파라미터를 찾는 과저이 옵티파이제이션을 알아본다.

 

두가지 로스에 대해 

svm을 활용한 힌지로스,

softmax cross entropy loss 를 알아보자

 

 

sj 잘못된 레이블의 스코어

syi 제대로된 레이블의 스코어

1은 safety margin (이게 머여)

 

A: 모든 로스값에 1이 더해짐.  최종 로스값도 1만큼 증가

 

A: 별 의미는 없다. 어차피 미니마이즈한 파라미터값을 구하는 거기때문에 영향을 주지 않느다.

 

A: 경우에따라서 제곱을 사용하는 경우가 있는데 안한거랑 차이가 있다. 제곱을 한다는 것은 언리니어한다는 것이기 때문에 달라진다.(언제 사용?0)

 

A: 최저값과 최대값은 각각 0, 무한대이다.

 

일반적으로 웨이트를 작은값으로 초기화한다. 이때 스코어는 0이 되는데, 그럼 로스값은?

A: 로스값 모두 2. 평균도 2 (클래스에 따라 값은 달라짐) (클래스-1 = 초기의 로스값)

 

sanity check : 최초학습 시작할때 로스값이 이 규칙에 맞다면 학습이 제대로 되어진다는 것을 파악할 수 있다. 이러한 작업을 세너티 체크라고 한다.

 

로스 구하는 방법.

 

로스값을 0으로 만드는 웨이트는 유니크하지 않다.( 왜 유니크하지 않지)

유니크한 웨이트 값을 결정하기 위해서 레귤러제이션을 도입함.

 

 

 

 

 

일밙거으로 웨이트를 매우 작은수로 초기화하기때문에 s 는 0으로 거의 나타날것이다.

그렇다면 loss는 어떻게 될까

2,2,2 평균 2 (클래스 3개일때)

 

 

 

데이터 로스: 학습용 데이터들을 최적화하려고 노력

레귤러라이제이션 로스: 테스트쪽을 일반화하려고 노력

 

서로 싸우면서 데이터 핏, 가장 최적화된 ㅏㄱ장 작은 웨이트값을 추출하게 됨

가장많이 사용되는 것, l2,l1 등등등

 

레귤라이제이션을 사용하면

트레이닝 데이터에 대한 정확도는 안좋아지게 되지만, 테스트셋에 대한 퍼모먼스는 좋아지게 된다.

 

l2는 동일한 스코어라면 최대한 스프레드 아웃되는 것을 선호한다.

 

softmax에 대해 알아보자.

각 점수마다 확률을 구하여 오차값을 구하는 방식.

최소값은 0 최대값은 무한대.

아주 잘 맞추면( 확률이 1이라면) 로스는 0에 가까움, 반대로 확률이 0이라면 로스는 무한대로 가까움.

 

오차값이 0.13이 되면 굉장히 좋은 오차값이지만, 이 값에 -LOG를 쓰ㅣ워보면 0.89로 작은 값은 큰값이 되고, 큰값은 작은 값으로 나온다. 그럼 89% 확률로 매우 강하게 고양이라는 것을 알려주는 것.

 

일반화시키면 -로그(1/클래스 수)

세너티 체크로 활용해서 실제로 이 값이 나오는지 확인하고 학습 진행시키면 좀더 정교한 작업이 될 수 있다.

 

softmax vs SVM

실제로는 소프트맥스를 많이 사용(왜?)

 

SVM은 Loss가 0이 되는 순간, 끝난다.  max값만 구하기 때문에 더 최적화된 것을 찾을려고 해도 0되면 작업이 끝남.

softmax는 계속해서 확률을 높이기 위해(최적화) 작업을 하기 때문에 실제로는 softmax를 많이 사용함.

 

(시그모이드 vs 소프트맥스 에 대한 설명이지만, 답이 될 수 있을 것 같아 해당 링크를 가져왔다.)

 

tensorflow.blog/%ED%95%B4%EC%BB%A4%EC%97%90%EA%B2%8C-%EC%A0%84%ED%95%B4%EB%93%A4%EC%9D%80-%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D-3/

 

해커에게 전해들은 머신러닝 #3

이 글에서 사용한 코드는 깃허브에서 확인할 수 있습니다. 본격 머신러닝 입문서 <[개정판] 파이썬 라이브러리를 활용한 머신러닝> 출간. 이 책은 사이킷런(Scikit-Learn) 라이브러리에 있는 지도학�

tensorflow.blog

소프트맥스는 출력값을 지수함수에 적용하여 정규화하는 형태를 가진다. 시그모이드 함수로 구한 값이 낮음에도 소프트맥스로 했을 때 값이 매우 높게 나와 잘 찾아내므로 멀티 클래스인 경우에는 소프트맥스를 자주 사용함.

 

 

스코화를 약간씩 변형하면 양쪽 로스값의 변화는 어떻게 될까

A: 세이프티 마진으로 흔들리지 않는 값을 제공, 그래서 SVM 로스값은 불변. 소프트맥스는 민감해서 변화.

 

optimization

loss을 미니마이즈하는 W를 찾아가는 과정

 

절대로 사용하지 않아야 할 전략

랜덤 서치 : 마치 산속에서 여기저기를 텔레포트하듯이 최적경로를 찾는 거기 때문에 별로임

 

Gradient Descent 법

유메리컬 그레이언트: 수치적으로 경사값을 구함

1차원에서는 미분, 멀티차원에서는 그레디언트 값은 벡터로 표현됨.

 

그레디언트는 음수는 아래로 가는 기울기, 양수는 위로 가는 기울기, 0은 기울기가 없다.

하지만 이것은 근사치일 뿐. 정확한 값이 아님. 그리고 평가할 때 하나하나 일일이 계산하고 있기 때문에 매우매우 느림.

 

결과적으로 이 방법을 사용하면 어리석은 법.

 

일일이 하는 것이 유멀리컬, 그냥 미분공식으로 바로 한게 어날리틱 .

하지만, 우리는 미분식 코드를 짜지 않을 거기 떼문에 그냥 미분을 통해서 Loss가 적은 방향으로 내려갈 수 있다라는 것만 알면 됨.

Gradient Descent 를 통해 가장 적잘한 W값을 찾아낼거앋.

여기서, step_size 를 잘 정해야 한다. 이게 하이퍼파라미터 임.

 

 

 

미분해서 나온 기울기 방향이 바로 하얀 화살표방향과 비슷하게 나옴.

우리가 최종 목표는 빨강(가장 낮은곳)인데,

저 방향으로 너무 멀리 가게 되면 보라색쪽으로 갈 수 있다. 그럼 빨강으로 안가고 더더더더더 멀리있느 ㄴ곳으로 가게 됨.

그래서 step_size를 잘 설정해서 빨강 있는 곳으로 가야하는 것임.

근데 스텝 사이즈를 너무 작게 설정하면 쬐금 이동하므로 이 행동을 오래도록 할 것임.

그래서 스텝 사이즈를 최대한 적절하게 조정해서 빨강색으로 잘 가야함.

 

 

트레이닝 전체 셋을 사용하는 것보다 효율적으로 성능을 높이는 법이 바로 아래!

미니배치 학습

: 전체의 근사치를 이용하여 일부를 무작위로 뽑아 학습하는 것.

ㅁㅣ니 배치사용해서 로스값이 작아지는 것을 보여주는 그래프

지그재그가 특징.

장기적으로 볼때는 서서히 내려간다.

 

 러닝 레이트를 잘 설정해야 한다.

그럼 어떻게 설정해야하나.

보통 쪼금 높게 설정하다가 점점 낮춰가는 식으로 이를 디케이라고 함.

 

파라미터를 업데이트 하는 방법들

모멘텀,, 등등등 (이것은 5강에서)

 모멘텀: 오버피팅하다가 빠르게 제자리로 찾아감.

더 자세한것은 5강에서...

 

전통: 피처를 추출한 다음에 자이언트 컬럼처럼 쫙이어줌. 이러고 리니어 클래식파이어에 적용시킴.

 

컬러가 피처.

컬러를 파악하고 컬러가 각각 해당하는 빈이 몇개인지.

이렇게 피처를 추출함

엣지 방향을 9가지로 구분해서 9가지 빈에 몇개가 속하는가

엣지 방향으로 피처 추출.

 

이미지의 여러지점들을 보고 작은 지점을 벡터로 기술. 이를 모아 사전화하여 사전과 비교해서 가장 유사하게 생긴 것을 찾음(k-means 를 사용해서)  

이를 피처 벡터들로 추출.

 

전통:피러 추출릉ㄹ 사람이 해서 리니어 클래식파이해서 결과겂을 얻음.

딥러닝: 인위적으로 피처추출할 없이 이미지 자체를 함수에 넣어주면 함수(모델)가 결과값을 알아서 출력해줌.

 

댓글