背景
这次主要介绍次梯度(subgradient)和近端梯度下降(Proximal gradient descent)算法我们以L1正则化求解为例
次梯度
对于任一个损失函数,将其简化写为:
L(w,λ)=f(w)+λ∣w∣
对于第一项求导
gw(w,λ)=∂w∂f(w)
第二项求导,由于在w>0时梯度为λ, 在w<0时梯度为−λ, 其中w=0时我们采用次梯度 为λ⋅sgn(w)
对于整个损失函数次梯度为
▽wL=gw(w,λ)+λ⋅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)是一种非常有用的方法。对于无约束函数
x∈RNminf(x)=g(x)+h(x)
其中
g(x)是凸函数,并且可微的
近端梯度算法通过迭代的方法来优化目标函数f(x):
- 在g(x)上进行梯度下降算法
- 在h(x)上执行近端梯度算法
将上述两布合并即:
xk+1=proxtkh(xk−tk▽g(xk))
近端算子
proxth(⋅)(w)===argzmin2t1∣∣w−z∣∣2+λ∣∣z∣∣argzmin21∣∣w−z∣∣2+λt∣∣z∣∣⎩⎨⎧w−λt0w+tif w>λtif ∣w∣≤λtif w<−λt
最后一步原因:
(w−z)+λt∂w∂∣z∣=(w−z)+λt⎩⎨⎧z[−z,z]−zz>0z=0z<0
令上式为0即可得
Lasso 回归上的应用
我们要优化的目标为
obj=i=1∑m(yi−j=1∑nxijwj)2+λi=1∑n∣wj∣
λ∂w∂∣w∣=⎩⎨⎧−λ[−λ,λ]λw<0w=0w>0
对于第一项其针对参数偏导:
∂wk∂RSS(w)==−2i=1∑mxik(yi−j=1∑nxijwj)−2i=1∑mxik(yi−j=1,j=k∑nxijwj)+2wki=1∑mxik2−2pk+2zkwk
对于第二项,其偏导数为:
λ∂wk∂∑j=1n∣wj∣=⎩⎨⎧−λ[−λ,λ]λwk<0wk=0wk>0
那么上述整体的偏导数
∂wk∂obj=−2pk+2zkwk+⎩⎨⎧−λ[−λ,λ]λwk<0wk=0wk>0
求解令∂wk∂obj=0
得到:
w^k=⎩⎨⎧(pk+λ/2)/zk0(pk−λ/2)/zkpk<−λ/2−λ/2≤pk≤λ/2pk<−λ/2
通过该公式,每次选取一个维度进行优化,不断迭代,直到满足停止条件。
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)
m, n = X.shape
w = np.matrix(np.zeros((n, 1)))
r = rss(X, y, w)
niter = itertools.count(1)
for it in niter:
for k in range(n):
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的参数与λ的关系图:

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

可以岭回归的系数没有真正变为0,而是一直趋于0.
参考:
- 机器学习算法实践-岭回归和LASSO
- Optimization with Sparsity-Inducing Penalties
- Proximal Gradient Algorithms