梯度下降法

方向导数与梯度

导数

我们都知道, 可以利用函数的导数来描绘函数在某一点处的变化率。比如$f(x) = x^2$的导数${f}’(x) = 2x$,当$x_1 = 2$时,${f}’(x_1) = 4$,也就是说函数$f(x)$在$x_1$处的瞬时变化率为$4$。

方向导数

方向导数是指在函数定义域的内点,对某一方向求导得到的导数。一元函数似乎没法朝着除了$x$轴以外的方向求导数,但是对于多元函数来说,这是可行的。

设$z = f(x, y); \quad {(x,y)\in D}; \quad {M_0(x_0,y_0) \in D}$。过点$M_0$做射线$l$,射线 $l$ 上有一点$M’_0(x_0+\delta x,y_0+\delta y)$。

则可以得出:

看起来需要走过长度$\rho$来实现函数的变化$\Delta z$。

当$\delta x,\delta y \rightarrow 0$时,可以将${lim{\rho \to 0}}{\frac{\Delta z}{\rho}}$看作$z = f(x, y)$在$M_0$处沿方向$l$的瞬时变化率,也称函数$z$在点$M_0$处沿方向$l$的方向导数,用$\frac{\partial z}{\partial l}|{M_0}$来表示。

在直角坐标系中,方向导数由下面定理给出计算公式:

若函数$u = f (x, y, z)$ 在点$M_0$处可微, $cos \alpha, cos\beta,cos\gamma$为直线$l$的方向余弦(即$\alpha, \beta, \gamma$分别为为$l$与$x, y, z$轴的夹角),则函数$u$在点$M_0$处沿方向$l$的方向导数必存在,且满足

梯度

将上面的公式用向量的形式来表示:

其中$\begin{pmatrix}
cos\alpha & cos\beta & cos \gamma
\end{pmatrix}$为单位向量,模长为$1$,$\theta$为向量$\begin{pmatrix}
\frac{\partial u}{\partial x} &\frac{\partial u}{\partial y} &\frac{\partial u}{\partial z}
\end{pmatrix}|_{M_0}$与射线$l$的夹角

令:$\sqrt{(\frac{\partial u}{\partial x})^2+(\frac{\partial u}{\partial y})^2+(\frac{\partial u}{\partial z})^2} = t$ ,则:

由上式可知:当$\theta$越小时,方向导数越大,我们将$\begin{pmatrix}
\frac{\partial u}{\partial x} &\frac{\partial u}{\partial y} &\frac{\partial u}{\partial z}
\end{pmatrix}|{M_0}$称为函数$u$在$M_0$点处的梯度,记作$\nabla u(x,y,z)|{M_0}$。则$l$方向与梯度方向越接近,$M_0$点处的方向导数越大。

关于单位向量$\begin{pmatrix}
cos\alpha & cos\beta & cos \gamma
\end{pmatrix}$:

设$\vec {e}$为三维向量$\vec a=\begin{pmatrix}x&y&z\end{pmatrix}$的单位向量,则$\vec e=\begin{pmatrix}\frac{x}{|a|}&\frac{y}{|a|}&\frac{z}{|a|}\end{pmatrix}=\begin{pmatrix}
cos\alpha & cos\beta & cos \gamma
\end{pmatrix}$

梯度下降法(Gradient Descent)

单变量线性回归

让我们通过一个预测住房价格例子来开始:已知的住房面积和住房价格的数据集如下:

$Size~in~Feet^2(x)$ $Price~in~1000’s(y)$
2104 460
1416 232
1534 315
852 178
…… ……

很显然,在这个例子中假设只有房屋的大小才能影响房屋的价格,因为只含有一个特征/输入变量,所以这种问题我们叫做单变量线性回归。如果我们要根据以上的数据集预测某一房屋的住房价格,可以不用像初高中那样用线性回归的方式来预测,而用更高级的梯度下降法来预测:

