深度学习优化函数详解(1)-- Gradient Descent 梯度下降法

深度学习优化函数详解系列目录

本系列课程代码,欢迎star:
https://github.com/tsycnh/mlbasic

深度学习优化函数详解(0)-- 线性回归问题
深度学习优化函数详解(1)-- Gradient Descent 梯度下降法
深度学习优化函数详解(2)-- SGD 随机梯度下降
深度学习优化函数详解(3)-- mini-batch SGD 小批量随机梯度下降
深度学习优化函数详解(4)-- momentum 动量法
深度学习优化函数详解(5)-- Nesterov accelerated gradient (NAG)
深度学习优化函数详解(6)-- adagrad

本文延续该系列的上一篇 深度学习优化函数详解(0)-- 线性回归问题。

上一篇讲到了最基本的线性回归问题,最终就是如何优化参数 a , b a,b a,b 寻找最小的loss l o s s = 1 2 m ∑ i = 1 m ( y p , i − y i ) 2 loss=\frac{1}{2m}\sum_{i=1}^m(y_{p,i}-y_i)^2 loss=2m1i=1m(yp,iyi)2 显然loss函数是一个二次函数,问题就转化成了如何求二次函数的最小值。我们再举一个更简单的例子,假设我们要优化的函数是 y = x 2 y=x^2 y=x2,初始条件我们选择了 x 0 = 2 , y 0 = 4 x_0=2,y_0=4 x0=2,y0=4,画在图上如下:

深度学习优化函数详解(1)-- Gradient Descent 梯度下降法_第1张图片

图中红色的点就是我们的初始点,很显然,我们想要找的最终最优点是绿色的点 ( 0 , 0 ) (0,0) (0,0)
接下来我们需要对目标函数求微分 d y d x = 2 x \frac{dy}{dx}=2x dxdy=2x这就是所谓的梯度,当 x = 2 x=2 x=2 的时候,可以求得该点的梯度为4,翻译成人话就是当前这一点的’倾斜程度’是4。下面举几个例子
x|-2|-1|0|1|2|
:–|:–|:–|:–|:–|
y|4|1|0|1|4|
梯度|-4|-2|0|2|4|

和上面的图一对应就很明显了,梯度的绝对值越大,数据点所在的地方就越陡。数字为正数时,越大,表示越向右上方陡峭,反之亦然。好了,懂了什么是梯度,下面我们就来聊聊梯度下降是个什么玩意。现在我们先假设我们自己就是一个球,呆在图中的红点处,我们的目标是到绿点处,该怎么走呢?很简单,顺着坡 向下走就行了。现在球在 ( 2 , 4 ) (2,4) (2,4) 点处,这一点的倾斜程度是4,向右上方陡峭。接下来要做的就是向山下走,那么每一次走多远 呢?先小心一点,按当前倾斜程度的1%向下走。也就是 x n e w = x 0 − 0.01 ∗ 4 x_{new}=x_0-0.01*4 xnew=x00.014, x n e w = 1.96 x_{new} = 1.96 xnew=1.96 再算一下 y y y 值等于多少 y n e w = 3.8416 < 4 y_{new}=3.8416 <4 ynew=3.8416<4。小球成功的往下滚了一点,这样一直滚下去,最终就会滚到绿色的点,如下图
深度学习优化函数详解(1)-- Gradient Descent 梯度下降法_第2张图片
红色的曲线表示了小球的滚动路线

这 就是梯度下降法

转换成数学语言就是在每一次迭代按照一定的学习率 α \alpha α 沿梯度的反方向更新参数,直至收敛,公式 θ t + 1 = θ t − α d f d θ \theta_{t+1}=\theta_{t}-\alpha\frac{df}{d\theta} θt+1=θtαdθdf

接下来我们回到房价预测问题上。 y p , i = a x i + b y_{p,i}=ax_i+b yp,i=axi+b l o s s = 1 2 m ∑ i = 1 m ( y p , i − y i ) 2 {loss=\frac{1}{2m}\sum_{i=1}^m(y_{p,i}-y_i)^2 } loss=2m1i=1m(yp,iyi)2

