OWL-QN算法: 求解L1正则优化

在机器学习模型中,比如监督学习中,我们设计模型,我们重要的的工作是如何求解这个模型的最优值,通常是如何求救损失函数的最小值。比如logistic regression 中我们求解的是的loss function就是负log 最大似然函数。logistic regression 被广泛应用与互联网应用中,比如反欺诈,广告ctr。logistic regression是广义线性模型,优点是简单,实现容易,线上能很快响应。当数据不是呈现线性关系的时候,如果我们想应用logistic regression就得扩大特征空间,比如做非线性变换,特征组合来达到非线性模型的效果。对于非线性模型比如GDBT,
Random Forest,SVM的RBF核,相对就不需要做这些特征变换,因为模型本身已经已经做了非线性工作。我认为,GBDT, Randomn Forest 这种他的非线性方法一个重要的工作就是做特征的组合,而SVM的RBF核只是单一特征变换,做了升维工作,让数据在更高维空间能被划分。在lr模型中特征过多,或者非线性模型中,极容易出现过拟合,为了尽量避免过拟合,同样的做法就是加正则方法。通常的正则方法为L1和L2。L1相对L2有个好处就是,他不仅可以避免过拟合问题,还可以起到特征选择的作用。当loss function
加L1的正则的时候,最优解会使很多不重要的特征收敛到0值,而L2只会把这些特征收敛到一个很小的值,但不是0。 我们来看下一个通用的加上L1的损失函数:

f(x) = l(x) + c||x||, 其中l(x) 是原来的可导损失函数。

