chapter4-梯度下降算法(Gradient Descent)
求解机器学习算法的模型参数时,即无约束优化问题时,梯度下降(Gradient Descent)是最常采用的方法之一,另一种常用的方法是最小二乘法。这里就对梯度下降法做一个完整的总结。
1.梯度
在微积分里面,对多元函数的参数求∂偏导数,把求得的各个参数的偏导数以向量的形式写出来,就是梯度。比如函数$f(x,y)$,分别对$x,y$进行求导,求得梯度向量是$(\frac{\partial f}{\partial x},\frac{\partial f}{\partial y})^T$ 简称$grad f(x,y)$ | $\Delta f(x,y)$,对于点为$(x_0,y_0)$,他的梯度向量值为$(\frac{\partial f}{\partial x_0},\frac{\partial f}{\partial y_0})^T$ | $\Delta f(x_0,y_0)$,如果为三个变量,就为:$\Delta f(x,y,z)$,以此类推。
那为什么要找到函数$f(x,y)$的梯度呢?因为梯度向量是函数下降(增加)速度最快的地方。比如说,在初始点$(x_0,y_0)$ 沿着梯度向量$\Delta f(x_0,y_0)$ (-$\Delta f(x_0,y_0)$),增加最快(下降最快)的方向 ,我们能够更快的找到函数的最小值(最大值)。
2.梯度上升与梯度下降
在机器学习背景当中,求损失函数的最小值,是非常常见的。对于梯度来说,求梯度向量给予不同的正负,就能够使得在函数上走向增加最快的方向(+)和下降最快的方向(-)。即为$f(\theta)$和$-f(\theta)$。
3.梯度下降算法详解
3.1梯度下降算法的直观解释
梯度下降算法如下图所示,从图中我们可以看出,从初始点出发,通过迭代不断的朝着下降速度最快的方向前进。但是在不同的step size (learning rate)下,他走向了不同的地方,因为函数可能有多个峰值和谷值,所以会找到不同谷底的最小值,使得最终的结果可能是局部最优。当然梯度下降算法分为:批量梯度下降算法(BGD),随机梯度下降算法(SGD)和小批量随机梯度算法(MBGD)(算法区别主要在于样本选择)。选择不同的算法,他们在运行时间和结果是否最优解上有较大的差异。(如果函数为凸函数,那么不管怎样都会有全局最优解,比如$x^2$)
3.2 梯度下降算法相关概念
由上述介绍,我们总结概念如下:
步长(learning rate): 步长决定了你梯度下降时,一次迭代你往前进方向走的长度
特征(feature): 指样本输入部分。比如2个但特征样本$(x_0,y_0)(x_1,y_1)$,则第一个样本特征为$x_0$,输出为$y_0$.
假设函数(hypothesis fuction):在监督学习中,为了拟合输入样本,而使用的假设函数,记为$h_\theta(x)$,比如对于某个单个特征的m个样本$(x^{(i)},y^{(i)}) \quad (i=1,2,3,\cdots,m)$,可以采用拟合函数如下:$h_\theta=\theta_0 + \theta_1x$.
损失函数(loss function): 为了评估模型拟合的好坏,通常用损失函数来度量拟合程度。损失函数极小化,以为这拟合度最好,对应的模型参数即为最优函数。在线性回归中,损失函数,通常为样本输出与假设函数的差的平方,即为平方误差(mse).比如m个样本$(x^{(i)},y^{(i)}) \quad (i=1,2,3,\cdots,m)$,采用线性回归,损失函数为:
$$
J(\theta_0,\theta_1) = \sum_{i=1}^m(h_\theta{(x_i)}-y_i)^2
$$
其中$x_i$表示第$i$个样本特征,$y_i$表示第$i$个样本的输出,$h_\theta(x)$为假设函数。
3.3 梯度下降详细算法
类比于最小二乘法章节。梯度下降算法我们以线性回归来进行举例,它亦有代数式和矩阵式两种求解方式,下面我们将进行分别讨论。
3.3.1. 梯度下降代数式算法
确定假设函数和损失函数
对于线性回归的假设函数为$h_\theta(x_1,x_2,…x_n)=\theta_0+\theta_1x_1+…+\theta_{n−1}x_{n−1}$,其中$x_i$为样本特征,$\theta_i$为 模型参数,同最小二乘法,我们可以令$x_0=1$,可以简化为$h_θ(x_1,x_2,…x_n)=\sum_{i=0}^{n}\theta_ix_i$,因此利用均方误差作为损失函数为
$$
J(\theta_0,\theta_1,\cdots,\theta_j) =\frac{1}{2m}\sum_{i=1}^m(h_θ(x_0^{(i)},x_1^{(i)},\cdots,x_j^{(i)}) - y^{(j)})^2=\frac{1}{2m}\sum_{i=1}^n(\sum_{j=1}^m\theta_jx_j^{(i)}-y^{(i)})^2
$$
算法参数的初始化
主要初始化模型参数$\theta_i$、终止距离$\epsilon $、步长$\alpha$和最大迭代次数max_iters.在没有先知经验下,我喜欢把数$\theta_i$初始化为0,$\epsilon $初始化为0.0001和$\alpha$初始化为0.38,max_iters初始化为1000.
3.算法过程
1)对损失函数$\theta_i$求偏导,得到梯度向量,即线性回归梯度为:
$$
\frac{\partial }{\partial \theta_i}J(\theta_0,\theta_1,\cdots,\theta_j) =\frac{1}{m}\sum_{i=1}^n(\sum_{j=1}^m\theta_jx_j^{(i)}-y^{(i)})x_j^{(i)}
$$
2)利用步长乘以损失函数梯度,得到当前位置下降的距离。
3)确定当前所有$\theta_i$下降距离是否都小于$\epsilon$,如果小于或者达到最大迭代次数结束max_iters就终止训练,即 最佳参数为当前$\theta_i$,如果没有就进行步骤4。
4) 更新每个参数$\theta_i$,更新后进入步骤1,知道满足步骤3或者达到最大迭代次数结束max_iters
$$
\theta_i=\theta_i-\alpha\frac{1}{m}\sum_{i=1}^n(\sum_{j=1}^m\theta_jx_j^{(i)}-y^{(i)})x_j^{(i)}
$$
3.3.2. 梯度下降矩阵式算法
基本思想和线性代数解法一致,只是由矩阵进行表示
1. 确定假设函数和损失函数
对于简化后的$h_\theta$可知,能够得到矩阵表达式为:
$$
h_\theta(X) = \theta X
$$
化简为矩阵损失函数 $J(θ)=\frac{1}{2}(θX−Y)^T(θX−Y)$,其中, 假设函数$h_{\theta}(X)$为mx1的向量,$\theta$为nx1的 向量,里面有n个代数法的模型参数。$X$为mxn维的矩阵。m代表样本的个数,n代表样本的特征数.
算法参数的初始化
除$\theta_i$变为矩阵向量表示,其余和上述一致
算法过程
1) 对损失函数$\theta_i$求偏导,得到梯度向量,即线性回归梯度为
~
$$
\frac{\partial }{\partial \theta}J(\theta)=X^T(\theta X-Y)
$$
2) 利用步长乘以损失函数梯度,得到当前位置下降的距离。
3)确定当前所有$\theta_i$下降距离是否都小于$\epsilon$,如果小于或者达到最大迭代次数结束max_iters就终止训练,即最佳参数为当前$\theta_i$,如果没有就进行步骤4,
4) 更新每个参数$\theta_i$,更新后进入步骤1,直到满足步骤3。
$$
\theta = \theta-\alpha X^T(\theta X-Y)
$$
3.3.3. 梯度下降算法代码实践
现在我们举一个实际的栗子。对于函数$f(x)=x^4-3x^3+2$,求导可以得到$f^\prime(x)=4x^3-9x^2$.我们令$f^\prime(x)=0$可以解出$x=\frac{9}{4}=2.25 \quad and\quad x=0$,我们需要全局最小值,所以取得$x=2.25$.下面我们通过梯度下降算法去解出$x$的值:
1 | next_x = 6 #初始化值x |
3.4 梯度下降算法调参
1.learning_rate(步长)的选择,在不同阶数函数当中,峰值与谷值高低不一,造成步长的长度一定决定是否会错过全局最优峰值,或者会在局部峰值停滞不前。所以呢?根据我的经验来说:构建模型时,我们应该把步长设置得较大一点比如0.5,这样模型会更快的收敛,这样会更快的找到模型构建是否正确。当模型完全没问题时,应该逐渐减小步长,免得错过更好的峰值。
- 初始值设定。站在不同的高度,领略不同的风景。所以需要细心调整初始值。当然在深度学习当中对初始值的设定要求会更高。
- 归一化。在线性模型当中,归一化可以使模型更快的收敛。不会各种低峰饶很久,才回收敛。最常见归一化就是特征值$(x-avg(x))/std(x)$,就是减去平均值,然后除以方差。
3.5梯度下降算法的区别
1.批量梯度下降算法(BGD)
批量梯度下降算法,直观而言。就是对全部样本的数据进行参数更新
$$
\theta_i=\theta_i-\alpha\frac{1}{m}\sum_{i=1}^n(\sum_{j=1}^m\theta_jx_j^{(i)}-y^{(i)})x_j^{(i)}
$$
2.随机梯度下降算法(SGD)
同理,随机梯度下降算法,就是随机在样本中选择一个样本进行更新参数$\theta_i$ .
3.小批量随机梯度算法(MBGD)
小批量随机梯度算法,是对前两种算法的综合。即为随机选择小批量的样本进行更新参数$\theta_i$ .