自动微分(AD)学习笔记
1.自动微分(AD)
作者:李济深
链接:https://www.zhihu.com/question/48356514/answer/125175491
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
开源里面比较干净的Forward Mode实现应该是ceres-solver里的的Jet[1]了。文件注释里解释得很详细。Reverse Mode比较成熟的实现是Stan[3]的。Adept[2]的实现思路有点意思,速度上跟Stan差不多(Stan在对节点函数上做了更多优化的工作),但是似乎缺乏实际产品的检验,稳定性可能不如Stan。Adept 2.0 版本自己实现了Array,原因大抵是作者想写出自己的风格…向不成熟的方向又迈进了一步。
AD在优化问题里面是一个非常方便的工具。但是不要忘了最简单的 df = (f(x+h) - f(x-h)) / 2h 这样简单而高效的形式,结合两者在某些优化问题里会有更好的效果。
Ceres中提供了三种求导方式:
- 解析法求导
- 数值法求导
- 自动微分法(AD)求导
[2]: Adept: Fast Automatic Differentiation using Expression Templates
[3]: GitHub - stan-dev/math: Stan Math Library
2.数值微分:
https://en.wikipedia.org/wiki/Numerical_differentiation
求解非线性最小二乘法 Eigen https://blog.csdn.net/z444_579/article/details/52228602
http://blog.sina.com.cn/s/blog_a29eae2b0102whjp.html
Eigen中Levenberg-Marquardt算法的应用 https://blog.csdn.net/u012541187/article/details/53220280
https://scicomp.stackexchange.com/questions/16237/eigen-unsupported-levenberg-marquardt-algorithm
Eigen3中的数值微分法:
在Eigen3中,数值微分法也是继承自自定义的Functor数据结构的,写法大概是如下这样。
这样自定义的my_functor中就只定义了 operator() 函数,虽然没有定义 df() 函数,但是NumericalDiff数据结构是定义了 df() 函数的。
1 2 3 | my_functor functor; Eigen::NumericalDiff<my_functor> numDiff(functor); Eigen::LevenbergMarquardt<Eigen::NumericalDiff<my_functor>, double > lm(numDiff); |
当然可以完全自己定义一个结构体,自己实现df函数求偏导,和operator()函数求函数值。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· Vue3状态管理终极指南:Pinia保姆级教程
2017-06-05 KinectFusion测试