使用梯度下降优化正则化最小二乘

机器算法验证 回归 matlab 正则化 梯度下降
2022-03-22 01:44:59

我有这个正则化的最小二乘公式:

i=1N(ωTxiyi)2+λω2

和梯度:

2i=1N((j=1dxijωj)xikxikyi)+2λωk

我想使用梯度下降来找到向量 w。我正在使用matlab。我虽然可以进行两个循环并计算 ws,但我的解决方案非常不稳定,我需要使用非常小的学习项 a (a=0.000000001) 才能获得非 NAN 解决方案。但是我认为当 lambda 很大但不会发生时 w 的值应该趋向于 0...我的数据集是矩阵 X (400x64) 和 y (400x1)。这是包含类标签的两类问题(1 类为+1,2 类为-1)。

这是我的matlab代码:

function [ w ] = gradDecent( X, Y, a, lambda, iter )
% GRADIENT DESCENT

w = zeros(size(X(1,:)))';

for it=1:iter % For each iteration
    for k = 1:size(w,1)
        s = 0;
       for i = 1:size(X,1)
           s = s + (X(i,:)*w - Y(i))*X(i,k);
       end
       w(k) = w(k) - a*(2*s+2*lambda*w(k));
    end
end

我犯了一些愚蠢的错误吗?

2个回答
  1. 不要使用恒定的学习率,而是将您的学习率设置为一个相当大的值(尝试),然后使用“退避”使用以下算法酌情缩小您的学习率:α=1

    :f(w(k)αd)>f(w(k))α:=α/2

    w(k+1):=w(k)αd

    其中是你的目标函数,是你的下降方向,是学习率。fdα

  2. 我认为您没有在代码中正确实现渐变。特别是,我相信当你真的想要s=\sum\ slimits_s=i=1N(xiωyixi)s=i=1N((j=1dxijωj)xikxikyi)

  3. 梯度下降可能不是这里最好的解决方案。梯度下降很慢:你不应该对它需要很长时间才能收敛感到惊讶,因为梯度下降通常会这样做。它可以完成工作,但通常是一个缓慢的选择。尝试使用其他优化算法,看看会发生什么。例如,尝试使用 newton-raphson。我敢肯定,如果您翻阅文献,您将能够确定优化岭回归损失函数的“最先进”算法选择。我会把钱放在它上面,而不是简单的梯度下降。

正如 whuber 所说,没有必要为优化算法而烦恼。矩阵表示法中的梯度是 在 Matlab 中将其等于 0 是单线:

2X(Xwy)+2λw

w_star = (X'*X+lambda*eye(d)) \ X'*y;