反向传播
0 简介
反向传播是利用链式法则递归计算表达式的梯度的方法,理解反向传播对于理解、实现、设计和调试神经网络非常关键。
我们需要解决的核心问题就是,给定函数 f(x) f ( x ) ,其中 x x 是输入数据的向量,需要计算函数关于 x x 的梯度,也就是。
xi x i 的梯度有时是有用的,比如将神经网络所做的事情可视化便于直观理解。
函数关于每个变量的导数指明了整个表达式对于该变量的敏感程度。
1 计算图
反向传播是一个优美的局部过程。在整个计算线路图中,每个门单元都会得到一些输入并立即计算两个东西。
这个门的输出值
其输出值关于输入值的局部梯度(后面的具体梯度,用一个变量暂存)
加法门:梯度分发(所有值与梯度同)
最大门:梯度路由(较大值占所有,其余均为0)
乘法门:梯度交换(所有值交换乘梯度)
因此,反向传播可以看做是门单元之间在通过梯度信号相互通信,只要让他们的输入沿着梯度方向变化,无论他们自己的输出值在何种程度上升或下降,都是为了让整个网络的输出值更高。
注:
对前向传播变量进行缓存:
在计算反向传播时,前向传播过程中得到的一些中间变量非常有用。在实际操作中,最好代码实现对于这些中间变量的缓存,这样在反向传播的时候也能用上他们。如果这样做过于困难,也可以(但是浪费计算资源)重新计算他们。
在不同分支的梯度要相加:
如果变量x,y变量在前向传播的表达式中出现多次,那么进行反向传播的时候就要非常小心,使用+=而不是=来累计这些变量的梯度(不然就会造成覆写)。这是遵循了微积分中的多元链式法则,该法则指出如果变量在线路中分支走向不同的部分,那么梯度在回传的时候,就应该进行累加。
梯度的向量化编码
Jacobian J a c o b i a n 雅克比矩阵
2 总结
(1)神经网络十分庞大:对于所有参数,用手写下所有公式是不切实际的
(2)反向传播:沿计算图递归应用链式规则计算所有输入、输出、中间件的梯度
(3)维护图结构,其中每个节点实现forward()/backward()API
(4)前向传播过程:计算运算的结果,在内存中保存梯度计算需要的任何中间件
(5)反向传播过程:应用链式求导规则,计算损失函数关于输入变量的所有梯度