Python深度学习 训练一个神经网络

Python深度学习 训练一个神经网络

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

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

梯度可以通过反向传播算法有效计算。反向传播或反向传播的关键观察点是,由于微分的连锁规则,神经网络中每个神经元的梯度都可以用它的出边神经元的梯度来计算。因此,我们向后计算梯度,即首先计算输出层的梯度,然后是最上面的隐藏层,接着是前面的隐藏层,以此类推,最后是输入层。

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

梯度下降优化技术

一个常用的优化函数,根据权重造成的误差来调整权重,被称为 “梯度下降”。

梯度是斜率的另一个名字,而斜率在X-Y图上表示两个变量之间的关系:上升大于运行,距离的变化大于时间的变化,等等。在这种情况下,斜率是网络的误差与单一权重之间的比率;也就是说,随着权重的变化,误差是如何变化的。

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

随着神经网络的学习,它慢慢地调整许多权重,使它们能够正确地将信号映射为意义。网络误差和每个权重之间的比率是一个导数,即dE/dw,它计算了一个权重的轻微变化导致误差的轻微变化的程度。

每个权重只是涉及许多变换的深度网络中的一个因素;权重的信号通过激活和几层的总和,所以我们使用微积分的连锁规则,通过网络的激活和输出进行回溯。这使我们看到了有关的权重,以及它与整体误差的关系。

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

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

如果梯度值小,深度网的训练速度就慢,如果梯度值高,训练速度就快。训练中的任何不准确都会导致不准确的输出。从输出到输入的训练网的过程被称为反向传播或反向推进。我们知道,正向传播从输入开始,然后向前工作。反向传播则相反,从右到左计算梯度。

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

让我们从输出层的一个节点开始。边缘使用该节点的梯度。当我们回到隐藏层时,它变得更加复杂。0和1之间的两个数字的乘积给你一个更小的数字。梯度值不断变小,因此,后面的道具需要大量的时间来训练,准确性也受到影响。

深度学习算法的挑战

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

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

Dropout

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

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

用深度学习的先驱之一Geoffrey Hinton的话来说,”如果你有一个深度神经网络,而且它没有过度拟合,你可能应该使用一个更大的网络,并使用dropout”。

剔除是一种技术,在梯度下降的每个迭代过程中,我们会剔除一组随机选择的节点。这意味着我们随机地忽略一些节点,就像它们不存在一样。

每个神经元被保留的概率为q,被随机丢弃的概率为1-q。对于神经网络中的每一层,q值可能是不同的。隐蔽层的值为0.5,输入层的值为0,在广泛的任务中都能很好地工作。

在评估和预测的过程中,不使用辍学。每个神经元的输出都乘以q,以便下一层的输入具有相同的预期值。

Dropout背后的想法如下 – 在没有Dropout正则化的神经网络中,神经元之间会产生共同的依赖性,从而导致过拟合。

实现技巧

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

早期停止

我们使用一种叫做梯度下降的迭代算法来训练神经网络。

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

数据扩增

在这个过程中,我们通过使用现有的数据并对其进行一些转换,来增加我们所拥有的数据量或增强它。所用的具体转换取决于我们打算实现的任务。此外,帮助神经网的转换也取决于其架构。

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

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

转移学习

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

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

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

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

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程