Python训练神经网络,我们现在将学习如何训练神经网络。我们还将学习 Python 深度学习中的反向传播算法和反向传递。
我们必须找到神经网络权重的最佳值以获得所需的输出。为了训练神经网络,我们使用迭代梯度下降法。我们最初从权重的随机初始化开始。随机初始化后,我们通过前向传播过程对数据的某些子集进行预测,计算相应的成本函数 C,并以与 dC/dw 成正比的量更新每个权重 w,即成本函数的导数 wrt重量。比例常数称为学习率。
可以使用反向传播算法有效地计算梯度。反向传播或反向传播的关键观察是,由于微分的链式法则,神经网络中每个神经元的梯度可以使用神经元处的梯度来计算,它具有向外的边缘。因此,我们向后计算梯度,即首先计算输出层的梯度,然后是最顶层的隐藏层,然后是前面的隐藏层,依此类推,直到输入层结束。
反向传播算法主要是利用计算图的思想实现的,其中每个神经元扩展到计算图中的许多节点,并执行简单的数学运算,如加法、乘法。计算图在边上没有任何权重;所有权重都分配给节点,因此权重成为它们自己的节点。然后在计算图上运行反向传播算法。一旦计算完成,只需要更新权重节点的梯度。其余的梯度可以被丢弃。
梯度下降优化技术
一种常用的优化函数根据权重引起的误差调整权重,称为“梯度下降”。
梯度是斜率的另一个名称,在 xy 图上,斜率表示两个变量如何相互关联:运行中的上升、距离随时间变化的变化等。在这种情况下,斜率是网络误差与单个权重之间的比率;即,随着权重的变化,误差如何变化。
更准确地说,我们想找出哪个权重产生的误差最小。我们想要找到正确表示输入数据中包含的信号的权重,并将它们转换为正确的分类。
随着神经网络的学习,它会慢慢调整许多权重,以便它们可以将信号正确映射到含义。网络误差与每个权重之间的比率是一个导数 dE/dw,它计算权重的轻微变化导致误差轻微变化的程度。
每个权重只是涉及许多转换的深度网络中的一个因素;权重信号通过激活并在几层上求和,因此我们使用微积分的链式法则通过网络激活和输出进行反向计算。这导致我们得出所讨论的权重及其与整体误差的关系。
给定两个变量,误差和权重,由第三个变量activation调节,权重通过该变量传递。我们可以通过首先计算激活的变化如何影响误差的变化,以及权重的变化如何影响激活的变化来计算权重的变化如何影响误差的变化。
深度学习的基本思想无非就是:根据模型产生的误差调整模型的权重,直到不能再减少误差为止。
如果梯度值小,深度网络训练缓慢,如果梯度值高,则训练速度快。训练中的任何不准确都会导致不准确的输出。从输出到输入训练网络的过程称为反向传播或反向传播。我们知道前向传播是从输入开始,向前进行的。Back prop 做反向/反向计算从右到左的梯度。
每次我们计算梯度时,我们都会使用到该点之前的所有梯度。
让我们从输出层的一个节点开始。边缘使用该节点处的梯度。当我们回到隐藏层时,它变得更加复杂。0 和 1 之间的两个数字的乘积给你一个较小的数字。梯度值不断变小,结果反向传播花费大量时间进行训练,准确性受到影响。
深度学习算法的挑战
浅层神经网络和深层神经网络都存在一定的挑战,例如过度拟合和计算时间。DNN 会受到过度拟合的影响,因为使用了额外的抽象层,这使得它们能够对训练数据中的罕见依赖项进行建模。
在训练期间应用诸如退出、提前停止、数据增强、迁移学习等正则化方法来对抗过度拟合。Drop out regularization 在训练期间随机忽略隐藏层中的单元,这有助于避免罕见的依赖性。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 个像素。我们在不同的方向上应用了许多不同的偏移,从而产生了比原始数据集大很多倍的扩充数据集。
迁移学习
采用预训练模型并使用我们自己的数据集“微调”模型的过程称为迁移学习。有几种方法可以做到这一点。下面描述了几种方法 –
- 我们在大型数据集上训练预训练模型。然后,我们删除网络的最后一层,并用一个具有随机权重的新层替换它。
- 然后我们冻结所有其他层的权重并正常训练网络。这里冻结层并没有改变梯度下降或优化期间的权重。
这背后的概念是预训练模型将充当特征提取器,并且只有最后一层将在当前任务上进行训练。