将上面两个方程合并, 并把1/2放到右边方程
l o s s = 1 m ∑ i = 1 m 1 2 ( a x i + b − y i ) 2 {loss=\frac{1}{m}\sum_{i=1}^m\frac12(ax_i+b-y_i)^2 } loss=m1i=1m21(axi+byi)2
一共有m项累加,我们单拿出来一项来分析。
l o s s i = 1 2 ( a x i + b − y i ) 2 {loss_{i}=\frac{1}{2}(ax_i+b-y_i)^2 } lossi=21(axi+byi)2
要优化的参数有两个,分别是a和b,我们分别对他们求微分,也就是偏微分
∂ l o s s i ∂ a = ( a x i + b − y i ) x i \frac{\partial loss_{i}}{\partial a}=(ax_i+b-y_i)x_i alossi=(axi+byi)xi
∂ l o s s i ∂ b = ( a x i + b − y i ) \frac{\partial loss_{i}}{\partial b}=(ax_i+b-y_i) blossi=(axi+byi)
这里我们看到了loss函数为什么要在前面加一个1/2,目的就是在求偏微分的时候,可以把平方项中和掉,方便后面的计算。
自然地我们将每一个 ∂ l o s s i ∂ a \frac{\partial loss_{i}}{\partial a} alossi ∂ l o s s i ∂ b \frac{\partial loss_{i}}{\partial b} blossi 累加起来得到
∂ l o s s ∂ a = 1 m ∑ i = 1 m ∂ l o s s i ∂ a \frac{\partial loss}{\partial a}=\frac{1}{m}\sum_{i=1}^m\frac{\partial loss_{i}}{\partial a} aloss=m1i=1malossi
∂ l o s s ∂ b = 1 m ∑ i = 1 m ∂ l o s s i ∂ b \frac{\partial loss}{\partial b}=\frac{1}{m}\sum_{i=1}^m\frac{\partial loss_{i}}{\partial b} bloss=m1i=1mblossi

∂ l o s s ∂ a \frac{\partial loss}{\partial a} aloss 记为 ∇ a \nabla a a ∂ l o s s ∂ b \frac{\partial loss}{\partial b} bloss 记为 ∇ b \nabla b b ,分别表示loss在a、b方向的梯度, 更新参数的方法如下
a n e w = a − α ∇ a a_{new}=a-\alpha \nabla a anew=aαa
b n e w = b − α ∇ b b_{new}=b-\alpha \nabla b bnew=bαb

实验

写了这么多公式,是时候直观的看一看梯度下降法是怎么一回事了。下面将绘制四幅图,分别是

  1. 在a,b的一定的取值范围内,计算所有的loss,绘制出分布图
  2. 将这张分布图拍扁,画出等高线图
  3. 绘制原始的数据折线以及依据a,b绘制预测直线
  4. 绘制在训练过程中loss的变化
    如下
    深度学习优化函数详解(1)-- Gradient Descent 梯度下降法_第3张图片

我们看到图1和之前二次函数的那个例子很像,只不过是在三维空间内的一个曲面,初始的参数选择 a = 15 , b = 10 a=15,b=10 a=15,b=10,可以看到图1上曲面右侧有一个浅浅的点,就是初始值了。图二是等高线图,俯视更加明显,等高线图主要是为了之后训练的过程中可视化更清晰。图三上方的绿线是根据选择的初始值绘制的,下方是真实的实验数据,可以看出差距很远,需要优化的步骤还很多。将学习率 α \alpha α 设置为0.01, 经过200次迭代,结果如下图
深度学习优化函数详解(1)-- Gradient Descent 梯度下降法_第4张图片

图一和图二都可以很直观的看到loss的减小。图三也从模型上给出了最终逼近的过程。图四可以看出下降还是很快的。
值得注意的是,不同的学习率对算法的收敛速度影响很大,下图是 α = 0.15 \alpha=0.15 α=0.15 的结果
深度学习优化函数详解(1)-- Gradient Descent 梯度下降法_第5张图片
基本在前10次迭代就快速收敛。
但是如果学习率设置的太大的话,很容易造成发散。说白了就是步子迈的太大了,一步迈到对面更高的山坡上去了,结果越迈越高,最后就不知道跑到哪里去了,如下图 ( α = 0.3 \alpha=0.3 α=0.3)
深度学习优化函数详解(1)-- Gradient Descent 梯度下降法_第6张图片
每个图请注意看坐标轴的尺度,都大的不行,一开始的画的曲面和和等高线图都变得十分小,而这也只是迭代了5步而已。

所以机器学习里面,参数的选择是个技术活,往往同一个模型,两个人调参,结果却大相径庭。

本文的源码在此 https://github.com/tsycnh/mlbasic/blob/master/p1 gradient descent.py

你可能感兴趣的:(深度学习,深度学习优化函数详解)