随机梯度下降_Batch、Mini-batch和随机梯度下降Python示例

本文详细介绍了梯度下降的三种类型:Batch梯度下降、Mini-batch梯度下降和随机梯度下降,包括它们的工作原理、优缺点和在深度学习中的应用。重点讨论了如何在实际代码中实现这些方法,以帮助选择适合不同场景的优化算法。
摘要由CSDN通过智能技术生成

在研究机器学习和深度学习时出现的主要问题之一是梯度下降的几种类型。在梯度下降的三种类型(Batch梯度下降、Mini-batch梯度下降和随机梯度下降)中,我应该使用哪一种呢?在这篇文章中,我们将了解这些概念之间的区别,并从梯度下降的代码实现来阐明这些方法。

梯度下降

梯度下降是帮助神经网络获得正确的权重值和偏差值的最常见算法之一。梯度下降法(GD)是在每一步中最小化成本函数J(W,b)的一种算法。它迭代地更新权重和偏差,以尝试在成本函数中达到全局最小值。

fd47c0ae2678aedcc97233a95299bbac.png

最小化成本函数,梯度下降图

在我们计算GD之前,首先获取输入并通过神经网络的所有节点,然后计算输入、权重和偏差的加权和。这是计算梯度下降的主要步骤之一,称为正向传播。一旦我们有了一个输出,我们将这个输出与预期的输出进行比较,并计算出它们之间的距离,即误差。有了这个误差,我们现在可以反向传播它,更新每个权重和偏差,并尝试最小化这个误差。正如你所预料的,这部分被称为反向传播。反向传播步骤是使用导数计算得出的,并返回“梯度”,这个值告诉我们应遵循哪个方向以最小化成本函数。

现在我们准备更新权重矩阵W和偏差向量b了。梯度下降规则如下:

307fe049a301461826bba785602645e2.png

换句话说,新的权重/偏差值将是最后一个减去梯度的值,使其接近成本函数的全局最小值。我们还将这个梯度乘以一个学习率,它控制着步长。

这种经典的梯度下降法也称为Batch梯度下降法。在这种方法中,每个epoch遍历所有训练数据,然后计算损失并更新W和b值。该方法虽然具有稳定的收敛性和误差,但是该方法使用了整个机器学习训练集,因此,对于大型机器学习数据集来说会非常慢。

Mini-batch梯度下降

想象一下,将您的数据集分成几个batches。这样,它就不必等到算法遍历整个数据集后才更新权重和偏差,而是在每个所谓的Mini-batch结束时进行更新。这使得我们能够快速将成本函数移至全局最小值,并在每个epoch中多次更新权重和偏差。最常见的Mini-batch大小是16、32、64、128、256和512。大多数项目使用Mini-batch梯度下降,因为它在较大的机器学习数据集中速度更快。

X = data_inputY = labelsparameters = initialize_parameters(layers_dims)for i in range(0, num_iterations):minibatches = random_mini_batches(X, Y, mini_batch_size)        for minibatch in minibatches:            # Select a minibatch    (minibatch_X, minibatch_Y) = minibatch    # Forward propagation    a, caches = forward_propagation(X, parameters)    # Compute cost.    cost += compute_cost(a, Y)    # Backward propagation.    grads = backward_propagation(a, caches, parameters)    # Update parameters.    parameters = update_parameters(parameters, grads)

Batch梯度下降

如前所述,在此梯度下降中,每个Batch等于整个数据集。

5f3bbff1b0404f9230f680c33931e786.png

其中{1}表示Mini-batch中的第一批次。缺点是每次迭代花费的时间太长。此方法可用于训练少于2000个样本的机器学习数据集。

X = data_inputY = labelsparameters = initialize_parameters(layers_dims)for i in range(0, num_iterations):    # Forward propagation    a, caches = forward_propagation(X, parameters)    # Compute cost.    cost += compute_cost(a, Y)    # Backward propagation.    grads = backward_propagation(a, caches, parameters)    # Update parameters.    parameters = update_parameters(parameters, grads)

随机梯度下降

在这种方法中,每个batch等于训练集中的一个实例。

1b62f7b682441017e835b89788b903de.png

其中(1)表示第一个训练实例。这里的缺点是它失去了向量化的优势,有更多的振荡但收敛得更快。

X = data_inputY = labelsparameters = initialize_parameters(layers_dims)for i in range(0, num_iterations):    for j in range(0, m):        # Forward propagation        a, caches = forward_propagation(X[:,j], parameters)        # Compute cost        cost += compute_cost(a, Y[:,j])        # Backward propagation        grads = backward_propagation(a, caches, parameters)        # Update parameters.        parameters = update_parameters(parameters, grads)

最后

理解这些优化算法之间的区别是很重要的,因为它们构成了神经网络的关键功能。综上所述,Batch梯度下降虽然比随机梯度下降具有更高的准确度,但是随机梯度下降的速度更快。Mini-batch梯度下降很好的结合了两者,从而提供了良好的准确性和性能。

110a0e46553c78fcea2653fe46593824.png

Batch vs Stochastic vs Mini-batch Gradient Descent

可以仅使用Mini-batch梯度下降代码来实现所有版本的梯度下降,对于随机梯度下降可以将mini_batch_size设置为1,对于Batch梯度下降可以将mini_batch_size设置为数据集中的实例数。因此,Batch、Mini-batch和随机梯度下降之间的主要区别是每个epoch使用的实例数以及达到成本函数的全局最小值所需的时间。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值