Deep Learning/CS231N

[CS231N] Loss function & Optimization (2)

언킴 2021. 7. 5. 17:24
반응형

앞 내용에 이어서 이번에는 Loss function 중에서 softmax를 다뤄볼 것이다. 

각 score를 확률값으로 바라볼 수 있을 것이다. $P(Y\ =\ k\ |X\ =\ x_{i})$ 는 $X=x_{i}$일 때 $Y = k$로 k라는 class에 속할 확률값을 찾는 것이며, 이러한 값이 Likelihood가 된다. 

$\Sigma_{j}e^{sj}$ = 모든 score의 합

$e^{sk}$ 는 k class 의 score

Maximize loglikelihood는 가장 최대가 되는 값을 찾는 것이기 때문에 그 값에 대해 -1 을 곱해줘서 최솟값을 찾는 loss function 으로 만들 수 있다. 그리고 MLE는 각 확률값을 곱하여 도출하는데 이 부분에서 log를 취해주면 곱을 덧셈으로 바꿀 수 있기 때문에 계산하기에 용이하다. softmax 함수를 적용하면 0~1사이의 확률값으로 결과값이 도출된다.

 

 

 

SVM vs Cross-entropy loss (Softmax)

두 loss function 을 비교하면 위 데이터의 경우 softmax 값이 더 낮은 loss를 가진다 (조금더 정답에 가깝다는 뜻) 하지만 SVM의 경우 작은 변화에 대해서는 margin보다 작을 경우 값의 변화가 없지만, Softmax인 경우 직접적인 영향을 미치게 된다. 

 

 

Optimization 

Random Search : 임의로 가중치를 선택하여 이 가중치에 대한 loss를 확인해보는 것

import numpy as np

bestloss = float('inf')

for num in xrange(1000):
    W = np.random.randn(10, 3073) * 0.0001
    loss = L(x_train, y_train, W)
    if loss < bestloss:
        bestloss = loss
        bestW = W
    print('in attempt %d the loss was %f, best %f' %(num, loss, bestloss))

score = Wbest.dot(x_test)

y_pred = np.argmax(score, axis = 0)
np.mean(y_pred == y_test)

 

Gradient Descent 

loss function 을 미분하여 그 값이 0에 가까워지도록 점점 경사를 내려가면서 탐색하는 방법이다. 현재 w값에 대해 loss를 계산하고 w의 각 차원에서 h만큼 움직여 그 때의 loss를 계산한다 w의 loss와 w + h의 loss를 비교하여 gradient를 구할 수 있다. 

GD

# 수치적으로 GD를 계산

import numpy as np

def eval_numerical_gradient(f, x):
    fx = f(x)
    grad = np.zeros(x.shape)
    h = 0.00001

    it = np.nditer(x, flags = ['multi_index'], op_flags = ['readwrite'])
    while not it.finished:
        ix = it.multi_index
        old_value = x[ix]
        x[ix]= old_value + h
        fxh = f(x)
        x[ix] = old_value

        grad[ix] = (fxh - fx) / h
        it.iternext()

    return grad

h가 아주 작은 값이라는 가정 하에 gradient를 추정한 것이고, 각 차원에 대해서 반복하기 때문에 계산하는데 너무 오래걸리는 문제로 인해 실제로는 사용하지 않는다. 그렇기 때문에 해석학적으로 접근해 미분을 통하여 gradient를 계산한다. Gradient Descent 에 대해서는 다음에 다뤄볼 것이다.