본문 바로가기
cs231n

cs231n - Loss function & Optimization

by winston1214 2021. 8. 27.
반응형

 - Loss Function : score의 불만족한 부분을 정량화

- Opimization : Loss function을 최소화하는 파라미터를 찾는 과정

 

Loss function을 설명하기 위해 \( f(x,W) = Wx \)를 통해서 다음 그림과 같은 score를 구하였다.

위 그림과 같이 점수가 나오고 이러한 상태에서 두가지의 loss function에 대해 알아본다.

1. SVM - Hinge Loss 2. Softmax - Cross Entropy Loss

 

## Multiclass SVM Loss

예를 들어 \( (x_{i}, y{i}) \)가 있고, \( x_{i} \)는 이미지, \( y_{i} \)는 label이라고 하자. 이 때, SVM loss는 다음의 식과 같다.

$$ L_{i} = \sum_{j \neq y_{i}} max(0, s_{j} - s_{y_{i}} + 1) $$

이를 Hinge Loss 라고 한다. 위 loss의 의미는 0과 \( s_{j} - s_{y_{i}} + 1 \) 둘 중에 큰 것을 취하겠다라는 의미이다.

여기서 \( s_{j} \)는 잘못된 label의 score, \( s_{y_{i}} \)는 정답값 label의 score, 1은 safety margin이다.

이 loss는 correct score - 1 보다 큰 incorrect label score가 있다면 0보다 크게 된다. 그리고 correct label의 score가 다른 incorrect label의 score보다 1이상 크면 loss는 0이 된다. 

위 그림에서 예를 들어 숫자를 대입해보겠다.

고양이를 예로 들면 cat의 correct score = 3.2이다. 고양이 기준으로 incorrect score는 car = 5.1, frog = -1.7 이 된다.

이를 위 Hinge Loss에 대입하면 

$$ max(0, 5.1-3.2 +1) + max(0,-1.7-3.2+1) = max(0,2.9) + max(0,-3.9) = 2.9 $$

와 같이 loss가 계산된다.

이를 모든 클래스에 대해서 계산하면 각각 cat = 2.9, car = 0, frog = 12.9로 Average Loss = 5.27이 된다.

질문 : weight를 처음엔 매우 작은 수(0에 가까운 수)로 초기화하는데 이 때의 Loss 는?

-> 이는 \( s_{j} , s_{y_{i}} \) 모두 0에 가까운 숫자가 나오므로 output class = 3 일 때, loss = 2가 나오게 되고, average loss = 1 이 나오게 될 것이다.

 

이러한 Loss를 계산하는 Hinge Loss에는 버그가 있다. 이 버그는 다음과 같은 예시로 설명한다.

예를 들어 Loss가 0이 되는 Weight 값을 발견했을 때, 이는 유일한 Weight 값일까?

정답은 그렇지 않다. 

위 그림의 예시에서 자동차를 예측한 score 값의 Loss를 계산하는 것을 보자.

위 그림에서 나온 weight 값으로 score를 계산했을 때, 0+0 = 0으로 loss는 0이 된다. 그럼 위에 있는 weight 값을 2배하면 어떤 Loss가 나올까? 실제로 계산하면 이 값도 loss = 0이 된다.

따라서 weight 값이 unique 하지 않다는 것을 증명이 되었다.

 

## Weight Regularization

Weight가 unique한 값을 갖기 위해 Weight Regularization이라는 개념을 도입한다.

Weight Regularization은 weight 가 얼마나 좋은지 측정하는 역할을 한다.

자세히 설명하기 전에 Weight Regularization을 추가한 Loss를 보자.

$$ L_{i} = \frac{1}{N}\sum^{N}_{i=1}  \sum_{j \neq y_{i}} max(0, f(x_{i};W)_{j} - f(x_{i};W)_{y_{i}} + 1) + \lambda R(W) $$

\( \lambda R(W) \) 이전의 부분을 data loss라고 하고 이는 학습용 데이터들의 최적화를 위한 loss 이고 그리고 regularization loss는 test 쪽에서 일반화를 위한 loss이다. 따라서 이 상반된 두 loss들이 (강의의 표현을 인용하자면) 싸우는 것을 통해 가장 데이터에 가장 알맞고 최적화된 weight 값을 구하는 것이다.

본 강의에선 이를 A way of trading off training loss and generalization loss on test set 이라고 표현한다.

보통 사용되는 Regularization 방법은 L1, L2, Elastic 방법이 사용된다. Elastic은 L1과 L2를 더한 것으로 생각할 수 있다.

식은 다음과 같다.

$$ L1 : R(W) = \sum_{k} \sum_{l} \mid W_{k,l} \mid $$

$$ L2 : R(W) = \sum_{k} \sum_{l} W^{2}_{k,l} $$

$$ Elastic : R(W) = \sum_{k} \sum_{l} \beta W^{2}_{k,l} + \mid W_{k,l} \mid $$

여기서 L2 regularization에 대해서 보자. L2 Regularization의 motivation은 다음과 같은 예시로 설명한다.

$$ x = [1,1,1,1] $$

$$ w_{1} = [1,0,0,0] $$

$$ w_{2} = [0.25,0.25,0.25,0.25] $$

$$ w_{1}^{T}x = w_{2}^{T}x = 1 $$

이러한 weight 를 가질 때 regularization은 어떤 weight를 더 선호할까? 바로 \( w_{2} \) 이다. 왜냐하면 모든 x 값에 대해서 weight 값의 영향을 받기 때문이다. L2 Regularization은 weight를 가능한 최대로 spread out 하여 모든 input feature에 영향을 주길 원한다. 

 

## Softmax Classifier(Multinomial Logistic Regression)

