训练正确的神经网络是建立可靠模型最重要的方面?

点击上方关注,尽在AI中国

作者 – 阿纳斯·马斯里

自从将机器学习引入递归非线性函数(如人工神经网络)以来,相关内容的应用已经充分发展。在这种情况下,训练正确的神经网络是构建可靠模型的最重要方面。这种训练通常与术语“反向传播”相关联,这个术语对大多数新手来说非常模糊。这也是本文的意义所在。

(图片来源:)

反向传播是神经网络训练的本质。它实际上是根据上一个 epoch(即迭代)获得的错误率(即损失)微调神经网络的权重的做法。适当调整权重可以保证较低的错误率,增加模型的适用性,使模型更加可靠。

那么这个过程是如何工作的呢?让我们通过例子来学习!

为了使这个例子尽可能容易理解,我们将只介绍相关概念(如损失函数、优化函数等)而不解释它们前向和递归神经网络的区别,因为这些主题值得单独写一篇文章。

首先,让我们设置模型组件

想象一下,我们需要训练一个深度神经网络。训练的目的是建立一个模型,用两个输入和三个隐藏单元执行 XOR(异或)函数,使训练集看起来像这样:

此外,我们需要一个激活函数来确定神经网络中每个节点的激活值。为简单起见,让我们选择一个激活函数:

我们还需要一个假设函数来确定激活函数的输入是什么。这个功能是:

让我们选择一个损失函数作为逻辑回归的一般成本函数,看起来有点复杂,但实际上很简单:

此外,我们将使用批量梯度下降优化函数,该函数用于确定我们应该调整权重的方向,以获得比我们目前拥有的更低的损失。最后,学习率为0.1,所有的权重都会被初始化为1。

我们的神经网络

让我们终于画出我们一直在等待的神经网络图。它应该如下所示:

最左边的层是输入层,它将X0作为值1的偏置项,X1和X2作为输入特征。中间层是第一个隐藏层,它的偏置项Z0也取值为1。最后,输出层只有一个输出单元D0,其激活值为模型的实际输出(即h(x))。

现在我们向前传播

现在是时候将信息从一层反馈到另一层了。这需要两个步骤,遍历网络中的每个节点/单元:

1. 使用我们之前定义的 h(x) 函数来获取特定单元的输入的加权和。

2. 将我们从步骤 1 中得到的值插入到我们的激活函数中(在这种情况下为 f(a) = a),并使用我们得到的激活值(即激活函数的输出)作为连接输入特征 层中的一个节点。

请注意,单元 X0、X1、X2 和 Z0 根本没有任何单元连接到它们并提供输入。因此,上述步骤不会出现在这些节点中。然而,对于其余的节点/单元,训练集中第一个输入样本的整个神经网络如下所示:

其他单位也是如此:

如前所述前向和递归神经网络的区别,最终单元(D0)的激活值(z)是整个模型的激活值(z)。因此,我们的模型预测输入集{0,0的输出为1 }. 计算当前迭代的loss/cost如下:

actual_y值来自训练集,而predicted_y值是我们模型产生的值。所以这个迭代的成本是-4。

那么反向传播在哪里?

根据我们的示例,我们现在有一个模型没有给出准确的预测(它给我们一个值 4 而不是 1),因为它的权重没有调整(它们都等于 < @1) 。我们还有一个损失,即-4。反向传播就是将这个损失向后传递,以便我们可以据此微调权重。优化函数(在我们的例子中是梯度下降)将帮助我们找到权重。让我们开始吧!

使用以下函数进行前馈:

然后通过这些函数的偏导数发生反馈。无需经历派生这些函数的过程。我们只需要知道上面的函数将遵循:

其中 Z 是我们从前馈步骤中的激活函数计算中得到的 z 值,delta 是层中单位的损失。

我知道一口气要吸收很多信息,但我建议您花点时间真正了解每一步的情况,然后再继续。

计算增量

现在我们需要找到神经网络中每个单元/节点的损失。为什么是这样?让我们这样想,深度学习模型所达到的每一次损失实际上都是由所有节点累积到一个数字造成的。因此,我们需要找出哪一个节点对每一层的损失负责,这样我们就可以通过给它一个较小的权重值来惩罚它,从而减少模型的总损失。

计算每个单元格的增量可能是有问题的。但是感谢 Ng Enda 先生,他为我们提供了整个事情的捷径:

其中delta_0、w和f'(z)的值是同一单元内的值,delta_1是加权链路另一侧的单元损失。例如:

你可以这样想,要得到一个节点的损失(例如Z0),我们将其对应的f'(z)值乘以它在下一层连接的节点的损失( delta_1),乘以连接两个节点的链路的权重。

这正是反向传播的工作原理。我们在每个单元上执行一个增量计算步骤,将损失反向传播到神经网络中,并找出每个节点/单元的损失。

让我们计算一下这些增量!

以下是一些注意事项:

更新权重

现在剩下的就是更新神经网络中的所有权重。这遵循批量梯度下降公式:

其中 W 是手头的权重,alpha 是学习率(在我们的例子中是 0.1)),而 J'(W) 是成本函数 J(W) 的偏导数W. 同样,我们不需要做数学。所以让我们使用吴先生函数的偏导数:

其中Z是前向传播得到的Z值,delta是加权链路另一端的单位损失:

现在用我们在每一步得到的偏导数值和批梯度下降权重更新所有权重。值得强调的是,输入节点的Z值(X0、X1和X2)分别等于1、0、0。1是偏置单元的值,而0其实是特征来自数据集的输入值。最后要注意的是,更新权重没有特定的顺序。您可以按照您想要的任何顺序更新它们,只要您不会在同一迭代中错误地更新任何权重两次即可。

为了计算新的权重,让我们在神经网络名称中给出链接:

新的重量计算方法如下:

重要的是要注意模型没有经过适当的训练,因为我们只通过训练集中的一个示例进行反向传播。我们对样本做了我们所能做的一切,这可以产生一个精度更高的模型,试图在每个步骤中接近最小的损失/成本。

如果没有正确的方法,机器学习背后的理论真的很难掌握。这方面的一个例子是反向传播,其效果在大多数现实世界的深度学习应用程序中都是可以预测的。反向传播只是一种将总损失传回神经网络的方法,这样人们就可以了解每个节点的损失量,然后通过给节点更高的误差来以最小化损失的方式更新权重,反之亦然反之当然。

编译生成

原文链接:

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论