본문 바로가기
  • 비둘기다
  • 비둘기다
  • 비둘기다
AI/Computer Vision

[Computer Vision] cs231n lecture3 - Loss Functions and Optimization

by parzival56 2023. 3. 24.

일반적으로 손실함수에 대해 이야기를 할 때 여러 개의 x와 y가 있다고 가정합니다.

x들은 이미지 분류 사례에서 알고리즘에 대한 입력인 N개의 예입니다. 즉, 이미지들의 실제 픽셀값이 됩니다. 

그리고 y들은 알고리즘이 예측하기를 원하는 것입니다. 주로 레이블이나 대상이라고 부릅니다.

손실함수의 경우에는 x와 가중치 행렬 W를 취하고 이를 통해 y를 예측하는 예측함수를 구성하게 됩니다.

이를 이미지 분류에서는 실제 목표 또는 레이블 y와 함께 함수 f에서 나오는 예측 점수를 가져오고, 해당 훈련에 대한 예측이 얼만 나쁜지에 대한 정량적 값을 제공하는 일부 손실함수를 정의합니다.

이제 최종 손실 L은 데이터셋의 N개의 예시 각각에 대해 전체 데이터셋에 대해 합산된 손실값의 평균입니다.

 

○ 다중 클래스 SVM 손실

 

다중 클래스를 처리하기 위한 일반화

모든 개별 예시에 대한 손실 Li를 계산하는 방식은 실제 범주 yi를 제외하고 모든 범주 y에 대해 합계를 수행한다.

모든 잘못된 범주의 합계를 구한 다음 올바른 범주의 점수와 잘못된 범주의 점수를 비교한다.

올바른 범주의 점수가 잘못된 범주의 점수보다 큰 경우(우리가 1로 설정한 일부 안전 마진만큼 잘못된 점수보다 큰 경우)는 실제 점수가 훨씬 높거나 실제 범주에 대한 점수가 거짓 범주보다 큰 경우 손실은 0이 된다. 그리고 이것을 이미지에 대한 모든 잘못된 범주에 대해 합산을 하면 이 데이터셋에서 한 가지 예시에 대해 최종 손실을 나타내게 된다. 그리고 전체 훈련 데이터셋에 대한 이 손실의 평균을 구할 것이다.

 

이러한 스타일의 손실함수는 hinge loss를 유발하기도 합니다. x축은 s_yi에 해당합니다. (일부 훈련 시의 실제 클래스 점수) y축은 손실입니다. 그래프에서 볼 수 있듯이 실제 범주에 대한 점수가 증가함에 따라 손실은 마진 이상이 될 정도에 도달할 때까지 선형으로 감소할 것이고, 이후에는 이 예시를 올바르게 분류했기 때문에 손실이 0이 될 것입니다. 

 

질문)
1. s랑 s_yi는 도대체 무엇인가?
-> s는 분류기에서 나오는 클래스의 예상 점수이다. 만약 고양이 클래스와 개 클래스가 있다고 할 때 s1은 고양이, s2는 개의 점수가 되는 것이다. yi는 어떤 정수인 예제에 대한 정답 레이블의 범주이다. 그러면 s_yi는 훈련셋의 i번째 예시에 대한 실제 클래스의 점수에 해당한다.

2. 도대체 이 컴퓨팅은 무엇인가?
-> 손실이 말하는 것은 정답에 해당하는 점수가 다른 모든 점수보다 훨씬 높으면 옳다는 것이다. 높다는 것은 안전 마진 이상으로 높아야 하며 그정도로 다른 점수들과 차이가 나지 않을 경우 약간의 손실이 발생할 것이다.

 

위와 같이 고양이를 예로 들었을 때 정답에 해당하는 고양이의 점수는 3.2입니다. 고양이는 첫 번째에서는 정답이기에 자동차와 개구리에 대해서만 비교가 이루어지면 됩니다. 먼저 자동차와 고양이를 비교하면 위 SVM 공식에 따라 5.1-3.2+1이 되면서 손실이 생깁니다. 그래서 고양이라는 클래스에서 자동차와 비교한 예시에서 2.9의 손실이 발생한다는 것입니다.

