随机梯度下降(Stochastic Gradient Descent, SGD)是随机和优化相结合的产物,是一种很神奇的优化方法,属于梯度下降的一种,适用于大规模的问题 。
要想扯清楚它,还得先谈谈梯度下降。
众所周知,每个优化问题会有一个目标函数
f(w)
,
梯度下降就是采用迭代的策略,
从初始点
w1
开始,
每次沿着目标函数在当前点的负梯度方向前进一定的步长,即
只要步长
ηt
设置合理,
这样可以得到一个单调递减的序列
{f(w1),…,f(wt),…}
,
直至最终不再下降,即可得到最优解
w∗
。
对于一般优化问题,梯度下降可以找到局部最优解,对于凸优化问题,梯度下降可以得到全局最优解,下面我们只考虑凸优化问题。
考虑如下的目标函数
其中
xi
是与
w
无关的常向量。
当
n
为很大的正整数时,例如几十万甚至几百万时,计算梯度:
代价很大,那么这个方法就行不通了。
但是这样的问题在机器学习领域又很常见,比如感知机(Perceptron),支持向量机(Support Vector Machine, SVM),套索(Least Absolute Shrinkage and Selection Operator, LASSO)等算法都可以写成如下的形式:
其中
Ω(w)
是关于
w
的凸正则化项,
L(w,xi)
是关于
w
的凸损失函数。
因此我们需要克服梯度下降计算开销太大的问题,那么,随机梯度下降就呼之欲出了。
随机梯度下降的基本想法很简单,就是不直接计算梯度的精确值,而是用梯度的无偏估计 g(w) 来代替梯度,即
其中 E[g(wt) | wt]=∇f(wt) 。
那么肯定有人要问,这么简单,靠不靠谱啊?
可以证明的是在某些条件下,这样得到的序列
{f(w1),…,f(wt),…}
中的最小值依期望收敛 到
f(w∗)
。
具体来说,设
其中
η=[η1,η2,…]⊤
是无穷维向量,
并假设存在常数
G
和
对于任意
t
有
并记
fbest(t)=min{f(w1),…,f(wt)}
,
那么当
t→∞
时,
E[fbest(t)]→f(w∗)
。
结合条件期望的性质和 f 的凸性知
两边同时对 wt 取期望,由重期望公式知
重复利用该式可得
注意
E[||wt+1–w∗||22]≥0
,
E[||w1–w∗||22]≤R2
以及
∑tj=1η2j≤||η||22
,
于是
结合 E[fbest(t)]≤E[f(wj)] 可知
由于 ∑∞t=1ηt=∞ ,故当 t→∞ 时有 E[fbest(t)]→f(w∗) 。
此外,由Markov不等式知对于 ∀ϵ>0 有
即当 t→∞ 时有 P(fbest(t)–f(w∗)≥ϵ)→0 。
下面举几个机器学习里的具体例子,设训练集
S
有
即
S={(x1,y1),(x2,y2),…,(xn,yn)}
,
由于有
成立,于是一个很直观的想法就是每次更新只随机选取一个样本 xi 来计算梯度。
感知机:感知机可形式化成如下的优化问题
那么对应的更新公式为
支持向量机:支持向量机可形式化成如下的优化问题
那么对应的更新公式为
套索:套索可形式化成如下的优化问题
设
w=u–v
且
u≥0,v≥0
,
e
为全
1
向量,
优化问题可重写为
那么对应的更新公式为
最后再提一个小技巧,以支持向量机为例,它的更新公式为
当
x
维度很高而非零元素很少时,
+ytxt
可以很高效地算出来,
但是第一项
(1–ληt)wt
的计算代价就有点高了,
因为
w
一般来说不是稀疏的,一个小技巧就是做个变量代换
其中 αt 是标量,于是原来的更新式可以转化为如下只涉及标量计算和稀疏向量操作的更新过程