神经网络训练
现在我们将学习如何训练神经网络。我们还将学习Python深度学习中的反向传播算法和反向传播过程。
我们必须找到神经网络权重的最佳值以获得期望的输出。为了训练神经网络,我们使用迭代梯度下降法。我们最初使用权重的随机初始化开始。随机初始化后,我们在数据的某个子集上进行前向传播过程进行预测,计算相应的代价函数C,并通过与dC/dw成比例的量更新每个权重w,即代价函数相对于权重的导数。比例常数称为学习率。
可以使用反向传播算法有效地计算梯度。反向传播或反向传播的关键观察结果是,由于微分的链式法则,神经网络中每个神经元的梯度可以使用其具有输出边的神经元的梯度来计算。因此,我们反向计算梯度,即首先计算输出层的梯度,然后计算最顶层的隐藏层,然后计算前面的隐藏层,依此类推,直到输入层。
反向传播算法主要使用计算图的概念来实现,其中每个神经元都扩展到计算图中的许多节点,并执行简单的数学运算,如加法、乘法。计算图的边上没有任何权重;所有权重都分配给节点,因此权重成为它们自己的节点。然后在计算图上运行反向传播算法。计算完成后,只需要权重节点的梯度进行更新。其余的梯度可以丢弃。
梯度下降优化技术
一个常用的优化函数根据权重造成的误差调整权重,称为“梯度下降”。
梯度是斜率的另一种说法,而斜率在x-y图上表示两个变量之间的关系:上升量除以运行量,距离变化除以时间变化等。在这种情况下,斜率是网络误差与单个权重之间的比率;即,当权重变化时,误差如何变化。
更准确地说,我们想要找到哪个权重产生最小的误差。我们想要找到正确表示输入数据中包含的信号并将其转换为正确分类的权重。
随着神经网络的学习,它会缓慢地调整许多权重,以便它们能够正确地将信号映射到含义。网络误差与这些权重中的每一个之间的比率是一个导数dE/dw,它计算权重的微小变化导致误差的微小变化的程度。
每个权重只是深度网络中的一个因素,它涉及许多转换;权重的信号通过激活并跨多个层进行求和,因此我们使用微积分的链式法则来回溯网络激活和输出。这将我们引向相关的权重及其与整体误差的关系。
假设误差和权重这两个变量由第三个变量激活(权重通过它传递)来调解。我们可以通过首先计算激活变化如何影响误差变化以及权重变化如何影响激活变化来计算权重变化如何影响误差变化。
深度学习的基本思想就是这样:根据模型产生的误差调整模型的权重,直到无法再减少误差为止。
如果梯度值较小,深度网络训练缓慢;如果梯度值较高,则训练速度快。训练中的任何不准确都会导致输出不准确。从输出到输入训练网络的过程称为反向传播或反向传播。我们知道前向传播从输入开始并向前工作。反向传播则相反,从右到左计算梯度。
每次计算梯度时,我们都会使用所有之前的梯度。
让我们从输出层的一个节点开始。边使用该节点处的梯度。当我们回到隐藏层时,它会变得更复杂。0到1之间两个数的乘积会得到一个更小的数。梯度值不断变小,结果反向传播需要大量时间来训练,并且精度会下降。
深度学习算法的挑战
浅层神经网络和深度神经网络都面临一些挑战,例如过拟合和计算时间。由于使用了额外的抽象层,DNN容易受到过拟合的影响,这些层允许它们对训练数据中的罕见依赖关系进行建模。
在训练过程中应用正则化方法,例如dropout、提前停止、数据增强、迁移学习来对抗过拟合。Dropout正则化在训练期间随机省略隐藏层中的单元,这有助于避免罕见的依赖关系。DNN考虑几个训练参数,例如大小(即层数和每层单元数)、学习率和初始权重。由于时间和计算资源成本高昂,找到最佳参数并不总是可行的。批量处理等一些技巧可以加快计算速度。GPU强大的处理能力极大地帮助了训练过程,因为所需的矩阵和向量计算在GPU上执行得很好。
Dropout
Dropout是一种流行的神经网络正则化技术。深度神经网络特别容易过拟合。
现在让我们看看什么是dropout以及它是如何工作的。
用深度学习先驱之一Geoffrey Hinton的话来说,“如果你有一个深度神经网络,它没有过拟合,你可能应该使用更大的网络并使用dropout”。
Dropout是一种技术,在梯度下降的每次迭代中,我们都会丢弃一组随机选择的节点。这意味着我们随机忽略一些节点,就好像它们不存在一样。
每个神经元以q的概率保留,并以1-q的概率随机丢弃。q值对于神经网络中的每一层可能不同。对于隐藏层为0.5,对于输入层为0的值在各种任务上效果良好。
在评估和预测过程中,不使用dropout。每个神经元的输出乘以q,以便下一层的输入具有相同的期望值。
Dropout背后的思想如下:在没有dropout正则化的神经网络中,神经元之间会发展出相互依赖关系,从而导致过拟合。
实现技巧
在TensorFlow和Pytorch等库中实现Dropout的方法是将随机选择的神经元的输出保持为0。也就是说,尽管神经元存在,但其输出被覆盖为0。
提前停止
我们使用称为梯度下降的迭代算法来训练神经网络。
提前停止背后的想法很简单:当误差开始增加时,我们停止训练。在这里,误差指的是在验证数据上测量的误差,验证数据是用于调整超参数的训练数据的一部分。在这种情况下,超参数是停止标准。
数据增强
我们增加现有数据量或通过使用现有数据并对其应用一些转换来增强它的过程。使用的确切转换取决于我们打算实现的任务。此外,帮助神经网络的转换取决于其架构。
例如,在许多计算机视觉任务(如目标分类)中,一种有效的数据增强技术是添加新的数据点,这些数据点是原始数据的裁剪或平移版本。
当计算机接受图像作为输入时,它会接收像素值数组。假设整个图像向左移动了15个像素。我们在不同的方向上应用许多不同的位移,从而产生一个比原始数据集大许多倍的增强数据集。
迁移学习
采用预训练模型并使用我们自己的数据集“微调”模型的过程称为迁移学习。有几种方法可以做到这一点。下面描述了一些方法:
我们在大型数据集上训练预训练模型。然后,我们移除网络的最后一层,并用一个具有随机权重的新层替换它。
然后,我们冻结所有其他层的权重并正常训练网络。这里的冻结层是指在梯度下降或优化过程中不改变权重。
这背后的概念是预训练模型将充当特征提取器,只有最后一层将在当前任务上进行训练。