CS231n - lecture 3: loss function and optimization

Nunucoder·2021년 9월 18일
0


복습 :
지난 시간에는 이미지 분류에 대해 알아보았습니다.
인간의 눈으로는 쉽지만 컴퓨터가 이해하기에는 장애요소들이 있습니다.

  • viewpoint
  • illumination
  • deformation
  • occlusion
  • clutter
  • intra variation
    과 같은 문제점때문이였습니다.

저번주에 했던 k-nearst에대해 알아보았습니다. 그리고 CIFAR-10 데이터셋 에 대해 알아보았습니다.
validation data와 hyperparameter에 대해서도 이야기 했습니다.

그리고 linear classifier에 대해 배웠습니다.
x는 이미지, w는 가중치(weight), 이것들을 통해score (점수)를 뽑아냈습니다.
여러 레이블 score에서 구한 값이 높다면 해당 레이블에 있을 가능성이 높고,
낮다면 그 레이블에는 속하지않을 가능성이 있다는 것을 보여줬습니다.

w값을 여기서 사용한다는것에 대해 배웠습니다.하지만 우리는 실제 w값을 어떻게 선택하는지에 대해 이야기를 하지않았습니다.trainiing data에서 w를 결정하기 가장 좋은 적용 방법을 말이죠. 위 사진을 보고 넘어가겠습니다. 고양이 사진부터 보시면 고양이 score는 2.9점이고 , 강아지 score는 8.02점이고 오히려 개구리 score가 높은 것을 확인할 수 있습니다. 자동차 사진은 분류를 잘했지만,
개구리 사진 같은 경우에는 -4.34점입니다.

이때 score는 매우 안좋다는 것이고 이것에 영향을 준 w는 매우 안좋다고 할수 있습니다.즉 w가 좋다 안좋다 라고 정량적으로 말할 과정이 필요합니다. 이것이 바로 ‘loss function’입니다. w를 정량화하여 얼만큼 좋고 나쁨을 알려주는 것입니다. 그리고 안좋다면 좋은쪽으로 가야겠죠?
이 과정을 optimization 이라고 합니다. 이 장에서는 2가지 핵심을 보입니다.

데이터를 고양이,자동차,개구리 3개를 이용하겠습니다.
그리고 x는 이미지이고 y는 정수인 레이블 값입니다. 10개의 레이블 혹은 0~9까지의 레이블을 의미합니다.
아래 식에 일반적인 loss를 구하는 방법이 나와있습니다.
각 카테고리별 loss를 구해주고 그것들을 더해주고 개수만큼 나눠서 평균값을 만듭니다.
이 과정을 통해 최종 loss를 구해줍니다.

첫 번째로 볼 loss는 multi-class SVM(Support vector machine) loss 입니다.

binary SVM을 CS229에서 본적있을 것입니다. 이것 예는 positive 와 negative의 두 상태만을 다룹니다.

multi-class SVM 은 다중 클래스들을 다루기에 일반화되어있습니다.
Li는 true category Yi를 제외하고 모든 Yi의 합으로 구합니다.

  • sj는 분류기를 통해 예측한 각 클래스별 점수(score)
  • syi는 해당 클래스의 정답 점수(score)
  • 1은 ‘safty margin’, 예측 값과 정답 값에 대한 상대적인 차이를 주기 위해 설정

추측한 score(sj)가 정답 score(syi)보다 1 이상으로 높을 때, sj-syi+1 값을 Loss로 반환합니다.

추측한 score(sj)가 정답 score(syi)보다 1 미만일 때는 0 값을 Loss로 반환합니다.

multi-class SVM(Support vector machine) loss의 그래프를 보면 x 축은 syi , y축은 loss를 나타냅니다.
정답 클래스를 이미 정확하게 분류했다면 Li의 값은 safty margin인 0에 가까울 것이고, 그렇지 않다면 Loss의 값이 linear하게 감소 할것입니다.

이렇게 loss식을 볼수 있습니다.


loss식의 과정을 보면 각각의 쌍으로 클래스들의 loss의 합을 구하고 max값을 가져오는 것을 알 수 있습니다.

