Python Deep Learning 简明教程

Training a Neural Network

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

我们必须找到神经网络权重的最佳值以获取所需的输出。为了训练神经网络,我们使用迭代梯度下降法。我们最初使用权重的随机初始化开始。在随机初始化之后,我们对数据的部分子集做出预测,采用前向传播处理,计算相应的成本函数 C,并根据与 dC/dw 成比例的量更新每个权重 w,即成本函数 w.r.t. 权重的导数。比例常数称为学习速率。

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

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

Gradient Descent Optimization Technique

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

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

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

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

每个权重只是涉及许多变换的深度网络中的一个因素;权重的信号穿过激活并对几层求和,因此我们使用微积分的链式法则来处理网络激活和输出。这将我们引向有问题的权重及其与整体误差的关系。

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

深度学习的基本思想也无非如此:根据它产生的误差调整模型的权重,直到你无法再减少误差为止。

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

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

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

Challenges in Deep Learning Algorithms

对于浅层神经网络和深层神经网络,都存在一定的挑战,例如过度拟合和计算时间。DNN 会受到过度拟合的影响,因为它们使用了额外的抽象层,使它们能够对训练数据中的稀有依赖关系进行建模。

在训练期间应用了许多方法以对抗过拟合,例如 dropout、早期停止、数据增强和迁移学习。Dropout 正则化在训练期间会随机略去隐藏层中的单元,有助于避免稀疏依赖性。DNN 考虑多种训练参数,如规模(即层数和每层单元数)、学习速率和初始权重。找到最优参数并不总实用,原因是耗费大量时间和计算资源。批处理等多种技巧可以加快计算速度。GPU 强大的处理能力极大助力于训练过程,因为 GPU 能最好地执行所需的矩阵和向量计算。

Dropout

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

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

用深度学习先驱之一 Geoffrey Hinton 的话来说:“如果您有一个深度神经网络但它没有过拟合,您可能应该使用更大一点的网络,然后使用 Dropout”。

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

每个神经元都有 q 的概率被保留,而被丢弃的概率为 1-q。q 值在神经网络中的每一层中可能不同。对于隐藏层使用 0.5 的值,对于输入层使用 0 的值可在广泛的任务中发挥良好作用。

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

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

Implementation trick

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

Early Stopping

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

早期停止背后的想法很直观;当误差开始增加时,我们停止训练。此处,误差是指在验证数据中测量的误差,验证数据是用于微调超参数的部分训练数据。在这种情况下,超参数是停止准则。

Data Augmentation

这个过程是指我们增加数据的量子,或使用现有数据并对其应用一些变换来扩充数据。具体使用的变换取决于我们打算实现的任务。此外,帮助神经网络的变换取决于其架构。

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

当计算机接受图像作为输入时,它会采用像素值数组。假设整个图像向左平移了 15 个像素。我们在不同方向上应用了许多不同的平移,从而生成一个扩充数据集,其大小是原始数据集的数倍。

Transfer Learning

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

  1. 我们对大型数据集训练经过预训练的模型。然后,我们移除网络的最后一层,并用一个具有随机权重的新层替代它。

  2. 然后,我们冻结所有其他层的权重,并正常训练网络。此处冻结层是指在梯度下降或优化过程中不更改权重。

这一概念背后的原理是:经过预训练的模型将充当特征提取器,而只有最后一层将在当前任务中接受训练。