梯度下降笔记

Gradient Descent

1 梯度下降简单理解

在微积分里面,对多元函数的参数求∂偏导数,把求得的各个参数的偏导数以向量的形式写出来,就是梯度。比如函数f(x,y)f(x,y), 分别对x,y求偏导数,求得的梯度向量就是(f/x,f/y)T(\partial f/ \partial x, \partial f/ \partial y)^T,简称grad f(x,y)或者f(x,y)\nabla f(x,y)。对于在点(x0,y0)(x_0,y_0)的具体梯度向量就是(f/x0,f/y0)T(\partial f/ \partial x_0, \partial f/ \partial y_0)^T。或者f(x0,y0)\nabla f(x_0,y_0),如果是3个参数的向量梯度,就是(∂f/∂x, ∂f/∂y,∂f/∂z)T,以此类推。

那么这个梯度向量求出来有什么意义呢?他的意义从几何意义上讲,就是函数变化增加最快的地方。具体来说,对于函数f(x,y)f(x,y),在点(x0,y0)(x_0,y_0),沿着梯度向量的方向就是(f/x0,f/y0)T(\partial f/ \partial x_0, \partial f/ \partial y_0)^T的方向是f(x,y)f(x,y)增加最快的地方。或者说,沿着梯度向量的方向,更加容易找到函数的最大值。反过来说,沿着梯度向量相反的方向,也就是(f/x0,f/y0)T-(\partial f/ \partial x_0, \partial f/ \partial y_0)^T的方向,梯度减少最快,也就是更加容易找到函数的最小值。

设我们的损失函数为L(θ)L(\theta)θ\theta为参数向量,θ\theta^*为最后我们想得到的最优参数。则线性回归中我们对模型的优化可记为:

θ=argminθL(θ)\theta^* = arg \, \min_\theta L(\theta)

我们假设模型很简单只有两个参数,即θ=[θ1,θ2]\theta = [\theta_1, \theta_2],我们给参数随机初始值θ0=[θ10,θ20]\theta^0 = [\theta^0_1, \theta^0_2],则我们的梯度下降/参数更新可以表示为:

[θ11θ21]=[θ10θ20]η[L(θ10)/θ1L(θ20)/θ2]\begin{array}{l} {\left[\begin{array}{l} \theta_{1}^{1} \\ \theta_{2}^{1} \end{array}\right]=\left[\begin{array}{l} \theta_{1}^{0} \\ \theta_{2}^{0} \end{array}\right]-\eta\left[\begin{array}{l} \partial L\left(\theta_{1}^{0}\right) / \partial \theta_{1} \\ \partial L\left(\theta_{2}^{0}\right) / \partial \theta_{2} \end{array}\right]} \\ \end{array}

[θ12θ22]=[θ11θ21]η[L(θ11)/θ1L(θ21)/θ2]\begin{array}{l} {\left[\begin{array}{l} \theta_{1}^{2} \\ \theta_{2}^{2} \end{array}\right]=\left[\begin{array}{l} \theta_{1}^{1} \\ \theta_{2}^{1} \end{array}\right]-\eta\left[\begin{array}{l} \partial L\left(\theta_{1}^{1}\right) / \partial \theta_{1} \\ \partial L\left(\theta_{2}^{1}\right) / \partial \theta_{2} \end{array}\right]} \end{array}

如果我们将梯度记为\nabla,即:

L(θ)=[L(θ1)/θ1L(θ2)/θ2]\nabla L(\theta)=\left[\begin{array}{l} \partial L\left(\theta_{1}\right) / \partial \theta_{1} \\ \partial L\left(\theta_{2}\right) / \partial \theta_{2} \end{array}\right]

上面参数更新公式将变得简单直观一些:

θ1=θ0ηL(θ0)\theta^{1} = \theta^{0} - \eta \nabla L(\theta^{0})
θ2=θ1ηL(θ1)\theta^{2} = \theta^{1} - \eta \nabla L(\theta^{1})

需要注意的是梯度下降中,梯度方向是由所有的样本决定的,在数据集比较大的情况下每次更新需要耗费大量计算资源和时间。

2 tip1 learning rates 调节

关于learning rates大小的控制,给一张图,很好理解:

梯度下降笔记

2.1 自适应的调节learning rates

比较简单的做法是每过一个epoch就降低一下learning rates 因为:

  • 通常最开始我们离目的地比较远,我们希望用大的学习率快速接近终点;
  • 当几个epoch之后我们接近目的地了,我们希望减小学习率来更精确的到达最低点。

例如:让learning rates 与迭代次数t相关:ηt=η/t+1\eta^t = \eta / \sqrt{t+1} 这样随着迭代次数的增加learning rates 越来越小。

但更优的做法是我们应该给不同的参数不同的学习率。

2.2 Adagrad

原来的梯度下降:参数计算偏导数乘以学习率,再用参数减去这个值,即得到该参数更新后的值

wt+1=wtηtgtw^{t+1} = w^t - \eta^t g^t

其中:这里ww表示函数的一个参数,t表示梯度下降计算的次数,ηt\eta^t为第t次梯度下降的学习率,gtg^t为第t次梯度下降计算的该参数偏微分的值。

Adagrad: 每一个参数的学习率都除以其之前算出来的微分值的均方根(root mean square)。

