自动微分(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)求导
[1]: ceres-solver/jet.h at master · kashif/ceres-solver · GitHub
[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() 函数的。
my_functor functor;
Eigen::NumericalDiff<my_functor> numDiff(functor);
Eigen::LevenbergMarquardt<Eigen::NumericalDiff<my_functor>, double> lm(numDiff);
当然可以完全自己定义一个结构体,自己实现df函数求偏导,和operator()函数求函数值。
自动微分(AD)学习笔记的更多相关文章
- AD学习笔记(基础)
AD学习 1 学习思路 1.1 学什么 1.2 怎么学 2 AD本身 3 AD project 3.1 任务层级 3.2 PCB流程 4 原理图工作环境设置 5 开始 5.1工程创建 5.2 元件库介 ...
- JVM自动内存管理学习笔记
对于使用 C.C++ 的程序员来说,在内存管理领域,他们既是拥有最高权力的皇帝又是从事最基础工作的劳动人民——拥有每一个对象的“所有权”,又担负着每一个对象生命开始到终结的维护责任.对于 Java 程 ...
- AD学习笔记----PCB设计
1.重新设置板子的形状 Design ---->Board Shape---->Redefine Board Sharp 2.通过Board Options 对板子进行设置 3.添加一个新 ...
- [学习笔记] AD笔记
Auto diff 深度学习基础知识,auto diff自动微分的笔记,tensorflow中的求导就是基于这个做的.多用于复杂神经网络求导.来自于一篇论文,没怎么看完,但是会算了,比较底层一点吧.. ...
- swift学习笔记5——其它部分(自动引用计数、错误处理、泛型...)
之前学习swift时的个人笔记,根据github:the-swift-programming-language-in-chinese学习.总结,将重要的内容提取,加以理解后整理为学习笔记,方便以后查询 ...
- [原创]java WEB学习笔记99:Spring学习---Spring Bean配置:自动装配,配置bean之间的关系(继承/依赖),bean的作用域(singleton,prototype,web环境作用域),使用外部属性文件
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- Dynamic CRM 2013学习笔记(三十四)自定义审批流5 - 自动邮件通知
审批过程中,经常要求自动发邮件:审批中要通知下一个审批人进行审批:审批完通知申请人已审批完:被拒绝后,要通知已批准的人和申请人.下面详细介绍如何实现一个自动发邮件的插件: 1. 根据审批状态来确定 ...
- Android(java)学习笔记204:自定义SmartImageView(继承自ImageView,扩展功能为自动获取网络路径图片)
1.有时候Android系统配置的UI控件,不能满足我们的需求,Android开发做到了一定程度,多少都会用到自定义控件,一方面是更加灵活,另一方面在大数据量的情况下自定义控件的效率比写布局文件更高. ...
- thinkphp学习笔记9—自动加载
原文:thinkphp学习笔记9-自动加载 1.命名空间自动加载 在3.2版本中不需要手动加载类库文件,可以很方便的完成自动加载. 系统可以根据类的命名空间自动定位到类库文件,例如定义了一个类Org\ ...
随机推荐
- (8) MySQL主从复制架构使用方法
一. 单个数据库服务器的缺点 数据库服务器存在单点问题 数据库服务器资源无法满足增长的读写请求 高峰时数据库连接数经常超过上限 二. 如何解决单点问题 增加额外的数据库服务器,组建数据库集群 同一集群 ...
- ETF计划Q&A
ETF计划Q&A 2018-07-16 参考:详解ETF计划.ETF计划Q&A(2017版) 目录 问1:ETF计划是什么?问2:ETF计划适合什么人参加?问3:我想参考你的计划,但告 ...
- 【转】JAVA反射与注解
转载自:https://www.daidingkang.cc/2017/07/18/java-reflection-annotations/ 前言 现在在我们构建自己或公司的项目中,或多或少都会依赖几 ...
- 在windows 上自动重启 tomcat 的方法
在windows 上自动重启 tomcat 的方法 实现思路: Windows 上监控tomcat 进程并且自动重启的脚本 一类是 定时重启 tomcat 一类是 监控并重启 写一个守护tomcat进 ...
- Idea2018旗舰版破解方法
完整请参考 https://www.jianshu.com/p/3c87487e7121 1.在hosts文件里添加一行: 0.0.0.0 account.jetbrains.com 2.在Activ ...
- 导出jqgrid表格数据为EXCEL文件,通过tableExport.js插件。
今天公司项目需要做个导出功能,将jqgrid查询出的数据导出为EXCEL表格文件,期间遇到两个问题: 1.导出报错 uncaught exception: INVALID_CHARACTER_ERR: ...
- 【Clojure 基本知识】 关于函数参数的各种高级用法
关于Clojure函数参数用法,学习中一些总结,无废话,直接看代码: 一.接受不定参数 ;;接受不定参数 (defn f0[& pms] (println "params count ...
- Object.assign方法的使用
https://www.cnblogs.com/chenyablog/p/6930596.html
- MyEclipse 修改项目部署路径
就Tomcat来说,MyEclipse默认是使用安装目录下的webapps目录作为部署路径,比如你在设置中为Tomcat选择的根目录是D:\wwwroot,如图所示: 那么在选择Tomcat作为服务器 ...
- Golang遇到的一些问题总结
当类成员是struct指针.map.slice 时,默认初始化的值是 nil,在使用前需要提前初始化,否则会报相关的 nil 错误.引用类型的成员,默认会初始化为 nil,但对 nil 的切片进行 l ...