基础 --- > 优化方法(二)

*爱你&永不变心* 提交于 2019-12-23 08:07:31

背景

这次主要介绍次梯度(subgradient)和近端梯度下降(Proximal gradient descent)算法我们以L1正则化求解为例

次梯度

对于任一个损失函数,将其简化写为:
L(w,λ)=f(w)+λwL(w, \lambda) = f(w) + \lambda|w|
对于第一项求导
gw(w,λ)=f(w)wg_w(w, \lambda) = \frac{\partial f(w)}{\partial w}

第二项求导,由于在w>0w>0时梯度为λ\lambda, 在w<0w<0时梯度为λ-\lambda, 其中w=0w=0时我们采用次梯度 为λsgn(w)\lambda\cdot sgn(w)

对于整个损失函数次梯度为

wL=gw(w,λ)+λsng(w)\triangledown_w L = g_w(w, \lambda) + \lambda \cdot sng(w)
然后利用普通的梯度下降(上升)方法求解。但这种方式得到的值非常接近于0,而非真正的为0,并不会真正引入参数的稀疏性。

次导数
设f:I→R是一个实变量凸函数,定义在实数轴上的开区间内。这种函数不一定是处处可导的,例如最经典的例子就是f(x) = |x|,在x=0处不可导。但是,从下图的可以看出,对于定义域内的任何x_0,我们总可以作出一条直线,它通过点(x_0, f(x_0)),并且要么接触f的图像,要么在它的下方。这条直线的斜率称为函数的次导数。次梯度是将函数扩展到多维下次导数的推广。

可以看到对于f(x) = |x|,其实所有在[-1, 1]斜率都满足上述次导数的条件,每个值都是该函数的次导数,所有次导数的集合[-1, 1]称为次微分

近端梯度下降法

当我们的目标函数可分拆为光滑函数和具有近端操作算子时,近端梯度法(Proximal gradient algorithms)是一种非常有用的方法。对于无约束函数
minxRN  f(x)=g(x)+h(x)\underset{x\in \mathbb R^N}{min}\; f(x)=g(x) + h(x)
其中
g(x)g(x)是凸函数,并且可微的
近端梯度算法通过迭代的方法来优化目标函数f(x)f(x):

  1. 在g(x)上进行梯度下降算法
  2. 在h(x)上执行近端梯度算法
    将上述两布合并即:
    xk+1=proxtkh(xktkg(xk))x^{k+1}=prox_{t_kh}(x^k-t_k\triangledown g(x^k))