그리고 개구리와도 비교를 해보면 고양이가 개구리보다 1보다 훨씬 큰 것을 알 수 있습니다. 일정 마진보다 더 크기에 손실은 0이 됩니다. 결국 한 클래스에 대한 최종적인 값은 모든 손실값을 더해준 것이기에 2.9+0을 하여 고양이 클래스의 최종 손실은 2.9가 됩니다. 

즉, 2.9는 우리가 만든 모델이 하나의 훈련 예시에 대해 얼마나 잘못되었는지에 대한 정랼적인 척도를 제시해 주는 것이라고 보면 됩니다. 

 

위와 같이 자동차와 개구리의 클래스도 계산하면 자동차 클래스는 정답 점수가 다른 모든 점수보다 1이상 높기 때문에 총 손실이 0, 개구리는 공식에 대입하여 계산하였을 때 총 손실이 12.9가 됩니다.

그렇다면 최종적인 손실은 모든 손실의 평균값이기 때문에 (2.9+0+12.9)/3을 하면 5.27이 나오게 되고, 이것은 모델이 전체 데이터셋에 대해 얼마나 성능이 안 좋은지를 정량적으로 나타냅니다.

 

질문)
1. +1은 언제 선택해주나요? (고양이를 계산할 때는 다 +1 했는데 개구리 계산할 때는 +1을 적용하지 않음)
-> +1을 해주는 것은 임의적인 선택이다. 왜냐하면 우리는 실제로 이 손실함수에서는 점수의 절대적인 값에 대해 신경 쓰지 않고 점수 간의 상대적인 차이에만 관심이 있기 때문이다. 정답 점수가 이외의 점수보다 훨씬 큰지 안 큰지에만 관심이 있다. 따라서 이 상수는 W가 변함에 따라 W의 규모의 변동과 같이 같은 규모로 지워지고 취소됩니다.

 

▶교수의 질문

1. 만약 자동차의 점수가 바뀐다면 손실에는 어떤 영향을 미칠까요?
-> 결론부터 말하자면 자동차의 점수가 바뀌어도 손실은 변하지 않는다. 왜냐하면 SVM에서는 정답 점수가 다른 것들보다 1 이상 더 큰지에만 집중하는데 자동차의 점수가 정말 드라마틱하게 크게 변하지 않는 한 이미 다른 점수들보다 상당히 큰 격차의 차이가 나기 때문에 손실에는 변화가 없을 것이다.

2. SVM에서 최대/최소 손실은 무엇인가?
-> 최소는 당연히 0이다. 자동차처럼 정답 점수가 훨씬 높아버리면 손실이 0이기 때문이다. 
그러나 hinge loss 그래프에서 알 수 있듯이 정답에 멀어질수록 손실은 무한하게 커질 수 있다. 그래서 최댓값을 무한대.

3. 만약 W의 규모가 너무 작아서 모든 점수들이 0에 가깝고 크기 또한 모두 비슷하다면 손실은 무엇이 되는가?
-> 정답은 전체 클래스의 수 -1이다. 이유는 잘못된 클래스를 모두 반복하면 C에서 클래스-1만큼을 반복하고 각 클래스 내에서 두 개의 s는 동일할 것이기 때문에 처음에 가정한 1이라는 마진 때문에 위의 값을 얻게 된다.
(위 정답은 유용하다고 합니다. 보통 모델을 짜게 되면 결과로 나올 손실에 대해 미리 생각을 해야합니다. 그래서 만약 첫 결과가 C-1이 아니라면 애초에 잘못 짜인 코드라서 수정할 필요가 있기 때문입니다. [첫 결과는 학습을 한 번 한 것이기에 당연히 점수가 굉장히 낮다.])

4. 잘못된 클래스에 대해 SVM을 합산한다고 했는데, 만약 해당 클래스의 손실을 구할 때 정답 클래스 점수까지 포함시키면 어떻게 되는가?
-> 정답은 손실이 1 증가한다. 기존의 공식에 적용하면 max(0, 정답 점수 - 정답 점수 + 1)이기 때문이다.

