我想從此鏈接瞭解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上。如果有任何地方發佈有關深度學習的問題,請告訴我。
嗨,感謝您的幫助。只有一件事我沒有得到。我的激活函數是'w * x + b'。所以如果我計算'dW',(我的意思是'W'上的梯度),它就是'x'(正如你所提到的)。那麼爲什麼我需要在'x'和分數梯度之間使用點積?(我的意思是爲什麼'dW = np.dot(X.T,dscores)')?它實際上做了什麼? –
@S_kar是'W'的最終漸變。您可以從輸出層開始,從整個事物的派生出發,並使用鏈式法則。它會變得很難看,所以我只給出了出現'X'的直覺:因爲激活函數的導數是'X'。如果你想計算一切,鏈式規則會使它更清晰。反向傳播基本上就是鏈式規則的連續應用:g(f(x))的導數是'g'(f(x))* f'(x)* x''。 – IVlad
因此,使用鏈規則我會得到'dW = X * dscore'?現在,如果鏈式規則是g(f(x))是g'(f(x))* f'(x)* x'',那麼如果激活函數是'f = w * x + b',那麼通過連鎖規則,我得到'dW = x'。那爲什麼我不直接從'w'中減去它? ('W + = -step_size * dW')?我是這個主題的新手,所以你知道我很難理解這一點。對不起,如果我錯過了一些明顯的觀點。 –