Day 6 Back propagation

关键词:链式法则

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

Back-propagation

上述示例表示为 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

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)放在一起,然后需要的时间进行调用。

Torch Github - nn 

你可能感兴趣的:(Day 6 Back propagation)