代价函数(Cost Function)

我们设$h(x) = \theta_0 + \theta_1 x$为这个问题的假设(Hypothesis),如何选择参数$\theta_0 ,\theta_1$成为我们现在需要解决的问题。所选择的参数决定了我们得到的直线相对于我们的训练集的准确程度,模型所预测的值与训练集中实际值之间的差距就是建模误差(modeling error)。

设代价函数$J(\theta_0,\theta_1)$:

我们的目标便是选择出可以使得代价函数(建模误差的平方和)能够最小的模型参数。我们将训练集带入代价函数中,绘制一个等高线图,三个坐标分别为$\theta_0$和$\theta_1$和$J(\theta_0,\theta_1)$:

如果我们能找到代价函数的最小值,我们就能得出$h(x)$的最优假设,那么这个求最小值的方法,我们叫他梯度下降法

梯度下降

梯度下降法又叫最速下降法。梯度下降背后的思想是:开始时我们随机选择一个参数的组合$(\theta_0,\theta_1,…\theta_n)$,计算代价函数,然后我们寻找下一个能让代价函数值下降最多的参数组合。我们持续这么做直到到到一个局部最小值(local minimum),因为我们并没有尝试完所有的参数组合,所以不能确定我们得到的局部最小值是否便是全局最小值(global minimum),选择不同的初始参数组合,可能会找到不同的局部最小值

单变量批量梯度下降(batch gradient descent)的算法公式为:

其中$\alpha$是学习率(learning rate),它决定了我们沿着能让代价函数下降程度最大的方向向下迈出的步子有多大;而$\frac{\partial}{\partial \theta_j}J(\theta_0,\theta_1)$决定了我们可以沿着梯度方向,以最快的效率下降。

我们在梯度下降时要注意,$\theta_0$与$\theta_1$应该同时迭代,否则下降的方向就不会沿着正确的梯度的方向下降。

将上文中的假设$ h(x)=\theta_0 + \theta_1 x$带入到梯度下降的公式中求导得:

批量梯度下降中“批量”是指在每一步梯度下降的迭代中,我们用到了所有样本(求和运算中需要带入所有样本)。因此,批量梯度下降法这个名字说明了我们需要考虑所有这一批训练样本。

当然,有时也有其他类型的梯度下降法,不是这种”批量”型的,不考虑整个的训练集,而是每次只关注训练集中的一些小的子集。

当偏导数大于$0$时,则函数趋于上升趋势,也就是说$\theta_j$需要小一点$J(\theta_0,\theta_1)$才会更小;相反地,当偏导数小于$0$时,则函数趋于下降趋势,也就是说$\theta_j$需要大一点$J(\theta_0,\theta_1)$才会更小。当偏导数越大时,$\alpha\frac{\partial J}{\partial \theta_j}$越大,下降越快,反之函数趋于平稳,下降速度变慢,最后收敛于局部最小值。

值得我们注意的一点是:如果$\alpha$(学习率)过小,结果就是只能这样像小宝宝一样一点点地挪动,去努力接近最低点,会很浪费我们梯度下降的时间与性能。但如果$\alpha$(学习率)太大,我们就会迈出很大的一步,那么梯度下降法可能会越过最低点,甚至可能无法收敛,下一次迭代又移动了一大步,又越过了最低点。直到你发现实际上离最低点越来越远。

多变量线性回归

现在,将单变量特征的房价模型增加更多的特征,比如房间卧室数量,房间楼层等,构成一个含有多个变量的多维模型模型:

Size$(x_1)$ Number of bedrooms$(x_2)$ Number of floors$(x_3)$​ Age of home$(x_4)$ Price$(y)$
2104 5 1 45 460
1416 3 2 40 232
1534 3 2 30 315
852 2 1 36 178
…… …… …… …… ……

$n~~$代表特征的数量, 在本例中,$n=4$

$x^{(i)}~~$代表第$i$个实例,是特征矩阵中的第$i$行,是一个向量,在本例中:

