梯度

http://cs231n.github.io/optimization-2/

这一节对梯度进行了介绍,并对梯度进行解释,以及介绍了链式规则,可能是国外的基础教育做的不够好,这在高数里面可能一小节就够用了。其实就是求导。根据每个数据的导数对运算结果的影响,来决策更新参数的方式。

值得注意的是,矩阵求导之前一直为接触过。如下所示,W 与X相乘,相对于X的偏导数,就是运算结果的偏导数(没有后续操作的话,这里就是1) 与矩阵W的转置相乘

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) 结果每个维度的值的变化方向。
下面这个例子可以看出,X.dot(W) 计算出结果后没有继续的运算,那么结果的梯度就相当于1,我们在这个基础,改变参数W的值,加上dW,结果变大,减去dW结果变小。(相当于y=kx+b, k变大,那么运算结果y也会变大,如果x<0,那么k的梯度就是负的,假设是-1,(k+(-1)0.1)x 相当于向梯度减少的方向移动了-1个单位,就是向梯度增加的方向移动了一个单位,在多维度上也是满足这个关系的,所以 (W+0.01dW).dot(X)一定会使结果变大。(W-0.01dW).dot(X)一定会使结果变小)
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.01
dW).dot(X))

result:
[[0.13265561]]
[[0.34511483]]
[[-0.07980361]]

结论:不论输入X的正负对,对于(W+0.01dW).dot(X)一定会使结果变大。(W-0.01dW).dot(X)一定会使结果变小

据此,就有了SVM和Softmax中参数更新的理论基础。

使用此种方式进行分类,在梯度更新时难免会丢失数据,相当与特征不完整,初见弊端。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容