728x90
Loss Function
- Loss function(오차함수)란 classifier가 얼마나 잘 작동하는 지 보여줌
- 즉 모델이 나타내는 확률 분포와 데이터의 실제 분포 간의 차이를 나타내는 것
- 이는 해당 모델의 가중치 W가 얼마나 잘 작동하는지를 보여줌
- 일반적으로 모델이 나타낸 값과 실제 데이터의 값 사이 오차(다양한 공식 사용)를 샘플 수로 나눠서 사용함
1. Multiclass Support Vector Machine Loss
Multiclass SVM
- 이미지 x, 라벨 y, 그리고 모델로부터 만든 점수 s를 활용
- s = f(x_i,W)로 나타남
- SVM Loss는
- (1) 정답일 때의 score가 다른 score+1 보다 같거나 크면 0
- (2) 그렇지 않다면 다른 score-정답 score +1 을 수행한 후
- (3) (1)과 (2)중 max를 구한 후 이의 합을 구함 (자기자신의 클래스는 제외) → 해당 클래스에 대한 Loss
- (4) 모든 클래스에 대한 Loss를 평균내면 전체 classifier의 Loss
- safety margin : 예시에서는 1로 세팅(값 자체가 큰 의미는 없음). 정답인 클래스가 오답인 클래스보다 마진을 갖기를 원함.
- 오답인 클래스의 score + 1 : y=0이 되는 지점. 즉 Loss가 0이 됨
- 정확하게 예측할수록 즉 정답 score가 높을수록 Sj(오답) - S_yi(정답)이 음수가 될 것임 → max(0,Sj(오답) - S_yi(정답)+1)에서 0이 될 것임.
🤔Q. 가중치 W를 초기화할때, 이를 엄청 작게 잡아서 모든 score 점수인 s가 0에 가깝게 되면 loss는 어떻게 될까?
🤩A. Class의 갯수 - 1. sj-syi는 0으로 수렴할 것이고 class는 자기 자신(정답)에 대해선 계산하지 않기 때문.
정답 Class를 제외하는 이유는 일반적으로 Loss가 0이되어야 하기 때문. 모든 클래스 별 loss가 0이 되어도, 정답 클래스는 sj-syi=0이므로 safety margin 1이 남게 되고 이는 전체 Loss의 합이 1이 되게 함으로 적절하지 않음
🤔Q. loss function에서 max(~~)를 max(~~)**2, 즉 제곱하면 어떻게 될까?
🤩A. 결과가 크게 달라짐. 제곱하게 되면 그래프가 비 선형(빗살무늬토기모양...)으로 변화됨. SVM loss는 정답인 class의 score가 오답 score보다 크길 바랄 뿐인데, 이걸 제곱하게 되면 오답 score가 제곱되어 loss가 급증하게 됨. 즉 Square하게 되면 잘못 분류되는 것을 용납하지 않는 Loss가 됨
def L_i_vectorized(x,y,W):
scores = W.dot(x)
margins = np.maximum(0, scores - scores[y] +1)
margins[y]=0 #정답인 y라벨 값을 0으로 만들어줘서 자기자신의 클래스 제외하고 합치기
loss_i = np.sum(margins)
return loss_i
2. Regularization
- training data 과적합을 피하기 위해 정규화 시행
- Data Loss : training data에 맞춤
- Regulirization : 과적합 되지 않도록 좀 더 단순한 가중치 W를 고르게 함. W에 페널티를 주는 느낌
- lambda : 하이퍼파라미터
종류
- L1 (Lasso Regression): R(W)=∑k∑i|W_k,i|
- L2 (유클리드, Ridge Regression): R(W)=∑k∑i(W_k,i)**2
- BatchNorm, Stochastic Depth..etc
3. L2 Regularization(Weight Decay)
- 아래와 같은 x와 w 벡터가 있다고 할 때 w1,w2와 x의 내적은 모두 1이라는 같은 결과를 도출함
- 하지만 L2에 따르면 w2를 선호. w2가 더 낮은 regulalization loss를 달성하기 때문 (가중치가 더 작고 확산되는 벡터를 선호함)
- R(w1) = 1
- R(w2) = 4*(0.25)**2 = 0.25
4. Softmax
소프트맥스 함수는 다항 로지스틱 회귀에서 사용됨 (여러개의 class를 예측)
- (1) 모델에 따라 score값을 도출
- (2) 각 score을 자연상수의 지수로 취함
- (3) (2)의 값을 바탕으로 분수로 만들어 0~1사이 확률값으로 변환
- (4) Loss는 정답인 경우에만 계산하며, 계산식에 따라 -log를 씌운다 (추후 cross entropy loss임)
🤔Q. Loss가 0이 되려면 어떻게 해야할까?
🤩A. 정답 score가 무한대에 가깝게 크고 나머지는 음의 무한대가 되어야함. 지수를 취하고 로그를 씌우기 때문.
🤔Q. Score가 모두 0에 가까운 작은 값이라면 loss는 어떻게 될까?
🤩A. normalize를 하며 확률로 변환하기 때문에 1/class숫자가 되어 -log(1/c)가 됨
5. Softmax vs. SVM
- SVM : 정답의 score가 다른 애들보다 높으면 됨
- Softmax : 확률을 구한 후 -log를 취하기 때문에 정답 score가 충분히 높아도 정답 class의 확률을 더 높이고자 할 것
Optimization
Loss를 최소화시키는 W를 찾아서 궁극적으로는 신경망을 최적화시키려고 함.
1. Random search
very bad solution but there is things to learn : iter
best loss = float("inf")
for num in xrange(1000):
W = np.random.randn(10,3073)*0.0001
loss = L(X_train, Y_train,W)
if loss <bestloss:
bestloss = loss
bestW = W
2. Follow the Slope (Random Local Search)
- 함수의 기울기를 찾아 기울기가 가파른 곳으로 이동하며 최선의 방향을 찾을 수 있음
- 다차원에서는 gradient가 각 차원에대한 벡터가 됨(벡터 x에 대한 편도함수)
- 어떤 방향에서라도 기울기는 특정 방향과 gradient를 내적한 결과
3. Gradient computing
수치 미분
각각의 벡터에 아주 작은 수 h를 더하며 이의 gradient(loss 차이 / h)를 구하는 것
parameter 개수가 많아지면 계산 비용이 많이 들어 좋지 않은 방법
해석 미분
미적분을 사용해서 해석적으로 gradient를 구하자!
4. Gradient Descent
(1) 가중치 W를 임의의 값으로 초기화
(2) 이에 따른 loss를 계산
(3) w, loss를 바탕으로 gradient 계산
(4) 가중치를 gradient의 반대 방향으로 업데이트 (gradient는 증가하는 형태라서 음수로 진행해야 최소오차를 찾을 수 있음)
while True:
weights_grad = evaluate_gradient(loss_fun, data,weights)
weights += -step_size * wegiths_grad #step_size = learning rate
5. Stochastic Gradient Descent (SGD), 미니배치 경사하강법
- Gradient Descent를 한번 계산하려면 전체 training set을 돌아야 해서 비효율적임. 이를 배치를 사용해 개선시킴
- n개의 미니배치만을 이용해서 gradient를 구하고 parameter를 업데이트 하는 것
- 결국 Loss는 각 데이터 Loss의 gradient값의 합이므로, 미니배치를 이용해 loss 전체 값에 대한 추정치와 실제 gradient 추정치를 계산하는 것
while True:
data_batch = sample_training_data(data,256)
weights_grad = evaluate_gradient(loss_fun, data_batch,weights)
weights += -step_size * wegiths_grad #step_size = learning rate
'👩💻LEARN : ML&Data > Lecture' 카테고리의 다른 글
[CS231n] Lecture5. Convolutional Neural Networks (0) | 2023.05.14 |
---|---|
[CS231n] Lecture4. Backpropagation and Neural Networks (0) | 2023.05.11 |
[CS231n] Lecture2. Image Classification Pipeline (0) | 2023.05.08 |
[알고리즘 구현으로 배우는 선형대수] #11. 직교 행렬 (0) | 2023.04.13 |
[Reinforcement learning]#2. State-action value function & #3. Continuous state spaces (0) | 2023.03.30 |