Q1 : car score이 변하게 된다면 loss의 값은 어떻게 되는가?

A1 : score 간에 상대적인 차이가 중요하므로 loss의 값에는 크게 영향을 미치지 않는다.

Q2 : loss값의 최솟값과 최댓값을 구하면?

A2 : 그래프를 생각해본다면 최솟값은 0 , 최댓값은 ∞이다.

Q3 : 초기에 W가 0에 가까우면 모든 score의 값은 0과 비슷하다. 이때 loss값을 구하면?

A3 : Loss는 ‘(클래스) - 1’이 된다. 이는 디버깅할 때 유용하다.

Q4 : Li값을 구하는데 합을 구할 때 j≠yi가 아닌, j를 포함한 모든 값을 다 더하게 되면?

A4 : j를 포함한 모든 값을 다 더하게 되면 Loss의 값이 ‘0’이 아닌 ‘1’이 정답 값이다. (정답이라는 표현이 애매한데 오차가 없으면 Loss 값이 1로 나온다.)

Q5 : Loss를 계산하는데, 합 대신 평균을 사용하면 Loss값은 어떻게 되는가?

A5 : Loss 값을 구하는데는 크게 상관이 없다. 우리가 관심이 있는건 정답 클래스의 점수와 그렇지 않은 클래스의 차이이기 때문이다.

