juuuding

[CS231n] Lecture 3. Loss Functions and Optimization (1) 본문

인공지능/cs231n

[CS231n] Lecture 3. Loss Functions and Optimization (1)

jiuuu 2023. 12. 7. 22:21

 Loss Function

 

 다음과 같은 3가지 class의 훈련 예제가 있다고 가정하자. 그리고 아래의 숫자는 해당 사진에 대한 각 class의 score이다. 

 

그림1

 

 loss function은 우리가 가진 classifier가 얼마나 잘 작동하는지를 말해준다. 앞으로 loss function을 l로 표현할 것인데 이 식에서 image는 x로, target인 label은 y로 표현된다. 아래의 식을 해석하면 loss는 각 image에서 우리의 classifier가 예측한 결과에 대한 loss 값에 대해 평균을 낸 것이다. 

 

loss function

 

 이러한 loss를 계산하는 두가지 방법 SVM, Softmax 에 대해 알아볼 것이다. 참고로 다음 표현은 우리가 가진 classifier로 한 image에 대해 각 class의 score을 간단하게 나타낸 식이다. 

 

score

 

 

[Multiclass SVM loss]

 SVM loss는 다음과 같이 표현할 수 있다. 

 

SVM loss

 

 이 식의 의미를 설명하자면, classifier을 가지고 우선 이미지들에 대한 각 class의 score 값을 구한다. 예를 들어 cat image에 대한 class들의 score가 각각 cat 3.2, car 5.1, frog -1.7이면, 우리의 classifier이 고양이 사진을 보고 고양이 같다고 생각한 점수가 3.2, 자동차 같다고 생각한 점수가 5.1, 개구리 같다고 생각한 점수가 -1.7이라는 것이다. 우리는 이런 결과를 가지고 classifier의 성능이 좋은지 판단을 해야하기 때문에 이것으로 loss를 계산해야한다. loss 값을 계산할 때는 true class를 제외하고 <other class' score - true class' score + 1 (safety margin)>을 하여 이 값이 0보다 크다면 나온 결과 값으로, 작다면 0으로 계산하여 이를 모두 더하여 classifier의 한 이미지에 대한 loss_i 값을 구한다. 여기서 safety margin을 더해주는 이유는 loss 값에 대한 오차를 줄이기 위해서다. 이를 그래프로 나타내면 다음과 같고 그래프 모양에서 이름 붙여 "hinge loss"라고 한다. 이 그래프를 보면 true class의 score가 높아질수록 safety margin에 도달하기 전까지 loss는 선형적으로 감소하는 것을 알 수 있다.

 

 

 위 그림을 예로 들어 classifier가 계산해낸 score을 가지고 각 이미지에 대한 loss_i 를 계산해보자.

① cat image

 사진이 고양이일 때 우리의 classifier은 cat 3.2, car 5.1, frog -1.7이라는 score 값을 계산해냈다. cat image에 대한 loss_i를 계산하기 위해 우선 cat과 car의 score을 비교해보겠다. 5.1-3.2+1 = 2.9 라는 결과가 나온다. 2.9는 0보다 크니까 cat image에 대해 car에서 발생한 loss는 2.9다. 다음으로 cat과 frog의 score을 비교해보면, -1.7-3.2+1=-3.9고 -3.9는 0보다 작으므로 여기서 발생한 loss는 0이다. 그리고 이 0을 car에서 발생한 loss인 2.9와 더하면 2.9라는 결과가 나온다. 이것이 cat image에 대한 loss_i 값이다. 

 

② car image

 이번엔 사진이 자동차일 때 발생하는 loss_i를 구해보자. cat과 car score을 비교하면 1.3-4.9+1=-2.6, car과 frog를 비교하면 2.0-4.9+1=-1.9이고 이 두 값 모두 0보다 작은 값을 가지기 때문에 각각 0인 loss가 발생한다. 그리고 0+0=0이기 때문에 car image에 대한 loss_i는 0이라고 할 수 있다.

 

③ frog image

 마지막으로 사진이 개구리일 때 발생하는 loss_i를 구해보자. 우선 cat과 frog를 비교하면 2.2-(-3.1)+1=6.3이고 이것은 0보다 크기 때문에 frog image에 대해 cat에서 발생한 loss는 6.3이다. 다음으로 car과 frog를 비교하면 2.5-(-3.1)+1=6.6이고 0보다 큰 값이기 때문에 car에서 발생한 loss는 6.6이다. 그리고 6.3+6.6을 해주면 12.9라는 결과가 나온다. 

 

 정리하자면 cat image에서 발생한 loss_i 2.9, car image에서 발생한 loss_i 0, frog image에서 발생한 loss_i 12.9를 계산하였다. 그리고 최종적으로 이 classifier에 대한 loss를 구하려면 이 loss_i들의 평균을 내주어야 한다. 그래서 (2.9+0+12.9)/3을 하면 5.27이라는 결과가 나타난다. 이것이 우리가 구하고자 한 SVM loss로 계산한 이 classifier의 loss 값이다. 이러한 loss 구하는 방법을 수식으로 표현하면 다음과 같다.

 

