这是我在 stackoverflow 上的第一篇文章,所以如果这不是正确的区域,我深表歉意。我正在努力最小化 L1 正则化系统。
这个周末是我第一次深入优化,我有一个基本的线性系统 Y = X*B,X 是一个 n×p 矩阵,B 是一个 p×1 模型系数向量,Y 是一个 n× -1 输出向量。
我试图找到模型系数,我已经实现了梯度下降和坐标下降算法来最小化 L1 正则化系统。为了找到我正在使用回溯算法的步长,我通过查看梯度的 norm-2 并终止算法,如果它“足够接近”为零(现在我使用的是 0.001)。
我试图最小化的函数是以下 (0.5)*(norm((Y - X*B),2)^2) + lambda*norm(B,1)。(注意:通过 norm(Y,2) 我的意思是向量 Y 的 norm-2 值)我的 X 矩阵是 150×5 并且不是稀疏的。
如果我将正则化参数 lambda 设置为零,我应该收敛于最小二乘解,我可以验证我的两种算法都做得很好而且相当快。
如果我开始增加 lambda,我的模型系数都趋向于零,这就是我所期望的,但我的算法永远不会终止,因为梯度的 norm-2 始终是正数。例如,1000 的 lambda 将给我 10^(-19) 范围内的系数,但我的梯度的 norm2 约为 1.5,这是经过数千次迭代后,而我的梯度值都收敛到 0 到 1 的某个值范围,我的步长变得非常小(10 ^(-37)范围)。如果我让算法运行更长时间,情况并没有改善,它似乎已经以某种方式卡住了。
我的梯度和坐标下降算法都收敛于同一点,并为终止条件给出相同的 norm2(梯度)数。它们也适用于 0 的 lambda。如果我使用非常小的 lambda(比如 0.001)我会收敛,如果我运行一两个小时,0.1 的 lambda 看起来会收敛,一个更大的 lambda 并且收敛速度太小没用。
我有几个问题,我认为可能与问题有关?
在计算梯度时,我使用有限差分法 (f(x+h) - f(xh))/(2h)),h 为 10^(-5)。对 h 的这个值有什么想法吗?
另一个想法是,在这些非常小的步骤中,它在几乎与最小值正交的方向上来回移动,这使得收敛速度如此缓慢以至于毫无用处。
我最后的想法是,也许我应该使用不同的终止方法,也许看看收敛速度,如果收敛速度非常慢,则终止。这是一种常见的终止方法吗?