【发布时间】: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