2016-11-13 5 views
3

MNIST 인 간단한 3 계층 신경망에서 backpropagation을 이해하려고합니다.numpy : softmax 함수의 미분을 계산합니다.

weightsbias 인 입력 레이어가 있습니다. 라벨은 MNIST이므로 10 클래스 벡터입니다.

두 번째 레이어는 linear tranform입니다. 세 번째 계층은 출력을 확률로 얻는 softmax activation입니다.

Backpropagation은 각 단계에서 미분을 계산하고이를 그라디언트라고합니다.

이전 레이어는 global 또는 previous 그라디언트를 local gradient에 추가합니다. 나는 유도체에 대하여 설명 문제가이 softmax의 설명을 통해 이동 및 그 유도체, 심지어 softmax를 자체

def softmax(x): 
    """Compute the softmax of vector x.""" 
    exps = np.exp(x) 
    return exps/np.sum(exps) 

의 코드 샘플을 제공 온라인 softmax

여러 자원의 local gradient을 계산하는 데 문제 i = ji != j 일 때. 이것은 내가 가지고 올 한 간단한 코드입니다 내 이해를 확인하기 위해 기대했다 :

def softmax(self, x): 
    """Compute the softmax of vector x.""" 
    exps = np.exp(x) 
    return exps/np.sum(exps) 

def forward(self): 
    # self.input is a vector of length 10 
    # and is the output of 
    # (w * x) + b 
    self.value = self.softmax(self.input) 

def backward(self): 
    for i in range(len(self.value)): 
     for j in range(len(self.input)): 
      if i == j: 
       self.gradient[i] = self.value[i] * (1-self.input[i)) 
      else: 
       self.gradient[i] = -self.value[i]*self.input[j] 

그런 다음 self.gradient는 벡터이다 이는 local gradient입니다. 이 올바른지? 이것을 작성하는 더 좋은 방법이 있습니까?

+1

이 ... 무엇 그라데이션 당신은 실제로 계산하기 때문에 불분명하려고합니까? SM은 R^n에서 R^n까지의 맵이므로 n^2 편미분 dSM [i]/dx [k] ... – Julien

+1

@JulienBernu를 정의 할 수 있습니다. 질문을 업데이트했습니다. 이견있는 사람? –

답변

10

나는 3 층 NN이이라고 가정하고 있습니다., b1 for은 입력 레이어에서 숨겨진 레이어로의 선형 변환과 연관되며 W2, b2은 숨겨진 레이어에서 출력 레이어로의 선형 변환과 관련됩니다. Z1Z2은 숨겨진 레이어 및 출력 레이어의 입력 벡터입니다. a1a2은 숨겨진 레이어와 출력 레이어의 출력을 나타냅니다. a2은 예상 결과입니다. delta3delta2은 오류 (백 프레젠테이션)이며 모델 매개 변수와 관련하여 손실 함수의 그라디언트를 볼 수 있습니다.

enter image description here enter image description here

이 3 층 NN하는 일반적인 시나리오

(입력 층, 하나의 숨겨진 층과 하나의 출력 층). 위에 설명 된 절차에 따라 계산하기 쉬운 그래디언트를 계산할 수 있습니다!이 게시물에 대한 또 다른 대답은 이미 코드의 문제를 지적한 이후로 동일한 내용을 반복하지는 않습니다.

+0

한 가지 더 명확하게하기. 우리가 z2로 시작해야한다면, 즉 z1이 존재하지 않는다면 2 층 NN으로 만들겠습니까? 선형 변환이 두 번 일어나면 3 계층 NN이됩니까? –

+0

방정식의 레이어 이름을 설명 할 수 있습니까? 귀하의 경우 입력 레이어가 z1입니까? 얼마나 많은 숨겨진 레이어와 그 무엇입니까? –

+0

답장을 업데이트했습니다. @ SamHammamy –

6

내가 말했듯이 n^2 부분 파생물입니다. 대신,이보다 간결과 같이 계산 될 수있다 그런데

 if i == j: 
      self.gradient[i] = self.value[i] * (1-self.input[i)) 
     else: 
      self.gradient[i] = -self.value[i]*self.input[j] 

 if i == j: 
      self.gradient[i,j] = self.value[i] * (1-self.value[i)) 
     else: 
      self.gradient[i,j] = -self.value[i] * self.value[j] 

: 당신이 수학을하는 경우

, 당신은 dSM[i]/dx[k]SM[i] * (dx[i]/dx[k] - SM[j]) 그래서 당신이해야 것을 알게 :

SM = self.value.reshape((-1,1)) 
jac = np.diag(self.value) - np.dot(SM, SM.T) 
+0

자코비안인가? –

+0

네, 그렇습니다 ...... – Julien

+0

다른 단절이 있다고 생각합니다. @ wasi의 대답이 숨겨진 레이어에 선형 변환이 있습니까? –