Q6 : 손실 함수를 max(0,sj−syi+1)가 아닌 (max(0,sj−syi+1)2(제곱) 을 사용하게 된다면?

A6 : 손실 함수를 계산하는 것 자체가 변하기 때문에 값이 완전히 달라진다.

numpy를 이용한 코드

우리가 Loss function을 이용해서 L을 구했을 때 L = 0 인 W의 값이 단 하나인가?

또 다른 W의 값이 존재한다.
train data를 이용해서 어떤 분류기를 찾고 (즉, W의 값을 찾고) 이 분류기(W)를 test data에 적용했을 때 성능이 잘 나오는 것을 고르면 된다!

우리는 지금까지 분류기에 데이터적용을 train data 에 중점을 두었다. 하지만 우리가 실제 예측하려는 데이터는 test데이터 이므로 이 데이터에 주목해야합니다.

train data를 파란색 선들로 잇고, test data를 녹색 데이터들을 추가해보고 선을 긋습니다.
그럼 train data들을 가지고 test data들을 예측할수 없는상황이 일어날 것입니다.
이것을 overfitting(과적합)이라하고 이 해결방법으로 regulation이 사용됩니다.

loss 함수를 추가하는 것입니다.모델이 더욱 simple한 w값을 선택하도록 하는것입니다.
Regularization은 Occam's Razor에 따라 가설을 세우기 위해 단순한 데이터가 더 좋다고 하는 것입니다.
data loss 와 Regularization loss 와 트레이드 오프 관계를 가진 lambda 에 대해 보겠습니다.

Regularization

L1은 실제차수 값이 0이되게함
L2는 전체 차수 값을 0에 가깝게 유도
norm regularization, dropout은 후에 나옴
lambda : 규제의강도, 높으면 모델이 단순해짐(=underfitting),낮으면 모델이 복잡해짐(=overfitting)

multi class SVM과 함께 잘쓰이는 softmax에 대해 알아보겠습니다.
두 함수의 가장 큰 차이점은 Multi class SVM 같은 경우 정답 score과 오답 score(정답 클래스가 아닌 다른 클래스)의 차이(Gap)에만 관심을 보였다면, Softmax의 경우 그 차이를 모두 수치화하여 score에 대한 해석을 할 수 있도록 합니다.

softmax함수의 적용 방식을 보면
score들을 exponential(지수화) 시켜주고 normalize(정규화) 시켜주고 그값들을 Log(로그화) 시켜주면 loss가 나옵니다.

Q1 가능한 loss의 최소값과 최대값은 무엇인가?

이론적으로는 0, 무한대이다. (Log 그래프를 보면 확인할 수 있음)

Q2 W가 너무 작아서 S가 0에 가까운 경우, loss 값은?

score가 모두 0에 가까운 값이라면 loss는 -log1/C 값이 나오게 될 것이고,
loss 식이 올바른지 확인하기 위해 sanity check를 사용한다.

  • svm은 한번 bar를 넘어선 데이터 포인트를 정확하게 분류되기 위해 얻습니다. 그리고 데이터 포인트에 더 이상 관심을 갖지않습니다.(= 둔감하다)

  • softmax 계속적으로 데이터 포인트를 더 좋은 방향으로 계속해서 얻어냅니다. (=예민하다)

실제로 딥러닝에서의 용도 차이는 별로 없지만 그래도 이 차이점을 염두해둔다면 좋을 것압나다.

요약

full loss : 언제나 regularization을 가지는것

좋은 w값을 어떻게 찾을까요? loss를 최소화할 w를 어떻게 구할까요?

opimization

보통 optimaization 과정을 vally를 내려가는것과 비슷하게 생각합니다. 좋은 위치를 찾아가는 것이죠 . 즉 loss가 0인 w를 찾아가는것입니다.

좋은 위치(낮은 loss)를 찾기 위한 방법으로
Random search 가 있는데, 단순히 random하게 w 위치를 찾는 것입니다. 항상 좋은 위치를 찾을 보장이 없음으로, 사용하지 않는 나쁜 방법이다. CIFAR-10을 random search를 사용한 예시 결과를 보면 나쁘면 약 15%, 좋은 경우에는 95%로 결과의 차이가 매우 커서 사용하지 않습니다.


낮은 곳을 향해 나아가기 위해 경사를 따라 내려가는 방법을 사용하고 Gradient Descent라고 합니다. 현재 위치와 이동한 위치의 미분 값을 계산하여 미분 값의 반대 방향으로 이동하면 항상 아래를 향해 나아가게 된다. 위와 같이 수식으로 하나하나 계산하는 방법을 numerical 방법(수치적 방법)이라고 합니다 현재 위치와 한번 이동한 후의 위치를 이용해 loss와 gradient를 계산해보면 loss는 감소하였고, gradient는 -2.5가 나오는 것을 확인할 수 있습니다.

  • loss가 증가한 경우에는 gradient가 양수 값이 나오는 것을 알 수 있습니다.

  • loss가 동일한 경우에는 gradient 값이 0으로 loss의 변화가 없음으로, 기울기가 0이라는 것을 확인할 수 있다. 이렇게 하나하나 수치적으로 계산하는 것이 위의 방법입니다. 하지만 W이 너무 많아, 위와 같은 방식으로 하나하나 계산하기에 시간이 너무 많이 걸립니다.

그래서 미분식을 이용해 더 빠르고 쉽게 계산할 수 있게 됩니다.
위와 같이 빠르게 미분을 이용해 빠르게 dW를 계산할 수 있습니다.

Numerical gradient 은 근사적이고 느리지만 간편하다는 특징이 있다. 실제 gradient 계산 방식 Analysis gradient 방식(미분)을 사용합니다.

보통은 analytic gradient를 사용하지만, 디버깅 및 점검할 때는 numerical gradient를 사용하기도 합니다.

일단 우리가 gradient를 계산하는 방법을 알고 나면 이 세 줄짜리 간단한 알고리즘은 엄청 크고 복잡하고 싶은 신경망알고리즘을 어떻게 학습시킬지에 대한 핵심 아이디어를 담고 있습니다.

Gradient Descent에서는 우선 W를 임의의 값으로 초기화합니다 그리고 Loss와 gradient를 계산한 뒤에 가중치를 gradient의 반대 방향으로 업데이트합니다.스텝 사이즈는 하이퍼 파라미터 입니다. 스텝 사이즈는 그 -gradient 방향으로 얼마나 나아가야 하는지를 알려줍니다.step size는 learning rate라고도 불리며 가장 중요한 하이퍼파라미터 중 하나입니다.

아래 두 그래프와 같이 너무 큰 learning rate를 가지면, 가장 낮은 값에 적절하게 정착하지 못해 overshooting이 일어날 수 있고, 너무 작은 learning rate를 가지면 시간이 너무 오래 걸리고, 전체적으로 가장 작은 loss를 가진 구간(global minimum)이 아닌 지역적인 최소 구간(local minimum)에 빠질 수 있습니다.

하지만 모든 data에 대하여 일일이 이 작업을 하기에는 연산량이 너무 많습니다.
따라서 우리는 묶음(minibatch)를 활용해 Gradient Descent를 사용하는데 이를 Stochastic Gradient Descent(SGD)라고 합니다.
Minibatch는 보통 2의 승수로 정하며 32, 64, 128 을 보통 씁니다.따라서 이 작은 minibatch를 이용해서 Loss의 전체 합의 "추정치"와 실제 gradient의 "추정치"를 계산하는 것입니다.

이미지의 특징에 관한 것입니다.지금까지 Linear classifier에 대해 이야기해 보았습니다.
실제 Raw 이미지 픽셀을 입력으로 받는 방식이었죠 실제로는 영상 자체를 입력으로 사용하는 것은 성능이 좋지 않습니다.
그래서 DNN이 유행하기 전에 주로 쓰는 방법은 두가지 스테이지를 거치는 방법이었습니다.
첫번 째는, 이미지가 있으면 여러가지 특징 표현을 계산하는 것입니다.
이런 특징 표현은 이미지의 모양새와 관련된 것일 수 있습니다.

그리고 여러 특징 표현들은 한데 연결시켜(Concat) 하나의 특징 벡터로 만듭니다.
마지막에 이 특징 벡터가 Linear classifier의 입력으로 들어가는 것입니다.

특징 변환의 한 예를 들어보자면 컬러 히스토그램이 있습니다.
이미지에서 Hue 값만 뽑아서 모든 픽셀을 각 양동이에 넣는 것입니다.한 필셀은 해당하는 색의 양동이에 넣고
각 양동이에 들어있는 픽셀의 개수를 세는 것입니다.

NN이 뜨기 전에 인기있었던 또 다른 특징 벡터중 하나는 바로 Histogram of oriented gradients(HOG) 입니다. HOG는 이미지 내에 전반적으로 어떤 종류의 edge정보가 있는지를 나타냅니다.

어떤 문장이 있고, BOW에서 이 문장을 표현하는 방법은바로 문장의 여러 단어의 발생 빈도를 세서 특징 벡터로 사용하는 것입니다. 하지만 BOW를 적용하려고 하는데 이미지에 적용하려니 쉬운 문제가 아니였습니다."시각 단어(visual words)"라고 하는 우리만의 용어를 정의해야 했습니다. 엄청 많은 이미지를 가지고, 그 이미지들은 임의대로 조각냅니다. 그리고 그 조각들을 K-means와 같은 알고리즘으로 군집화합니다.이미지내의 다양한 것들을 표현할 수 있는 다양한 군집들을 만들어 내는 것입니다.

오른쪽 예를 보면, 이것은 이미지들에서 다양한 이미지 패치를 뽑아내서 군집화 시켜 놓은 실제 예시입니다.
군집화 단계를 거치고나면, 시각 단어(visual words)는 빨간색, 파랑색, 노랑색과 같은 다양한 색을 포착해냅니다.
이런 시각 단어(visual words) 집합인 Codebook을 만들고 나면 그러면 어떤 이미지가 있으면, 이 이미지에서의 시각 단어들의 발생 빈도를 통해서 이미지를 인코딩 할 수 있는 것입니다.그리고 이는 이 이미지가 어떻게 생겼는지에 대한
다양한 정보를 제공하는 것입니다.

Image classification의 pipleline은 이렇게 생겼습니다.

Image feature

5~10년 전까지만 해도 이미지를 입력받으면 BOW나 HOG와 같은 다양한 특징 표현을 계산하고, 계산한 특징들을 한데 모아 연결해서, 추출된 그 특징들을 Linear classifier의 입력으로 사용했습니다.특징이 한번 추출되면 feature extractor는 classier를 트레이닝하는 동안 변하지 않습니다. 트레이닝 중에는 오직 Linear classifier만 훈련이 됩니다.

CNN이나 DNN

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

profile
집에가고싶다

0개의 댓글