Ceres-Auto-diff原理

更新时间:2023-05-14 19:14:18 阅读: 评论:0

Ceres-Auto-diff 原理
Ceres-Auto-diff 原理
Ceres 有⼀个⾃动求导功能,只要你按照ceres要求的格式写好⽬标函数,ceres会⾃动帮你计算 精确的导数(或者雅克⽐矩阵),这极⼤节约了算法开发者的时间,
Ceres ⾃动求导(Auto-diff )实现原理
Ceres ⾃动求导的核⼼是运算符的重载与Ceres⾃有的Jet 变量。
抗洪英雄
举⼀个例⼦:
找春天日记
.
函数 , 他的⽬标函数值为 ,导数为  ,
其中 $h(x)$,$g(x)$ 都是标量函数.酉时属什么
如果我们定义⼀种数据类型,
高考必背古诗文64篇
Data={double value, double derived},
value 储存变量的函数值,derived 储存变量对 的导数。
并且对于数据类型 Data,重载乘法运算符
data1*data2={data1.value*data1.value,
data1.derived*data2.value+
data1.value*data2.derived} (1)
令  h_x={h(x),h’(x)},  g_x={g(x),g’(x)}
f_x=h_x * g_x, 那么f_x.derived 就是f_x的导数,f_x.value 即为f_x的数值。
类似(1),如果我们对数据类型 Data 重载所有可能⽤到的运算符.“ + - * / log, exp,…”,
那么在变量h_x,g_x经过任意次运算后,result=h_x+g_x*h_x+exp(h_x)…, 任然能获得函数值 result.value 和他的导数值result.derived,这就是Ceres ⾃动求导的原理。
党校学习心得上⾯讲的都是单⼀⾃变量的⾃动求导,对于多元函数 对于n 元函数,Data ⾥⾯的 double derived 就替换为 double* derived,derived[i] 为对于第i个⾃变量的导数值。
并且对于数据类型 Data,乘法运算符重载为
国防教育知识内容$data1*data2={double value=data1.value*data1.value,
derived[i]=data1.derived[i]*data2.value+
data1.value*data2.derived[i]}$ (2)
其余的运算符重载⽅法也做相应改变。
这样对多元函数的⾃动求导问题也就解决了。
Ceres ⾥⾯的Jet 数据类型类似于 这⾥Data 类型,并且Ceres 对Jet 数据类型进⾏了⼏乎所有数学运算符的重载,以达到⾃动求导的⽬的。
Ceres ⾃动求导的注意点
⽤ceres 对⽬标函数⾃动求导时,这编写⽬标函数时,⽬标函数⾥的变量必须⽤Jet类型,对于Jet类型的运算要⽤Ceres⾃带的函数如(ceres::exp(),ceres::squrt(),⽤std::exp()会报错。
礼的词语Ceres ⾃动求导的拓展
如果在⽬标函数的计算中,如果引⽤了第三⽅接⼝,这个接⼝不⽀持Jet变量,那么⾃动求导功能就⽆法正常⼯作。
但是我们现在知道了ceres⾃动求导的原理,可以在接⼝上做点⼿脚,即使第三⽅库不⽀持Jet变量,也能让Ceres⾃动求导正常⼯作。f (x )=h (x )∗g (x )h (x )∗g (x )f (x )=′h (x )g (x )+′h (x )g (x )′x f (x )
i
x i
在Jet 类型value 储存变量的函数值,doubel* derived 储存变量对⾃变量  的导数。那么我们可以仅仅把 Jet变量的函数值传⼊ 第三⽅接⼝。
在由第三⽅接⼝传出参数时,⼿动设置Jet 变量的函数值,和导数值。
陈宝茱
那么在对如此接⼝做了扩充后,ceres ⾃动求导功能就能正常⼯作了。

本文发布于:2023-05-14 19:14:18,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/631070.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:变量   求导   函数   重载
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图