Python深度学习 训练神经网络


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

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

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

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

梯度下降优化技术


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

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

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

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

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

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

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

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

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

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

深度学习算法的挑战


浅层神经网络和深层神经网络都存在某些挑战,例如过拟合和计算时间。 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 个像素。我们在不同方向上应用了许多不同的移位,从而产生了一个比原始数据集大很多倍的增强数据集。

迁移学习


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

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

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

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