做者:李濟深
連接: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()函數求函數值。