这里回顾dlsys第四讲,本讲内容是自动微分。

课程主页:

大纲

  • 不同微分方法的介绍;
  • 反向模式自动微分;

不同微分方法的介绍

微分在机器学习的那个步骤起作用

回顾:每个机器学习算法都包含三个不同的元素。计算关于假设类参数的损失函数梯度是机器学习中最常见的操作:

数值微分

数值微分是根据定义直接计算梯度:

一种更精确的近似梯度的方法:

数值微分的问题有数值误差,并且计算效率较低。

数值误差检查

然而,数值微分是测试自动微分算法实现的强大工具:

其中$\delta$是单位球上的点,如果自动微分算法实现正确,则上式成立。

符号微分

写下公式,通过求和、乘积和链式法则推导出梯度(即最朴素的方式,利用定义求导):

这样实现会导致浪费计算,例如:

计算全部梯度需要$n(n-1)$次乘法。

计算图

每个节点代表计算中的一个(中间)值, 边表示输入输出关系:

自动微分的前向模式

考虑计算:

我们可以按照计算图的拓扑排序顺序计算$\dot{v}_i$,这被称为自动微分的前向模式:

因此:

前向模式的局限性

对于$f:\mathbb R^n \to \mathbb R^k$,我们需要$n$次前向AD传递来获得关于每个输入的梯度。在深度学习中,我们主要关心$k=1$和$n$很大的情况。为了高效地解决问题,我们需要使用另一种AD。

反向模式自动微分

实例

依然是之前的例子,我们计算:

然后我们可以按照计算图的反向拓扑顺序迭代计算$\bar{v}_i$:

multiple path情形

$v_1$被用于计算图的多条路径上($v_2$和$v_3$):

即$y=f(v_2, v_3)$,那么:

定义伴随:

那么:

总结后即可得到反向AD算法。

反向AD算法

通过扩展计算图的反向AD

我们可以通过拓展计算图来实现反向AD:

张量上的反向模式

对于高维情形,利用向量微积分即可,考虑下例:

前向计算为:

对于反向模式,定义(伴随):

那么:

即:

反向AD vs 反向传播

反向传播:

特点:

  • 在同一个前向图中运行反向操作;
  • 用于第一代深度学习框架(caffe、cuda-convnet);

特点:

  • 为伴随构造单独的图节点;
  • 由现代深度学习框架使用;
  • 反向模式AD的结果仍然是一个计算图;
  • 我们可以通过组合更多操作进一步扩展该图,并在梯度上再次运行反向模式AD;
  • 可以计算梯度的梯度;

在其他数据结构上的反向AD

要点:

  • 通常在与前向值和伴随传播规则相同的数据类型中定义“伴随值”,然后之前的算法就可以起作用;
  • 在我们的框架中不需要支持一般形式,但我们可能会支持“元组值”;