손실함수(loss function)
모델이 예측한 값과 실제 값 사이의 차이를 측정하는 함수로 모델의 성능을 평가하고 모델이 어떤 방향으로 개선되어야하는지 알려준다.
즉, 최적의 가중치(w)를 찾기 위해 정량화 시켜주는 역할이다.

가장 일반적인 Loss function으로, 최종 Loss값은 전체 데이터셋에서 각 N개의 샘플들에 대한 Loss값의 평균이다.
1. multi-class SVM loss (hinge loss)
정답 클래스의 점수가 다른 클래스들보다 마진(margin)만큼 높도록 만드는 것
- 정답 클래스 점수 ≥ 다른 클래스 점수 + margin → Loss 0 (벌점 없음)
- 아니면 → (다른 클래스 점수 + margin - 정답 점수)만큼 벌점 발생
이런식으로 정답이 아닌 카테고리의 모든 클래스이 벌점을 합치면 그 값이 한 이미지의 최종 loss값이다.

위의 식에서는 safety margin=1이므로, 정답 카테고리 점수가 틀린 카테고리 점수보다 1이상 크면 loss 값은 0

이 이미지를 예시로 svm loss값을 구하자면,
cat: max(0, 5.1-3.2+1) + max(0, -1.7-3.2+1) = max(0, 2.9) + max(0, -3.9) = 2.9+0 = 2.9
car: max(0, 1.3-4.9+1) + max(0, 2.0-4.9+1) = max(0, -2.6) + max(0, -1.9) = 0+0 = 0
frog: max(0, 2.2-(-3.1)+1) + max(0, 2.5-(-3.1)+1) = max(0, 6.3) + max(0, 6.6) = 6.3+6.6 = 12.9
따라서 평균 loss 값은 카테고리 개수로 나눈 (2.9+0+12.9)/3= 5.3 이 된다.

def L_i_vectorized(x, y, W): #x:image, y:label
scores = W.dot(x) #Wx
margins = np.maximum(0, scores - scores[y] + 1) #svm loss
margins[y] = 0
loss_i = np.sum(margins)
return loss_i
weight regularization(full loss)
모델의 복잡도를 줄이기 위해 가중치 값에 패널티를 주는 기법

Full Loss = Data loss + Regularization loss
Data loss: 학습데이터에 대한 예측 오차 (train data), 모델이 정답과 얼마나 차이 나는가
Regularization loss: 모델 가중치가 너무 커지지 않도록, 가중치의 크기에 비례해 추가되는 패널티 (test data), 과적합 방지
-R(W)

L2 regularization은 가중치를 고르게 퍼뜨려 모든 input feature들을 조금씩 활용한다.
L1 regularization은 불필요한 feature의 가중치를 0으로 만들어 복잡도가 낮아진다.
2. Softmax를 이용한 cross-entropy loss
softmax 함수는 각 클래스의 점수를 확률 분포(0~1 사이의 값)으로 변환한다.
모든 확률의 합은 1이다.

이 확률 중 정답 클래스의 확률을 뽑아서 cross-entropy loss를 계산한다.
확률이 높을수록 loss는 작아지고, 낮을수록 loss는 커진다 → 정답 확률이 1(loss값은 0)에 가까워지는 것이 목표
이때 loss 값은 -log(softmax function)이다. (loss의 최솟값은 0, 최댓값은 무한대이다.)


3. hinge loss(SVM) vs cross-entropy loss(Softmax)

일반적으로 softmax와 cross-entropy 가 딥러닝에서 주로 사용된다.
SVM은 margin 기반으로 둔감한 반면에 softmax는 작은 차이에도 예민하게 반응하여 더 정밀하게 학습된다.
Optimization
loss값을 최소화하는 가중치(weight)값을 찾는 과정
1. Random search (worst idea)
무작위로 하이퍼파라미터 조합을 선택하여 최적의 성능을 찾는 최적화 기법
2. Follow the slope (gradient)
함수의 기울기(gradient)를 따라 loss를 줄이는 방향으로 파라미터를 업데이트하는 방식
기울기는 현재 위치에서 가장 가파르게 내려가는 방향을 알려준다.
1) Full-batch Gradient descent (전체 train set을 이용)
한 번의 파라미터를 업데이트할 때 전체 학습 데이터를 모두 사용해 기울기(gradient)를 계산하는 방법
즉, 모든 샘플에 대해 손실 함수를 계산하고, 이를 미분해 정확한 평균 기울기를 구한 뒤 가중치를 업데이트

numerical gradient: 함수의 값을 아주 조금 변화시켜서 근사적으로 기울기를 계산하는 방법(느리지만 구현 쉬움)
analytic gradient: 수학적으로 미분 공식을 이용해 정확한 기울기를 계산하는 방법(빠르고 정확)
gradient check: analytic gradient가 맞는지 numerical gradient가 맞는지 검증
while True:
weights_grad = evaluate_gradient(loss_fun, data, weights)
weights += - step_size * weights_grad
장점: 전체 데이터 기준의 정확한 기울기를 구할 수 있음
단점: 데이터가 많을 경우 계산이 매우 느림
2) Mini-batch Gradient descent (train set을 쪼개어)
일정 크기의 batch로 잘라서 사용
주로 32,64,128,256의 batch size로 나눔
while True:
data_batch = sample_training_data(data, 256)
weights_grad = evaluate_gradient(loss_fun, data_batch, weights)
weights += - step_size * weights_grad
장점: 계산 속도가 빠름, 메모리 효율이 좋음, 업데이트가 자주 일어나서 지역 최적값을 탈출할 가능성이 커짐
단점: 각 업데이트마다 방향이 정확하지 않아 노이즈가 있음
+) learning rate에 따른 loss값의 변화

Image Features

- 이미지의 feature들(의미있는 패턴)을 추출
- 하나의 벡터로 concatenate
- Linear classifier에 입력하여 각 class에 대한 score 계산
feature 추출 방법
1) Color (Hue) Hiatorgram
이미지의 색상(Hue)을 기준으로 여러 bin으로 나누고, 각 bin에 해당하는 픽셀 개수를 세어 분포 형태의 feature vector를 생성

2) HOG/SIFT features
이미지의 작은 영역에서 edge들의 방향을 9가지로 구분하여, 각 방향에 해당하는 gradient의 강도를 세서 feature로 사용

3) Bag of Words
이미지의 여러 local patch를 descriptor vector로 표현
모든 patch들을 사전으로 군집화 (ex. K-means)
각 이미지에서 사전의 어떤 visual word가 얼마나 나왔는지 세서 히스토그램 형태의 feature vector를 만들어 linear classifier에 사용

+)
기존의 전통 적인 방식은 인간이 인위적으로 feature를 추출해줘야 했지만,
딥러닝에서는 image 자체를 function에 넣어주면 feature 추출을 따로 할 필요가 없음.

'AI > Stanford Univ. cs231n' 카테고리의 다른 글
| 7강 Convolutional Neural Networks (0) | 2025.04.05 |
|---|---|
| 6강 Training Neural Networks 2 (0) | 2025.04.04 |
| 5강 Training Neural Networks 1 (1) | 2025.04.04 |
| 4강 Introduction to Neural Networks (0) | 2025.04.04 |
| 2강 Image classification (1) | 2025.04.04 |