查看公式请安装插件GitHub with MathJax
问题陈述:核心问题是:给定函数$f(x)$,其中x是输入数据的向量,需要计算函数f关于x的梯度,也就是$\nabla f(x)$。在神经网络中f对应的是损失函数
简单认知:对于$f=wx+b$,有$\frac{df}{dx}=w$、$\frac{df}{dw}=x$、$\frac{df}{db}=1$,其中$f$和$df$的维度相同并以此类推于其他变量,函数关于每个变量的导数指明了整个表达式对于该变量的敏感程度。
在神经网络中,会有许多复合表达式,采用链式法则求输入量的梯度,这个过程称为反向传播。
设$net_j$是节点
关键在于$\frac{\partial{E_d}}{\partial{net_j}}$的推导,引入误差项$\delta_j=\frac{\partial{E_d}}{\partial{net_j}}$,使用链式法则可得:
根据以上公式将梯度逐步传递。
直观理解:门单元将反向传回的梯度乘以它对其的输入的局部梯度,从而得到整个网络的输出对该门单元的每个输入值的梯度。
模块化与分段计算:门单元是相对的,任何可微分的函数都可以看做门单元。为了计算方便,可以将多个门组合成一个门,也可以根据需要将一个函数分拆成多个门。
注意: 对前向传播变量进行缓存 在不同分支的梯度要相加
加法门单元把输出的梯度相等地分发给它所有的输入
Max门单元对梯度做路由,选出在前向传播中值最大路径回传梯度
乘法门单元相对不容易解释但很重要。它的局部梯度就是相互交换后的输入值,然后根据链式法则乘以输出值的梯度。同时说明,数据的大小对于权重梯度的大小有影响。
向量化操作:层与层之间的交流是通过向量,但有的是Hadamard乘积,有的是矩阵相乘,分辨两种乘法以防混淆维度和转置操作。参照回传流图片:
其实数据前向传播和梯度反向传播,都属于卷积
附:结合《Neural Networks and Deep Learning-反向传播算法是如何工作的》学习,推荐阅读系列文章神经网络和反向传播算法