梯度是一个向量,具有大小和方向。想象我们在上山,从我所在的位置出发可以从很多方向上山,而最陡的那个方向就是梯度方向。对函数 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点沿着梯度方向最陡,也就是变化速率最快。
我们的目标是使损失函数最小化,所以我们要沿着梯度相反方向下降,这就是所谓的梯度下降。假设我们要求函数 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),重复上面的步骤,直到函数收敛,此时可认为函数取得了最小值。
在介绍实际使用的算法之前,有必要介绍下与之相关的三个概念:epoch,iteration,batch
名词 | 定义 |
---|---|
Epoch | 使用训练集的全部数据对模型进行一次完整训练,被称之为“一代训练” |
Batch | 使用训练集的一小部分样本对权重进行一次反向传播的参数更新,这一小部分样本被称为“一批数据” |
Iteration | 使用一个Batch数据对模型进行一次参数更新过程称为“一次训练” |
一个Batch包含的样本数目称为Batch_size,一般设为 2 2 2的 n n n次幂,常用的包括64,128,256。 网络较小时选用256,较大时选用64
梯度下降法算法一般有三种形式:
其实大体上都是一样的,差别就在于所用的batch_size大小不一样,由此影响了损失函数所采用的样本点的数量,从而实现不同速度和精度的梯度下降方式,随机梯度下降和batch梯度下降都是特殊的mini-batch梯度下降。