Gradient Descent
1 梯度下降简单理解
在微积分里面,对多元函数的参数求∂偏导数,把求得的各个参数的偏导数以向量的形式写出来,就是梯度。比如函数f(x,y), 分别对x,y求偏导数,求得的梯度向量就是(∂f/∂x,∂f/∂y)T,简称grad f(x,y)或者∇f(x,y)。对于在点(x0,y0)的具体梯度向量就是(∂f/∂x0,∂f/∂y0)T。或者∇f(x0,y0),如果是3个参数的向量梯度,就是(∂f/∂x, ∂f/∂y,∂f/∂z)T,以此类推。
那么这个梯度向量求出来有什么意义呢?他的意义从几何意义上讲,就是函数变化增加最快的地方。具体来说,对于函数f(x,y),在点(x0,y0),沿着梯度向量的方向就是(∂f/∂x0,∂f/∂y0)T的方向是f(x,y)增加最快的地方。或者说,沿着梯度向量的方向,更加容易找到函数的最大值。反过来说,沿着梯度向量相反的方向,也就是−(∂f/∂x0,∂f/∂y0)T的方向,梯度减少最快,也就是更加容易找到函数的最小值。
设我们的损失函数为L(θ),θ为参数向量,θ∗为最后我们想得到的最优参数。则线性回归中我们对模型的优化可记为:
θ∗=argθminL(θ)
我们假设模型很简单只有两个参数,即θ=[θ1,θ2],我们给参数随机初始值θ0=[θ10,θ20],则我们的梯度下降/参数更新可以表示为:
[θ11θ21]=[θ10θ20]−η[∂L(θ10)/∂θ1∂L(θ20)/∂θ2]
[θ12θ22]=[θ11θ21]−η[∂L(θ11)/∂θ1∂L(θ21)/∂θ2]
如果我们将梯度记为∇,即:
∇L(θ)=[∂L(θ1)/∂θ1∂L(θ2)/∂θ2]
上面参数更新公式将变得简单直观一些:
θ1=θ0−η∇L(θ0)
θ2=θ1−η∇L(θ1)
需要注意的是梯度下降中,梯度方向是由所有的样本决定的,在数据集比较大的情况下每次更新需要耗费大量计算资源和时间。
2 tip1 learning rates 调节
关于learning rates大小的控制,给一张图,很好理解:

2.1 自适应的调节learning rates
比较简单的做法是每过一个epoch就降低一下learning rates 因为:
- 通常最开始我们离目的地比较远,我们希望用大的学习率快速接近终点;
- 当几个epoch之后我们接近目的地了,我们希望减小学习率来更精确的到达最低点。
例如:让learning rates 与迭代次数t相关:ηt=η/t+1 这样随着迭代次数的增加learning rates 越来越小。
但更优的做法是我们应该给不同的参数不同的学习率。
2.2 Adagrad
原来的梯度下降:参数计算偏导数乘以学习率,再用参数减去这个值,即得到该参数更新后的值
wt+1=wt−ηtgt
其中:这里w表示函数的一个参数,t表示梯度下降计算的次数,ηt为第t次梯度下降的学习率,gt为第t次梯度下降计算的该参数偏微分的值。
Adagrad: 每一个参数的学习率都除以其之前算出来的微分值的均方根(root mean square)。
wt+1=wt−σtηtgt
跟原来的梯度下降不同的是,这里的σt 表示参数w过去所有所有微分值的均方根。这个值对每个参数都不一样,使每一个参数的学习率都不一样了。简单示例:

由于σt=t+11∑i=0t(gi)2,与迭代次数相关的ηt=t+1η,显然,对于Adagrad的公式,可以将t+1消掉,约简后的Adagrad公式如下:
wt+1=wt−∑i=0t(gi)2ηgt
小结:Adagrad在更新到较多代之后参数更新非常慢,目前相对稳定且可以避免这种情况的优化器可选用Adam。
3 Stochastic Gradient Descent
可以让我们的训练更快一点
随机梯度下降(stochastic gradient descent,SGD)减少了每次迭代的计算开销。在随机梯度下降的每次迭代中,我们随机均匀采样的一个样本索引i∈{1,...,n} i∈{1,…,n} ,并计算梯度∇Li(θ)来迭代模型参数θ:
θ1=θ0−η∇Li(θ0)
每次迭代的计算开销从梯度下降的 O(n) 降到了常数 O(1)。
回顾: 上面介绍的梯度下降,假设模型是一个线性回归,其损失函数为:
L=n∑(y^n−(b+∑wixin))2
我们的梯度下降计算为:
θi+1=θi−η∇L(θi)
从上式的损失函数可以明显看出,梯度下降是针对所有数据计算损失,然后再分配权重。这样做虽然能准确把握梯度方向,能最大程度上的使下一步的损失降低,但确实是速度过慢,耗费计算资源。
二随机梯度下降的计算如下:
Ln=(y^n−(b+∑wixin))2
θi+1=θi−η∇Ln(θi)
与梯度下降不同的是,这里的损失函数公式里没有了∑n符号,这里计算的一条数据n的损失,并根据这一条数据进行梯度下降,从而减小计算量和计算时间。
4 批量梯度下降
折中的方法,每次计算一个mini-batch的数据来计算梯度更新参数。当前主流方法
5 调优2 特征缩放(feature scaling)
当多个特征的值的范围差距过大时,代价函数的轮廓图会非常的偏斜,如下图左所示,这会导致梯度下降函数收敛的非常慢。因此需要特征缩放(feature scaling)来解决这个问题,特征缩放的目的是把特征的的值范围缩放到接近的范围。当把特征的值的范围缩放到接近的范围,就会使偏斜的不那么严重,通过损失函数执行梯度下降算法时速度会加快,更快的收敛。

如上图左所示,x2的特征值明显比x1的值要大很多,这时如果w1,w2的值做一样的参数更新,w2的变化会对预测值y以及损失值L产生很大的影响,所以其损失函数的等高面如上图左,在w1的方向上损失值变化较平缓,在w2的方向上,损失值变化剧烈,这对梯度下降的计算是不利的。而如果特征值差别较小,如上右图所示,损失函数的等高面就比较均匀,利于梯度下降,因为梯度下降并不是一开始就朝着最低点,而是垂直于等高线的方向。
常用的两种特征缩放方法:
min-max标准化
它把原始数据映射到[0-1]之间,公式为:
x=max−minx−min
0均值标准化
公式为:
x=σx−μ
其中μ为特征值x的均值,σ为x的标准差,标准差是方差的开方,公式如下:
σ=N1i=1∑N(xi−μ)2
这种归一化方法是该特征值的均值为0,方差为1
这两种归一化方法的适用场景为:
- 在不涉及距离度量、协方差计算、数据不符合正太分布的时候,可以使用第一种方法或其他归一化方法。比如图像处理中,将RGB图像转换为灰度图像后将其值限定在[0 255]的范围
- 在分类、聚类算法中,需要使用距离来度量相似性的时候、或者使用PCA技术进行降维的时候,第二种方法(Z-score standardization)表现更好。
参考李宏毅机器学习课程
参考刘建平的博客
天泽28的博客