美文网首页
2019-11-04 反向传播 链式法则 局部梯度

2019-11-04 反向传播 链式法则 局部梯度

作者: 霍尔元件 | 来源:发表于2019-11-04 16:49 被阅读0次

    发下cs231n关于反向传播的讲解特别好,尤其是代码实现部分。一个复杂的式子的导数可能很复杂,但是利用链式法则就可以将问题分解为一个又一个局部梯度的堆叠(staged)

    x = 3 # example values
    y = -4
    
    # forward pass
    sigy = 1.0 / (1 + math.exp(-y)) # sigmoid in numerator   #(1)
    num = x + sigy # numerator                               #(2)
    sigx = 1.0 / (1 + math.exp(-x)) # sigmoid in denominator #(3)
    xpy = x + y                                              #(4)
    xpysqr = xpy**2                                          #(5)
    den = sigx + xpysqr # denominator                        #(6)
    invden = 1.0 / den                                       #(7)
    f = num * invden # done!                                 #(8)
    
    # backprop f = num * invden
    dnum = invden # gradient on numerator                             #(8)
    dinvden = num                                                     #(8)
    # backprop invden = 1.0 / den 
    dden = (-1.0 / (den**2)) * dinvden                                #(7)
    # backprop den = sigx + xpysqr
    dsigx = (1) * dden                                                #(6)
    dxpysqr = (1) * dden                                              #(6)
    # backprop xpysqr = xpy**2
    dxpy = (2 * xpy) * dxpysqr                                        #(5)
    # backprop xpy = x + y
    dx = (1) * dxpy                                                   #(4)
    dy = (1) * dxpy                                                   #(4)
    # backprop sigx = 1.0 / (1 + math.exp(-x))
    dx += ((1 - sigx) * sigx) * dsigx # Notice += !! See notes below  #(3)
    # backprop num = x + sigy
    dx += (1) * dnum                                                  #(2)
    dsigy = (1) * dnum                                                #(2)
    # backprop sigy = 1.0 / (1 + math.exp(-y))
    dy += ((1 - sigy) * sigy) * dsigy                                 #(1)
    

    我们对前向传播时产生每个变量(sigy, num, sigx, xpy, xpysqr, den, invden)进行回传。我们会有同样数量的变量,但是都以d开头,用来存储对应变量的梯度。注意在反向传播的每一小块中都将包含了表达式的局部梯度,然后根据使用链式法则乘以上游梯度。

    当前梯度 = 局部梯度 * 上游梯度

    讨论了分段计算在反向传播的实现中的重要性。应该将函数分成不同的模块,这样计算局部梯度相对容易,然后基于链式法则将其“链”起来。重要的是,不需要把这些表达式写在纸上然后演算它的完整求导公式,因为实际上并不需要关于输入变量的梯度的数学公式。只需要将表达式分成不同的可以求导的模块(模块可以是矩阵向量的乘法操作,或者取最大值操作,或者加法操作等),然后在反向传播中一步一步地计算梯度。

    相关文章

      网友评论

          本文标题:2019-11-04 反向传播 链式法则 局部梯度

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