在机器学习中,我们通常会根据输入 x 来预测输出 y,预测值和真实值之间会有一定的误差,我们在训练的过程中会使用优化器(optimizer)来最小化这个误差,梯度下降法(Gradient Descent)就是一种常用的优化器
1. 什么是梯度
梯度是一个向量,具有大小和方向。想象我们在上山,从我所在的位置出发可以从很多方向上山,而最陡的那个方向就是梯度方向。对函数 f ( x 1 , x 2 , ⋯ , x n ) f(x_1, x_2, \cdots, x_n) f(x1,x2,⋯,xn)来讲,对于函数上的每一个点 P ( η 1 , η 2 , ⋯ , η n ) P(\eta_1, \eta_2, \cdots, \eta_n) P(η1,η2,⋯,ηn),我们都可以定义一个向量 { ∂ f ∂ x 1 , ∂ f ∂ x 2 , ⋯ , ∂ f ∂ x n } \displaystyle\left \{\frac{\partial f}{\partial x_1}, \frac{\partial f}{\partial x_2}, \cdots, \frac{\partial f}{\partial x_n}\right\} {∂x1∂f,∂x2∂f,⋯,∂xn∂f},这个向量被称为函数 f f f在点 P P P的梯度(gradient),记为 ∇ f ( x 1 , x 2 , ⋯ , x n ) \nabla f(x_1, x_2, \cdots, x_n) ∇f(x1,x2,⋯,xn)。函数 f f f在 P P P点沿着梯度方向最陡,也就是变化速率最快。
2. 梯度下降
我们的目标是使损失函数最小化,所以我们要沿着梯度相反方向下降,这就是所谓的梯度下降。假设我们要求函数
f
(
x
1
,
x
2
)
f(x_1,x_2)
f(x1,x2)的最小值,起始点为
x
(
1
)
=
(
x
1
(
1
)
,
x
2
(
2
)
)
\displaystyle x^{(1)}=(x^{(1)}_1, x^{(2)}_2)
x(1)=(x1(1),x2(2)),则在
x
(
1
)
x^{(1)}
x(1)点处的梯度为
∇
f
(
x
(
1
)
)
=
(
∂
f
∂
x
1
(
1
)
,
∂
f
∂
x
2
(
1
)
)
\displaystyle\nabla f(x^{(1)})=(\frac{\partial f}{\partial x_1^{(1)}}, \frac{\partial f}{\partial x^{(1)}_2})
∇f(x(1))=(∂x1(1)∂f,∂x2(1)∂f),我们可以进行第一次梯度下降来更新
x
x
x:
x
(
2
)
=
x
(
1
)
−
α
∇
f
(
x
(
1
)
)
x^{(2)} = x^{(1)} - \alpha \nabla{f(x^{(1)})}
x(2)=x(1)−α∇f(x(1))
其中,
α
\alpha
α被称为步长,在机器学习中也被称为学习率。这样我们就得到了下一个点
x
(
2
)
x^{(2)}
x(2),重复上面的步骤,直到函数收敛,此时可认为函数取得了最小值。
3. 梯度下降算法
在介绍实际使用的算法之前,有必要介绍下与之相关的三个概念:epoch,iteration,batch
名词 | 定义 |
---|---|
Epoch | 使用训练集的全部数据对模型进行一次完整训练,被称之为“一代训练” |
Batch | 使用训练集的一小部分样本对权重进行一次反向传播的参数更新,这一小部分样本被称为“一批数据” |
Iteration | 使用一个Batch数据对模型进行一次参数更新过程称为“一次训练” |
一个Batch包含的样本数目称为Batch_size,一般设为 2 2 2的 n n n次幂,常用的包括64,128,256。 网络较小时选用256,较大时选用64
梯度下降法算法一般有三种形式:
- 随机梯度下降(stochastic gradient descent)
- batch梯度下降(batch gradient descent)
- mini-batch梯度下降(mini-batch gradient descent)
其实大体上都是一样的,差别就在于所用的batch_size大小不一样,由此影响了损失函数所采用的样本点的数量,从而实现不同速度和精度的梯度下降方式,随机梯度下降和batch梯度下降都是特殊的mini-batch梯度下降。