[CS231n] lecture 03. Loss Functions and Optimization - 2
ML & DL/CV

[CS231n] lecture 03. Loss Functions and Optimization - 2

Stanford University의 CS231n (spring 2017)을 들으며 정리했습니다.

0. SVM loss 이어서..

image

  • 위 loss function에서 W는 loss 0을 얻을 수 있는 유일한 값일까?
    • 아니다. W에 2를 곱한 2W도 loss 0을 얻을 수 있다.
    • 이미 정답 예측 점수가 오답 예측 점수보다 1(safety margin)이상 크다면, W가 두배가 되어도 loss 0을 얻을 수 있기 때문이다.
  • 이처럼 우리는 학습 데이터(training data) 안에서 loss 가 0이 되는 W 값을 찾았기 때문에, W를 두배를 하는 등의 변형된 W여도 loss 가 0이 될 수 있다.
  • 과연 이 방식이 옳은 학습이라고 할 수 있을까?

1. 과적합 (Overfitting)

  • 우리는 전체 데이터를 학습, 테스트 데이터(train, test data)로 나눈 후 학습 데이터만을 사용해서 학습을 진행한다.
  • 오로지 학습 데이터를 사용했을 때만 loss 가 0이 되는 W 값을 찾는 다면, 테스트 데이터에는 전혀 맞지 않을 수 있다.
  • 그림으로 이해해보자!

image

  • 파란 점은 학습 데이터, 초록색 점은 테스트 데이터이다.
  • 학습 데이터에만 적합한(fit) 학습을 한 모델은 파란색 그래프이다.
  • 이렇게 학습 데이터에만 학습된 경우를 모델이 과적합(overfitting)되었다고 한다.
  • 모델의 결과는 학습 데이터가 아닌 테스트 데이터에 대한 결과로 판단하기 때문에 과적합은 학습이 잘 되었다고 볼 수 없다.
  • 어떻게 해결할 수 있을까?

image

  • 초록색 그래프처럼 과적합을 피하고 학습 데이터, 테스트 데이터 모두에 일반적으로 적용할 수 있는 학습을 해야 한다.
  • 과적합(overfitting)은 머신러닝의 일반적인 문제이고, 이 문제를 해결하기 위해 정규화(Regularization) 작업을 필요로 한다.

2. 정규화 (Regularization)

  • loss function에 정규화 식을 더함으로써 모델이 단순한 (overfitting하지 않는) W를 선택하게 한다.
  • 정규화의 목적은 일반적인 W를 선택하는 것이다.
  • 따라서 최종 loss function은 data loss 부분과 정규화(regularization) loss 부분으로 구성된다.
  • 하이퍼 파라미터 lambda는 두 항의 트레이드 오프이다.
  • 사용할 수 있는 정규화는 여러 가지가 있다.

image

  • 보통 L2 정규화를 많이 사용하며, 유클리디안 거리를 이용한 정규화 방법이다.

Regularization의 종류 

  • 가중치 행렬인 W에 대해 적용한다.
    • W에 대한 규제라고도 함.
  • L2 regularization 
    • 미분을 깔끔하게 하기 위해 1/2를 곱하기도 함.
    • W의 euclidean norm에 페널티를 주는 아이디어이다. 
  • L1 regularization
    • W의 L1 norm에 페널티를 주는 아이디어이다. 
    • W가 희소행렬이 되도록 한다.
      • 희소행렬 : 대부분의 항이 '0'인 행렬 
  • L2와 L1의 차이점
    • x = [1, 1, 1, 1], w_1 = [1, 0, 0, 0], w_2 = [0.25, 0.25, 0.25, 0.25]
    • 위 예시에서 L2는 w_2를, L1은 w_1를 더 선호한다.
    • L2는 매끄러운(coarse) 값을, L1은 0이 많을수록(sparse) 선호한다. 
    • 복잡도를 정의하는 기준은 문제, 모델, 데이터에 따라 다르다. 

 

3. Softmax Classifier (multinominal logistic regression)

  • SVM loss와 마찬가지로 loss function의 종류 중 하나이며 딥러닝에서 흔히 사용된다.
  • SVM loss에서는 스코어에 신경 쓰지 않았다. 정답 클래스가 그 외의 클래스보다 더 높은 스코어를 내는 것에 집중함
  • softmax를 통해 클래스 별 확률분포를 구함으로써 스코어에 추가적인 의미 부여를 함.
    • 자연로그를 써서 지수화, 양수가 되게 만들고, 그 지수들의 합으로 정규화시킨다. ⇒ 확률분포 ⇒ 해당 클래스의 확률 

image

  • 모든 확률들의 합이 1이되기를 원한다. 특히, 정답 클래스 확률이 1에 가깝게 계산되는 것을 원한다. ⇒ -log(정답 클래스 확률)
  • log를 최대화한다. log:단조 증가함수. 그냥 확률 값을 최대화시키는 것보다 이게 더 쉬움.
  • 얼마나 성능이 나쁜지를 확인하기 위해 Log에 -를 붙인다.
  • 각 스코어를 확률화 시키고, 합이 1이 되도록 정규화, 정답 스코어에만 -log를 묻힌다.

