当前位置: 首页 > 文档资料 > Python 深度学习 >

训练神经网络(Training a Neural Network)

优质
小牛编辑
136浏览
2023-12-01

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

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

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

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

梯度下降优化技术

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

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

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

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

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

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

深度学习的基本思想仅仅是:调整模型的权重以响应它产生的错误,直到你不能再减少错误为止。

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

每次我们计算一个渐变时,我们都会使用之前的所有渐变。

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

深度学习算法面临的挑战

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

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

Dropout

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

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

用深度学习的先驱之一杰弗里·辛顿(Geoffrey Hinton)的话来说,“如果你有一个深度神经网络并且它不会过度拟合,你应该使用更大的一个并使用辍学”。

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

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

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

Dropout背后的想法如下 - 在没有退出正则化的神经网络中,神经元在彼此之间产生共同依赖性,导致过度拟合。

实施技巧

通过将随机选择的神经元的输出保持为0,在诸如TensorFlow和Pytorch的库中实现丢失。即,虽然神经元存在,但其输出被覆盖为0。

提前停止

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

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

数据扩充

我们通过使用现有数据并对其应用一些转换来增加数据量或增加数据量的过程。 使用的确切转换取决于我们打算实现的任务。 而且,帮助神经网络的转换依赖于它的架构。

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

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

转学习

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

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

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

这背后的概念是预训练的模型将作为特征提取器,并且只有最后一层将被训练当前任务。