가중치 W구하는 법
가중치 W를 구하기 위해서는 해당 가중치가 좋은지 나쁜지를 정량화 할 방법이 필요하다. 따라서 가중치의 성능을 파악하기 위해 도입된 것이 바로 손실함수이다. 행렬 W가 될 수 있는 모든 가능의 수 중에서 손실함수가 가장 적은 W를 찾는 것이 가중치 W를 구하는 방법이며, 이를 최적화 과정(optimization)이라 한다.
Loss
Loss는 Data Loss Term의 평균과 Regularization Term의 합으로 이루어져있다. Data loss term은 모델이 데이터에 좀 더 fit할 수 있게 도와주며, Regularization term은 모델을 단순하게 하여 오버피팅되지 않게 한다. Data loss term은 모든 클래스의 loss에 대한 총 합계로 이루어져 있는데, 이 때 loss를 구하기 위해 사용되는 함수가 Loss function이다. Loss Function에는 대표적으로 SVM과 Softmax가 존재한다.
1. Data Loss Term (Loss function)
1-1. Hinge Loss (Multi-class SVM)
이진 SVM의 일반적인 형태로서 이진 SVM과 달리 여러 클래스를 다루며, 그래프 모양이 경첩과 비슷하여 hinge loss라고 한다. hinge loss는 올바른 카테고리의 스코어(s_yi)와 그렇지 않은 카테고리의 스코어(s_j)를 비교하여, 올바른 카테고리의 스코어가 일정 수준(margin) 이상 더 크면 0을 반환한다. 그렇지 않으면, 올바르지 않은 카테고리와 올바른 카테고리의 차(sj - syi: 잘못된 경우 loss가 더 커져야하므로)에 margin을 더한 값이 반환된다. 위 과정을 나머지 클래스(정답이 아닌 클래스)에 대해서도 동일하게 순회하며 이를 모두 더한 값이 hinge loss function의 i번째 output이 된다. 이를 수식으로 나타내면, sigma{max(o, s_j-s_yi+1)}이 되며, output의 i개 카테고리에 대한 합을 N으로 나눠주면, Loss가 되는 것이다.
1-1-1) 예시
모델에 input 이미지를 넣은 결과 다음과 같은 스코어가 나왔다고 가정해보자. 내가 그냥 노트에 끄적거린거라 표가 살짝 헷갈리게 나와있는데, 첫 번째 열부터 순서대로 cat, car, frog에 대한 score이다.
각 카테고리에 대해서 lose들을 각각 구해준다. margin이 1일 때, loss는 각각 2.9, 0, 12.9이 나왔다.
Loss들을 전부 더해서 클래스 수로 나누어주면 최종 Loss를 구할 수 있다.
1-1-2) 특징
-
Loss의 범위
0 <= Loss < positive infinity
정답 스코어가 그렇지 않은 스코어보다 모두 클 경우, Loss는 0이 된다. 반면, 정답이 아닌 스코어가 양의 무한대로 발산하면, Loss는 양의 무한대가 된다.
-
디버깅 전략
모든 스코어 s가 거의 0에 가깝고 값이 서로 비슷하다면 loss는
클래스의 수 - margin
이 된다. C-1개의 클래스를 순회하며 스코어 비교를 하는 과정에서, 비교하는 두 스코어가 거의 비슷하니 결국 margin만 남게 되기 때문이다(s_j - s_yi ≈ 0). 첫 iteration에서의 디버깅 전략으로 유용하게 사용할 수 있으며, 만약 Loss가 C - margin이 아니라면 버그가 있는 것을 확인할 수 있다. -
정답 스코어 조금 바꿔도 Loss 변화 없음
정답 스코어가 충분히 크고, 다른 클래스의 스코어가 낮은 경우, margin의 범위 내에서 정답 스코어가 조금 바뀌어도 Loss의 변화는 없다. 정답 스코어가 그렇지 않은 스코어보다 일정 수준이상 큰지만 체크하기 떄문이다.
-
including j = y_i
정답 클래스도 순회에 포함한다면 어떻게 될까?
-> s_yi - s_yi + margin = margin이므로, Loss가 margin만큼 더 증가한다. -
Loss에서 전체합이 아니라 평균을 사용한다면?
영향을 미치지 않는다. 클래스 수는 어차피 정해져 있으니, 평균 취하는건 그냥 함수를 리스케일 할 뿐이다. 스코어 값이 몇인지는 신경쓰지 않고 단순히 얼만큼 크냐 작냐를 따지는 것이기 떄문에 스케일이 바뀌는 것은 아무 영향을 미치지 않는다.
-
그럼 손실함수를 제곱항으로 바꾼다면?
이를 square hinge loss라고 하며, 결과는 달라진다. 제곱항을 사용하면, Loss에 더 많은 가중치를 부여할 수 있다. loss를 얼마나 심각하게 받아들이느냐의 차이인듯 하다(제곱하면 절대값이 더 커지기 때문이다).
1-2. Cross-entropy Loss (Softmax)
딥러닝에서는 Multiclass SVM loss보다 더 많이 사용한다. Multiclass SVM의 경우, 스코어 자체는 신경쓰지 않고, 정답 클래스가 정답이 아닌 클래스보다 더 높은 스코어 내기만을 원한다. 따라서 스코어 자체에는 관심 없었으나, Softmax는 스코어 자체에 추가적인 의미를 부여한다. Softmax의 Loss 계산 과정은 다음과 같다.
모델에서 나온 스코어 -> 스코어를 지수화 시킴(양수화) -> 합이 1이 되도록 정규화(확률값이 됨) -> 정답 스코어에만 -log를 붙여줌
지수/정규화 통해 나온 확률이 정답 클래스에서 1에 가깝게 계산되는 것이 Softmax의 목표이다. log를 붙이면 그래프가 단조 증가함수가 되므로, 그냥 확률값을 최대화 시키는 것보다 더 쉽다. 또한, 얼마나 좋은지가 아니라 얼마나 성능이 좋지 않은지를 측정하는 측도가 되어야하므로 부호가 음수가 되어야한다. 따라서 최종 확률에 -log가 붙은 것이 Cross-entropy Loss(Softmax)이다.
1-2-1) 예시
다음은 cat에 대한 Cross-entropy Loss, L_cat을 구하는 과정이다.
각각의 스코어를 지수화 하고, 이를 정규화 시키면 각 클래스에 대한 확률값이 나오게 된다. 이 중, 정답 클래스의 확률을 뽑아 -log를 씌워주면, cat에 대한 Cross-entropy Loss를 구할 수 있게된다.
1-2-2) 특징
-
Loss의 범위
0 <= Loss < positive infinity
정답 스코어가 양의 무한대, 그 외는 음의 무한대로 발산한다면, 정답 클래스의 확률은 100%가 된다(지수/정규화 시키기 때문). 이 때 Loss는 0(-log(1) == 0)이되며 완벽한 분류가 된다. 반대로, 정답 클래스 스코어가 음의 무한대, 그 외가 양의 무한대로 발산하면, log(0) = 양의 무한대이므로 양의 무한대로 발산한다. 즉, 정답 클래스의 확률이 0%이면 loss는 무한대이다.
-
디버깅 전략
모든 스코어 s가 거의 0에 가깝고 값이 서로 비슷하다면 loss는
log(C)
가 된다. 그 이유는 다음과 같다.우선, 모든 스코어가 비슷한 경우 지수/정규화를 마친 확률값도 비슷하게 나와야 할 것이다. 이 때, 확률의 합은 1이 되어야 하므로, 각각의 확률은 1/클래스의 개수(C)로 모두 동일할 것이다. 여기서 정답 클래스를 뽑아 -log를 씌우게 되면 -log(1/C)이 되는데, 이 값은 로그 변환에 의해 log(C)로 바꿀 수 있다. 따라서 log(C)가 최종 결과가 되는 것이다.
이는, 첫 iteration에서의 디버깅 전략으로 유용하게 사용할 수 있으며, 만약 Loss가 log(c)가 아니라면 버그가 있는 것을 확인할 수 있다.
-
Multiclass SVM Loss와의 차이점
svm은 정답 스코어와 그렇지 않은 스코어 간의 마진을 신경쓴다. 따라서 정답 클래스의 스코어가 충분히 높다면, 정답 스코어가 조금 바뀐다고 해서 loss가 변하진 않는다. 왜냐하면, SVM loss는 정답과 그 외 클래스의 마진이 얼마나 되는지에만 관심있기 때문이다. 반면 Softmax(Cross Entropy Loss)는 정답 클래스의 스코어가 충분히 높고 다른 클래스 스코어가 충분히 낮아도, 최대한 정답에 확률을 몰아 넣으려고 할테고 그 결과, 정답 클래스 스코어는 무한대로, 그 외의 클래스 스코어는 음의 무한대로 발산하게 된다.
정리해보자면, SVM Loss는 일정 Margin을 넘으면 더이상 성능 개선에 신경쓰지 않는다. 그러나 Softmax는 더더욱 좋게 성능을 높이려 할 것이다. 두 손실함수의 성능 차이는 엄청나게 크진 않지만, 이러한 차이를 알고 있는 것이 좋다.
2. Regularization Term
Loss Function에는 우리가 앞서 살펴본 Data Loss Term 이외에도 Regularization Term이 존재하는데, 이 Regularization Term이 모델을 단순하게 만들어준다. 다시 말해, Data Loss Term에서는 분류기가 트레이닝 데이터에 fit하게 한다면, Regularization Term에서는 모델이 좀 더 단순한 W를 선택하도록 한다는 것이다. 이는 모델에 soft 패널티를 추가하여 복잡해지지 못하도록 하는 것으로 구현된다. 즉, 일반적으로 모델은 어떠한 문제를 고차 다항식으로 풀려고 하지만, regularization이 저차 다항식을 선호하도록 하며, 만약 복잡한 다항식을 쓰고 싶다면, 모델은 패널티를 감수해야 할 것이다. 만약 Regularization Term 없이 Data loss Term만 존재한다면 모델은 쉽게 오버피팅될 수 있다. 또한, Regularization은 딥러닝 뿐만 아니라 ML에서도 사용하니 기억해두자.
2-1) 오컴의 면도날 이론
다양한 가설이 존재하고, 그 가설들이 전부 옳다면 더 단순한 것을 선택하는 것이 좋다는 이론이다. 즉, 더 단순한 가설이 미래에 일어날 현상을 잘 설명할 가능성이 높다는 것이다. 이 이론은 기계학습 분야에서도 적용된다. 만약 상단 이미지의 파란색 그래프처럼 모델이 train 데이터에 오버피팅되면, 새로운 데이터(초록색)에 전혀 대응하지 못하게 된다. 우리는 파란색 그래프가 아니라, 새로운 데이터에도 유동적으로 반응하는 초록색 그래프(강인함)를 원하므로 모델을 어느정도 단순하게 만들 필요가 있다. 이것이 바로 Regularization Term을 사용하는 이유이다.
2-2) Regularization의 종류
-
L2 regularization
weight decay. 가장 보편적이며, W에 대한 Euclidean Norm 또는 Square Norm이라고도 한다. 1/2 * Square Norm을 사용하면 미분이 더 깔끔해진다.
-
L1 regularization
L1 Norm으로 W에 패널티를 부가하여, W가 희소행렬이 되도록 함.
-
Elastic net regularization
L1과 L2를 혼합시켜놓은 형태
-
Max norm regularization
L1, L2 대신 Max norm을 사용함
2-3) L1 reg. vs L2 reg.
[1,1,1,1]의 input 이미지가 주어졌을 때, 다음과 같은 w1과 w2라는 가중치가 있다고 가정해보자.
Linear Classifier의 관점에서, {w1 (dot) x} == {w2 (dot) x}이므로 w1과 w2 가중치는 동일하다. 하지만 L1 regularization과 L2 regularization이 바라보는 관점은 조금 다르다.
-
L2 regularization
L2 reg.는 w2 가중치를 더 선호하는데 그 이유는 다음과 같다. L2 reg는 x의 모든 요소가 골고루 영향을 줬으면 한다. 즉, x의 특정 요소에만 의존하기보다 모든 요소가 골고루 영향을 미치게 하여 외부 변화에도 강인해지길 바란다. 따라서 L2 reg는 w1과 w2중 어느것이 더 상대적으로 coarse한지 측정(값이 매끄러워야 함)하여 분류기의 복잡도를 계산한다.
-
L1 regularization
L1 reg.는 L2 reg.와는 반대로 오히려 w1을 더 선호한다. L1 reg는 w에 존재하는 0의 개수에 따라 모델의 복잡도를 다루기 때문에 sparse한 solution을 선호한다. 따라서 w의 요소 중 대부분이 0이 되게 한다.
-
정리
-
어떤 문제 / 어떤 모델 / 어떤 데이터냐에 따라 복잡하다의 정의가 달라짐
-
L1 : 0이 아닌 것들은 복잡하다
-
L2 : 요소가 전체적으로 퍼져있을 떄 덜 복잡하다
-
데이터와 문제에 따라 L1, L2를 적절하게 선택하면 된다.
-
3. Loss 총정리
데이터셋 x와 y
-> Model(Linear Classifier 등)을 통해 x로부터 스코어 얻음
-> Softmax, SVM등의 Loss function을 통해 모델의 예측값이 정답값에 비해 얼마나 좋지 않은지 측정
-> 모델의 복잡함과 단순함을 통제하기 위해 Loss function에 regularization term을 추가
-> Optimization 과정 (아래에서 설명)
-> 최종 손실함수가 최소가 되게 하는 가중치 행렬이자 파라미터 행렬인 행렬 W를 구하게 됨
Optimization
Optimization은 가능한 W의 경우의 수 중, 가장 Loss가 적은 W를 찾아 나가는 과정을 의미하며, 흔히들 산골짜기에서 내려오는 사람에 빗대어 표현하곤 한다. 산의 높이는 Loss가 되고, 우리는 골짜기에 있는 늪이나 개울을 피해 최대한 골짜기의 밑바닥까지 내려와야 하는 것이다. 밑바닥까지 바로 내려갈 수 있으면 좋겠지만, 실제로 NN을 사용하면 예측 함수, Loss func, regularizer같은 것들이 엄청 크고 복잡해진다. 따라서 어떤 명시적인 솔루션을 만들어내서 최적의 솔루션(minima)을 직접 얻어내는 건 불가능하다. 따라서 실제 Optimization은 임의의 지점에서 시작해서 점차적으로 성능 향상시키는 iterative한 방법을 쓴다.
1. Search 방법
1-1) random search
랜덤 샘플링한 W를 많이 모아놓고 loss를 계산해서 어떤 w가 가장 좋은지 고르는 방법이다. 매우 구린 성능의 알고리즘이므로 실제로 사용하지는 않고, 한번쯤 상상만 해볼 법한 방법이다.
1-2) local geometry 이용 (경사하강법)
특정한 지점에서의 경사(gradient)를 구해, 경사가 하강하는 방향으로 지속적으로 나아가, 최적의 loss를 찾는 방법이다. 골짜기에 빗대어 표현하자면, 어떠한 한 지점을 두 발로 느끼고 그 곳의 지형을 파악하여 땅의 경사(Slope)에 따라 어느 방향으로 가야할지 정하는 방법이다. 위 방법을 계속 반복하여 골짜기를 내려갈 수 있으며, 쉬워보이는 아이디어이지만, 정말 잘 동작한다.
-
경사(slope)란?
어떤 함수에 대한 미분값(기울기)을 의미한다. 이때, x가 scalar가 아니라 벡터이므로 미분을 다변수로 확장해야 한다. 다변수 상황에서의 미분은 gradient(벡터 x의 각 요소를 편도함수들의 집합(벡터))를 구하면 되고, gradient의 shape은 x와 같다(입력 3개면 gradient도 3개). 이때 그레디언트가 알려주는 것이 바로, 우리가 그쪽으로 갈 떄 함수 f의 경사(Slope)이다.
1-2-1) Slope 계산
-
Numerical gradient(유한 차분법)
W의 첫 번째 요소에 차례로 작은 값 h를 넣어 loss를 계산한다. 이 때, 변화된 loss와 원래 loss의 차(y축 증가량)를 h(x축 증가량)로 나누어주면 dW의 첫 번쨰 요소가 완성된다. 이렇게 나머지 원소도 전부 반복하면 gradient dW를 구할 수 있다. 그러나 해당 방법은 파라미터의 개수가 수천, 수만개로 늘어날 경우 끔찍하게 느려서 사용하지 않는 방법이고, 더 정확하고 빠른 Analytic gradient를 더 많이 사용한다.
-
Analytic gradient
우리는 파라미터 하나하나 모두 계산하는 게 아니라, 단지 W가 변화할 때의 loss를 알고싶을 뿐이다. 이는, 뉴턴과 라이프니츠가 만든 미분식을 이용하면 쉽게 해결할 수 있다. gradient를 나타내는 식이 뭔지만 먼저 찾아내고, 그걸 수식으로 나타내서 한번에 gradient dW를 계산할 수 있는 일종의
마법의 망치
이다. 이에 대한 자세한 설명은 Chain rule과 함께 다음장에서 설명된다.
-
Stochastic Gradient Descent (SGD)
N이 엄청나게 커질 경우, Loss를 계산하는데 엄청난 시간이 필요하다. Gradient는 선형 연산자이기 떄문에 loss는 각 데이터 loss의 gradient 합이되므로, gradient를 한번 더 계산하려면 N개의 전체 트레이닝 셋을 한번 더 돌면서 계산해야 한다. 따라서 실제로는 SGD를 많이 사용한다. SGD는 전체 데이터의 Gradient와 Loss를 계산하기보다는, Mini batch라는 작은 트레이닝 샘플 집합으로 나누어 학습힌다. 이때, 미니 배치는 보통 2의 승수인 32, 64, 128을 주로 사용하며, 이를 이용해 loss 전체합의 추정치와 Gradient의 추정치를 계산한다. stochasitc 하다는 것은 monte carlo method의 실제 값 추정 방법과 유사하다고 볼 수 있으며, 거의 모든 DNN 알고리즘에 사용되는 기반적인 학습 알고리즘이다.
-
Summary
-
Numerical gradient
간단하고 그럴싸하다. loss의 gradient를 계산 하는 코드를 짜고 있을 때, 디버깅 툴로는 사용 가능하다(gradient check). 단, 매우 느리므로, 파라미터의 스케일을 줄여서 사용해야 할 것이다.
-
Analytic gradient
Numerical gradient에 비해 빠르고 정확하다. 하지만 식을 유도하기 위해 많은 수학과 미적분학을 이해해야하며, 실수하기 쉬움. 수학적 검증 필요.
-
과정
Gradient descent에서 우선 W를 임의의 값으로 초기화 -> 그리고 Loss와 Gradient 계산한 뒤에 가중치를 Gradient 반대 방향으로 업데이트(gradient가 증가하는 방향이기 떄문에 -해야 내려가는 방향이 됨) -> 이걸 무한 반복하면 결국 어딘가에 수렴함
cf) step size(learning late) -> 대게 트레이닝 시작 시 가장먼저 정하는 하이퍼 파라미터이다. 학습률(걸음의 보폭)을 정하는 파라미터이며, 너무 작지도 너무 크지도 않은 적절한 값을 정해주어야한다.
-
특징 변환
Linear Classifier는 실제 raw 이미지 픽셀을 입력으로 받지만, 이는 multi-modality와 같은 문제(말머리 두개)가 있을 수 있기 때문에, 좋은 방법은 아니다. 따라서 DNN이 유행하기 전, 다음과 같이 2가지 스테이지를 거치는 방법을 주로 사용했다.
- 이미지가 있으면 여러가지 특징 표현을 계산(모양새 등등)
- 이러한 특징 표현들을 한데 연결시켜 하나의 특징 벡터로 만듦
- 이 특징 벡터를 모델에 input으로 넣어줌
1. 예시
1-1) 극좌표계 변환
위와 같은 이미지는 Linear한 결정 경계를 그릴 방법이 없다. 따라서 그림의 예시는 왼쪽 이미지를 적절하게 극좌표계로 특징 변환(오른쪽 그림)하여, 복잡하던 데이터를 선형으로 분리할 수 있도록 하였다. 이미지의 경우 픽셀들을 극좌표계로 바꾸는 건 말이 안되지만, 극좌표계로 변환하는 것을 일종의 특징 변환이라 생각하면 말이 되며, 실제로 raw 이미지를 넣는것보다 좋은 성능을 보여주고 있다. 따라서 이런 기법들은 해당 이미지에 어떤 특징 변환이 필요한가를 알아내는 것이 중요하다고 할 수 있다.
1-2) 컬러 히스토그램
이미지에서 hue값만 뽑아서 각 픽셀이 해당하는 색의 양동이에 넣고, 각 양동이에 들어있는 픽셀의 개수를 세는 방법이다. 이는 이미지가 전체적으로 어떤 색인지 알려주며, 실제로 사용하는 간단한 특징 벡터이다.
ex) 개구리는 초록이 많고, 자주색이나 붉은 색이 적다.
1-3) Histogram of oriented gradients (HoG)
oriented edges가 인간의 시각시스템에서 정말 중요하다고 생각한 researcher들이 개발한 특징 벡터이다. NN이 뜨기 전에 인기있었던 또 다른 특징 벡터 중 하나이며, Local orientation edges를 측정한다. 8*8로 픽셀을 나누어 지역 내 가장 지배적인 Edge의 방향을 계산하고, Edge directions를 양자화해서 양동이에 넣어 다양한 Edge orientations에 대한 히스토그램을 계산한다. 오른쪽 사진은 HoG를 시각화한 것이다.
1-4) bag of words
BOW 여러 문장의 단어 발생 빈도를 세어 특징 벡터로 사용하는 것에서 아이디어를 얻어 이미지에 적용한 방법이다. 시각 단어라고 하는 것을 만들었으며, 매우 많은 이미지를 가지고 그 이미지들을 임의대로 조각내고 k-means와 같은 알고리즘으로 군집화한다. 이는 이미지내의 다양한 것들을 표현할 수 잇는 군집을 만든 것이며, 군집화 단계를 거치고 나면 시각 단어는 빨강 파랑 노랑과 같은 다양한 색을 포착해냄뿐만 아니라 다양한 종류와 다양한 방향의 oriented edges또한 포착할 수 있다.
댓글남기기