softmax classifier의 score는 class를 log화한 확률이라고 말한다. 이를 수식으로 표현하면 다음과 같다.

$$ P(Y = k \mid X = x_{i}) = \frac{e^{sk}} {\sum_{j} e^{sj}} $$

즉, 이 식에서 하고자 하는 목표는 log의 확률을 최대화 하는 것이다. 정확한 클래스의 -log의 확률을 최소화 하자는 의미이다. 결과적으로는 다음과 같은 수식이 도출이 된다.

$$ L_{i} = -log( \frac{e^{sy_{i}}}{\sum_{j} e^{sj}} $$

여기서 log를 취하는 이유는 수학적으로 좀 더 편리하기 때문에 사용하는 것이다.

이러한 loss를 예를 들어 설명하겠다.

정규화하지 않은 log 확률은 파란색 박스에 있는 값이고, 이를 확률로 나타내기 위해서 exponential을 씌워주면 빨간색 박스에 있는 값과 같다. 이를 정규화 시켜주면 초록색 값처럼 된다. 이렇게 정규화를 시켜주면 하나의 확률처럼 값이 나타나게 된다. 그리고 이러한 확률 값에 -log를 씌운다. 예를 들어 고양이일 확률 값에 \( -log(0.13) = 0.89 \) 처리를 하여서 loss를 구한다. 

이러한 cross entropy loss의 최소값은 0이고 최대값은 무한대가 된다. 만약에 클래스를 아주 정확하게 맞춘다하면 loss는 0에 가까워지게 되고, 만약에 아주 형편없이 맞춘다면 loss는 무한대에 가까워질 것이다. 

## Hinge Loss vs Cross Entropy

Hinge Loss vs Hinge Loss

만약에 정답값이 그림에서 파란색으로 칠해진 내부 상자의 값이라고 하자. 그러고 이 값에 대한 score를 추출한다.

-2.85, 0.86, 0.28 과 같이 나온다. 

그림에서 보이는 바와 같이 Hinge Loss는 1.58 이라는 loss 가 나오고 Cross Entropy Loss는 0.452라는 값이 나온다.

만약에 ground truth의 score값은 유지되고, 다른 score 값의 차이가 커지거나 작아지면 어떻게 될까?

ex) [10,-2,3], [10,9,9], [10,-100,-100]

SVM의 Hinge Loss 같은 경우 거의 변화하지 않고, CrossEntropy는 모든 score를 다 고려하기 때문에 변화한다. 

즉, Hinge은 다른 score에 변화에 둔감하고, Cross Entropy는 민감하여 변화가 크다. 

 

## Optimization

Optimization은 Loss를 최소화하는 weight 를 찾아가는 과정이다.

최적화를 하기 위한 전략 중 절대로 해서는 안될 전략 중 하난 Random Search 이다.

Optimization은 산속에서 눈을 가린채 최저점을 찾아가는 것과 동일한데, Random Search는 산 속에서 여기저기 순간이동해가면서 최저점을 찾는 것과 동일한 방식이기 때문이다. 이는 매우 비효율적이다.

이러한 opitmization은 어떤 전략을 활용하면 좋을까?

전략 중 하난 Follow the slope이다. 미분을 통해서 기울기 vector를 구하면서 기울기의 최소값을 찾아나가는 것이다.

이를 실제 숫자를 대입해서 설명을 해보겠다.

Gradient 

현재 W라는 값이 있을 때, 그 값에 h라는 변화량을 더하여 미분을 한 값을 의미한다.

Gradient는 W+h 에서 한 값에 0.0001을 더한 값에 loss의 변화: f(x+h) 원래 loss : f(x) 를 뺀 것을 h로 나눠준 것이다. 

여기서 gradient가 음수라는 것은 내려가는 방향으로 기울기가 생성되어 있는 것이고, 양수는 그 반대이다. 

하지만 이런 방식으로 계산하게 되면 근사치로 값을 예측하게 되고, test가 매우 느리다는 단점을 갖게 된다.

이 방식을 Gradient Descent라고 하고 이러한 Gradient Descent는 다음과 같은 로직으로 weight를 update 하게 된다.

while True:
	weights_grad = evalutate_gradient(loss_fun,data,weights)
	weights += -step_size * weights_grad

여기서 step_size는 learning_rate이다. 미분으로 구한 weight의 gradient 값을 learning rate를 곱한 값에 음수를 씌워서 weight를 업데이트 하는 것이다.

 

## SGD(Sthochastic Gradient Descent)

위에서 본 Gradient Descent는 전체 데이터 모두를 활용하여 gradient를 계산하고 weight를 업데이트하는 것이다. 그러다보면 데이터의 값이 많아지면 계산량이 많아질 수가 없다. 따라서 Sthochastic Gradient Descent, SGD는 배치 즉, 데이터의 일부분만을 샘플링하여 계산하고 weight 를 업데이트 하는 것이다. 

SGD loss

이러한 미니배치 확률적 경사하강법은 loss가 튀긴 하지만 결국 점점 최저점을 향해 수렴하는 것을 볼 수 있다. 

자세한 Optimizer는

2021.08.14 - [딥러닝 기초] - Advanced Optimizer than SGD

 

Advanced Optimizer than SGD

본 글은 https://www.youtube.com/watch?v=a5R4gL1ObP8&list=PLSAJwo7mw8jn8iaXwT4MqLbZnS-LJwnBd&index=16 위 동영상을 바탕으로 하였습니다. ## Batch Stochastic Gradient Descent Gradient Descent 를 식으로..

bigdata-analyst.tistory.com

에서 미리 확인할 수 있다.

 

 

반응형

'cs231n' 카테고리의 다른 글

cs231n - Backpropogation and NN part1  (0) 2021.08.30
cs231n - Image Classification  (0) 2021.08.22

댓글