【问题标题】:Minimization of L1-Regularized system, converging on non-minimum location?最小化 L1-Regularized 系统,收敛于非最小位置?
【发布时间】:2013-01-05 21:44:01
【问题描述】:

这是我在 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(x-h))/(2h)),h 为 10^(-5)。对这个 h 值有什么想法吗?

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

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

【问题讨论】:

  • 我并不是说这与 StackOverflow 无关,但它可能更适合 scicomp.stackexchange.com
  • @tmyklebu:也许更适合 Programmers.stackexchange.com。

标签: matlab optimization machine-learning minimization convex-optimization


【解决方案1】:

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

您真正想要的终止测试将类似于“subgradient 中有一个非常短的向量。”

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-05
    相关资源
    最近更新 更多