1. Introduction
本节主要介绍反向传播的直观理解:使用链式法则进行递归求导的梯度计算方式。
给定一个函数,其中是输入变量,我们要计算函数关于的梯度,即:。
可以是损失函数。我们知道,是关于输入样本和权重与偏置的函数,其中是固定不变的,和是算法要去学习和确定的。通过计算损失函数关于和的导数,可以迭代更新权重和偏置。
2. Simple expressions and interpretation of the gradient
例1:函数,包括两个变量,分别对其求导,可以得到:
,
导数的解释:函数的关于某变量的导数,代表了这个变量的值的变化对函数的影响的大小。
梯度:梯度代表偏导数组成的向量,例如:
函数的梯度可以写成:
例2:计算加法运算的的导数
,
这个例子表示,函数关于变量的导数与的值无关。
例3:计算max运算的导数
,
这个例子表示,只有取值大的变量才有导数,取值小的变量导数为0。
3. Compound expression (复合表达式)with chain rule
例4:计算的导数。
首先,将这个稍微复杂的表达式分解成两个函数,。 然后,先对进行求导:,。 接着,再用对求导:,。 最后,根据链式法则可知: , |
若输入一个样本,上面的计算过程可以用下图表示:
绿色代表前向传播的结果,红色代表反向传播的结果。
4. Intuitive understanding of backpropagation
反向传播是局部运算过程。每个gate(计算单元)在得到输入后,可以立即计算两个东西:1. 输出 2. 根据输出值计算关于输入的局部梯度。每个Gate不需要知道整个网络的结构就可以进行这两个计算。在前向传播结束后,反向传播时,只用局部梯度相乘就可以得到最终输出相对于某个变量的梯度值。
注意:gate 就是计算单元。
5. Modularity:Sigmoid example
任意可微函数都可以作为一个gate,我们可以把任意多个gates组成一个gate,也可以将一个函数拆分成几个gates。
例5: 给定函数
在后面的学习中,我们会发现这个函数可以描述一个2D神经元,即:输入为,权重为,使用sigmoid作为激活函数的神经元。但现在,我们只把它看成一个函数就好。
这个函数是由多个gate组成的。除了之前介绍的加、乘、max之外,还有四种:
,
,
以为例,则给定函数的计算过程可以用下面的计算图表示:

Sigmoid函数及其导数:
Sigmoid函数定义:
Sigmoid函数的导数:
诀窍Tips:Staged Backpropagation分段反向传播。在前向传播时将函数进行拆分,分段进行,方便后续的求导和反向传播。
6. Backprop in practice:staged computation
例6: 给定函数,
前向传播实现过程:
在前向传播时,创建了一些中间变量,这些都是简单的表达式。在反向传播时,在这些变量前面加上d
表示梯度。
反向传播实现过程:
注意:
-
缓存前向传播的变量,因为在反向传播的时候也会用到
-
Gradients add up for forks. 如果在前向传播时使用了多次,name在反向传播的时候要用“+=”替代“=”。我们要累积梯度,使用
=
会覆盖掉前面计算好的梯度。
7. Patterns in backward flow
在大多数情况下,反向传播过程中的梯度可以被很直观的解释清楚。例如:常见的神经网络中经常使用的gates:add,max和mul。
举例:
Add:加法是梯度不变的传递给下一个门单元
Max:max算子是把梯度分到值比较大的一个单元。
Mul:乘法是把梯度乘以一个值传到下一个门单元。f=xyf=xy,那么传到xx的梯度要乘以yy,同理yy的梯度。
注意:
Question:为什么预处理调整输入数据的scale很重要??
Answer:
当一个较大的值和一个较小值作为乘法算子的input时,那么对于值小的输入会有一个较大的梯度,对于值大的输入会有一个较小的梯度。
是乘法算子,说明输入数据的尺度scale对权重的梯度有很大影响。如果输入数据很大,那么对应的权重的梯度也会很大,那就意味着我们需要降低learning rate来补偿,就会导致w很敏感,鲁棒性差。这也是为什么预处理很重要的原因。
8. Gradients for vectorized operations
上面的章节都是基于单个变量的,但是神经网络中的运算都是以矩阵或向量为单位的。
求梯度以及梯度反向传播,都可以用矩阵或向量乘法。
Tips:使用use dimension analysis!在计算梯度的过程中,不用牢记它的表达式,因为可以通过维度分析出来。例如:的维度和维度大小一致,它等于和的乘积。
9. Summary
- 对梯度有直观的理解,如何用计算图,梯度的传播过程以及梯度对输出的影响。
- 讨论了stage computation在反向传播中的用法和意义:把函数划分成更小的模块,可以很好地计算梯度,再使用链式法则计算最后的梯度。