wt+1=wtηtσtgtw^{t+1} = w^t - \frac{\eta^t}{\sigma^t} g^t

跟原来的梯度下降不同的是,这里的σt\sigma^t 表示参数ww过去所有所有微分值的均方根。这个值对每个参数都不一样,使每一个参数的学习率都不一样了。简单示例:

梯度下降笔记
由于σt=1t+1i=0t(gi)2\sigma^{t}=\sqrt{\frac{1}{t+1} \sum_{i=0}^{t}\left(g^{i}\right)^{2}},与迭代次数相关的ηt=ηt+1\eta^t = \frac{\eta}{\sqrt{t+1}},显然,对于Adagrad的公式,可以将t+1\sqrt{t+1}消掉,约简后的Adagrad公式如下:

wt+1=wtηi=0t(gi)2gtw^{t+1} = w^t - \frac{\eta}{\sqrt{\sum_{i=0}^{t}\left(g^{i}\right)^{2}}} g^t

小结:Adagrad在更新到较多代之后参数更新非常慢,目前相对稳定且可以避免这种情况的优化器可选用Adam。

3 Stochastic Gradient Descent

可以让我们的训练更快一点

随机梯度下降(stochastic gradient descent,SGD)减少了每次迭代的计算开销。在随机梯度下降的每次迭代中,我们随机均匀采样的一个样本索引i{1,...,n}i \in \{1, ..., n\} i∈{1,…,n} ,并计算梯度Li(θ)\nabla L_i(\theta)来迭代模型参数θ\theta

θ1=θ0ηLi(θ0)\theta^{1} = \theta^{0} - \eta \nabla L_i(\theta^{0})

每次迭代的计算开销从梯度下降的 O(n) 降到了常数 O(1)。

回顾: 上面介绍的梯度下降,假设模型是一个线性回归,其损失函数为:

L=n(y^n(b+wixin))2L=\sum_{n}\left(\hat{y}^{n}-\left(b+\sum w_{i} x_{i}^{n}\right)\right)^{2}

我们的梯度下降计算为:

θi+1=θiηL(θi)\theta^{i+1} = \theta^{i} - \eta \nabla L(\theta^i)

从上式的损失函数可以明显看出,梯度下降是针对所有数据计算损失,然后再分配权重。这样做虽然能准确把握梯度方向,能最大程度上的使下一步的损失降低,但确实是速度过慢,耗费计算资源。

二随机梯度下降的计算如下:

Ln=(y^n(b+wixin))2L^n=\left(\hat{y}^{n}-\left(b+\sum w_{i} x_{i}^{n}\right)\right)^{2}

θi+1=θiηLn(θi)\theta^{i+1} = \theta^{i} - \eta \nabla L^n(\theta^i)

与梯度下降不同的是,这里的损失函数公式里没有了n\sum_n符号,这里计算的一条数据n的损失,并根据这一条数据进行梯度下降,从而减小计算量和计算时间。

4 批量梯度下降

折中的方法,每次计算一个mini-batch的数据来计算梯度更新参数。当前主流方法

5 调优2 特征缩放(feature scaling)

当多个特征的值的范围差距过大时,代价函数的轮廓图会非常的偏斜,如下图左所示,这会导致梯度下降函数收敛的非常慢。因此需要特征缩放(feature scaling)来解决这个问题,特征缩放的目的是把特征的的值范围缩放到接近的范围。当把特征的值的范围缩放到接近的范围,就会使偏斜的不那么严重,通过损失函数执行梯度下降算法时速度会加快,更快的收敛。

梯度下降笔记

如上图左所示,x2x_2的特征值明显比x1x_1的值要大很多,这时如果w1,w2w_1, w_2的值做一样的参数更新,w2w_2的变化会对预测值y以及损失值L产生很大的影响,所以其损失函数的等高面如上图左,在w1w_1的方向上损失值变化较平缓,在w2w_2的方向上,损失值变化剧烈,这对梯度下降的计算是不利的。而如果特征值差别较小,如上右图所示,损失函数的等高面就比较均匀,利于梯度下降,因为梯度下降并不是一开始就朝着最低点,而是垂直于等高线的方向。

常用的两种特征缩放方法:

min-max标准化

它把原始数据映射到[0-1]之间,公式为:

x=xminmaxminx = \frac{x-min}{max-min}

0均值标准化

公式为:

x=xμσx = \frac{x-\mu}{\sigma}

其中μ\mu为特征值x的均值,σ\sigma为x的标准差,标准差是方差的开方,公式如下:

σ=1Ni=1N(xiμ)2\sigma = \sqrt{ \frac{1}{N} \sum_{i=1}^{N} (x_i - \mu)^2}

这种归一化方法是该特征值的均值为0,方差为1

这两种归一化方法的适用场景为:

  • 在不涉及距离度量、协方差计算、数据不符合正太分布的时候,可以使用第一种方法或其他归一化方法。比如图像处理中,将RGB图像转换为灰度图像后将其值限定在[0 255]的范围
  • 在分类、聚类算法中,需要使用距离来度量相似性的时候、或者使用PCA技术进行降维的时候,第二种方法(Z-score standardization)表现更好。

参考李宏毅机器学习课程

参考刘建平的博客

天泽28的博客