知识点概述

自动微分(Automatic Differentiation, AD)是一系列利用函数在计算机中的计算过程来精确计算其导数的技术。它与符号微分和有限差分都不同。AD基于一个核心事实:任何复杂的函数,无论其代码多么繁琐,最终都是由一系列基本的算术运算(加、减、乘、除)和初等函数(sin, exp等)组成的。通过反复应用链式法则,AD可以精确地(在浮点精度内)计算出导数值。AD主要有两种模式:前向模式和反向模式。

教材原文

Automatic differentiation is the generic name for techniques that use the computational representation of a function to produce analytic values for the derivatives. … Automatic differentiation techniques are founded on the observation that any function, no matter how complicated, is evaluated by performing a sequence of simple elementary operations… Another common ingredient of the various automatic differentiation tools is their use of the chain rule.

详细解释

  1. 计算图 (Computational Graph)

    • 函数求值的过程可以被表示为一个有向无环图,称为计算图。图的节点代表变量(输入、中间、输出),边代表基本运算。
    • 例如,函数 可以被分解为一系列如 , 等基本步骤。
  2. 前向模式 (Forward Mode)

    • 思想: 与函数求值(前向扫描)同步,计算每个中间变量在一个特定方向上的方向导数
    • 过程: 从输入变量开始,其方向导数就是自身的分量。然后,根据链式法则,逐个计算图中每个节点的值,直到最终算出
    • 应用:
      • 计算Jacobian-向量积 (Jv): 如果有一个向量函数,计算只需要一次前向扫描,其计算成本大约是函数自身求值成本的2-3倍。
      • 计算完整的Jacobian/Gradient: 需要对每个输入变量进行一次前向扫描(即令),总共需要次扫描。因此,计算梯度的成本大约是函数求值成本的倍。
  3. 反向模式 (Reverse Mode)

    • 思想: 分为两个阶段。第一阶段是标准的前向扫描,计算并存储所有中间变量的值。第二阶段是反向扫描,从最终的函数值开始,反向遍历计算图,利用链式法则计算并累加每个变量对最终函数值的“贡献”,即偏导数。
    • 过程: 在反向扫描中,每个节点关联一个“伴随”变量,它累加了所有流经该节点的路径上的导数信息。扫描从开始,根据 的规则,从子节点向父节点传播导数信息,直到计算出所有输入变量的偏导数。
    • 应用:
      • 计算梯度 (Gradient): 对于一个标量函数,只需要一次前向扫描和一次反向扫描,就可以得到完整的梯度。其计算成本通常不超过函数自身求值成本的5倍,且与变量数量无关!
      • 计算Jacobian转置-向量积 (J^T v): 对于向量函数,计算也只需要一次前向和一次反向扫描。
  4. 前向模式 vs. 反向模式

    • 计算梯度/Jacobian:
      • 如果(输入维度)远大于(输出维度),反向模式更有效。特别是对于标量函数(),反向模式计算梯度的成本与无关,优势巨大。
      • 如果远小于前向模式更有效。
    • 内存:
      • 前向模式的内存需求与函数求值相当。
      • 反向模式需要存储整个计算图(或至少是其中的一部分关键节点),内存开销可能非常大。检查点技术 (Checkpointing) 可以用来分段计算,以空间换时间,缓解内存压力。

学习要点

  • 核心原理: AD是链式法则在计算机程序上的系统性应用,它不是符号微分也不是数值近似。
  • 两种模式: 理解前向模式和反向模式的根本区别。前向模式“携带”方向导数前进,反向模式“传播”伴随变量(偏导数)后退。
  • 成本分析: 掌握两种模式的计算成本和适用场景。计算梯度()用反向模式;计算Jacobian-向量积(是单个向量)用前向模式。
  • 内存开销: 了解反向模式的主要缺点是可能需要巨大的内存来存储计算图。

实践应用

  • 机器学习: 训练深度神经网络的核心算法——反向传播 (Backpropagation)——本质上就是自动微分的反向模式。
  • 大规模优化: 在不精确牛顿法中,需要计算Hessian-向量积。这可以通过两次AD操作完成:一次前向模式计算,或者一次前向加一次反向模式计算
  • 复杂模型: 当函数由一个复杂的计算机模拟程序定义时,手动求导几乎不可能,有限差分又不精确,此时AD是唯一可行的精确求导工具。

关联知识点