cs231反向传播笔记

    技术2022-07-12  68

    反向传播实践代码示例: 函数表达式:

    代码示例

    x = 3 # 例子数值 y = -4 # 前向传播 sigy = 1.0 / (1 + math.exp(-y)) # 分子中的sigmoi #(1) num = x + sigy # 分子 #(2) sigx = 1.0 / (1 + math.exp(-x)) # 分母中的sigmoid #(3) xpy = x + y #(4) xpysqr = xpy**2 #(5) den = sigx + xpysqr # 分母 #(6) invden = 1.0 / den #(7) f = num * invden # 搞定!

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

    # 回传 f = num * invden dnum = invden # 分子的梯度 #(8) dinvden = num #(8) # 回传 invden = 1.0 / den dden = (-1.0 / (den**2)) * dinvden #(7) # 回传 den = sigx + xpysqr dsigx = (1) * dden #(6) dxpysqr = (1) * dden #(6) # 回传 xpysqr = xpy**2 dxpy = (2 * xpy) * dxpysqr #(5) # 回传 xpy = x + y dx = (1) * dxpy #(4) dy = (1) * dxpy #(4) # 回传 sigx = 1.0 / (1 + math.exp(-x)) dx += ((1 - sigx) * sigx) * dsigx # Notice += !! See notes below #(3) # 回传 num = x + sigy dx += (1) * dnum #(2) dsigy = (1) * dnum #(2) # 回传 sigy = 1.0 / (1 + math.exp(-y)) dy += ((1 - sigy) * sigy) * dsigy #(1) # 完成! 嗷~~

    需要注意几点: 对前向传播变量进行缓存:在计算反向传播时,前向传播过程中得到的一些中间变量非常有用。在实际操作中,最好代码实现对于这些中间变量的缓存,这样在反向传播的时候也能用上它们。如果这样做过于困难,也可以(但是浪费计算资源)重新计算它们。

    在不同分支的梯度要相加:如果变量x,y在前向传播的表达式中出现多次,那么进行反向传播的时候就要非常小心,使用+=而不是=来累计这些变量的梯度(不然就会造成覆写)。这是遵循了在微积分中的多元链式法则,该法则指出如果变量在线路中分支走向不同的部分,那么梯度在回传的时候,就应该进行累加。 矩阵相乘的梯度:可能最有技巧的操作是矩阵相乘(也适用于矩阵和向量,向量和向量相乘)的乘法操作。注意不需要去记忆dW和dX的表达,因为它们很容易通过维度推导出来。例如,权重的梯度dW的尺寸肯定和权重矩阵W的尺寸是一样的。

    Processed: 0.023, SQL: 9