关键词:链式法则
这节课重点就讲了一个重点:链式法则(个人观点:类似连续求导)

上述示例表示为 f = q * z = ( x + y ) * z
反向传播的处理过程
1. 正向传播,计算各个节点的输出值
2. 计算局部导数:df/df = 1, df/dq = z = -4; df/dz = q = (-2 + 5) = -3; dq/dx=dq/dy = 1;
3. 利用链式法则(chain rule) 进行反向传播获得最终我们需要的导数,如
df/dx = (df/dq) * (dq/dx) = -4 * 1 = -4
上述过程不需要考虑整个网络,只需要单独计算各个节点,然后利用链式法则,将当前节点与它的top节点相连即可。
注:正向传播过程中的,每个节点的计算结果都要保存起来,因为反向传播时会使用到这些数值。所以如果只做正向传播,可以在代码中调整,不存储这些中间节点的计算结果。因为对于嵌入式设备而言,内存的耗用还是需要注意的。
链式求导:就是将各个Gates(节点)的导数相乘。

Sigmoid Gate
有些函数的导数是已知的,就不用一步步求导了,举例:Sigmoid Gate

注:横线上的绿色数字是正向传播的每个点的输出值,下测红色字体是反向传播的各个节点的梯度。
举例:
f(x) = 1/x 的导数是 -1 / x的平方,对应的数值 = -1/ (1.37*1.37) = -0.53 (用该节点的输入值求导)
g(x) = e^x 的导数还是e^x,该节点的导数 = g(x)的导数 * f(x)的导数 = e^(-1) * (-0.53) = -0.196,(+1的那个节点的导数为1,所以相当于乘以1,所以在这里暂时忽略了)
Gate的三种类型
add gate: gradient distributor
add gate不会给他的输入带来改变,会将它输出的梯度直接传递过去
max gate: gradient router
max gate 中只有一个分支会有梯度,另外一个为0,会把他的输出的导数传递到较大的输入中
mul gate: gradient switcher
某个输入的梯度等于输出的梯度与其他因子的乘积,比如f=(x+y)*z 中 x的梯度:
df/dx = (df/dq) * (dq/dx) = (dq/dx) * z = 1 * -4 = -4
最后,提到现在的Deep Learning Framework,每一个神经网络就是一系列层的集合,运算时,每一个曾都能实现一部分的功能(池化、Relu,Sigmoid等等)就是将各种层(layer)放在一起,然后需要的时间进行调用。

网友评论