反向传播算法过程 什么事反向传播算法


自从机器学习被引入到递归的非线性函数中(例如人工神经 *** )以来,对相关内容的应用得到了充足的发展 。在这种情况下,训练正确的神经 *** 是建立可靠模型最重要的方面 。这种训练通常与”反向传播”一词联系在一起,这个术语对大多数新手来说是非常模糊的 。这也是本文所存在的意义 。
反向传播是神经 *** 训练的本质 。它实际上是基于在前一历元(即迭代)中获得的误差率(即损失)对神经 *** 的权重进行微调的实践 。适当的调整权重可确保较低的错误率,增加模型的适用性使模型更可靠 。
那么这个过程如何运作的呢?让我们通过例子学习!
为了使这个例子尽可能便于大家理解,我们只涉及相关概念(例如损失函数、优化函数等)而不解释它们,因为这些主题值得我们另起一篇文章进行细说 。
首先,让我们设置模型组件
想象一下,我们需要训练一个深层神经 ***。训练的目的是构建一个模型,该模型使用两个输入和三个隐藏单元执行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 。计算当前迭代的损失/成本如下:
actual_y值来自训练集,而predict_y值是我们模型产生的值 。所以这次迭代的成本是-4 。
那么反向传播在哪里呢?
根据我们的例子,我们现在有一个模型没有给出准确的预测(它给我们的值是4而不是1),这归因于它的权重尚未调整(它们都等于1) 。我们也有损失,即-4 。反向传播就是以这样一种方式向后传递这种损失,我们可以根据这种方式微调权重 。优化函数(在我们的例子中为梯度下降)将帮助我们找到权重 。那就让我们开始吧!
使用以下功能进行前馈:
然后通过这些函数的偏导数发生反向反馈 。不需要经过经过推导这些函数的过程 。我们需要知道的是,上面的函数将遵循:
其中Z是我们从前馈步骤中的激活函数计算中获得的z值,而delta是图层中单位的损失 。
我知道有很多信息一次性就能吸收,但我建议你花点时间,真正了解每一步发生了什么,然后再继续前进 。
计算增量
现在我们需要找到神经 *** 中每个单元/节点的损耗 。这是为什么呢?我们这样想,深度学习模型到达的每一次损失实际上是由所有节点累积到一个数字引起的 。因此,我们需要找出哪个节点对每层中的大部分损失负责,这样我们就可以通过赋予它更小的权重值来惩罚它,从而减少模型的总损失 。
计算每个单元的增量可能会有问题 。但是,感谢吴恩达先生,他给了我们整个事情的捷径公式:
其中delta_0,w和f’(z)的值是相同单位的值,而delta_1是加权链接另一侧的单位损失 。例如:
你可以这样想,为了获得节点的损失(例如Z0),我们将其对应的f’(z)的值乘以它在下一层(delta_1)连接的节点的损失,再乘以连接两个节点的链路的权重 。

推荐阅读