背景
这次主要介绍次梯度(subgradient)和近端梯度下降(Proximal gradient descent)算法我们以L1正则化求解为例
次梯度
对于任一个损失函数,将其简化写为:
L ( w , λ ) = f ( w ) + λ ∣ w ∣ L(w, \lambda) = f(w) + \lambda|w| L(w,λ)=f(w)+λ∣w∣
对于第一项求导
g w ( w , λ ) = ∂ f ( w ) ∂ w g_w(w, \lambda) = \frac{\partial f(w)}{\partial w} gw(w,λ)=∂w∂f(w)
第二项求导,由于在 w > 0 w>0 w>0时梯度为 λ \lambda λ, 在 w < 0 w<0 w<0时梯度为 − λ -\lambda −λ, 其中 w = 0 w=0 w=0时我们采用次梯度 为 λ ⋅ s g n ( w ) \lambda\cdot sgn(w) λ⋅sgn(w)
对于整个损失函数次梯度为
▽ w L = g w ( w , λ ) + λ ⋅ s n g ( w ) \triangledown_w L = g_w(w, \lambda) + \lambda \cdot sng(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)是一种非常有用的方法。对于无约束函数
m i n x ∈ R N f ( x ) = g ( x ) + h ( x ) \underset{x\in \mathbb R^N}{min}\; f(x)=g(x) + h(x) x∈RNminf(x)=g(x)+h(x)
其中
g ( x ) g(x) g(x)是凸函数,并且可微的
近端梯度算法通过迭代的方法来优化目标函数 f ( x ) f(x) f(x):
- 在g(x)上进行梯度下降算法
- 在h(x)上执行近端梯度算法
将上述两布合并即:
x k + 1 = p r o x t k h ( x k − t k ▽ g ( x k ) ) x^{k+1}=prox_{t_kh}(x^k-t_k\triangledown g(x^k)) xk+1=proxtkh(xk−tk▽g(xk))
近端算子
p r o x t h ( ⋅ ) ( w ) = a r g m i n z 1 2 t ∣ ∣ w − z ∣ ∣ 2 + λ ∣ ∣ z ∣ ∣ = a r g m i n z 1 2 ∣ ∣ w − z ∣ ∣ 2 + λ t ∣ ∣ z ∣ ∣ = { w − λ t i f w >