训练神经网络


我们现在将学习如何训练神经网络。我们还将学习Python深度学习中的反向传播算法和反向传递。

我们必须找到神经网络权重的最佳值才能获得所需的输出。为了训练神经网络,我们使用迭代梯度下降法。我们首先从权重的随机初始化开始。随机初始化后,我们通过前向传播过程对数据的某些子集进行预测,计算相应的成本函数 C,并按与 dC/dw 成比例的量更新每个权重 w,即成本函数相对于重量。比例常数称为学习率。

可以使用反向传播算法有效地计算梯度。反向传播或反向传播的关键观察是,由于微分的链式法则,神经网络中每个神经元的梯度可以使用神经元处的梯度来计算,它具有输出边缘。因此,我们向后计算梯度,即首先计算输出层的梯度,然后计算最顶层的隐藏层,然后是前面的隐藏层,依此类推,最后到输入层。

反向传播算法主要利用计算图的思想来实现,其中每个神经元扩展到计算图中的许多节点并执行简单的数学运算,如加法、乘法。计算图的边上没有任何权重;所有权重都分配给节点,因此权重成为它们自己的节点。然后在计算图上运行反向传播算法。计算完成后,只需要更新权重节点的梯度即可。其余的梯度可以被丢弃。

梯度下降优化技术

一种常用的优化函数根据权重引起的误差来调整权重,称为“梯度下降”。

梯度是斜率的另一个名称,在 xy 图表上,斜率表示两个变量如何相互关联:运行过程中的上升、距离随时间的变化等。在这种情况下,斜率是网络误差与单个权重之比;即,随着重量的变化,误差如何变化。

更准确地说,我们想要找到哪个权重产生的误差最小。我们希望找到正确表示输入数据中包含的信号的权重,并将其转换为正确的分类。

当神经网络学习时,它会慢慢调整许多权重,以便它们能够正确地将信号映射到含义。网络误差与每个权重之间的比率是导数 dE/dw,用于计算权重的微小变化导致误差微小变化的程度。

每个权重只是涉及许多变换的深层网络中的一个因素;权重信号经过多个层的激活和求和,因此我们使用微积分的链式法则来回溯网络激活和输出。这使我们得到了所讨论的权重及其与总体误差的关系。

给定两个变量(误差和权重),由第三个变量(激活)调节,权重通过该变量传递。我们可以通过首先计算激活的变化如何影响误差的变化,以及权重的变化如何影响激活的变化来计算权重的变化如何影响误差的变化。

深度学习的基本思想无非是:根据模型产生的误差来调整模型的权重,直到无法再减小误差为止。

如果梯度值较小,则深度网络训练缓慢;如果梯度值较高,则深度网络训练速度较快。训练中的任何不准确都会导致输出不准确。从输出到输入训练网络的过程称为反向传播或反向传播。我们知道前向传播从输入开始并向前传播。Back prop 执行反向/相反计算从右到左的渐变。

每次计算梯度时,我们都会使用到该点之前的所有梯度。

让我们从输出层的一个节点开始。边缘使用该节点处的梯度。当我们回到隐藏层时,它变得更加复杂。0 和 1 之间的两个数字的乘积会得到一个较小的数字。梯度值不断变小,因此后向支撑需要花费大量时间来训练,并且准确性会受到影响。

深度学习算法的挑战

浅层神经网络和深层神经网络都存在某些挑战,例如过度拟合和计算时间。DNN 会受到过度拟合的影响,因为使用了附加的抽象层,这使得它们能够对训练数据中罕见的依赖关系进行建模。

在训练过程中应用退出、早期停止、数据增强、迁移学习等正则化方法来对抗过度拟合。丢弃正则化在训练期间随机省略隐藏层中的单元,这有助于避免罕见的依赖关系。DNN 考虑多个训练参数,例如大小(即层数和每层单元数)、学习率和初始权重。由于时间和计算资源成本高昂,寻找最佳参数并不总是可行。批处理等一些技巧可以加快计算速度。GPU 的强大处理能力极大地帮助了训练过程,因为所需的矩阵和向量计算在 GPU 上得到了很好的执行。

辍学

Dropout 是一种流行的神经网络正则化技术。深度神经网络特别容易过度拟合。

现在让我们看看什么是 Dropout 以及它是如何工作的。

用深度学习先驱之一 Geoffrey Hinton 的话说,“如果你有一个深度神经网络并且它没有过度拟合,那么你可能应该使用更大的神经网络并使用 dropout”。

Dropout 是一种在每次梯度下降迭代期间,我们丢弃一组随机选择的节点的技术。这意味着我们随机忽略一些节点,就好像它们不存在一样。

每个神经元以 q 的概率保留,并以 1-q 的概率随机丢弃。对于神经网络中的每一层,q 值可能不同。隐藏层的值为 0.5,输入层的值为 0,适用于各种任务。

在评估和预测期间,不使用 dropout。每个神经元的输出乘以 q,以便下一层的输入具有相同的期望值。

Dropout 背后的想法如下:在没有 Dropout 正则化的神经网络中,神经元之间会产生相互依赖性,从而导致过度拟合。

实施技巧

在 TensorFlow、Pytorch 等库中,通过将随机选择的神经元的输出保持为 0 来实现 Dropout。也就是说,尽管神经元存在,但其输出会被覆盖为 0。

提前停止

我们使用称为梯度下降的迭代算法来训练神经网络。

提前停止背后的想法很直观。当误差开始增加时我们停止训练。这里,误差是指在验证数据上测量的误差,验证数据是用于调整超参数的训练数据的一部分。在这种情况下,超参数就是停止标准。

数据增强

我们增加现有数据量或通过使用现有数据并对其进行一些转换来扩充数据的过程。使用的确切转换取决于我们想要实现的任务。此外,有助于神经网络的转换取决于其架构。

例如,在许多计算机视觉任务(例如对象分类)中,有效的数据增强技术是添加新的数据点,这些数据点是原始数据的裁剪或翻译版本。

当计算机接受图像作为输入时,它会接收像素值数组。假设整个图像向左移动 15 个像素。我们在不同方向上应用许多不同的移位,从而产生了原始数据集大小的许多倍的增强数据集。

迁移学习

采用预先训练的模型并使用我们自己的数据集“微调”模型的过程称为迁移学习。有几种方法可以做到这一点。下面描述了几种方法 -

  • 我们在大型数据集上训练预训练模型。然后,我们删除网络的最后一层,并将其替换为具有随机权重的新层。

  • 然后我们冻结所有其他层的权重并正常训练网络。这里冻结层并不会改变梯度下降或优化期间的权重。

其背后的概念是预训练模型将充当特征提取器,并且只有最后一层将针对当前任务进行训练。