softmax 문제를 풀면서 느낀거는 강의를 듣고서만 풀 수 없는 거 같다.
여러 검색들과 정리된 식들, 코드로 어떻게 옮길 것인가를 반복하면서 풀었다.
이번 코드는 내가 풀지 못했고 다른 코드를 가져와서 분석하는 식으로 공부했다...
**softmax_loss_naive
가중치 W:(D,C) /c는 클래스의 갯수 / 각 클래스에 대한 예측 점수를 계산하는 벡터
미니배치 X:(N,D) / N개의 minibatches, D는 각 data point의 차원 수
traing label y:(N,) / y[i]는 미니 배치 내 datapoint의 ground_table / 이미지의 정답 클래스
SoftMax
-sigmoid 보다 학습이 더 잘된다
-loss function으로 cross-entrophy를 쓴다
cross-entrophy(p,q)=-(p1log(q1)+...pclog(qc)) p는 원-핫, q는 모델 예측 확률 == 일반적인 형태
Li=-log(e^fyi / e^f1+e^f2+...e^fj) == log loss라는 특수한 형대
-예측한 확률 분포와 진정한 class label의 차이를 줄인다.
- 식: fj(x) = e^xj / e^x1+e^x2+...e^xk
<코드 분석>
0) W와 X를 내적해준다. 이는 각 데이터 포인트(X)가 각 클래스에 속할 확률이다.
1) dW[:,y[i]] -=X[i]
-dW의 모든 행에 대해 y[i] 열에서 X[i]를 뺀다. 이때 X는 2차원 배열인데 X[i]는 i번째 행을 선택하여 1XD 인 1차원 배열이 된다.
X[i]는 i번째 data point의 feature vector이다.
-복습) X=0~9까지 손글씨를 쓴 2차원 배열, y는 실제 숫자 0~9이다.
W 가중치를 이용해 모델이 y에는 높은 확률을 다른 클래스는 낮은 확률을 할당한다. 예측된 확률분포와 y가 얼마나 일치하는지 손실을 계산한다. (정규화도 까먹지 않기)
gradient descent)
W_new = W_old -a*dL/dW (a는 learning rate, dL/dW는 목표함수의 gradient)
왜 빼주지?
목표함수(cross-entrophy) 최소화가 목표이다(딥러닝 모델 함수의 목표-모델의 예측 오류를 최소화하여 모델의 정확도를 높인다).
y[i]번째 클래스에 대한 weight-vector은 줄이고(정답클래스에 대한 예측 점수 높이기) 다른 클래스는 늘린다(오답은 낮추기).
2) dW+=np.dot(np.reshape(X[i],[-1,1]),np.reshape(np.exp(scores),[1,-1])) / np.sum(np.exp(scores))
-np.reshape(X[i],[-1,1])
복습) [-1,1]은 X가 (N,D)인 상태에서 reshape하면 (N*D,1)이 된다.
-np.reshape(np.exp(scores),[1,-1])
exp한 scores가 (N,C)인 상태에서 [1,-1]으로 reshape하면 (1,N*C)이 된다.
따라서 내적해주면 (N*D, N*C)가 된다.
'CS231n' 카테고리의 다른 글
C231n(12) Visualizing and Understanding (1) | 2024.03.23 |
---|---|
CS231n(11) Detection and Segmentation (0) | 2024.03.18 |
Assignment 1-1 (KNN) (0) | 2024.03.18 |
Assignment Python Tutorial (1) | 2024.03.14 |
CS231n(10) Recurrent Neural Networks (0) | 2024.03.13 |