近端算子
proxth()(w)=arg  minz12twz2+λz=arg  minz12wz2+λtz={wλtif w>λt0if wλtw+tif w<λt\begin{aligned} prox_{th(\cdot)}(w) = & arg\; \underset{z}{min}\frac{1}{2t}||w-z||^2 + \lambda ||z||\\ = & arg\; \underset{z}{min}\frac{1}{2}||w-z||^2 + \lambda t ||z|| \\ =& \left \{\begin{matrix} w-\lambda t & if\ w > \lambda t\\ 0 & if\ |w|\leq \lambda t \\ w+t & if\ w < -\lambda t \end{matrix}\right. \end{aligned}
最后一步原因:
(wz)+λtzw=(wz)+λt{zz>0[z,z]z=0zz<0(w-z) + \lambda t\frac{\partial |z|}{ \partial w} = (w-z) + \lambda t \left \{\begin{matrix} z & z >0\\ [-z, z] & z=0\\ -z & z < 0\end{matrix}\right.
令上式为0即可得

Lasso 回归上的应用

我们要优化的目标为
obj=i=1m(yij=1nxijwj)2+λi=1nwjobj = \sum\limits_{i=1}^m(y_i-\sum\limits_{j=1}^nx_{ij}w_j)^2 + \lambda \sum_{i=1}^n|w_j|

λww={λw<0[λ,λ]w=0λw>0\lambda \frac{\partial |w|}{\partial w}=\left\{\begin{matrix} -\lambda &w < 0 \\ [-\lambda, \lambda ]&w=0 \\ \lambda & w > 0 \end{matrix}\right.

对于第一项其针对参数偏导:
RSS(w)wk=2i=1mxik(yij=1nxijwj)=2i=1mxik(yij=1,jknxijwj)+2wki=1mxik22pk+2zkwk\begin{aligned} \frac{\partial RSS(w)}{\partial w_k} = & -2 \sum_{i=1}^m x_{ik}(y_i-\sum\limits_{j=1}^nx_{ij}w_j) \\ =& -2\sum\limits_{i=1}^m x_{ik}(y_i - \sum\limits_{j=1,j\neq k}^nx_{ij}w_j)+2w_k\sum\limits_{i=1}^m x_{ik}^2 \\ & -2p_k + 2z_kw_k \end{aligned}

对于第二项,其偏导数为:
λj=1nwjwk={λwk<0[λ,λ]wk=0λwk>0\lambda \frac{\partial\sum_{j=1}^n|w_j|}{\partial w_k}=\left\{\begin{matrix} -\lambda &w_k < 0 \\ [-\lambda, \lambda ]&w_k=0 \\ \lambda & w_k > 0 \end{matrix}\right.

那么上述整体的偏导数

objwk=2pk+2zkwk+{λwk<0[λ,λ]wk=0λwk>0\frac{\partial obj}{\partial w_k} = -2p_k + 2z_kw_k + \left\{\begin{matrix} -\lambda &w_k < 0 \\ [-\lambda, \lambda ]&w_k=0 \\ \lambda & w_k > 0 \end{matrix}\right. \\

求解令objwk=0\frac{\partial obj}{\partial w_k}=0
得到:
w^k={(pk+λ/2)/zkpk<λ/20λ/2pkλ/2(pkλ/2)/zkpk<λ/2\hat w_k = \left\{\begin{matrix} (p_k + \lambda/2)/z_k &p_k<-\lambda/2 \\ 0 & -\lambda/2 \leq p_k \leq \lambda/2 \\ (p_k - \lambda/2)/z_k &p_k<-\lambda/2 \end{matrix}\right.
通过该公式,每次选取一个维度进行优化,不断迭代,直到满足停止条件。

python代码按照机器学习算法实践-岭回归和LASSO,具体可以查看原文

def lasso_regression(X, y, lambd=0.2, threshold=0.1):
    ''' 通过坐标下降(coordinate descent)法获取LASSO回归系数
    '''
    # 计算残差平方和
    rss = lambda X, y, w: (y - X*w).T*(y - X*w)
    # 初始化回归系数w.
    m, n = X.shape
    w = np.matrix(np.zeros((n, 1)))
    r = rss(X, y, w)
    # 使用坐标下降法优化回归系数w
    niter = itertools.count(1)
    for it in niter:
        for k in range(n):
            # 计算常量值z_k和p_k
            z_k = (X[:, k].T*X[:, k])[0, 0]
            p_k = 0
            for i in range(m):
                p_k += X[i, k]*(y[i, 0] - sum([X[i, j]*w[j, 0] for j in range(n) if j != k]))
            if p_k < -lambd/2:
                w_k = (p_k + lambd/2)/z_k
            elif p_k > lambd/2:
                w_k = (p_k - lambd/2)/z_k
            else:
                w_k = 0
            w[k, 0] = w_k
        r_prime = rss(X, y, w)
        delta = abs(r_prime - r)[0, 0]
        r = r_prime
        print('Iteration: {}, delta = {}'.format(it, delta))
        if delta < threshold:
            break
    return w

其中Lasso的参数与λ\lambda的关系图:

可以看出,随着λ\lambda的增大,系数逐渐变于0,而对于岭回归:

可以岭回归的系数没有真正变为0,而是一直趋于0.

参考:

  1. 机器学习算法实践-岭回归和LASSO
  2. Optimization with Sparsity-Inducing Penalties
  3. Proximal Gradient Algorithms
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!