加载中…
个人资料
应用优化
应用优化
  • 博客等级:
  • 博客积分:0
  • 博客访问:0
  • 关注人气:0
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

检测梯度的正确性

(2012-05-05 17:00:10)
标签:

杂谈

分类: 小技巧
优化计算中经常要给算法或软件包提供函数的梯度。很多时候函数可能很复杂,比如与微分方程有关的优化中需要离散化泛函,矩阵优化中变量是矩阵。犯些小错误经常在所难免,比如漏掉一个正负号,差一个什么项。因此,验证其正确性非常必要。经常使用的有两种方法:差分和自动微分。

1) 差分
i) 如果调用Matlab 优化工具箱的算法,可以设置参数:
options = optimset('DerivativeCheck','on','GradObj','on');
http://www.mathworks.cn/help/toolbox/optim/ug/f12471.html#br5vdvm

ii) 当然可以写一个小函数,比如
http://math.sjtu.edu.cn/faculty/zw2109/code/GradFiniteDiff.txt
(将GradFiniteDiff.txt存为GradFiniteDiff.m,服务器不支持.m文件)

例:
function testderiv
n = 20; k = 10;
A = randn(n); A = A'*A;
X0 = rand(n,k);
[F, G] = objeig(X0,  A);

optdeps.deps = 1e-8;
G1 = GradFiniteDiff(@objeig, X0, optdeps, A);
norm(G-G1,'fro')

function [F, G] = objeig(X, A)
G = A*X;  F = trace(X'*G)/2;
end

结果:
ans =
   5.9221e-05


2) 自动微分

自动微分可以精确的计算梯度,甚至Hessian。当然计算量通常比较大,对函数形式有时也有些要求。Matlab下一个比较好的程序包是Intlab:
http://www.ti3.tu-harburg.de/rump/intlab

继上例:
X2 = gradientinit(X0);
y = objeig(X2,  A);
G2 = reshape(y.dx, n, k);
norm(G-G2,'fro')

结果:
ans =
   2.2164e-13

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有