CS231n assignment 1 multi svm - 행렬 곱셈 의 기하학 적 의미
문제 도입
cs 231 n 의 assignment 1 여러 종류의 svm 부분 에서 완전 벡터 법 으로 손실 함수 가 가중치 에 대한 경사도 dW 를 풀 어야 합 니 다.
∇wyiLi=−⎛⎝∑j≠yi1(wTjxi−wTyixi+Δ>0)⎞⎠xi∇wjLi=1(wTjxi−wTyi+Δ)xi
(상세 유도) 입력
xi, 정확 한 유형 을 가정 하면
가중치
yi 열의 경사도 만족
wTjxi−wTyixi+Δ>0 의 열 수량 곱 하기 입력 '
− xi ', 기타 열의 경사도 가 적당 하 다.
wTjxi−wTyixi+Δ>0 은
xi, 그렇지 않 으 면 0. 어떻게 행렬 방법 으로 해결 하여 답 을 얻 을 수 있 습 니까?
행렬 상승 의 의미
가령×3 매트릭스 A 와 3.×2 행렬 B 를 곱 하면 우 리 는 결과 가 다음 과 같다 는 것 을 안다.
[x11x21x12x22x13x23]×⎡⎣⎢y11y21y31y12y22y32⎤⎦⎥=[x11y11+x12y21+x13y31x21y11+x22y21+x23y31x11y12+x12y22+x13y32x21y12+x22y22+x23y32]
그럼 그 의 미 는 무엇 일 까요?
우 리 는 등식 오른쪽 에 있 는 모든 열 을 자세히 관찰 하면 같은 열의 B 행렬 요소 yij 가 모두 같다 는 것 을 발견 할 수 있다.
[[x11x21]y11+[x12x22]y21+[x13x23]y31[x11x21]y12+[x12x22]y22+[x13x23]y32]
행렬 A 에 대해×B. 결과 의 j 열 은 행렬 A 의 각 열 에 행렬 B 제 j 열 에서 마지막 요 소 를 곱 한 다음 에 추가 하 는 것 과 같다.
그래서?
우 리 는 − xi 곱 하기 margin 이 0 이상 인 수량 을 xi 의 정확 한 유형 에 대응 하 는 가중치 경사도 에 사용 할 것 이다. 다른 열 은 margin 이 0 이상 인지 에 따라 누적 되 고 0 이상 이면 대응 하 는 열의 경사도 를 누적 하지 않 으 면 누적 되 지 않 는 다.
구체 적 인 절차: 1. n 개의 D 차원 데 이 터 를 포함 하 는 행렬 곱 하기 D 행 c 열 (c 는 분류 유형 수) 의 가중치 W 를 사용 하여 각 견본 을 각 유형 으로 나 누 는 점수 (i 행 j 번 째 요 소 는 i 번 째 견본 을 대표 하여 j 번 째 견본 으로 분류 되 는 점수) 를 얻 습 니 다. 2. 모든 데이터 의 모든 유형의 점 수 를 정확 한 유형의 점 수 를 뺀 다음 에 더 합 니 다.Δ ,그리고 정확 한 분류 에 대응 하 는 항목 을 0 으로 설정 하여 margin 을 얻 을 수 있 습 니 다. 3. margin 이 0 보다 큰 지 판단 하고 모든 입력 데이터 가 0 보다 많은 margin 의 수량 을 계산 합 니 다. 4. 입력 을 바 꾸 고 각 열 은 하나의 데 이 터 를 대표 합 니 다. 우 리 는 오른쪽 행렬 을 통 해 모든 데이터 누적 횟수 를 지정 해 야 합 니 다.
박문 이 제시 한 코드 는 다음 과 같다.
def svm_loss_vectorized(W, X, y, reg):
"""
Structured SVM loss function, vectorized implementation.
Inputs and outputs are the same as svm_loss_naive.
"""
loss = 0.0
dW = np.zeros(W.shape) # initialize the gradient as zero
#print(type(W))
#print(type(X))
num_classes = W.shape[1]
num_train = X.shape[0]
scores = X.dot(W)
correct_class_score = scores[np.arange(num_train), y]
#print(scores.shape)
#print(correct_class_score.shape)
#print(type(scores))
#print(type(correct_class_score))
tmpMat = scores.T - correct_class_score + 1
tmpMat = tmpMat.T
tmpMat[np.arange(num_train), y] = 0
margin = np.maximum(tmpMat, np.zeros((num_train, num_classes)))
#print(margin.shape)
loss = np.sum(margin)
loss /= num_train
loss += 0.5*reg*np.sum(W*W)
# Binarize into integers
binary = margin
binary[margin > 0] = 1
# Perform the two operations simultaneously
# (1) for all j: dW[j,:] = sum_{i, j produces positive margin with i} X[:,i].T
# (2) for all i: dW[y[i],:] = sum_{j != y_i, j produces positive margin with i} -X[:,i].T
col_sum = np.sum(binary, axis=1)
binary[np.arange(num_train), y] = -col_sum[range(num_train)]
dW = np.dot(X.T, binary)
# Divide
dW /= num_train
# Regularize
dW += reg*W
return loss, dW
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
【Codility Lesson3】FrogJmpA small frog wants to get to the other side of the road. The frog is currently located at position X and wants to get to...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.