📜  训练神经网络

📅  最后修改于: 2020-12-13 14:26:38             🧑  作者: Mango


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

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

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

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

梯度下降优化技术

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

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

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

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

在涉及许多转换的深度网络中,每个权重只是一个因素。权重的信号通过激活并在多个层上求和,因此我们使用演算的链式规则通过网络激活和输出进行反算,这导致了我们所讨论的权重及其与整体误差的关系。

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

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

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

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

让我们从输出层的一个节点开始。边缘在该节点处使用渐变。当我们回到隐藏层时,它变得更加复杂。 0到1之间的两个数字的乘积为您提供较小的数字。梯度值会越来越小,结果是反向支撑要花费很多时间来训练,并且精度会受到影响。

深度学习算法的挑战

浅层神经网络和深层神经网络都面临某些挑战,例如过度拟合和计算时间。 DNN受过度拟合的影响,因为使用了添加的抽象层,这使它们可以对训练数据中的稀有依赖性进行建模。

在训练过程中采用了正规化方法,例如辍学,提早停止,数据扩充,转移学习,以对抗过度拟合。在训练过程中,放弃正规化会从隐藏层中随机删除单位,这有助于避免罕见的依赖关系。 DNN考虑了几个训练参数,例如大小,即层数和每层单元数,学习率和初始权重。由于时间和计算资源的高昂成本,寻找最佳参数并不总是可行的。批处理之类的一些技巧可以加快计算速度。 GPU的强大处理能力极大地帮助了训练过程,因为所需的矩阵和矢量计算可以在GPU上很好地执行。

退出

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

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

用深度学习的先驱之一杰弗里·欣顿(Geoffrey Hinton)的话来说,“如果您拥有一个深层的神经网络并且没有过度拟合,那么您可能应该使用更大的网络并使用辍学功能”。

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

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

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

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

实施技巧

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

提前停止

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

尽早停止的想法很直观。当错误开始增加时,我们将停止训练。在这里,误差是指在验证数据上测得的误差,该数据是用于调整超参数的训练数据的一部分。在这种情况下,超参数是停止条件。

数据扩充

我们使用现有数据并对其进行一些转换来增加或增加所拥有数据量的过程。使用的确切转换取决于我们要完成的任务。此外,帮助神经网络的转换取决于其体系结构。

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

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

转移学习

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

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

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

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