4

我想從此鏈接瞭解Softmax分類器的簡單實現 - CS231n - Convolutional Neural Networks for Visual Recognition。在這裏他們實現了一個簡單的softmax分類器。在鏈接上的Softmax分類器的例子中,2D空間上有300個隨機點和一個與它們相關的標籤。 softmax分類器將瞭解哪個點屬於哪個類。瞭解softmax分類器

以下是softmax分類器的完整代碼。或者你可以看到我提供的鏈接。

# initialize parameters randomly 
W = 0.01 * np.random.randn(D,K) 
b = np.zeros((1,K)) 

# some hyperparameters 
step_size = 1e-0 
reg = 1e-3 # regularization strength 

# gradient descent loop 
num_examples = X.shape[0] 
for i in xrange(200): 

    # evaluate class scores, [N x K] 
    scores = np.dot(X, W) + b 

    # compute the class probabilities 
    exp_scores = np.exp(scores) 
    probs = exp_scores/np.sum(exp_scores, axis=1, keepdims=True) # [N x K] 

    # compute the loss: average cross-entropy loss and regularization 
    corect_logprobs = -np.log(probs[range(num_examples),y]) 
    data_loss = np.sum(corect_logprobs)/num_examples 
    reg_loss = 0.5*reg*np.sum(W*W) 
    loss = data_loss + reg_loss 
    if i % 10 == 0: 
    print "iteration %d: loss %f" % (i, loss) 

    # compute the gradient on scores 
    dscores = probs 
    dscores[range(num_examples),y] -= 1 
    dscores /= num_examples 

    # backpropate the gradient to the parameters (W,b) 
    dW = np.dot(X.T, dscores) 
    db = np.sum(dscores, axis=0, keepdims=True) 

    dW += reg*W # regularization gradient 

    # perform a parameter update 
    W += -step_size * dW 
    b += -step_size * db 

我不能理解他們是如何計算這裏的梯度。我假設他們在這裏計算了梯度 -

dW = np.dot(X.T, dscores) 
    db = np.sum(dscores, axis=0, keepdims=True) 
    dW += reg*W # regularization gradient 

但是如何?我的意思是爲什麼dW的梯度是np.dot(X.T, dscores)?爲什麼db的梯度是np.sum(dscores, axis=0, keepdims=True)?那麼他們如何計算重量和偏差的梯度?也爲什麼他們計算了regularization gradient

我剛開始學習卷積神經網絡和深度學習。我聽說CS231n - Convolutional Neural Networks for Visual Recognition是一個很好的開始。我不知道在哪裏放置深度學習相關的帖子。所以,我把它們放在了stackoverflow上。如果有任何地方發佈有關深度學習的問題,請告訴我。

回答

6

的梯度開始被計算這裏:

# compute the gradient on scores 
dscores = probs 
dscores[range(num_examples),y] -= 1 
dscores /= num_examples 

首先,這臺dscores等於由SOFTMAX函數計算的概率。然後,它從第二行中正確類的計算概率中減去1,然後除以第三行中的訓練樣本數。爲什麼減去1?因爲你想要正確的標籤的概率是1,理想情況下。所以它會從它實際預測的內容中減去它應該預測的值:如果預測值接近1,那麼減法將是一個很大的負數(接近零),所以漸變將很小,因爲您接近解決方案。否則,它將是一個很小的負數(遠離零),所以漸變會更大,並且您將向解決方案邁出更大的步驟。

您的激活功能只是w*x + b。它的相對於w的衍生物是x,這就是爲什麼dWx和分數/輸出層的梯度之間的點積。

關於bw*x + b的衍生物是1,這就是爲什麼在反向傳播時簡單地總結dscores的原因。

+1

嗨,感謝您的幫助。只有一件事我沒有得到。我的激活函數是'w * x + b'。所以如果我計算'dW',(我的意思是'W'上的梯度),它就是'x'(正如你所提到的)。那麼爲什麼我需要在'x'和分數梯度之間使用點積?(我的意思是爲什麼'dW = np.dot(X.T,dscores)')?它實際上做了什麼? –

+1

@S_kar是'W'的最終漸變。您可以從輸出層開始,從整個事物的派生出發,並使用鏈式法則。它會變得很難看,所以我只給出了出現'X'的直覺:因爲激活函數的導數是'X'。如果你想計算一切,鏈式規則會使它更清晰。反向傳播基本上就是鏈式規則的連續應用:g(f(x))的導數是'g'(f(x))* f'(x)* x''。 – IVlad

+1

因此,使用鏈規則我會得到'dW = X * dscore'?現在,如果鏈式規則是g(f(x))是g'(f(x))* f'(x)* x'',那麼如果激活函數是'f = w * x + b',那麼通過連鎖規則,我得到'dW = x'。那爲什麼我不直接從'w'中減去它? ('W + = -step_size * dW')?我是這個主題的新手,所以你知道我很難理解這一點。對不起,如果我錯過了一些明顯的觀點。 –