질문

  • Q1. softmax의 최댓값과 최솟값은 얼마일까?
    • A1. 최소 0, 최대 무한대
    • log(1) = 0 , -log(1) = 0 이기 때문에 log(_) = 1이 되려면 무한대가 되어야 한다.
    • -log(0) 음의 무한대,
    • 유한 정밀도를 갖고 최대, 최소에 다다를 수는 없다.
  • Q2. 모든 스코어가 0에 가까운 작은 값이라면 loss는 얼마일까? (softmax loss debugging strategy)
    • A2. -log(1/C) = log(C)

4. SVM, Softmax 비교

svm : margin만 넘으면 성능에는 신경 쓰지 않는다. softmax : 확률을 구해서 정답 클래스 스코어에 신경 쓴다.

svm에서는 어떤 스코어가 변해도 상관없지만, softmax는 정답 클래스는 무한대로, 그 외는 음의 무한대로 보내려고 한다. 확률을 1로 만들기 위해서 softmax는 계속해서 성능을 개선하는 성질이 있다.

둘의 성능차는 미미하나 그 차이를 아는 것이 중요함

데이터에 대한 민감도도 다르다.

linear classifier를 이용해서 스코어를 얻고 이 값이 얼마나 구린지를 softmax, svm 등을 이용함

5. optimization

: 좋은 W(minimize loss)를 찾는 방법

골짜기의 밑바닥을 찾아야 한다.라고 비유하고 있음

  • 임의의 지점에서 시작해서 밑바닥을 찾는 것

 

  1. random search 말 그대로 랜덤 하게 W를 찾아서 성능을 본다.
  2. follow the step : local geometric, 경사를 느끼고 내려가는 방향으로 가는 것 일반적으로 사용하는 방법 (nn, linear classifier)
  • 경사(slope)란? : 기울기 (도함수, 미분) gradient : 도함수의 벡터
  • 수치적 gradient로 디버깅할 수 있다. 미분 값을 잘 구했는지

경사 하강 (Gradient Descent)

  • gradient를 나타내는 식을 찾아서 그 식을 통해 한번에 gradient dW를 계산한다.

계산 과정 

  • 임의의 작은 값으로 W를 초기화한다.
  • loss와 gradient를 계산한다.
  • 가중치를 gradient의 반대방향으로 적용해준다.
  • -gradient를 계산한다.
    • gradient는 함수에서 증가하는 방향이다.
    • 우리는 경사를 찾아 최저점에 가야하기 때문에 역방향으로 간다.
  • 이전 모든 스텝의 gradient를 이용해서 매 스텝마다 아래로 내려가는 것
  • W를 업데이트하려면 데이터를 한 번 더 돌아야 한다.
  • *여러 하이퍼파라미터 중 (optimization, regularization, etc..) learning rate를 가장 먼저 찾는다.

numerical gradient

  • 아주 작은 수를 더하면서 변화량을 계산하는 방법
  • debugging : 적은 수로 되는지만 확인하면 되기 때문에 사용한다. 또한 하나하나 뜯어볼 수 있다.

analytic gradient

  • 미분 공식을 사용해 계산하는 방법 
  • 오류가 발생하기 쉽다.
  • 속도가 빠르기에 사용한다.

SGD

  • minibatch로 집합을 나누는 방법
  • 데이터가 많을 때, gradient는 선형계산이기 때문에 연산시간이 많이 소요된다.
  • stochastic한 방법을 계산하면, 샘플 집합으로 나누어 학습하기 때문에 효율적으로 계산할 수 있다.
  • 보통 minibatch는 2의 승수 (32, 64, 128)로 사용한다.
  • minibatch를 이용하면 loss의 전체합의 추정치, gradient의 추정를 계산하게 된다.
  • DNN에서 사용되는 가장 기본적인 학습법

image features

linear classifier = raw 한 이미지를 받아서 사용한다.

  • 이미지의 특징 표현을 계산한다. 이를 결합 (concatenate) 해 하나의 특징 벡터로 만들어 classifier에 입력으로 넣는다.

극좌표계로 특징을 바꾸면 선형으로 만들어 Linear classifier로 문제를 풀 수 있다.

이처럼 어떻게 특징을 변환시켜 문제를 풀 수 있게 할지 생각하는 것이 중요함

  • color histogram
    image

: 색상 값 별로 categorical 하게 분류하는 것 (양동이)

  • HOG
    image

: LOCAL Orientation edges(edge의 방향)를 측정한다.

  8x8로 나누고, 양자화해서 양동이에 넣는다.

  영상인식에 많이 활용하는 특징 벡터

  • Bag Of Words (using visual words)
    image

:문장을 표현할 때 단어의 발생 빈도를 세서 벡터에 활용 시각 단어를 활용한다.

  • 이미지를 임의대로 조각, k-means 등의 알고리즘으로 군집화함 → Edges를 얻는다. → 여러 방향에서 얻은 oriented Edges, 색 등을 포착한 visual words를 codebook이라고 한다.
반응형