• 机器学习之深入理解凸优化次梯度算法


    什么是次梯度?并不是很懂,就抽了一些时间,查了资料(很多资料来自百度百科),总结整理了这个博文,记录下自己的学习过程。

    0、前言

    次梯度方法(subgradient method)是传统的梯度下降方法的拓展,用来处理不可导的凸函数。它的优势是比传统方法处理问题范围大,劣势是算法收敛速度慢。但是,由于它对不可导函数有很好的处理方法,所以学习它还是很有必要的。

    1、导数(Derivative)

    导数(Derivative),也叫导函数值。又名微商,是微积分中的重要基础概念。导数是函数的局部性质。一个函数在某一点的导数描述了这个函数在这一点附近的变化率。导数的本质是通过极限的概念对函数进行局部的线性逼近。

    对于一般的函数f(x)f(x),在点x0x_0处的导数为:
    f(x)=limΔx0ΔyΔx=limΔx0f(x0+Δx)f(x0)Δx f^{prime}(x)=lim _{Delta x ightarrow 0} frac{Delta y}{Delta x}=lim _{Delta x ightarrow 0} frac{fleft(x_{0}+Delta x ight)-fleft(x_{0} ight)}{Delta x}
    等同于
    f(x)=limΔx0f(x+Δx)f(x)Δx=limΔx0f(x)f(xΔx)Δx f^{prime}(x)=lim _{Delta x ightarrow 0} frac{f(x+Delta x)-f(x)}{Delta x}=lim _{Delta x ightarrow 0} frac{f(x)-f(x-Delta x)}{Delta x}
    如果不使用增量,f(x)f(x)x0x_0处的导数 也可以定义为:当定义域内的变量xx趋近于x0x_0时,
    f(x)=f(x)f(x0)xx0 f^{prime}(x)=frac{f(x)-fleft(x_{0} ight)}{x-x_{0}}

    2、次导数(subderivative)

    次导数、次切线和次微分的概念出现在凸分析,也就是凸函数的研究中。

    f:IRf:I→R是一个实变量凸函数,定义在实数轴上的开区间内。这种函数不一定是处处可导的,例如最经典的例子就是f(x)=xf(x)=|x|,在x=0x=0处不可导。但是,从下图的可以看出,对于定义域内的任何x0x_0,我们总可以作出一条直线,它通过点(x0,f(x0))(x_0,f(x_0)),并且要么接触f的图像,要么在它的下方。直线的斜率称为函数的次导数,次导数的集合称为函数ffx0x_0处的次微分。
    在这里插入图片描述

    3、次微分(subdifferential)

    凸函数f:IRf:I→R在点x0x_0的次导数,是实数cc使得:
    f(x)f(x0)c(xx0) f(x)-fleft(x_{0} ight) geq cleft(x-x_{0} ight)
    对于所有II内的xx。我们可以证明,在点x0x_0的次导数的集合是一个非空闭区间 [a, b],其中aabb是单侧极限
    a=limxx0f(x)f(x0)xx0 a=lim _{x ightarrow x_{0}^{-}} frac{f(x)-fleft(x_{0} ight)}{x-x_{0}}
    b=limxx0+f(x)f(x0)xx0 b=lim _{x ightarrow x_{0}^{+}} frac{f(x)-fleft(x_{0} ight)}{x-x_{0}}
    它们一定存在,且满足aba≤b。所有次导数的集合 [a,b] 称为函数ffx0x_0的次微分。

    例子:考虑凸函数f(x)=xf(x)=|x|。在原点的次微分是区间 [−1, 1]。x0<0x_0<0时,次微分是单元素集合 {-1},而x0>0x_0>0,则是单元素集合{1}。

    4、次梯度(subgradient)

    在优化问题中,我们可以对目标函数为凸函数的优化问题采用梯度下降法求解,但是在实际情况中,目标函数并不一定光滑、或者处处可微,这时就需要用到次梯度下降算法。

    次梯度与梯度的概念类似,凸函数的FirstordercharacterizationFirst-order characterization是指如果函数ff可微,那么当且仅当dom(f)dom(f)为凸集,且对于x,ydom(f)∀x,y∈dom(f),使得f(y)f(x)+f(x)T(yx)f(y)≥f(x)+∇f(x)^T(y−x),则函数ff为凸函数。这里所说的次梯度是指在函数ff上的点xx满足以下条件的gRng∈R^n
    f(y)f(x)+gT(yx) f(y)≥f(x)+g^T(y−x)
    其中,函数ff不一定要是凸函数,非凸函数也可以,即对于凸函数或者非凸函数而言,满足上述条件的gg均为函数在该点的次梯度。但是,凸函数总是存在次梯度(可以利用epigraph和支撑平面理论证明),而非凸函数则不一定存在次梯度,即使ff可微。该定义说明,用次梯度对原函数做出的一阶展开估计总是比真实值要小。

    很明显,凸函数的次梯度一定存在,如果函数ff在点xx处可微,那么g=f(x)g=∇f(x),为函数在该点的梯度,且唯一;如果不可微,则次梯度不一定唯一。但是对于非凸函数,次梯度则不一定存在,也不一定唯一。

    例如,凸函数xp∥x∥_p范数为凸函数,但不满足处处可微的条件,因此,函数的次梯度不一定唯一,如下图:
    在这里插入图片描述

    • 左图为x2∥x∥_2,函数在x0x≠0时,次梯度唯一,且g=x/x2g=x/∥x∥_2;当x=0x=0时,次梯度为z:z21{z:∥z∥_2≤1}中的任意一个元素;

    • 右图为x1∥x∥_1,函数在x0x≠0时,次梯度唯一,且g=sign(x)g=sign(x);当x=0x=0时,次梯度为 [−1,1] 中的任意一个元素;

    同样,绝对值函数f(x)=xf(x)=∣x∣和最大值函数f(x)=max{f1(x),f2(x)}f(x)=max{f_1(x),f_2(x)}在不可微点处次梯度也不一定唯一,如下图:
    在这里插入图片描述

    • 左函数为绝对值函数f(x)=xf(x)=∣x∣,其在满足x=0x=0的点处,次梯度为任意一条直线,在向量f1(x)∇f_1(x)f2(x)∇f_2(x)之间。;
    • 右函数为最大值函数f(x)=max{f1(x),f2(x)}f(x)=max{f_1(x),f_2(x)},其在满足f1(x)=f2(x)f_1(x)=f_2(x)的点处,次梯度为任意一条直线,在向量f1(x)∇f_1(x)f2(x)∇f_2(x)之间。

    5、次梯度的性质

    • Scalingf:(af)=af∂(af)=a⋅∂f
    • Addition:(f1+f2)=f1+f2∂(f_1+f_2)=∂f_1+∂f_2;
    • Affine composition:g(x)=f(Ax+b)g(x)=ATf(Ax+b)如果g(x)=f(Ax+b),那么∂g(x)=A^T∂f(Ax+b);
    • Finite pointwise maximum:f(x)=maxi=1,,mfi(x)f(x)=conv(i:fi(x)=f(x)fi(x))如果f(x)=max _{i=1, ldots, m} f_{i}(x), 那么partial f(x)=operatorname{conv}left(igcup_{i : f_{i}(x)=f(x)} partial f_{i}(x) ight);

    6、灵魂一问:为什么要计算次梯度?

    对于光滑的凸函数而言,我们可以直接采用梯度下降算法求解函数的极值,但是当函数不处处光滑,处处可微的时候,梯度下降就不适合应用了。因此,我们需要计算函数的次梯度。对于次梯度而言,其没有要求函数是否光滑,是否是凸函数,限定条件很少,所以适用范围更广。

    次梯度具有以下优化条件:对于任意函数ff(无论是凸还是非凸),函数在点xx处取得最值等价于:
    f(x)=minxf(x)0f(x) fleft(x^{*} ight)=min _{x} f(x) Leftrightarrow 0 in partial fleft(x^{*} ight)
    即,当且仅当00属于函数ff在点xx^∗处次梯度集合的元素时,xx^∗为最优解。

    证明:当次梯度g=0g=0时,对于所有ydom(f)y∈dom(f),存在f(y)f(x)+0T(yx)=f(x)f(y)≥f(x^∗)+0^T(y−x^∗)=f(x^∗),所以,xx^∗为最优解,即证。

    7、次梯度算法(Subgradient method)

    次梯度算法与梯度下降算法类似,仅仅用次梯度代替梯度,记f:RnRf : mathbb{R}^{n} ightarrow mathbb{R}为定义在Rnmathbb{R}^{n}上的凸函数,即:
    x(k+1)=x(k)αkg(k),k=1,2,3, x^{(k+1)}=x^{(k)}-alpha_{k} g^{(k)},k=1,2,3,…
    其中g(k)g^{(k)}表示函数ffx(k)x^{(k)}的次梯度。如果ff可微,它的次梯度就是梯度向量f abla f。有时,g(k)-g^{(k)}不是函数ffx(k)x^{(k)}的下降方向。因此采用一系列可能的fbestf_{b e s t}来追踪目标函数的极小值点,即
    fbest(k)=min{fbest(k1),f(x(k))} f_{mathrm{best}}^{(k)}=min left{f_{mathrm{best}}^{(k-1)}, fleft(x^{(k)} ight) ight}
    另一点与梯度下降算法不同的是:次梯度算法没有明确的步长选择方法,类似Exact line search和Backtracking line search的方法,只有步长选择准则,具体如下:
    在这里插入图片描述

    8、次梯度算法实例

    A. Regularized Logistic Regression

    对于逻辑回归的代价函数可记为:
    f(β)=i=1n(yixiTβ+log(1+exp(xiTβ))) f(eta)=sum_{i=1}^{n}left(-y_{i} x_{i}^{T} eta+log left(1+exp left(x_{i}^{T} eta ight) ight) ight)
    明显,上式是光滑且凸的,而正则化则是指优化目标函数为:
    minβRpf(β)+λP(β) min _{eta in mathbb{R}^{p}} f(eta)+lambda cdot P(eta)
    如果P(β)=β22P(β)=∥β∥^2_2,则成为岭回归(ridge problem),如果P(β)=β1P(β)=∥β∥_1则称为Lasso。对于岭回归,我们仍然可以采用梯度下降算法求解目标函数,因为函数处处可导光滑,而Lasso问题则无法用梯度下降算法求解,因为函数不是处处光滑,具体可参考下面的图,所以,对于Lasso问题需要选用次梯度算法求解。
    在这里插入图片描述
    下图是对于同样数据集下分别对逻辑回归选用岭惩罚和Lasso惩罚求解最优解的实验结果图n=1000,p=20(n=1000,p=20)

    在这里插入图片描述
    B. 随机次梯度算法

    随机次梯度算法(Stochastic Subgradient Method)与次梯度算法(Subgradient Method)相比,每次更新次梯度是根据某一个样本计算获得,而不是通过所有样本更新次梯度。

    所以,根据梯度更新的方式不同,次梯度算法和梯度下降算法一般被称为“batch method”。从计算量来讲,mm次随机更新近似等于一次batch更新,二者差别在于i=1m[fi(x(k+i1))fi(x(k))]sum_{i=1}^{m}left[ abla f_{i}left(x^{(k+i-1)} ight)- abla f_{i}left(x^{(k)} ight) ight],当xx变化不大时,差别可以近似等于0。

    对于随机更新次梯度,一般随机的方式有两种:

    • Cyclic rule:选择ik=1,2,,m,1,2,,m,i_k=1,2,…,m,1,2,…,m,…
    • Randomized rule:均匀随机从1,,m{1,…,m}选取一点作为iki_k

    与所有优化算法一样,随机次梯度算法能否收敛?

    答案是肯定的,这里就不在做证明,有兴趣的同学可以参考boyd教授的论文,这里仅给出收敛结果,如下:
    limkf(xbest(k))f+5m2G2t2 lim _{k ightarrow infty} fleft(x_{b e s t}^{(k)} ight) leq f^{*}+frac{5 m^{2} G^{2} t}{2}
    对于Cyclic rule,随机次梯度算法的收敛速度为O(m3G2/ϵ2)O(m^3G^2/ϵ^2);对于Randomized rule,随机次梯度算法的收敛速度为O(m2G2/ϵ2)O(m^2G^2/ϵ^2)

    下图给出梯度下降和随机梯度下降算法在同一数据下迭代结果:
    在这里插入图片描述

    如果想要更多的资源,欢迎关注 @我是管小亮,文字强迫症MAX~

    回复【福利】即可获取我为你准备的大礼,包括C++,编程四大件,NLP,深度学习等等的资料。

    想看更多文(段)章(子),欢迎关注微信公众号「程序员管小亮」~

    在这里插入图片描述

    参考文章

  • 相关阅读:
    解决php网页运行超时问题:Maximum execution time of 30 seconds exceeded
    C#操作Xml:XSLT语法 在.net中使用XSLT转换xml文档示例
    C#操作Xml:XPath语法 在C#中使用XPath示例
    C#操作Xml:XmlSerializer 对象的Xml序列化和反序列化
    C#操作Xml:如何定义Xsd文件
    C#操作Xml:linq to xml操作XML
    C#操作Xml:使用XmlWriter写Xml
    C#操作Xml:使用XmlReader读Xml
    C#操作Xml:通过XmlDocument读写Xml文档
    XML的序列化和反序列化 详细介绍
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13302786.html
Copyright © 2020-2023  润新知