ChatGPTでMATLAB用の最急降下法の学習係数最適化プログラムを生成した。
合ってるかは不明。
% 3変数のラインサーチのサンプルコード(gradを使用しない)
% 目的関数(Rosenbrock関数)
fun = @(x) 100*(x(2) - x(1)^2)^2 + (1 - x(1))^2 + 100*(x(3) - x(2)^2)^2 + (1 - x(2))^2;
% 初期解
x0 = [0, 0, 0];
% 学習率の初期値
alpha = 1;
% 勾配の初期値
g0 = compute_gradient(fun, x0);
% ラインサーチのパラメータ
c1 = 1e-4;
c2 = 0.9;
max_iter = 100;
tol = 1e-6;
% ラインサーチ
for iter = 1:max_iter
% ステップサイズの更新
x_new = x0 - alpha * g0;
% 目的関数の評価
f_new = fun(x_new);
% ワルフ条件のチェック
if f_new > fun(x0) + c1 * alpha * dot(g0, g0')
alpha = alpha * c2;
else
break;
end
end
% 新しい解の計算
x_new = x0 - alpha * g0;
% 勾配の計算
g_new = compute_gradient(fun, x_new);
% 勾配ノルムが収束した場合、解を更新
if norm(g_new) < tol
x0 = x_new;
g0 = g_new;
end
% 勾配を計算する関数
function g = compute_gradient(fun, x)
eps = 1e-8;
g = zeros(size(x));
for i = 1:length(x)
e = zeros(size(x));
e(i) = eps;
g(i) = (fun(x + e) - fun(x - e)) / (2 * eps);
end
end
コメント