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를 찾는다.
(작은 데이터셋에 유용하지만 딥러닝에서는 잘 안쓰임)
'Research & Development > Machine Learning' 카테고리의 다른 글
[컴퓨터비전] Exploring CNN Architecture (0) | 2019.06.21 |
---|---|
[컴퓨터비전] Backpropagation (0) | 2019.06.21 |
[컴퓨터비전] Neural Network and CNN (0) | 2019.06.21 |
[컴퓨터비전] Recognition and Bag of words (0) | 2019.05.19 |
[컴퓨터비전] Supervised Learning (0) | 2019.05.16 |