5. 여기서 합계 대신에 평균을 사용하면 어떻게 되는가? (클래스 별로 계산할 때)
-> 정답은 아무것도 변하지 않는다. 이유는 클래스의 수는 우리가 데이터셋을 정하는 순간 고정되는 값이기에 이는 전체 손실함수를 상수로 재조정하는 것이므로 별다른 영향을 끼치지 않는다. 

6. 만약 max(0, s_j - s_yi)를 제곱하면 아떻게 되는가?
-> 기존에는 비선형의 방식으로 정답과 아닌 것을 나눴기에 이는 완전히 다른 손실함수를 계산하게 될 것이다. 

 

질문)
1. 왜 비제곱 손실 대신에 제곱 손실을 사용하는 것 자체를 고려하였는가?
-> 분류기가 아예 다른 종류의 실수를 저지르는 경우, 분류기가 저지를 수 있는 여러 유형의 실수 사이의 서로 다른 장단점을 어떻게 평가할 수 있겠는가? 예를 들어 제곱 손실의 경우에는 손실값 자체가 비제곱 손실에서의 제곱 분량으로 커진다. 그러면 각각의 손실들을 비교하여 나의 모델을 평가하는 것이 의미가 있겠는가? 
왜냐하면 손실함수는 알고리즘에다가 어떤 유형의 오류에 관심이 있고, 어떤 유형의 오류를 해결해야 하는지를 알려주는 방법이기 때문이다. 

▶교수 질문

1. 전체 데이터셋의 손실을 0으로 만드는 압도적인 W를 찾았다고 가정했을 때 이러한 결과를 낼 수 있는 W는 하나밖에 없는가 아니 더 있는가?
-> 정답은 당연히 더 있을 수 있다. 방금 찾을 W에 예를 들어 2를 곱한다면 원래의 W와는 다르지만 같은 결과를 낼 것이기 때문이다.
이를 만약 위의 예시에 적용한다면 이미 다른 점수들보다 마진 이상 큰 정답 점수는 2W를 사용하면 2*마진 만큼 커지는데 이는 어차피 손실 0이라는 같은 결과를 초래한다. 그렇다면 그냥 W를 사용해도 손실이 0이 나오고, 2W를 사용해도 손실이 0이 나온다면 알맞은 W를 계속 찾아가는 손실함수의 입장에서는 무엇을 선택해야 하는가?
이러한 궁금증이 나오는 이유는 데이터 측면에서 손실만 기록하고 훈련 데이터에 맞는 W를 찾으려고 시도해야 한다고 분류자에게만 지시했기 때문이다. 그러나 실제로는 훈련 데이터를 맞추는데 그다지 신경을 쓰지 않는다. 머신 러닝의 요점은 훈련 데이터를 사용하여 일부 분류자를 찾은 다음 이를 테스트 데이터에 적용한다는 것이다. 그래서 훈련 데이터에는 신경 쓰지 않고 테스트 데이터에 대한 이 분류기의 성능에 대해 정말로 신경을 쓴다. 

예를 들어 훈련 데이터를 가지고 힘들게 학습을 시켜 완벽하게 비선형으로 분류한 것이 파란색이라고 가정하겠습니다. 그러나 만약 실제 테스트 데이터는 초록색이라면 훈련 데이터는 아무런 의미를 갖지 않게 되는 것입니다. 

이러한 문제점을 보완하는 개념이 정규화(regularization)입니다. 

간단하게 설명하자면 마지막의 정규화 항을 통해 위의 푸른 그래프 선이 녹색선으로 바뀝니다.

위에서 볼 수 있듯이 Data Loss를 도출하는 앞의 식을 통해 훈련 데이터와의 예측을 모델을 통해 도출하고, 그 뒤에 붙는 정규화 수식을 통해 테스트 데이터까지 바로 보는 범용성을 갖추게 되는 것입니다. 정규화는 전체 과정을 간소화시켜주는 작업이기 때문에 R의 조작은 머신러닝에 있어서 필요한 작업입니다.  

