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

좋은 웹페이지 즐겨찾기