score에 대한 부족한 부분을 가시화시켜주는 Loss function과 Loss function을 minimize 된 parameter를 찾아주는 Optimizer에 대해 알아보겠습니다.
Loss function 중 SVM을 활용한 Hinge loss와 Softmax를 사용한 Cross entropy에 대해 알아보겠습니다.
SVM - Hinge loss
score가 $s = f(x, W)$라고 할 때 Loss 값은 파란색 네모와 같습니다. 0과 오른쪽 항 중에서 큰 것을 취하는 형식으로 Loss 값이 구해집니다. 여기서 $s_j$는 잘못된 label의 score $s_{y_i}$는 제대로 된 label의 score입니다. 여기서 1을 더해주는 데 이 값은 safety margin입니다.
고양이의 $s_i = 3.2$이고 나머지는 잘못된 label의 score입니다. 여기서 cat의 Loss를 계산해본다면
$max(0, 5.1 - 3.2 + 1) + max(0, -1.7 - 3.2 + 1) = 2.9 + 0$ 이 나오게 됩니다.
- Q1. $j=y_i$ 일 때를 제외하고 전부 더해주는데 이 경우를 포함하면 어떻게 될까?
- 이 경우 (0, 1 - 1 + 1) 즉 자기 자신을 빼니 0이 되고 거기에 1이 더해지니 Loss값이 항상 1이 나오게 된다.
- Q2. sum 대신에 mean을 사용한다면?
- 별 차이 없다, 똑같이 손실이 구해진다.
- Q3. $max(0, s_j - s_{y_i})^2$을 사용한다면?
- 제곱을 해주는 것부터 non-linear 해지기 때문에 차이가 생긴다.
- Q4. SVM Loss의 최대값과 최저값은?
- 최저값은 0이고 최대값은 제한이 없다.
- Q5. 보통 초기화를 매우 작은 값으로 하는데 그런 경우 score가 0에 가장 가까운 작은 값으로 나타납니다. 이런 경우에는 Loss가 어떻게 될까?
- 대략 1 정도의 Loss가 나온다.
SVM Loss를 코드로 나타내면 다음과 같습니다.
# 코드로 나타내면 다음과 같다
def L_i_vectorized(x, y, W): # y는 레이블을 나타내는 정수값
score = W.dot(x)
margins = np.maximum(0, scores - scores[y] + 1) # 전부 뺀거 + 1
margins[y] = 0 # 자기자신 뺀거는 0으로 만들어줌
loss_i = np.sum(margins)
return loss_i
- Loss를 0으로 만드는 가중치값을 찾았을 때 그 값이 unique하지 않는 오류가 존재, 즉 0을 출력하는 파라미터에 2배를 해주면 똑같이 0이 나옵니다. (car에 대한 Loss 값을 계산해보면 알 수 있습니다.)
0이라는 Loss 값을 만드는 파라미터가 unique하지 않는다면 Local minimum에 빠질 위험이 생깁니다. (0이 되는 지점이 여러 개 존재하기 때문에)
그래서 이 문제점을 해결하기 위해서 다음과 같이 train data loss에 regularization을 더해줍니다. (regularization는 test data가 일반화되도록 만들어줌)
즉 과학습을 막아주는 것인데 train loss는 안 좋아지지만 일반화가 되어 test 때 좋은 성능을 낼 수 있습니다.
- regularization은 모든 가중치가 0이 되면 Loss가 0이 되므로 가중치들을 0으로 만들려고 함
- 하지만 data loss는 분류를 진행해야 하기 때문에 가중치가 0이 되는 것을 원하지 않음
- 한쪽으로 가중치가 치우쳐지지 않게 막아줌
입력은 다음과 같고 가중치가 아래와 같이 2개가 존재합니다. 이때 두 벡터 전부 행렬곱 했을 때 값은 동일합니다. 하지만 $w_1$은 하나의 feature에 많은 가중치가 쏠린 형태로 불안정합니다. 이러한 문제점을 해결하기 위해서 L2를 사용합니다. L2는 이런 경우에 $w_2$를 선호합니다. 모든 input feature을을 고려하기 때문입니다.
- diffuse over everything = 가중치를 퍼뜨리다
Softmax - Cross entropy
Softmax는 로그화 한 확률을 나타냅니다. 학습을 통해 정답 레이블의 로그 확률을 최대로 올려야 합니다. 로그를 취하는 이유는 수학적으로 조금 더 편리해지는 장점이 있기 때문에 취합니다. (곱셈을 덧셈으로 변경)
SVM과 Softmax 비교
SVM은 데이터 변화에 강합니다. 하지만 Softmax는 모든 데이터를 보기 때문에 데이터 변화에 약합니다.
Optimization
Loss를 minimize 해주는 가중치 값을 찾는 과정입니다. Regularization Loss는 데이터의 함수가 아니고 가중치에 대한 함수이므로 가중치에만 영향을 받습니다. 최적화를 진행할 때 random search를 하면 안 되고 경사를 따라 내려가는 방식을 사용합니다.
1. Numericl gradient
이 방법은 수치적으로 계산을 하여 기울기를 구하는 것입니다. 이러면 정확한 값이 아니라 근사치이고 속도가 매우 느립니다. 대신에 간단하게 만들 수 있어 analytic gradient를 테스트할 때 사용합니다.
2. Analytic gradient
미분을 통해 기울기를 구하는 방식입니다. 언제나 analytic gradient를 사용하지만 계산이 잘 이루어지는지 확인하기 위해서 numerical gradient를 사용합니다. 학습할 때는 미분한 값에 Learning rate을 곱해줘서 가중치를 업데이트를 진행해줍니다. Learning rate도 task에 대해서 최적화를 진행해줘야 합니다. validation set을 사용하여 최적값을 찾아줘야 합니다.
이 강의에서 지금까지 설명한 내용은 full batch gradient descent입니다. 지금 설명할 내용은 mini-batch gradient descent입니다. train data 일부만 사용해서 학습을 진행하여 업데이트를 반복합니다. AlexNet에서는 256개를 mini-batch 단위로 사용했다고 합니다.
Gradient descent
다음과 같이 전체 데이터가 아니라서 좀 진동하지만 크게 봤을 때는 전체적으로 Loss 값이 내려가는 방향으로 학습이 진행됩니다. 옆에 그래프는 Learning 설정에 대한 값 변화입니다. 너무 크게 잡으면 Loss가 튕겨나가고 너무 작게 잡으면 최소점에 늦게 도착합니다. 일반적인 gradient descent는 적절한 값을 찾기가 어렵습니다. 그래서 처음에는 높게 잡고 점점 낮춰 진행하는 decay를 해야 합니다.
전통적인 이미지 분류 파이프라인
전통적인 이미지 분류 파이프라인은 Linear classifier을 사용하여 진행됩니다. feature를 추출한 다음 여기에 Linear classifier을 적용합니다. 그다음 추출한 feature을 이어 붙여줍니다. feature 추출 기법은 두 가지가 존재합니다.
1. Color Historgram
이미지 내의 모든 픽셀에 컬러를 확인합니다. 그리고 각각의 컬러에 해당하는 픽셀이 몇 개가 있는지 기록하는 형식으로 진행이 됩니다.
2. HOG/SIFT feature
이 방법에서 feature은 edge의 방향입니다. $8 \times 8$ 픽셀이 존재하는 공간을 보고 edge들의 방향을 총 9가지로 구분해서 9가지의 bin들에 몇 개가 속하는가를 통해서 feature을 추출합니다.
이 방법은 이미지의 여러 지점을 보고 그 작은 패치들을 벡터로 만듭니다. 그 후 이것들을 모아서 하나의 사전화를 합니다. 그러고 나서 이 사전 중에서 테스트와 가장 비슷한 형태를 찾는 방식입니다.
'cs231n' 카테고리의 다른 글
4. Training Neural Networks part 1 (0) | 2021.11.04 |
---|---|
3. Backpropagation and Neural Networks part 1 (0) | 2021.10.12 |
1. Image classification (0) | 2021.09.19 |