람다 R(W)항이 하는 역할을 정리하면 소프트 페널티라고 할 수 있습니다. 모델을 가지고 머신 러닝을 진행하는 데에는 크게 두 가지 방향이 있는데 하나는 모델 자체를 복잡성을 해결할 수 없게 제약을 걸거나 복잡한 문제를 해결할 수 있게 만들지만 이러한 소프트 페널티를 걸면서 패널티를 통과한 것들에 대해 해석을 하는 것입니다. 그러나 우리는 더욱 정교하고 정확한 것을 원하기 때문에 후자가 매력적인 선택지가 될 수밖에 없는 것입니다.  

 

● 정규화

바로 위의 문제처럼 unique 한 W의 값을 찾아주기 위해 도입하는 것이 정규화입니다.

람다는 hyper parameter로 regularization strength를 의미합니다. 그리고 뒤에 R(W)는 W가 전체에 대해 얼마나 괜찮은지를 나타냅니다. 

위의 가중치 정규화 식을 보면 1/N부터 람다식 이전까지를 Data Loss라고 불렀고 이는 훈련 데이터에 100% 초점을 맞춘 식이고, 정규화 식은 테스트 데이터에 초점을 맞춘 식이기 때문에 두 가지 식이 부딪히면서 양측에 다 맞는 W를 찾는 것이 위 식이 의미하는 바입니다. 

L2 정규화랑 가중치 감쇠가 가장 널리 쓰임. 

L2 정규화는 diffuse over everything을 선호한다고 합니다. 예를 들어 W1은 [1, 0, 0, 0]이고, W2는 [0.25, 0.25, 0.25, 0.25] 일 때 x가 [1, 1, 1, 1]이라면 W1과 W2 모두 x에 대한 값이 1이 됩니다. 그럴 때 L2 정규화에서는 값이 더 넓게 분포되어 있는 W2를 선호한다는 것입니다. 

 

○ SoftMax Classifier

소프트맥스 분류기는 Multinomial Logistic Regression이라고 부르기도 합니다. 

이도 결국은 분류기이기 때문에 각 클래스마다 score을 도출하게 됩니다. 여기서 scores는 클래스의 정규화되지 않은 로그 확률을 의미합니다. 

이 분류기의 목적은 제대로 된 경우에서의 로그 확률을 극대화시키는 것입니다. 정확히 말하자면 L_i 식에서의 -log값을 최소화시키는 것입니다. 그리고 이를 정리한 마지막의 식을 교차 엔트로피 손실(오차)라고 부릅니다.

 

질문)
1. log를 굳이 취하는 이유가 무엇인가요?
-> 수학적인 편리함을 위해서이다.

 

가장 위의 고양이 클래스에서의 점수들에 exp를 취한 후 정규화를 시키면 cat, car, frog 순서대로 값이 0.13, 0.87, 0.00이 나오게 되고 이를 모두 더할 시 값이 1이 되는 확률과 같은 값을 도출하게 됩니다. 그래서 L_i는 고양이에 대해 -log(0.13)이므로 0.89가 해당 분류기에 대한 고양이 클래스의 정답 점수가 되는 것입니다. 

 

위에서 교수님의 질문 중 L_i의 최댓값과 최솟값이 무엇인지 물어봅니다. 해당 답변은 hinge loss의 그래프를 통해 답이 나왔지만 여기서도  -log(x)의 그래프를 그려보면 알 수 있듯이 최솟값은 0이고 최댓값은 무한대라는 것 또한 알 수 있습니다. 

 

위 그림은 같은 W, x_i, 편향에 대해 hinge loss에 의한 SVM과 softmax를 각각 바교한 것입니다. 값의 차이가 나타나는 것을 알 수 있습니다.

