CS231n:(4) Backpropagation and Neural Networks
问答总结:
- 计算图的组成部分有哪些?
- 计算图反向传播时变量的梯度计算由哪两部分组成? 各种常见门的称号是什么,为什么有这样的称号?
- 当一个变量流向多个分支时,应该怎样计算它的梯度?
- 当变量向量化时,相当于每个输入向量的变量流向了多个分支,本地梯度保存的是雅可比矩阵,它的维度是怎样的。
- 当实现计算图时,是怎样实现的,有哪两个重要的类,它们有哪两个重要的函数,分别都在干嘛。
- 如何解释多层神经网络对单层神经网络的优势?
一、计算图
深度学习、机器学习的优化过程中,我们是要使得尽量小。方法是使得参数沿着负梯度方向更新。如何计算梯度?前一节已经给出两种方法。(1)利用差分方式计算梯度。(2)直接利用微积分求出梯度解析式。但是这两种方法,在复杂的深度学习网络中,都不太适合程序化。因此,我们引出计算图的概念。
1、计算图结构
(1) 结点: 计算图的结点是一个运算(圆圈)。
(2) 变量: 这是当前计算图中参数的值, 前向传播时计算(绿色值)。
(3) 变量梯度: 这是当前计算图中参数梯度的值,反向传播时计算(红色值)。
2、标量梯度计算技巧
由于计算图本身是DAG(有向无环图), 当反向传播计算梯度时,我们按照从后向前依次计算每个变量(绿色)的梯度(红色)。每次计算时,我们只需要关注当前结点以及相关变量。
当计算当前节点相关变量梯度时, 计算的方式如下:
(1) , 其中为上游梯度,在计算以前的节点时已经得到。为当前梯度, 根据当前节点的操作以及相关变量的值计算。
(2) 初始上游梯度:
我们也通常形象地将操作节点成为门,更具当前梯度的计算方式,我们可以形象地赋予各种常见门以下含义:
- “add”: 梯度分发器,进行操作, :即直接将上游梯度分发下来。
- “max”: 梯度路由器,进行操作. 被选中的参数梯度为, 否则为0,具有路由器的选择功能
- “mul”: 梯度交换器,进行操作, , 计算梯度时用到了的当前值,就好像执行了交换功能.
3、分支
如果一个变量通过一个节点(操作)流向了多个节点(操作),要计算梯度,则需要计算两个分支的梯度并相加:
4、门的合并
我们可以将多个门合并为一个门,然后人工求得合并门的当前梯度表达式,从而实现图的简化,比如常见的门:
这样我们就可以合并计算图(如下图蓝框所示):
二、变量向量化
1、雅可比矩阵
神经网络是通常是高度向量化的运算。对于每一个节点,当输入是向量时,所求的本地梯度应该是一个雅可比矩阵: 即保存每个输出变量对每个输入变量的偏导,若输入为, 输出为, 则雅可比矩阵。即:
2、分支思想
这里的向量化如果换成标量则相当于是产生了分支: 每个参数都流向了多个输出,因此我们使用链式法则和分支求和,便可以求得每个参数梯度。如图所示:
三、实践
进行编码的时候,我们将节点(操作)抽象出来,给其创建forward
和backward
的两个方法。
1、门
完成各个门后,我们将门拼接为计算图,给整个计算图也创建forward
和backward
两个方法。
2、图
四、多层神经网络的直观解释
在一层的线性分类器(感知器)中,我们仅仅学习了个模板,这很明显是不足的。比如下图,它对car的模板是一辆红色的车,如果遇到其他颜色的车,效果就会不太好。
如果我们加深网络层数,比如说两层,我们第一层网络参数, 第二层网络参数. 那么在第一层网络的学习过程中,他会学到个模板,其中可能有绿色的车,红色的车,卡车,小客车等对应模板。
当样本通过第一层时,得到的向量,代表各个模板的得分,最后再通过进一步整合,以各模板得分为特征,得到最终的分类得分。如此,就可能将绿色得车也成功分类,这就有效解决了单层神经网络的模板单一、鲁棒性差的问题。