loss

 

아래는 SVM loss에 대해 이해를 돕기 위한 몇가지 질문이다. 

 

Q1) car scores를 조금 바꾸면 loss가 어떻게 되나?

 - 위의 예제에서는 car class의 score이 다른 true class(in cat, frog image) / false(in car image)보다 훨씬 크기 때문에 car score를 조금 바꾸는 것은 loss 값에 영향을 미치지 않는다. 

 

Q2) loss의 최소 값과 최대 값은?

 - 최소 0, 최대 무한대

 

Q3) w을 너무 작게 설정하여 모든 score이 거의 0이라면 loss는 어떻게 되나?

 - 모든 score가 0이라면 loss_i는 class개수(C)-1 (true class는 포함하지 않기 때문에 전체 개수에서 빼주는 것). 모든 image에 대해 loss_i가 C-1을 값을 가질 것이니, 이것의 평균도 C-1. 따라서 최종 loss는 C-1이 된다. 

 

Q4) loss를 계산할 때 true class까지 포함하여 계산하면 어떤 결과가 나오나?

 - true class의 loss_i는 무조건 margin safety 값인 1이 나온다. 그렇기 때문에 모든 loss_i에서 1이 증가하며, 평균인 최종 loss도 원래 loss 값에서 1 증가한다. 

 

Q5) loss를 구할 때 합 대신 평균을 사용하면 어떻게 되나?

 - loss function이 상수 값으로 전체적으로 rescale 되기 때문에 상관 없다. 단지 크기가 변할 뿐이고 영향을 미치지는 않는다. 왜냐하면 우리는 score 값이 몇인지 신경쓰는 것이 아니기 때문이다. 

 

Q6) loss_i를 구할 때 아래의 식을 사용하면 어떻게 되나?

 - loss 값이 조금 더 극단적으로 나타난다. 작은 loss가 발생하여도 아주 큰 loss가 발생한 듯한 효과를 줄 수 있다. 

 

 앞서 본 SVM loss를 코드로 표현하면 다음과 같다. 

 

def L_i_vectorized(x,y,W):
    scores=W.dot(x)
    margins=np.maximum(0,scores-scores[y]+1)
    margins[y]=0
    loss_i=np.sum(margins)
    return loss_i

 

 만약 loss를 최소화하는 w는 오직 하나뿐일까? 아니다. 예를 들어 loss를 0으로 만드는 w 값을 w1이라고 표현하자. w1을 2배 시키면 모든 score이 2배로 증가할 것인데, 이렇게 2배로 증가된 score로 loss 값을 계산해도 loss가 0일 수 있다. 

 

 

w 값은 unique 한가? -> No

 

 training data에 딱 맞는 모델을 생성하면 아래와 같은 그래프가 나온다. 

 

overfitting

 

 하지만 model을 이렇게 생성하면 새로운 data에 잘 맞지 않을 가능성이 크다. 그래프에서 초록색으로 표시된 것이 새로운 data인데, 기존 model이 새 data에 맞지 않는 모습을 볼 수 있다. 

 

 

 그렇기 때문에 다음과 같이 model을 처음 생성할 때 조금 더 단순하게 하는 게 새 data에 잘 적용될 가능성이 높다.

 

 

  model을 만들 때 training data에 어느정도 맞게 하되, 새로운 data에도 잘 적용될 수 있는 model을 만드는 것이 중요하다.

 위의 그래프에서 확인할 수 있듯이 우리의 model이 복잡할수록 새로운 data에 잘 맞을 확률이 줄고 간단할수록 새 data에 잘 맞는다. 하지만 모델을 단순하게 만들면 training data에 대한 loss 값이 이전보다 조금 더 증가할 것이다. 마찬가지로 training data에 딱 맞게 만들면 단순한 모델보다는 loss가 작을 것이다. loss 값만 보면 파란색 model이 더 좋은가?라고 생각이 들 수 있다. 하지만 이는 training data에만 한정적으로 좋은 것이기 때문에, 새로운 data에게는 잘 적용되지 않아 좋다고 할 수 없다.

 이러한 loss 값에 대한 문제와 실제 새로운 data에 잘 적용되는 것에 대한 균형을 맞추기 위해 regularization이라는 개념을 도입할 수 있다. 

 

 위는 regularization을 도입한 loss식이다. regularization은 일종의 penalty를 부여하는 방식이다. model이 복잡할수록 loss 값에 큰 값을 더해주어 loss가 커지도록 만들어주는 것이다. 즉 training data에 잘 맞는 복잡한 model은 loss값이 낮은데, 이 loss 값에 regularization을 해주어 loss에 penalty를 준다. 그래서 더 합리적으로 model을 선택할 수 있도록 하는 것이다. "이 복잡한 모델을 사용하고 싶다면, 이 패널티를 극복해야 한다!"는 아이디어라고 할 수 있다. 

 이러한 regularization에는 다음과 같은 여러 종류의 regularization가 있다. 

 

 

 L2 regularization의 주요 아이디어는 w의 euclidean norm에 패널티를 주는 것이다. L1 regularization은 L1 norm으로 w에 패널티를 부과하는 것이다. Elastic은 L1과 L2를 합친 것이고, Max norm은 L1, L2 대신 max norm을 사용하는 것이다. 

 다음으로 L2 regularization이 모델이 복잡성을 어떻게 측정할 수 있냐에 대해 알아보자. 아래와 같은 벡터 x와 w1, w2 벡터가 있다고 가정하자.

 

