梯度

作者: 有花落蝶 | 来源:发表于2018-04-21 20:33 被阅读0次

    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中参数更新的理论基础。

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

    相关文章

      网友评论

          本文标题:梯度

          本文链接:https://www.haomeiwen.com/subject/azpxlftx.html