大部分的机器学习模型里有直接或者间接地使用了梯度下降的算法。虽然不同的梯度下降算法在具体的实现细节上会稍有不同,但是主要的思想是大致一样的。梯度下降并不会涉及到太多太复杂的数学知识,只要稍微了解过微积分里导数的概念,就足够完全理解梯度下降的思想了。

梯度下降的目的

R语言梯度提升决策树实例 r语言梯度下降_R语言梯度提升决策树实例

梯度下降的原理

R语言梯度提升决策树实例 r语言梯度下降_R语言梯度提升决策树实例_02

R语言梯度提升决策树实例 r语言梯度下降_算法_03

R语言梯度提升决策树实例 r语言梯度下降_R语言梯度提升决策树实例_04

梯度下降的过程

R语言梯度提升决策树实例 r语言梯度下降_权重_05

如果用伪代码把梯度下降的过程表现出来,可以写成下面的样子:

def train(X, y, W, B, alpha, max_iters):
    '‘’
    选取所有的数据作为训练样本来执行梯度下降
    X : 训练数据集
    y : 训练数据集所对应的目标值
    W : 权重向量
    B : 偏差变量
    alpha : 学习速率
    max_iters : 梯度下降过程最大的迭代次数
   '''
   dW = 0 # 初始化权重向量的梯度累加器
   dB = 0 # 初始化偏差向量的梯度累加器
   m = X.shape[0] # 训练数据的数量
   
   # 开始梯度下降的迭代
   for i in range(max_iters): 
       dW = 0 # 重新设置权重向量的梯度累加器
       dB = 0 # 重新设置偏差向量的梯度累加器
       
       # 对所有的训练数据进行遍历
       for j in range(m):
           # 1. 遍历所有的训练数据
           # 2. 计算每个训练数据的权重向量梯度w_grad和偏差向量梯度b_grad
           # 3. 把w_grad和b_grad的值分别累加到dW和dB两个累加器里
       
       W = W - alpha * (dW / m) # 更新权重的值
       B = B - alpha * (dB / m) # 更新偏差的值

    return W, B # 返回更新后的权重和偏差。

其他常见的梯度下降算法

上面介绍的梯度下降算法里,在迭代每一次梯度下降的过程中,都对所有样本数据的梯度进行计算。虽然最终得到的梯度下降的方向较为准确,但是运算会耗费过长的时间。于是人们在上面这个算法的基础上对样本梯度的运算过程进行了改进,得到了下面这两种也较为常见的算法:

1. 小批量样本梯度下降(Mini Batch GD)

这个算法在每次梯度下降的过程中,只选取一部分的样本数据进行计算梯度,比如整体样本1/100的数据。在数据量较大的项目中,可以明显地减少梯度计算的时间。

2. 随机梯度下降(Stochastic GD)

随机梯度下降算法只随机抽取一个样本进行梯度计算,由于每次梯度下降迭代只计算一个样本的梯度,因此运算时间比小批量样本梯度下降算法还要少很多,但由于训练的数据量太小(只有一个),因此下降路径很容易受到训练数据自身噪音的影响,看起来就像醉汉走路一样,变得歪歪斜斜的。

总结

这篇文章主要讲解了梯度下降算法的作用和主要原理,给出了梯度下降算法的运算过程和伪代码实现,最后介绍了两种改进后的梯度下降算法。

参考资料

1. Gradient Descent : All You Need to Know by Suryansh S.

2. Gradient Descent by ML Cheatsheet

3. 降低损失 (Reducing Loss):梯度下降法 by google