(一) 引言
试想,某人在山顶,并且四周全是雾(霾)完全无法辨别方向,该怎么以最快速度下山呢?对喽,就是沿着坡度最陡的方向下山。但是,哪里又是坡度最陡的路线呢?在伸手不见五指的情况下只能把四面八方都测量一遍,找出最陡峭的方向,就这样走一步测一遍就可以很快下山了,当然这样走下去,有可能我们不能走到山脚,而是到了某一个局部的山峰低处。
(二) 梯度
梯度的本意是一个向量(矢量),表示某一函数在该点处的方向导数沿着该方向取得最大值,即函数在该点处沿着该方向(梯度方向)变化最快,变化率最大(为该梯度的模)。
对于可微的数量场 \(f\left( x,y,z \right)\),以\(f\left ( \frac{\partial f}{\partial x} , \frac{\partial f}{\partial y}, \frac{\partial f}{\partial z} \right )\)为分量的向量场称为f的梯度或斜量。
(三) 梯度下降法
梯度下降法(gradient descent)的计算过程就是沿着梯度下降的方向求解极小值(也可以沿着梯度上升的方向求最大值)。同时也是一个最优化算法,常用于机器学习和人工智能当中用来递归性地逼近最小偏差模型。
(四) 梯度下降公式
\(Θ ^{1}=Θ ^{0}-\alpha \bigtriangledown J\left ( Θ \right ) \)
此公式的意义是:J是关于\(Θ\)的一个函数,我们当前所处的位置为\(Θ ^{0}\)点要从这个点走到J的最小值点,也就是山底。首先我们先确定前进的方向,也就是梯度的反向,然后走一段距离的步长,也就是α,走完这个段步长,就到达了\(Θ ^{1}\)这个点!
\(\alpha\)在梯度下降算法中被称作为学习率或者步长,意味着我们可以通过\(\alpha\)来控制每一步所走的距离。\(\alpha\)既不能太大,也不能太小,因为太大容易错过最低点,太小又移动的太慢(耗时太长)。
(五) 求解梯度方法
1. 代数方式描述
(1) 先决条件: 确认优化模型的假设函数和损失函数。
比如对于线性回归,假设函数表示为\(h_{\theta}\left(x_{0},x_{1},…x_{n}\right)=\theta_{0}+\theta_{1}x_{1}+…+\theta_{n}x_{n}\), 其中\(\theta_{i}\left ( i = 0,1,2…n \right)\)为模型参数,\(x_{i} \left(i = 0,1,2… n\right)\) 为每个样本的n个特征值。这个表示可以简化,我们增加一个特征\(x_{0}=1\),这样\(h_{\theta}\left(x_{0},x_{1},…x_{n}\right)=\sum_{i=0}^{n}\theta _{i}x_{i}\)。
同样是线性回归,对应于上面的假设函数,损失函数为: \(J\left ( \theta _{0}, \theta _{1},…, \theta _{1}\right )=\frac{1}{2m}\sum_{j=0}^{m}\left ( h_{0}\left ( x_{0}^{\left ( j \right )},x_{1}^{\left ( j \right )},…,x_{n}^{\left ( j \right )} \right ) -y^{j}\right )^{2}\)
(2) 算法相关参数初始化
主要是初始化\(x_{0},x_{1},…x_{n}\),算法终止距离ε以及步长α。在没有任何先验知识的时候,我喜欢将所有的θ初始化为0,将步长初始化为1,在调优的时候再优化。
(3) 算法过程
1) 确定当前位置的损失函数的梯度,对于\(θ_i\),其梯度表达式如下:
\(\frac{\partial }{\partial \theta _{i}}J\left ( x_{0},x_{1},…x_{n} \right )\)
2) 用步长乘以损失函数的梯度,得到当前位置下降的距离,即\(\alpha \frac{\partial }{\partial \theta _{i}}J\left ( x_{0},x_{1},…x_{n} \right )\)对应于前面登山例子中的某一步。
3) 确定是否所有的\(θ_i\),梯度下降的距离都小于ε,如果小于ε则算法终止,当前所有的\(\theta_{i}\left (i=0,1,…n\right)\)即为最终结果。否则进入步骤4.
4) 更新所有的θ,对于\(θ_i\),其更新表达式如下。更新完毕后继续转入步骤1.
\(\theta _{i}=\theta _{i}-\alpha \frac{\partial }{\partial \theta _{i}}J\left ( x_{0},x_{1},…x_{n} \right )\)
(4) 举例说明代数求解过程
1) 用线性回归的例子来具体描述梯度下降。假设我们的样本是
\(\left ( x_{1}^{\left ( 0 \right )}, x_{2}^{\left ( 0 \right )},…,x_{n}^{\left ( 0 \right )},y_{0}\right ),\left ( x_{1}^{\left ( 1 \right )}, x_{2}^{\left ( 1\right )},…,x_{n}^{\left ( 1 \right )},y_{1}\right ),…,\left ( x_{1}^{\left ( m \right )}, x_{2}^{\left ( m \right )},…,x_{n}^{\left ( m \right )},y_{m}\right )\)
2) 损失函数如前面先决条件所述:
\(J\left ( \theta _{0}, \theta _{1},…, \theta _{1}\right )=\frac{1}{2m}\sum_{j=0}^{m}\left ( h_{0}\left ( x_{0}^{\left ( j \right )},x_{1}^{\left ( j \right )},…,x_{n}^{\left ( j \right )} \right ) -y^{j}\right )^{2}\)
3) 则在算法过程步骤1中对于\(θ_i\) 的偏导数计算如下: \(\frac{\partial }{\partial \theta _{i}}J\left ( \theta _{0}, \theta _{1},…, \theta _{1}\right )=\frac{1}{m}\sum_{j=0}^{m}\left ( h_{0}\left ( x_{0}^{\left ( j \right )},x_{1}^{\left ( j \right )},…,x_{n}^{\left ( j \right )} \right ) -y^{j}\right )x_{i}^{\left ( j \right )}\)
4) 由于样本中没有\(x_0\)上式中令所有的\(x_{0}^{j}\)为1. 步骤4中\(θ_i\)的更新表达式如下: \(\theta _{i}=\theta _{i}-\alpha \frac{1}{m}\sum_{j=0}^{m}\left ( h_{0}\left ( x_{0}^{\left ( j \right )},x_{1}^{\left ( j \right )},…,x_{n}^{\left ( j \right )} \right ) -y^{j}\right )x_{i}^{\left ( j \right )}\)
5) 从这个例子可以看出当前点的梯度方向是由所有的样本决定的,加\(\frac{1}{m}\) 是为了好理解。由于步长也为常数,他们的乘机也为常数,所以这里\(\alpha \frac{1}{m}\)可以用一个常数表示。
2. 矩阵方式描述
(1) 先决条件:和上面代数描述类似。
需要确认优化模型的假设函数和损失函数。对于线性回归,假设函数 \(h_{\theta}\left(x_{0},x_{1},…x_{n}\right)=\theta_{0}+\theta_{1}x_{1}+…+\theta_{n}x_{n}\)
的矩阵表达式为: \(h_{\theta }\left (X\right )=X\theta \),其中, 假设函数\(h_{\theta }\left (X\right )\)为mx1的向量,\(\theta\)为(n+1)x1的向量,里面有n+1个代数法的模型参数。\(X\)X为mx(n+1)维的矩阵。m代表样本的个数,n+1代表样本的特征数。
损失函数的表达式为:\(J\left ( \theta \right )=\frac{1}{2}\left ( X\theta -Y \right )^{T}\left ( X\theta -Y \right )\),其中\(Y\)是样本的输出向量,维度为mx1。
(2) 算法相关参数初始化
\(\theta\)向量可以初始化为默认值,或者调优后的值。算法终止距离\(ε\),步长\(α\)和代数描述中没有变化。
(3) 算法描述
1) 确定当前位置的损失函数的梯度,对于\(\theta\)向量,其梯度表达式如下: \(\frac{\partial }{\partial \theta }J\left ( \theta \right )\)
2) 用步长乘以损失函数的梯度,得到当前位置下降的距离,即 \(\alpha \frac{\partial }{\partial \theta }J\left ( \theta \right )\)对应于前面登山例子中的某一步。
3) 确定\(\theta\)向量里面的每个值,梯度下降的距离都小于\(\varepsilon \),如果小于\(\varepsilon \)则算法终止,当前\(\theta\)向量即为最终结果。否则进入步骤4.
4) 更新\(\theta\)向量,其更新表达式如下。更新完毕后继续转入步骤1.
\(\theta = \theta -\alpha \frac{\partial }{\partial \theta }J\left ( \theta \right )\)
(4) 举例说明矩阵求解过程
损失函数对于\(\theta\)向量的偏导数计算如下: \(\frac{\partial }{\partial \theta }J\left ( \theta \right )=X^{T}\left ( X\theta -Y \right )\)
步骤4中\(\theta\)向量的更新表达式如下:\(\theta =\theta -\alpha X^{T}\left ( X\theta -Y \right )\)
(5) 矩阵求解中用到的法则与公式:
1) 矩阵求导链式法则
2) 公式1:\(\frac{\partial }{\partial X}\left ( XX^{T} \right )=2X\)
3) 公式2:\(\frac{\partial }{\partial \theta }\left ( X\theta \right )=X^{T}\)
(六) 梯度下降的算法调优
1. 算法的步长选择。
在前面的算法描述中,我提到取步长为1,但是实际上取值取决于数据样本,可以多取一些值,从大到小,分别运行算法,看看迭代效果,如果损失函数在变小,说明取值有效,否则要增大步长。前面说了。步长太大,会导致迭代过快,甚至有可能错过最优解。步长太小,迭代速度太慢,很长时间算法都不能结束。所以算法的步长需要多次运行后才能得到一个较为优的值。
2. 算法参数的初始值选择。
初始值不同,获得的最小值也有可能不同,因此梯度下降求得的只是局部最小值;当然如果损失函数是凸函数则一定是最优解。由于有局部最优解的风险,需要多次用不同初始值运行算法,关键损失函数的最小值,选择损失函数最小化的初值。
3. 归一化。
由于样本不同特征的取值范围不一样,可能导致迭代很慢,为了减少特征取值的影响,可以对特征数据归一化,也就是对于每个特征x,求出它的期望\(\overline{x}\)和标准差\(std(x)\),然后转化为:\(\frac{x-\overline{x}}{std\left ( x \right )}\) 这样特征的新期望为0,新方差为1,迭代次数可以大大加快。
(七) 梯度下降法的优化
1. 批量梯度下降法 [BGD: Batch Gradient Descent]
批量梯度下降法,是梯度下降法最常用的形式,具体做法也就是在更新参数时使用所有的样本来进行更新,参数对应公式如下:
\(\theta _{i}=\theta _{i}-\alpha \sum_{j=0}^{m}\left ( h_{\theta }\left ( x_{0}^{\left ( j \right )}, x_{1}^{\left ( j \right )}, …, x_{n}^{\left ( j \right )} \right )-y_{j} \right ) x_{i}^{\left ( j \right )}\)
2. 随机梯度下降法 [SGD: Stochastic Gradient Descent]
随机梯度下降法,其实和批量梯度下降法原理类似,区别在与求梯度时没有用所有的m个样本的数据,而是仅仅选取一个样本j来求梯度,其参数更新公式为:
\(\theta _{i}=\theta _{i}-\alpha \left ( h_{\theta }\left ( x_{0}^{\left ( j \right )}, x_{1}^{\left ( j \right )}, …, x_{n}^{\left ( j \right )} \right )-y_{j} \right ) x_{i}^{\left ( j \right )}\)
3. BGD vs SGD
随机梯度下降法和批量梯度下降法是两个极端,一个采用所有数据来梯度下降,一个用一个样本来梯度下降。自然各自的优缺点都非常突出。对于训练速度来说,随机梯度下降法由于每次仅仅采用一个样本来迭代,训练速度很快,而批量梯度下降法在样本量很大的时候,训练速度不能让人满意。对于准确度来说,随机梯度下降法用于仅仅用一个样本决定梯度方向,导致解很有可能不是最优。对于收敛速度来说,由于随机梯度下降法一次迭代一个样本,导致迭代方向变化很大,不能很快的收敛到局部最优解。
4. 小批量梯度下降法 [MBGD: Mini-batch Gradient Descent]
小批量梯度下降法是批量梯度下降法和随机梯度下降法的折衷,也就是对于m个样本,我们采用x个样子来迭代,1<x<m。一般可以取x=10,当然根据样本的数据,可以调整这个x的值。对应的更新公式是:
\(\theta_{i}=\theta_{i}-\alpha\sum_{j=t}^{t+x-1}\left (h_{\theta}\left(x_{0}^{\left(j\right)}, x_{1}^{\left(j\right)}, …, x_{n}^{\left(j\right)}\right)-y_{j}\right)x_{i}^{\left(j\right)}\)
(八) 梯度下降法 vs 其他无约束优化算法
梯度下降法和最小二乘法相比,梯度下降法需要选择步长,而最小二乘法不需要。梯度下降法是迭代求解,最小二乘法是计算解析解。如果样本量不算很大,且存在解析解,最小二乘法比起梯度下降法要有优势,计算速度很快。但是如果样本量很大,用最小二乘法由于需要求一个超级大的逆矩阵,这时就很难或者很慢才能求解解析解了,使用迭代的梯度下降法比较有优势。
梯度下降法和牛顿法/拟牛顿法相比,两者都是迭代求解,不过梯度下降法是梯度求解,而牛顿法/拟牛顿法是用二阶的海森矩阵的逆矩阵或伪逆矩阵求解。相对而言,使用牛顿法/拟牛顿法收敛更快。但是每次迭代的时间比梯度下降法长。
参考博客