🚀 优质资源分享 🚀
学习路线指引(点击解锁) | 知识定位 | 人群定位 |
---|---|---|
🧡 Python实战微信订餐小程序 🧡 | 进阶级 | 本课程是python flask+微信小程序的完美结合,从项目搭建到腾讯云部署上线,打造一个全栈订餐系统。 |
💛Python量化交易实战💛 | 入门级 | 手把手带你打造一个易扩展、更安全、效率更高的量化交易系统 |
自动微分原理
自动微分(Automatic Differentiation,AD)是一种对计算机程序进行高效准确求导的技术,一直被广泛应用于计算流体力学、大气科学、工业设计仿真优化等领域。而近年来,机器学习技术的兴起也驱动着对自动微分技术的研究进入一个新的阶段。随着自动微分和其他微分技术研究的深入,其与编程语言、计算框架、编译器等领域的联系愈发紧密,从而衍生扩展出更通用的可微编程概念。
本章将从常见的微分方法开始介绍,然后深入自动微分基本概念。
常见计算机求导方法
对计算机程序求导的方法可以归纳为以下四种:
- 手动求解法(Manual Differentiation) :完全手动完成,手工求导并编写对应的结果程序,依据链式法则解出梯度公式,带入数值,得到梯度。
- 数值微分法(Numerical Differentiation):利用导数的原始定义,通过有限差分近似方法完成求导,直接求解微分值。
- 符号微分法(Symbolic Differentiation):基于数学规则和程序表达式变换完成求导。利用求导规则对表达式进行自动计算,其计算结果是导函数的表达式而非具体的数值。即,先求解析解,然后转换为程序,再通过程序计算出函数的梯度。
- 自动微分法(Automatic Differentiation):介于数值微分和符号微分之间的方法,采用类似有向图的计算来求解微分值,介于数值微分和符号微分之间的一种求导方法,也是本文介绍的重点。
手动微分
手动微分就是对每一个目标函数都需要利用求导公式手动写出求导公式,然后依照公式编写代码,带入数值,求出最终梯度。
这种方法准确有效,但是不适合工程实现,因为通用性和灵活性很差,每一次我们修改算法模型,都要修改对应的梯度求解算法。如果模型复杂或者项目频繁反复迭代,那么工作量将会是巨大的。
数值微分
数值微分方式应该是最直接而且简单的一种自动求导方式,使用差分近似方法完成,其本质是根据导数的定义推导而来。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-83lbCmga-1653219536291)(https://www.zhihu.com/equation?tex=+f%27%28x%29%3Dlim_%7Bh+%5Cto+0%7D%5Cfrac%7Bf%28x%2Bh%29-f%28x%29%7D%7Bh%7D+%5Ctag%7B1%7D+)]
当 h h h 取很小的数值,比如 0.000001 时,导数是可以利用差分来近似计算出来的。只需要给出函数值以及自变量的差值,数值微分算法就可计算出导数值。单侧差分公式根据导数的定义直接近似计算某一点处的导数值。
观察导数的定义容易想到,当 h h h 充分小时,可以用差商 f ( x + h ) − f ( x ) h \frac{f(x+h)-f(x)}{h} hf