이 둘을 단적으로 비교한다면 소프트맥스가 우위에 있다고 할 수 있습니다. 이유는 SVM은 정답 점수와 비교하고자 하는 다른 점수만을 놓고 출력하지만 소프트맥스는 모든 값을 고려하기 때문에 값의 변화 또한 예민하고 비교하기에 적합하다고 할 수 있습니다. 

 

○ 최적화

최적화는 간단히 말해 손실을 최소화시키는 W를 찾아가는 과정입니다. 

최적화를 하는 데 있어서 절대 해서는 안 되는 전략 중 하나는 바로 randomize입니다. 정확히 말하자면 1000개 중 랜덤 하게 선택하는 방식입니다. 이와 같은 방법을 사용하면 정확도가 현저히 떨어지기 때문에 신뢰할 수 없는 방식이 되어버리기 때문입니다. 

 

올바른 전략은 경사를 따라 내려가는 전략입니다. 경사라고 함은 기울기가 있습니다.

흔히 수학에서 말하기를 위와 같은 수식은 1차원에서의 numerical gradient입니다. 구체적인 예시로 살펴보면 다음과 같습니다. 

현재의 가중치와 손실이 다음과 같이 주어지고 W+h도 주어졌을 때 이 값들을 위의 식에 그대로 집어넣어 계산할 수 있습니다. h 같은 경우에는 0.0001로 가정해 주었습니다.

그러나 이 방법에도 단점이 있습니다. 원래의 공식에서도 알 수 있듯이 이는 정확한 값이 아니라 근삿값이기에 조금에 오차가 발생한다는 것입니다. 그리고 평가하는데 매우 오래 걸린다는 단점 또한 있습니다. 

numerical gradient와는 다른 방식도 존재하는데 바로 analytic gradient입니다. 이는 미분을 한다는 차이점이 있습니다.

numerical gradient와 analytic gradient의 장단점을 비교해 보면 먼저 전자는 근삿값에다가 평가도 느리지만 코드를 짜기 매우 쉽다는 점이 있고, 후자의 경우에는 정확하고 빠르지만, 오류가 잦다는 단점이 있습니다. 

 

○ 경사 하강

1. full-batch gradient descent

경사 하강은 위의 코드처럼 손실함수, 데이터와 W를 넣어주면서 정의할 수 있습니다. 밑에 보이는 step_size는 learn rate와 같은 의미입니다. step_size에 -를 붙이는 이유는 gradient만큼 rate를 감소시켜줘야 하기 때문입니다. 

 

2. mini-batch gradient descent

미니 배치 같은 경우에는 앞선 full-batch와는 다르게 전체를 작은 배치들로 쪼개서 배치별로 계산을 거친 후 다른 배치들도 계산하여 계속해서 파라미터를 업데이트시키는 방식입니다. 

다음이 미니 배치 학습의 결과입니다. 시간이 지날수록 점점 손실이 줄어드는 것을 확인할 수 있습니다. 그러나 전체적인 그래프를 보면 중간중간에 지그재그처럼 삐죽한 부분들이 많이 보이는데 그 이유는 예를 들어 128개짜리 배치를 보고 다음 128개짜리로 넘어간다고 했을 때 이전보다 이후의 배치에서 손실이 더 클 수도 있기 때문에 갑작스럽게 올라가는 경우가 생기는 것입니다. 그러나 미니 배치 학습의 특성답게 모든 배치를 보며 업데이트를 시키는 방식이기에 장기적으로 봤을 때는 손실이 줄어드는 것을 볼 수 있습니다. 

위의 그래프는 learning rate를 어떻게 하느냐에 따라 달라지는 손실을 나타낸 것입니다. 먼저 매우 높게 잡아버리면 큰 손실이 발생합니다. 그리고 높게 잡으면 빠르게 손실을 줄지만 최저점까지는 도달하지 못하는 것을 볼 수 있습니다. 그렇다고 낮게 잡아버리면 최저점까지 도달하는 시간이 너무 오래 걸립니다. 그래서 good learning rate를 찾으려고 하는 것이고, 이는 보통 높은데에서 낮게 가면서 찾습니다. 

 

댓글