$x_j^{(i)}~~$代表第$i$个实例的第$j$个特征,在本例中$x_3^{(2)} = 2$

支持多变量的先行假设$h$为:

为了方便计算,引入$x0 =1$,使得$h\theta(x)$转换为:

令$\theta = \begin{pmatrix}\theta0\\theta_1\\theta_2\\dots\\theta_n\end{pmatrix}$,$X = \begin{pmatrix}x_0\x_1\x_2\\dots\x_n\end{pmatrix}$,则$h\theta(x) = \theta^TX$。

多变量梯度下降

与单变量线性回归相似,多变量线性回归也有一个代价函数$J(\theta)$:

多变量线性回归的批量梯度下降算法为:

代入到梯度下降的公式中求导得:

多项式回归

线性回归不总是可行的,我们可能需要先观察数据,然后再决定准备尝试怎样的模型,有时需要例如二次、三次模型之类的曲线来适应数据:

比如二次方模型$h\theta (x) = \theta_0+\theta_1x+\theta_2x^2$或者三次方模型$h\theta (x) = \theta_0+\theta_1x+\theta_2x^2+\theta_3 x^3$。我们可以令$x_2 = x^2,x_3=x^3$将多项式模型转化为线性回归模型。

如果我们采用多项式回归模型,在运行梯度下降算法前,特征缩放非常有必要。

特征缩放

在我们面对多维特征问题的时候,我们要保证这些特征都具有相近的尺度,这将帮助梯度下降算法更快地收敛。如果特征范围相差过大,则梯度下降法需要非常多次的迭代才能收敛。

解决的方法是尝试将所有特征的尺度都尽量缩放到$-1$到$1$之间,最简单的方法是令

其中$\mu_n$是平均值,$s_n$是标准差。

在某些将问题中,可以将特征进行人为的组合以简化模型:比如某个房价预测问题$h\theta(x)=\theta_0+\theta_1x_1+\theta_2x_2$,$x_1$为房屋的临街宽度,$x_2$为房屋的纵向深度,如果我们令$x= x_1\times x_2$来表示房屋的面积,则$h\theta(x)=\theta_0+\theta_1x$。

学习率

梯度下降算法的每次迭代受到学习率的影响,如果学习率$\alpha$过小,则达到收敛所需的迭代次数会非常高;如果学习率$\alpha$过大,每次迭代可能不会减小代价函数,可能会越过局部最小值导致无法收敛。

通常可以考虑尝试些学习率:$\alpha = 0.01,~0.03,~0.1,~0.3,~1,~3,~10$

随机梯度下降(Stochastic Gradient Descent)

如果我们有一个很大的训练集,那么每次迭代都要对他们求和,如果硬件设备不那么好就会很浪费时间。可以用随机梯度下降法(SGD)来代替批量梯度下降法。

在随机梯度下降法中,定义代价函数为一个单一训练实例的代价:

首先随机打乱样本顺序,之后对$\theta$进行迭代:

随机梯度下降算法在只用一个样本计算之后便更新参数$\theta$,直至所有样本都参与迭代1~10次。但SGD不是每一步都是朝着“正确”的方向迈出的。因此算法虽然会逐渐走向全局最小值的位置,但是可能无法站到那个最小值的那一点,而是在最小值点附近徘徊。

我们可以令学习率$\alpha$随着迭代次数的增加而减小,比如:

通过减小学习率,随着迭代次数的增加,我们不断地靠近全局最小值迫使算法收敛而非在最小值附近徘徊。 但是通常我们不需要这样做便能有非常好的效果了,对$\alpha$进行调整所耗费的计算不太值得。

小批量梯度下降(Mini-Batch Gradient Descent)

小批量梯度下降算法是介于批量梯度下降算法和随机梯度下降算法之间的算法,每计算常数$b$个训练实例,便更新一次参数$\theta$。