梯度下降
一、基本思想
1.1 知识回顾
我们首先回顾逻辑回归模型的参数估计:
对于给定的数据集D={(x1,y1),(x2,y2),...,(xn,yn)},xi∈Rd,yi∈{0,1}w^MLE=wargmini=1∑nlog(1+e−yi(wTxi+b))w^MAP=wargmini=1∑nlog(1+e−yi(wTxi+b))+λwTw
由此我们得到两个估计过程的损失函数:
l(w)MLE=i=1∑nlog(1+e−yi(wTxi+b))l(w)MAP=i=1∑nlog(1+e−yi(wTxi+b))+λwTw
我们的目标是最小化一个凸的、连续的、可微的损失函数l(w)。
凸函数定义为:
对∀t∈[0,1],若f(x)满足:f(tx1+(1−t)x2)≤tf(x1)+(1−t)f(x2),则称f(x)为凸函数
①l(w)是凸函数:这使得我们找到的局部最小值也是全局最小值
②l(w)至少三次连续可微:我们将广泛得使用泰勒近似,这个假设大大简化了讨论
③在w上没有设置任何约束,添加约束会增加问题的复杂程度,我们在这里将不讨论
1.2 局部最小值
1.2.1 定义
定义:我们将w∗称为l(w)的一个局部最小值,如果有:
∃ϵ>0,使得∀w∈{w:∣∣w−w∗∣∣2<ϵ},都有l(w∗)≤l(w)
LP范数:∣∣x∣∣p=(∑i=1n∣xi∣p)p1
因为我们之前有l(w)是凸函数的假设,所以找到的局部最小值w∗也是全局最小值,有:
∀w∈Rd,都有l(w∗)≤l(w)
当满足如下条件时,我们称w∗为l(w)的一个严格的局部最小值:
∃ϵ>0,使得∀w∈{w:∣∣w−w∗∣∣2<ϵ},都有l(w∗)<l(w)
注意不是所有的凸函数都有严格的局部最小值,比如l(w)=1
1.2.2 必要条件
一个点w∗成为局部最小值的必要条件为:
∇l(w∗)=0
∇为梯度算子,∇l(w)=[∂w1∂l(w),∂w2∂l(w),...,∂wd∂l(w)]T
如果点w∗满足上述必要条件,则该点成为严格的局部最小值的充分条件是Hessian矩阵为正定的:
即:∇2l(w∗)=H(w)=⎣⎢⎢⎢⎢⎢⎡∂w12∂2l(w) ∂w1∂w2∂2l(w) ... ∂w1∂wd∂2l(w) ... ... ... ...∂wd∂w1∂2l(w) ∂wd∂w2∂2l(w) ... ∂wd2∂2l(w)⎦⎥⎥⎥⎥⎥⎤是正定的。
正定矩阵的定义为:
设A是n阶方阵,即A∈Rn×n,如果对于任何非零向量X∈Rn都有:XTA X>0,那么A是正定的
二、泰勒展开
为了理解更新过程中的损失函数变化,我们对损失函数进行泰勒展开:
2.1 一阶泰勒展开
l(w+Δw)=l(w)+g(w)TΔwg(w)=∇l(w)=[∂w1∂l(w),∂w2∂l(w),...,∂wd∂l(w)]T
一阶泰勒展开对应于线性近似:
在Δw很小时,这些近似是合理可靠的,线性近似的误差为:
O(∣∣Δw∣∣22)=i=1∑dΔwi2
2.2 二阶泰勒展开
l(w+Δw)=l(w)+g(w)TΔw+21ΔwTH(w)ΔwH(w)为Hessian矩阵,[H(w)]i,j=∂wi∂wj∂2l(w)
二阶泰勒展开对应于二次近似:
二次近似的误差为:
O(∣∣Δw∣∣23)=(i=1∑nΔwi2)23
三、搜索方向方法
我们求解问题的目标是:寻找w∗使得l(w)取得最小值,我们需要研究寻找w∗的方向。
3.1 核心思想
给定一个初始点w0,寻找一个迭代序列:w0→w1→...→wk,wk表示第k次迭代找到的w,我们希望:k→∞,wk→w∗
我们的目的就是寻找一个步长s用于对w进行更新,更新过程:
wk+1=wk+s
由此我们得到了一个梯度下降过程的伪代码:
根据上述算法,我们便需要解决以下两个问题:
①如何寻找一个合理的步长s
②如何确定我们找到了w∗以跳出循环
3.2 梯度下降
我们需要寻找到一个使得函数梯度下降最快的方向,并朝该方向迈出一步。
考虑一阶泰勒展开:
l(wk+s)=l(wk)+g(wk)Ts
那么下降最快的方向就是−g(wk),因此我们在梯度下降过程中所作的就是:
s=−αg(wk),α>0
正确性验证:我们需要验证的是总有一些足够小的α使得:
l(wk−αg(wk))<l(wk)
根据泰勒展开:
l(wk−αg(wk))=l(wk)−αg(wk)Tg(wk)+O(α2)∵g(wk)Tg(wk)>0,α→0过程中α2→0的速度大于α∴存在足够小的α,使得:l(wk−αg(wk))<l(wk)
α的设定需要合理,太小的话会导致收敛过慢,太大的话会导致发散。
3.3 Adagrad算法
对于α的一个选择是:设置α使得步长适合于所有的特征,Adagrad算法通过保持每个优化变量的平方梯度的运行平均值来实现这一点
Adagrad算法为具有大梯度的变量设置小学习率,并为具有小梯度的特征设置大学习率。
Adagrad算法的伪代码如下:
该算法的特点是:每一个维度都有不同的学习率,第j维的学习率维:
zj+ϵα
3.4 牛顿方法
牛顿方法处理梯度下降利用二阶泰勒展开:
l(wk+s)=l(wk)+g(wk)Ts+21sTH(wk)s
H(w)=⎣⎢⎢⎢⎢⎢⎡∂w12∂2l(w) ∂w1∂w2∂2l(w) ... ∂w1∂wd∂2l(w) ... ... ... ...∂wd∂w1∂2l(w) ∂wd∂w2∂2l(w) ... ∂wd2∂2l(w)⎦⎥⎥⎥⎥⎥⎤
因为我们假设l(w)是凸函数,则H(w)对所有w都是半正定的,则有:
sTH(wk)s≥0
事实上,牛顿方法在严格的局部极小值附近有很好的性质,一旦足够接近一个解,它就会迅速收敛,为了便于分析,我们假设H(w)是正定的,即:
sTH(wk)s>0
二次近似的梯度为:
∂s∂l(wk+s)=g(wk)+H(wk)s
这意味着我们要找到的w∗满足:
g(w∗)+H(w∗)s=0
所以我们可以得到步长s:
s=H(wk)−1g(wk)
3.4.1 Example
这有一个简单的例子清楚地说明了利用二阶泰勒展开的牛顿方法的优势:
假设损失函数实际上是严格的凸二次函数,即:
l(w)=21wTAw+bTw+c
其中A为正定矩阵,b为任意向量,c为任意常数,在这种情况下,牛顿方法仅需一步即可收敛:
l(w)在Aw+b=0时收敛
我们不妨以二维向量为例:
A=[a11 a12a21 a22],w=[w1,w2]T,b=[b1,b2]T
则损失函数则变为:
l(w1,w2)=21(a11w12+(a12+a21)w1w2+a22w22)+(b1w1+b2w2)+c
g(w)=∇l(w)=[∂w1∂l(w),∂w2∂l(w)]=[a11w1+(a12+a21)w2+b1,a22w2+(a12+a21)w1+b2]
H(w)=⎣⎢⎢⎢⎡∂w12∂2l(w) ∂w1∂w2∂2l(w)∂w2∂w1∂2l(w) ∂w22∂2l(w)⎦⎥⎥⎥⎤=[ a11 a12+a21a12+a21 a22]
H(w)−1=⎣⎢⎢⎢⎡a11a22−(a12+a21)2a22 a11a22−(a12+a21)2−(a12+a21)a11a22−(a12+a21)2−(a12+a21) a11a22−(a12+a21)2a11⎦⎥⎥⎥⎤=β[ a22 −(a12+a21)−(a12+a21) a11],β=a11a22−(a12+a21)21
s=−H(w)−1g(w)=−β[(a11a22−(a12+a21)2)w1+a22b1−(a12+a21)b2(a11a22−(a12+a21)2)w2+a11b2−(a12+a21)b1]=⎣⎢⎢⎢⎡−w1+a11a22−(a12+a21)2(a12+a21)b2−a22b1−w2+a11a22−(a12+a21)2(a12+a21)b1−a11b2⎦⎥⎥⎥⎤
则更新w的过程为:
w=w+s=⎣⎢⎢⎢⎡a11a22−(a12+a21)2(a12+a21)b2−a22b1a11a22−(a12+a21)2(a12+a21)b1−a11b2⎦⎥⎥⎥⎤
为了便于讨论,我们不妨使得A=I,则有w=[−b1,−b2]T=−b,则有Aw+b=0,仅通过一次更新即实现了收敛。
注意:
①H(w)是一个d×d的矩阵,它的构造代价很大,一个很好的近似方法是只计算其对角线条目
②本质上这是梯度下降法和牛顿方法的结合,为了避免牛顿法的发散,一个好的方法是从梯度下降(甚至随机梯度下降)开始,然后完成优化牛顿法。通常,牛顿法使用的二阶近似值更可能接近最佳值