http://cs231n.github.io/optimization-2/
這一節(jié)對梯度進行了介紹,并對梯度進行解釋,以及介紹了鏈式規(guī)則,可能是國外的基礎(chǔ)教育做的不夠好,這在高數(shù)里面可能一小節(jié)就夠用了。其實就是求導(dǎo)。根據(jù)每個數(shù)據(jù)的導(dǎo)數(shù)對運算結(jié)果的影響,來決策更新參數(shù)的方式。
值得注意的是,矩陣求導(dǎo)之前一直為接觸過。如下所示,W 與X相乘,相對于X的偏導(dǎo)數(shù),就是運算結(jié)果的偏導(dǎo)數(shù)(沒有后續(xù)操作的話,這里就是1) 與矩陣W的轉(zhuǎn)置相乘
forward pass
W = np.random.randn(5, 10)
X = np.random.randn(10, 3)
D = W.dot(X)
dD = np.random.randn(*D.shape) # same shape as D
dW = dD.dot(X.T) #.T gives the transpose of the matrix
dX = W.T.dot(dD)
來自 http://cs231n.github.io/optimization-2/
既然我們知道了W每個維度的梯度,那么我們就可以決定X.dot(W) 結(jié)果每個維度的值的變化方向。
下面這個例子可以看出,X.dot(W) 計算出結(jié)果后沒有繼續(xù)的運算,那么結(jié)果的梯度就相當(dāng)于1,我們在這個基礎(chǔ),改變參數(shù)W的值,加上dW,結(jié)果變大,減去dW結(jié)果變小。(相當(dāng)于y=kx+b, k變大,那么運算結(jié)果y也會變大,如果x<0,那么k的梯度就是負的,假設(shè)是-1,(k+(-1)0.1)x 相當(dāng)于向梯度減少的方向移動了-1個單位,就是向梯度增加的方向移動了一個單位,在多維度上也是滿足這個關(guān)系的,所以 (W+0.01dW).dot(X)一定會使結(jié)果變大。(W-0.01dW).dot(X)一定會使結(jié)果變小)
import numpy as np
forward pass
W = np.random.randn(1, 10)
X = np.random.randn(10, 1)
D = W.dot(X)
dD = np.random.randn(D.shape)0+1 # same shape as D
dW = dD.dot(X.T) #.T gives the transpose of the matrix
dX = W.T.dot(dD)
print(D)
print((W+0.01dW).dot(X))
print((W-0.01dW).dot(X))
result:
[[0.13265561]]
[[0.34511483]]
[[-0.07980361]]
結(jié)論:不論輸入X的正負對,對于(W+0.01dW).dot(X)一定會使結(jié)果變大。(W-0.01dW).dot(X)一定會使結(jié)果變小
據(jù)此,就有了SVM和Softmax中參數(shù)更新的理論基礎(chǔ)。
使用此種方式進行分類,在梯度更新時難免會丟失數(shù)據(jù),相當(dāng)與特征不完整,初見弊端。