神经网络训练是一对一完成的吗?

人工智能 神经网络 深度学习 梯度下降 随机梯度下降 小批量梯度下降
2021-11-01 22:34:06

我正在尝试通过观看这一系列视频并在 Python 中实现一个简单的神经网络来学习神经网络。

这是我想知道的一件事:我正在用样本数据训练神经网络,我有 1000 个样本。训练包括逐渐改变权重和偏差以使成本函数产生更小的成本。

我的问题:我应该在继续下一个样本之前更改每个样本的权重/偏差,还是应该首先计算整个 1,000 个样本的所需变化,然后才开始将它们应用于网络?

2个回答

在继续下一个样本之前,我是否应该更改每个样本的权重/偏差?

您可以这样做,这称为随机梯度下降 (SGD),通常您会在每次处理数据集之前对数据集进行洗牌。

还是我应该首先计算整批 1,000 个样本的所需变化,然后才开始将它们应用于网络?

您可以这样做,这称为批量梯度下降,或者在某些情况下(尤其是在较旧的资源中)只是假定为正常方法并称为梯度下降。

每种方法都有优点和缺点。一般来说:

  • SGD 使每次更新在已处理的数据量方面更快。因此,在收敛到合理的值之前,您可能需要更少的时期。

  • SGD 对每个样本进行更多处理(因为它更新更频繁),因此处理每个样本需要更长的时间,因此速度也较慢。

  • SGD 可以较少地利用并行化,因为更新步骤意味着您必须连续运行每个数据项(因为权重已更改并且针对特定权重集计算错误/梯度结果)。

  • SGD 单个步骤通常只对正确的梯度进行非常粗略的猜测以改变权重。这既是缺点(NN 针对训练集上的目标的性能可以降低也可以增加)和优点(可能性较小由于这些随机差异导致的“抖动”而陷入局部静止点)。

在实践中发生的情况是,大多数软件允许您在批处理和单样本处理之间进行折衷,以尝试获得最佳性能和更新特性。这称为小批量处理,包括:

  • 在每个 epoch 开始时对数据集进行洗牌。

  • 处理混洗后的数据,每次 N 项,其中 N 可能从 10 到 1000 不等,具体取决于问题和对硬件的任何限制。一个常见的决定是处理 GPU 加速允许并行运行的最大批量大小。

  • 计算每个小批量所需的更新,然后应用它。

这是当今大多数神经网络库采用的最常见的更新方法,并且它们几乎普遍接受训练 API 中的批量大小参数。大多数库仍然会调用执行 SGD 的简单优化器;从技术上讲,确实如此,由于未使用完整批次,计算出的梯度仍然有些随机,但您可能会在一些较早的论文中发现这称为小批量梯度下降。

理想情况下,您需要通过遍历数据集中的所有样本来更新权重。这称为批量梯度下降但是,作为没有。训练样例增加,计算量变大,训练速度会很慢。随着深度学习的出现,训练规模以百万计,使用所有训练示例的计算非常不切实际且非常缓慢。

这就是,两种优化技术变得突出的地方。

  1. 小批量梯度下降
  2. 随机梯度下降 (SGD)

在小批量梯度下降中,您使用的批量大小远小于总数。训练示例并在通过这些示例后更新您的权重。

在随机梯度下降中,您在通过每个训练示例后更新权重。

来看看我们讨论的三种方法的优缺点。

  • 批量梯度下降逐渐收敛到全局最小值,但速度很慢,需要巨大的计算能力。

  • 随机梯度下降收敛速度很快,但不会收敛到全局最小值,它会收敛到接近全局最小值的某个位置,并在该点附近徘徊,但永远不会收敛到全局最小值。但是,随机梯度下降中的收敛点足以满足所有实际用途。

  • Mini-Batch 梯度是上述两种方法的折衷。但是,如果您有权重更新的矢量化实现,并且您
    正在使用多核设置进行训练或将训练提交到
    多台机器,那么无论是在训练时间还是收敛到全局最小值方面,这都是最好的方法。

您可以绘制成本函数,wrt 没有。迭代以了解所有 3 种梯度下降类型的收敛之间的差异。

  • 批量梯度下降图平稳缓慢下降并稳定并达到全局最小值。

  • 随机梯度下降图会有振荡,会快速下降,但会在全局最小值附近徘徊。

这些是一些博客,其中详细解释了每种方法的优缺点,以及成本函数如何随迭代而变化的所有三种方法的图表。

https://adventuresinmachinelearning.com/stochastic-gradient-descent/

https://machinelearningmastery.com/gentle-introduction-mini-batch-gradient-descent-configure-batch-size/