5

这是我在 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 的这个值有什么想法吗?

另一个想法是,在这些非常小的步骤中,它在几乎与最小值正交的方向上来回移动,这使得收敛速度如此缓慢以至于毫无用处。

我最后的想法是,也许我应该使用不同的终止方法,也许看看收敛速度,如果收敛速度非常慢,则终止。这是一种常见的终止方法吗?

4

1 回答 1

7

1-范数不可微。这会导致很多事情出现根本问题,尤其是您选择的终止测试;梯度将在您的最小值附近急剧变化,并且在一组测量零上不存在。

您真正想要的终止测试将遵循“次梯度中有一个非常短的向量

在 ||Ax-b||_2^2 + lambda ||x||_1 的次梯度中很容易找到最短向量。明智地选择容差eps并执行以下步骤:

  1. 计算v = grad(||Ax-b||_2^2).

  2. 如果x[i] < -eps,则从 中减去 lambda v[i]。如果x[i] > eps,则将 lambda 添加到v[i]. 如果-eps <= x[i] <= eps,则添加最小化[-lambda, lambda]的数字。v[i]v[i]

您可以在此处进行终止测试,将v其视为梯度。我还建议v在选择下一次迭代的位置时使用渐变。

于 2013-01-05T22:36:04.450 回答