这是我对stackoverflow的第一篇文章,所以如果这不是正确的区域我会道歉。我正致力于最小化L1规范化系统。
这个周末是我第一次进入优化,我有一个基本的线性系统Y = X * B,X是一个n-by-p矩阵,B是一个p-by-1模型系数向量,Y是一个n-by-1输出向量。
我试图找到模型系数,我已经实现了梯度下降和坐标下降算法,以最小化L1正则化系统。为了找到我的步长我正在使用回溯算法,我通过查看渐变的范数-2来终止算法,并且如果它“足够接近”为零则终止(现在我使用0.001)。
我试图最小化的函数是以下(0.5)*(norm((Y - X * B),2)^ 2)+ lambda * norm(B,1)。 (注意:按范数(Y,2),我的意思是矢量Y的范数-2值。)我的X矩阵是150乘5并且不稀疏。
如果我将正则化参数lambda设置为零,我应该收敛于最小二乘解,我可以验证我的算法都能很好地完成这个并且相当快。
如果我开始增加lambda我的模型系数都倾向于零,这就是我所期望的,我的算法永远不会终止,因为渐变的范数-2总是正数。例如,lambda为1000将给出10 ^( - 19)范围内的系数,但我的渐变的norm2为~1.5,这是经过几千次迭代后,而我的渐变值全部收敛到0到1之间的某个值范围,我的步长变得非常小(10 ^( - 37)范围)。如果我让算法运行的时间更长,情况不会改善,那么它似乎已经被卡住了。
我的梯度和坐标下降算法都收敛于同一点,并为终止条件提供相同的norm2(梯度)数。它们也很适合lambda为0.如果我使用一个非常小的lambda(比如0.001)我得到收敛,一个0.1的lambda看起来如果我跑了一两个小时会收敛,一个lambda任何更大的和收敛率很小,没用。
我认为可能与此问题有关的几个问题?
在计算梯度时,我使用有限差分法(f(x + h) - f(x-h))/(2h)),h为10 ^( - 5)。关于这个h值的任何想法?
另一个想法是,在这些非常小的步骤中,它在几乎与最小值正交的方向上来回移动,使得收敛速度变得如此之慢,这是无用的。
我最后的想法是,或许我应该使用不同的终止方法,可能会考虑收敛速度,如果收敛速度极慢然后终止。这是一种常见的终止方法吗?
答案 0 :(得分:7)
1-norm是不可区分的。这将导致许多事情的根本问题,特别是您选择的终止测试;梯度将在最小值附近急剧变化,并且在一组度量零点上不存在。
你真正想要的终止测试将是“subgradient中有一个非常短的向量”。
在|| Ax-b || _2 ^ 2 + lambda || x || _1的次梯度中找到最短矢量相当容易。明智地选择容差eps
并执行以下步骤:
计算v = grad(||Ax-b||_2^2).
如果x[i] < -eps
,则从v[i]
中减去lambda。如果x[i] > eps
,则将lambda添加到v[i]
。如果是-eps <= x[i] <= eps
,请将[-lambda, lambda]
中的号码添加到最小化v[i]
的{{1}}。
您可以在此处进行终止测试,将v[i]
视为渐变。我还建议在选择下一个迭代的位置时使用v
作为渐变。