CS231n:(4) Backpropagation and Neural Networks

问答总结:

  • 计算图的组成部分有哪些?
  • 计算图反向传播时变量的梯度计算由哪两部分组成? 各种常见门的称号是什么,为什么有这样的称号?
  • 当一个变量流向多个分支时,应该怎样计算它的梯度?
  • 当变量向量化时,相当于每个输入向量的变量流向了多个分支,本地梯度保存的是雅可比矩阵,它的维度是怎样的。
  • 当实现计算图时,是怎样实现的,有哪两个重要的类,它们有哪两个重要的函数,分别都在干嘛。
  • 如何解释多层神经网络对单层神经网络的优势?

一、计算图

深度学习、机器学习的优化过程中,我们是要使得 l o s s loss loss尽量小。方法是使得参数沿着负梯度方向更新。如何计算梯度?前一节已经给出两种方法。(1)利用差分方式计算梯度。(2)直接利用微积分求出梯度解析式。但是这两种方法,在复杂的深度学习网络中,都不太适合程序化。因此,我们引出计算图的概念。

1、计算图结构

(1) 结点: 计算图的结点是一个运算(圆圈)。
(2) 变量: 这是当前计算图中参数的值, 前向传播时计算(绿色值)。
(3) 变量梯度: 这是当前计算图中参数梯度的值,反向传播时计算(红色值)。
在这里插入图片描述

2、标量梯度计算技巧

由于计算图本身是DAG(有向无环图), 当反向传播计算梯度时,我们按照从后向前依次计算每个变量(绿色)的梯度(红色)。每次计算时,我们只需要关注当前结点以及相关变量。
在这里插入图片描述
当计算当前节点相关变量 x x x梯度时, 计算的方式如下:
(1) ∂ L ∂ x = ∂ L ∂ z ∂ z ∂ x \frac{\partial L}{\partial x} = \frac{\partial L}{\partial z}\frac{\partial z}{\partial x} xL=zLxz, 其中 ∂ L ∂ z \frac{\partial L}{\partial z} zL上游梯度,在计算以前的节点时已经得到。 ∂ z ∂ x \frac{\partial z}{\partial x} xz当前梯度, 根据当前节点的操作以及相关变量的值计算。
(2) 初始上游梯度: ∂ L ∂ L = 1 \frac{\partial L}{\partial L} = 1 LL=1

我们也通常形象地将操作节点成为,更具当前梯度的计算方式,我们可以形象地赋予各种常见门以下含义:

  • “add”: 梯度分发器,进行操作 z = x + y z = x + y z=x+y, ∂ L ∂ x = ∂ L ∂ z ∂ z ∂ x = ∂ L ∂ z × 1 \frac{\partial L}{\partial x} = \frac{\partial L}{\partial z}\frac{\partial z}{\partial x} = \frac{\partial L}{\partial z} \times 1 xL=zLxz=zL×1即直接将上游梯度分发下来
  • “max”: 梯度路由器,进行操作 z = m a x ( x , y ) z = max(x, y) z=max(x,y). 被选中的参数梯度为 ∂ L ∂ z \frac{\partial L}{\partial z} zL, 否则为0,具有路由器的选择功能
  • “mul”: 梯度交换器,进行操作 z = x ∗ y z = x * y z=xy, ∂ L ∂ x = ∂ L ∂ z ∂ z ∂ x = ∂ L ∂ z × y \frac{\partial L}{\partial x} = \frac{\partial L}{\partial z}\frac{\partial z}{\partial x} = \frac{\partial L}{\partial z} \times y xL=zLxz=zL×y, 计算 x x x梯度时用到了 y y y的当前值,就好像执行了交换功能.

3、分支

如果一个变量通过一个节点(操作)流向了多个节点(操作),要计算梯度,则需要计算两个分支的梯度并相加:
在这里插入图片描述

4、门的合并

我们可以将多个门合并为一个门,然后人工求得合并门的当前梯度表达式,从而实现图的简化,比如常见的 σ \sigma σ门:
σ ( x ) = 1 1 + e − x \sigma(x) = \frac{1}{1+e^{-x}} σ(x)=1+ex1
d σ ( x ) d x = ( 1 − σ ( x ) ) σ ( x ) \frac{d\sigma(x)}{dx} = (1-\sigma(x))\sigma(x) dxdσ(x)=(1σ(x))σ(x)
这样我们就可以合并计算图(如下图蓝框所示):
在这里插入图片描述

二、变量向量化

1、雅可比矩阵

神经网络是通常是高度向量化的运算。对于每一个节点,当输入是向量时,所求的本地梯度应该是一个雅可比矩阵: 即保存每个输出变量对每个输入变量的偏导,若输入为 x ∈ R n \mathbf{x} \in R^n xRn, 输出为 f ∈ R m \mathbf{f} \in R^m fRm, 则雅可比矩阵 J ∈ R m × n J \in R^{m \times n} JRm×n。即:
在这里插入图片描述

2、分支思想

这里的向量化如果换成标量则相当于是产生了分支: 每个参数都流向了多个输出,因此我们使用链式法则和分支求和,便可以求得每个参数梯度。如图所示:
在这里插入图片描述
在这里插入图片描述

三、实践

进行编码的时候,我们将节点(操作)抽象出来,给其创建forwardbackward的两个方法。

1、门

在这里插入图片描述
完成各个门后,我们将门拼接为计算图,给整个计算图也创建forwardbackward两个方法。

2、图

在这里插入图片描述

四、多层神经网络的直观解释

在一层的线性分类器(感知器)中,我们仅仅学习了 n n n个模板,这很明显是不足的。比如下图,它对car的模板是一辆红色的车,如果遇到其他颜色的车,效果就会不太好。
在这里插入图片描述
如果我们加深网络层数,比如说两层,我们第一层网络参数 W 1 ∈ R h × k W_1 \in R^{h \times k} W1Rh×k, 第二层网络参数 W 2 ∈ R n × h W_2 \in R^{n \times h} W2Rn×h. 那么在第一层网络的学习过程中,他会学到 h h h个模板,其中可能有绿色的车,红色的车,卡车,小客车等对应模板。

当样本通过第一层时,得到 h h h的向量,代表各个模板的得分,最后再通过 W 2 W_2 W2进一步整合,以各模板得分为特征,得到最终的分类得分。如此,就可能将绿色得车也成功分类,这就有效解决了单层神经网络的模板单一、鲁棒性差的问题。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值