现在的问题是如何求解f(x) 的最小值点。从f(x) 上来看,应为加了L1,导致在x=0点不可导,所以以往直接算梯度的方法就不可取了。Microsoft  Research的人员在ICML2007提出了一种基于L-BFGS的OWL_QN算法来求解因为L1加入带来的不可导问题,具体参考(Andrew G, Gao
J. Scalable training of L 1-regularized log-linear models[C]//Proceedings of the 24th international conference on Machine learning. ACM, 2007: 33-40.)。

下面是文献中把求解函数进行泰特展开,如下:

从上面看到,主要涉及到的就是一个一阶梯度,和一个Hessian矩阵。求解hessian矩阵就是这里的挑战。L-BFGS采用有限的空间,牺牲少许精度的方法来求救hession。主要涉及几个一维的向量,具体算法可参考wiki上的。

下面是wiki上关于L-BFGS的算法。

附上这块的部分实现代码:

 while (gnorm > gtol) and (k < maxiter):
        # find search direction (Nocedal & Wright 2006, p.178, Algorithm 7.4)
        q = numpy.array(gfk, dtype=gfk.dtype)
        size = len(sList)
        aList = [None]*size
        if size > 0:
            for i in xrange(size-1,-1,-1):
                aList[i] = rhoList[i] * numpy.dot(sList[i],q)
                q -= aList[i] * yList[i]
            # modify to ensure a well-scaled search direction (N&W 2006, eq. 7.20)
            q *= (rhoList[-1] * numpy.dot(yList[-1],yList[-1]))**(-1)
            for i in xrange(size):
                b = rhoList[i] * numpy.dot(yList[i],q)
                q += sList[i] * (aList[i] - b)
        pk = -q
        # fix non-descent components
        non_descent = numpy.where(pk*gfk>=0)[0]
        pk[non_descent] = 0
</pre><p></p><p> </p><p></p><div><p>OWL- QN <span style="font-family:宋体">算法是</span><span style="font-family:Times New Roman">L-BFGS</span><span style="font-family:宋体">算法的一种变种,求解</span><span style="font-family:Times New Roman">L1</span><span style="font-family:宋体">上不可导的问题。</span><span style="font-family:Times New Roman">OWL-QN</span><span style="font-family:宋体">相对</span><span style="font-family:Times New Roman">L-BFGS</span><span style="font-family:宋体">,其实大多都是一样的,要是按照从代码上来看,也许就是</span><span style="font-family:Times New Roman">30</span><span style="font-family:宋体">行左右代码不一样而已。</span><span style="font-family:Times New Roman">OWL-QL </span><span style="font-family:宋体">相对</span><span style="font-family:Times New Roman">L-BFGS</span><span style="font-family:宋体">不一样的地方</span><span style="font-family:Times New Roman">:</span></p><p>(<span style="font-family:Times New Roman">1</span><span style="font-family:宋体">)每次选取的下一步最有点</span><span style="font-family:Times New Roman">Xk+1</span><span style="font-family:宋体">的的象限进行了限制,不允许跨象限,比如之前</span><span style="font-family:Times New Roman">Xk< 0 , Xk+1</span><span style="font-family:宋体">是不允许大于</span><span style="font-family:Times New Roman">0</span><span style="font-family:宋体">,这种情况只能把</span><span style="font-family:Times New Roman">Xk+1</span><span style="font-family:宋体">设为</span><span style="font-family:Times New Roman">0</span><span style="font-family:宋体">;</span></p></div><p></p><p>(2)最原始损失函数的梯度了,做了个次梯度修正(加上L1的修正)。</p><p>这两点,我们从wiki上分先的OWL- QN的python代码上能看到;</p><p>(1)</p><pre code_snippet_id="469899" snippet_file_name="blog_20140916_8_4170922" name="code" class="python">在
def simple_line_search_owlqn(f, old_fval, xk, pk, gfk, k, Cvec):
.......
.......
while True:
        new_x = xk + alpha * pk
        crossed_discont = numpy.where(numpy.logical_and(Cvec>0, xk*new_x<0))[0]
        new_x[crossed_discont] = 0
        new_fval = f(new_x) + numpy.dot(Cvec,numpy.absolute(new_x))
        if new_fval <= old_fval + c1 * dirDeriv * alpha:
            break
        alpha *= backoff
        if alpha <= 1e-4:
            return None, None, None

(2)

  gfkp1 = myfprime(xkp1) # raw loss function gradient;
        # find penalized subgradients
   gfkp1 = subgrad(xkp1,gfkp1,Cvec)

# subgrad:
def subgrad(x, gf, Cvec):
    """Subgradient computation for fmin_owlqn."""
    for i in numpy.where(Cvec>0)[0]:
        if x[i] < 0:
            gf[i] -= Cvec[i]
        elif x[i] > 0:
            gf[i] += Cvec[i]
        else:
            if gf[i] < -Cvec[i]:
                gf[i] += Cvec[i]
            elif gf[i] > Cvec[i]:
                gf[i] -= Cvec[i]
            else:
                gf[i] = 0
    return gf

参考文献:

[1]  Andrew G, Gao J. Scalable training of L 1-regularized log-linear models[C]//Proceedings of the 24th international conference on Machine learning. ACM,
2007: 33-40.

[2] http://en.wikipedia.org/wiki/Limited-memory_BFGS

[3] http://www.umiacs.umd.edu/~msubotin/owlqn.py   . Python
implementation
 by Michael Subotin, intended for use with SciPy

时间: 2025-01-14 00:28:53

OWL-QN算法: 求解L1正则优化的相关文章

粒子群算法求解优化问题(MATLAB)

粒子群算法求解函数极值 初始化一个粒子群体随机分布在解空间中.然后每一次迭代,根据每个粒子的历史最优位置和粒子群的最优位置更新每个粒子的位置,直到满足要求为止. clc;clear all; tic; %程序运行计时 E0=0.001; %允许误差 MaxNum=100; %粒子最大迭代次数 narvs=1; %目标函数的自变量个数 particlesize=30; %粒子群规模 c1=2; %每个粒子的个体学习因子,也称为加速常数 c2=2; %每个粒子的社会学习因子,也称为加速常数 w=0.

浅谈压缩感知(三十):压缩感知重构算法之L1最小二乘

主要内容: l1_ls的算法流程 l1_ls的MATLAB实现 一维信号的实验与结果 前言 前面所介绍的算法都是在匹配追踪算法MP基础上延伸的贪心算法,从本节开始,介绍基于凸优化的压缩感知重构算法. 约束的凸优化问题: 去约束的凸优化问题: 在压缩感知中,J函数和H函数的选择: 那么,后面要解决的问题就是如何通过最优化方法来求出x. 一.l1_ls的算法 l1_ls,全称?1-regularized least squares,基于L1正则的最小二乘算法,在标准内点法的基础上,在truncate

L1正则与L2正则

L1正则是权值的绝对值之和,重点在于可以稀疏化,使得部分权值等于零. L1正则的含义是 ∥w∥≤c,如下图就可以解释为什么会出现权值为零的情况. L1正则在梯度下降的时候不可以直接求导,在网上找到一种优化方法,不知是否可行 对于目标函数中包含加性的非平滑项并使用梯度下降求解的问题,如果可以使用proximal operator,则解法如下: 假设目标函数为 其中 可导,而 不可导.则每步迭代更新为 其中,如果 ,也就是题目中要求的L1范数正则化,则对应的 L2正则的重点在于防止过拟合,没有稀疏特

基于贪心算法求解TSP问题(JAVA)

前段时间在搞贪心算法,为了举例,故拿TSP来开刀,写了段求解算法代码以便有需之人,注意代码考虑可读性从最容易理解角度写,没有优化,有需要可以自行优化! 一.TSP问题 TSP问题(Travelling Salesman Problem)即旅行商问题,又译为旅行推销员问题.货郎担问题,是数学领域中著名问题之一.假设有一个旅行商人要拜访n个城市,他必须选择所要走的路径,路径的限制是每个城市只能拜访一次,而且最后要回到原来出发的城市.路径的选择目标是要求得的路径路程为所有路径之中的最小值. TSP问题

两种改进的模拟退火算法求解大值域约束满足问题1.0

0引言 约束满足问题(Constraint Satisfaction Problem,CSP)是人工智能研究领域中一个非常重要的分支,现已成为理论计算机科学.数学和统计物理学等交叉学科研究中的热点问题.人工智能.计算机科学和自动控制等领域中的许多问题都可以归结为约束满足问题.同时,约束满足问题在实际问题如模式识别.决策支持.物流调度及资源分配等领域也有着非常广泛的应用. CSP由一个变量集合和一个约束集合组成.每个变量都有一个非空的可能值域,每个约束描述了一个变量子集与子集内各变量的相容赋值,所

秦九韶算法求解多项式

秦九韶算法是中国南宋时期的数学家秦九韶提出的一种多项式简化算法.在西方被称作霍纳算法.它是一种将一元n次多项式的求值问题转化为n个一次式的算法. 一般地,一元n次多项式的求值需要经过[n(n+1)]/2次乘法和n次加法,而秦九韶算法只需要n次乘法和n次加法.其大大简化了计算过程,即使在现代,利用计算机解决多项式的求值问题时,秦九韶算法依然是最优的算法. 题目:写程序计算给定多项式在给定点x处的值 f(x) = a0 + a1x + … + an-1xn-1 + anxn 分析:对比使用常规算法和

蚁群算法求解迷宫最优路径问题

本段程序的基本思想是利用蚁群算法中的蚁周模型,来对全局的迷宫图进行信息素的跟新 和为每一只蚂蚁选择下一个方格. 一共会进行RcMax = 2000轮模拟(理论上模拟的次数越多结果 会越接近真实值),而在每一轮中会排除 M = 10只蚂蚁进行探路.同时在算法的回溯思想上采用的 是栈的数据结构来实现的.当栈最终为空时则表示无解.但同时这段程序的一缺点就是:由于我没在 算法中对每一轮的每只探路蚂蚁采用多线程的模式,所以整体的运行效率还不是很高.如读者有好的 思想或建议,请留言. #include<io

利用QR算法求解矩阵的特征值和特征向量

利用QR算法求解矩阵的特征值和特征向量 为了求解一般矩阵(不是那种幼稚到shi的2 x 2矩阵)的特征值. 根据定义的话,很可能需要求解高阶方程... 这明显是个坑...高阶方程你肿么破... 折腾了好久 1.我要求特征值和特征向量. 2.找到一种算法QR分解矩阵求解特征值 3.QR矩阵分解需要Gram-schimidt正交化分解 有一种很明显的感觉,往往在现在很难有 很系统 很深入 的学习某一个学科的某一门知识. 往往学的时候"靠,学这东西有什么用""学了这么久,也不知道怎么用,不想学" 到后

隐马尔科夫模型HMM(三)鲍姆-韦尔奇算法求解HMM参数

隐马尔科夫模型HMM(一)HMM模型 隐马尔科夫模型HMM(二)前向后向算法评估观察序列概率 隐马尔科夫模型HMM(三)鲍姆-韦尔奇算法求解HMM参数(TODO) 隐马尔科夫模型HMM(四)维特比算法解码隐藏状态序列(TODO) 在本篇我们会讨论HMM模型参数求解的问题,这个问题在HMM三个问题里算是最复杂的.在研究这个问题之前,建议先阅读这个系列的前两篇以熟悉HMM模型和HMM的前向后向算法,以及EM算法原理总结,这些在本篇里会用到.在李航的<统计学习方法>中,这个算法的讲解只考虑了单个观测