做者:李济深
连接:https://www.zhihu.com/question/48356514/answer/125175491
来源:知乎
著做权归做者全部。商业转载请联系做者得到受权,非商业转载请注明出处。
html
开源里面比较干净的Forward Mode实现应该是ceres-solver里的的Jet[1]了。文件注释里解释得很详细。Reverse Mode比较成熟的实现是Stan[3]的。Adept[2]的实现思路有点意思,速度上跟Stan差很少(Stan在对节点函数上作了更多优化的工做),可是彷佛缺少实际产品的检验,稳定性可能不如Stan。Adept 2.0 版本本身实现了Array,缘由大抵是做者想写出本身的风格…向不成熟的方向又迈进了一步。git
AD在优化问题里面是一个很是方便的工具。可是不要忘了最简单的 df = (f(x+h) - f(x-h)) / 2h 这样简单而高效的形式,结合二者在某些优化问题里会有更好的效果。github
Ceres中提供了三种求导方式:算法
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.net
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()函数求函数值。