linear classification을 할 때 x와 w를 내적하는데, x와 w1의 내적 값과 x와 w2의 내적 값을 서로 같기 때문에 linear classification 관점에서는 w1과 w2가 같다. 여기서 문제는 L2 regularization이 어떤 w를 선호하느냐인데, 결론적으로는 w2를 더 선호한다. L2 regularization에서는 w2가 더 norm이 작기 때문이다. L2는 분류기의 복잡도를 w1과 w2 중 어떤 것이 더 coarse한지를 측정한다. 따라서 L2는 좀 더 매끄러운 w2를 선호하게 된다. L1의 경우는 정반대이다. L1은 w1을 더 선호하며, w의 0에 개수에 따라 모델의 복잡도를 다룬다. 이처럼 복잡도를 어떻게 정의하는지, 복잡도를 어떻게 측정하는지는 우리가 어떤 문제를 가지고 있느냐에 따라 다르기 떄문에 이를 반드시 고민해야한다.

 

 

[Softmax classifier]

 image에 대해 classifier가 생성한 score은 "unnormalized log of probabilities of the classes"다. 즉 w와 x를 가지고 만든 classifier로 계산한 값이 score이다.

 

 이 score을 가지고 위의 식에 대입하여 계산하면 softmax classifier이다. 위의 분수식은 앞으로 알아볼 softmax function이다. softmax function에 의해 계산된 확률 값을 -log 함수에 입력하면 L_i 값을 얻을 수 있다. 

 

 

 이 식은 normalized probabilities를 구하고 이것을 가지고 target class일 확률을 계산하여 -log 함수에 입력하면 L_i를 얻을 수 있다는 의미이다. 아래는 target class가 cat일 때의  L_i이다. 

 

 

아래는 Softmax Classifier에 대해 이해를 돕기 위한 몇가지 질문이다. 

 

Q1) loss의 최소 값과 최대 값은?

 -  최소 0, 최대 무한대 (correct class의 확률이 0일 때)

 

Q2) w을 너무 작게 설정하여 모든 score이 거의 0이라면 loss는 어떻게 되나?

 - 총 class의 개수를 C라고 하면 loss의 값은 logC가 된다. 모든 s가 0이면 exp한 결과가 모두 1이고 이것에 대한 확률을 구하면 1/C가 된다. 이 확률 값을 -log 함수에 입력하면 -log(1/C) = logC 라는 결과가 나온다. 이는 디버깅을 할 때 유용하게 사용되며 만약 logC가 결과로 나오지 않으면 코드에 이상이 있다고 판단할 수 있다.

 

 

[Softmax vs. SVM]

 

SVM & Softmax
Softmax & SVM

 

Q) 한 datapoint를 조금 변경한다고 가정. Softmax와 SVM에는 각각 무슨 일이 발생할까?

 - SVM: car score가 다른 class들보다 훨씬 크다 가정하면 car score가 조금 바뀌어서는 loss값에 아무런 영향을 미치지 않는다. SVM loss 정답 클래스와 다른 클래스의 차이가 얼마나 되는지에만 관심이 있기 때문이다.

 - Softmax: softmax에서의 확률  합은 항상 1이다. 그렇기 때문에 정답 score가 훨씬 큰 상황에서 score이 조금 바뀌어도 loss값이 달라진다. 

 두 case의 차이를 정리하면 SVM은 클래스 간의 차이가 일정 margin을 넘기면 성능 개선에 신경쓰지 않고, Softmax는 더 성능을 좋게하려 한다는 것이다. 

 

다음 글에서 loss 값을 최소화하는 best w를 찾는 방법인 optimization에 대해 알아볼 것이다.