训练神经网络

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

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

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

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

梯度下降优化技术

一种常用的优化函数根据权重造成的误差来调整权重,称为"梯度下降"。

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

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

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

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

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

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

如果梯度值较小,深度网络训练速度会很慢,如果梯度值较大,深度网络训练速度会很快。训练中的任何不准确都会导致不准确的输出。将网络从输出训练回输入的过程称为反向传播或反向传播。我们知道正向传播从输入开始并向前进行。反向传播则执行相反的操作,从右到左计算梯度。

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

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

深度学习算法中的挑战

浅层神经网络和深度神经网络都面临着某些挑战,例如过度拟合和计算时间。DNN 受到过度拟合的影响,因为使用额外的抽象层允许它们对训练数据中的罕见依赖关系进行建模。

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

Dropout

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

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

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

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

每个神经元以 q 的概率保留,以 1-q 的概率随机丢弃。神经网络中每一层的 q 值可能不同。隐藏层的值为 0.5,输入层的值为 0,这在各种任务上都很有效。

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

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

实现技巧

Dropout 在 TensorFlow 和 Pytorch 等库中实现,方法是将随机选择的神经元的输出保持为 0。也就是说,虽然神经元存在,但其输出被覆盖为 0。

提前停止

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

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

数据增强

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

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

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

迁移学习

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

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

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

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