Loss Function

현재의 Classifer가 주어진 Dataset에 대하여 얼마나 좋은지 나타내는 함수



예시) Linear classifier

3개의 training example, 3개의 class


이전에도 설명했듯이, f(x, W) = xW + b (b = bias, W = weight of parameters)



prob\GT    cat    car    frog

cat            3.2    1.3     2.2

car            5.1    4.9     2.5

frog         -1.7    2.0    -3.1


GT들은 각각 3.2, 4.9, -3.1이다.



Multiclass SVM Loss 구하기


각각 개별에 대한 Loss 구하는 방법

foreach true_negative in true_negatives:

  max = max(0, true_negative - GT + 1)


cat-cat의 loss는 2.9


전체에 대한 Loss 구하는 방법

  구해진 Loss들의 합에서 N을 나눈 값: Loss over Full dataset (Average)



Q. Loss가 0인 Weight값을 찾았다면, W는 유니크한 값인가?

A. Unique하지 않다. 2W도 Loss가 0이다.


Car에 대한 Loss가 0인것으로부터 생각할 수 있음


Softmax Classifier


초기에 주어진 Unnormalized log probability가


cat

cat          3.2

car          5.1

frog        -1.7


일 때, 각 probability에 exponential을 취해서 unnormalized probability를 생성


cat        e^X

cat          3.2        24.5    

car          5.1        164.0

frog        -1.7        0.18


각 e^X 값의 비중이 얼마나 차지하는지 계산하여 probability 생성


cat        e^X        probability

cat          3.2        24.5        0.13

car          5.1        164.0       0.87

frog        -1.7        0.18        0.00


실제 probability는 -log(probability)을 취함으로써 얻어짐


cat        e^X        probability        real_probabliity

cat          3.2        24.5        0.13                    0.89

car          5.1        164.0       0.87

frog        -1.7        0.18        0.00


Q. 왜 이렇게 하는가?

A. Cost function의 미분값을 convex하게 만들어주기 위해서


Softmax vs SVM


Hinge loss 를 제거하여 0-확률 문제를 제거함



Optimization

Gradient descent

  

epoch와 Learning rate에 관계에 중요한 역할을 가짐


Convex function에 최적의 값을 찾아주는 것을 보장 (Non-convex할 경우 Local minimum에 빠짐)

대부분의 vision problem이 non-convex임


Stochastic Gradient Descent

Q. Gradient descent를 적용하기에는 데이터셋이 너무 큰 경우가 존재하는데 어떻게 하는가?

A. Mini-batch를 사용해서 Gradient descent를 수행함.

    단, minibatch는 랜덤하게 뽑고, shuffle된 값이기 때문에 weight를 정해주어야 함.


Mini-batch를 수행하는 주기를 Epoch라고 함. (pytorch에서는 DataLoader 함수를 사용하고, iteration 시킴)


Learning rate를 설정하는 방법


Gradient descent oscillations

높을 수록 Curve를 잘 타서 Local minimum에서 빠져나올 수 있음.

단, 높은 LR은 변화에 민감해서 Loss의 최소값과 최대값 사이를 크게 진동하는 경향을 보임.

낮을 수록 안정적으로 수렴, Epoch에 따라서 LR을 조절해줄 필요가 있음 (점점 낮게, 보통 이니셜은 0.1에서 점차 줄임)


적절하게 LR을 조절하면, 최종적으로 Loss가 어느 정도에 수렴하게 됨 (좋은 알고리즘의 경우 Loss가 거의 0에 수렴)



How to set the Hyperparameter

1. Dataset(전체를 Training set으로 퉁침)에 맞는 hyperparameter를 찾는다 (문제: Training data에 대해서만 완벽함)

2. Dataset을 training set과 test set으로 구별하고, hyperparameter를 찾는다.

    (과제 했던 것 처럼 trainloader와 testloader를 따로 두는 방법, 문제: 새로운 데이터의 결과가 어떻게 나올지 모름)

3. dataset을 training set, validation set, test set으로 구별하고, validation set의 결과가 좋은 hyperparameter를 찾는다.

    (Training과 Validating을 분리하는 것이 중점. 이 때, Validation set은 Train에 사용될 수 없음.)

4. Dataset을 잘개 쪼개서 Fold로 만들고 각각의 Fold에 대해 Validation set으로 삼음, 3번과 동일하게 Hyperparameter를 찾는다.

    (작은 데이터셋에 유용하지만 딥러닝에서는 잘 안쓰임)