SIG-可微编程技术沙龙回顾 | 从自动微分到可微编程--综述_哔哩哔哩_bilibili
编程语言LAB
涂玏(le)
2021-08-15
自动微分(Automatic Differentiation,AD),科学计算,物理建模/图形渲染,人工智能。
程序求导的基本方法§
导数的定义是通过极限的概念对函数进行局部的线性逼近。
常见的基本函数在数学上有对应的导函数,复合函数也有对应的求导规则。
1 数值微分(Numerical Differentiation)§
实现简单,精确度不足。(截断误差+舍入误差)
截断误差和舍入误差存在一个折中,h过小,舍入误差过大,h过大,截断误差过大。
2 符号微分(Symbolic Differentiation)§
优点在于精确度,缺点在于容易产生表达式膨胀问题。
很难分解出最简表达式。
3 自动微分(Automatic Differentiation)§
在表达式展开过程中完成一部分计算。
对中间微分结果进行复用,截断表达式展开的过程。
优点在于保证精确度的同时,避免了表达式膨胀。
业内自动微分方案§
19世纪50年代~
1 基本表达式法§
- 将基本表达式及其对应的求导规则封装为库函数
- 用户使用封装的基本表达式构建程序
实现方式简单,但无法使用语言原生的表达式构建程序,微分过程不透明。
2 操作符重载法§
- 将语言中的基本表达式通过重载来定义其求导规则
- 用户使用语言原生的基本表达式构建程序
利用了现代语言特性,实现简单。
动态运行期计算的引入阻碍了编译器优化,且影响高阶微分的实现。
3 代码变换法§
- 将程序本身按照求导规则进行代码变换来完成求导
- 编辑器/解释器:对程序的中间表示(AST/IR/bytecode)进行变换
- 元编程:对源码进行变换
用户使用简单,利于编译优化,实现难度较大。
可微编程§
Deep Learning est mort. Vive Differentiable Programming!
-- Le Cun
将微分技术与语言设计、编译器/解释器甚至IDE等工具链等深度融合。
- 可以使用更丰富的语言原生特性
- 可以更自由定制微分规则
- 支持更丰富的微分模式和内置一些优化算法
- 更友好的编程体验
Swift for TensorFlow§
- Differentiable protocol: 将数学中的微分概念抽象为语言中的protocol特性,任意扩展后的数据类型均可定义为“可微”
- Differentiable attribute: 允许用户通过语言中的attribute自定义微分规则。
- Differentiable type: 利用类型系统完成一部分基础的微分规则检查。
技术挑战和展望§
1 性能§
反向模式自动微分中如何确定checkpoint的策略。
2 易用性§
- 语言原生
- 更复杂的控制流
- 高级语言特性,如多态
- 用户友好
- 更健壮的微分规则检查
- 更友好的错误告警
- 更方便的调试手段
- 功能全面
- 内置针对特定领域场景的优化策略,如二阶优化
- 更丰富的微分模式,前向&反向&混合