检测梯度的正确性
(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
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,
optdeps.deps = 1e-8;
G1 = GradFiniteDiff(@objeig, X0, optdeps, A);
norm(G-G1,'fro')
function [F, G] = objeig(X, A)
G = A*X;
end
结果:
ans =
2) 自动微分
自动微分可以精确的计算梯度,甚至Hessian。当然计算量通常比较大,对函数形式有时也有些要求。Matlab下一个比较好的程序包是Intlab:
http://www.ti3.tu-harburg.de/rump/intlab
继上例:
X2 = gradientinit(X0);
y = objeig(X2,
G2 = reshape(y.dx, n, k);
norm(G-G2,'fro')
结果:
ans =
前一篇:分散式、联合稀疏优化
后一篇:matlab 绘图

加载中…