BP网络学习笔记

反向传播是神经网络训练的本质。这是一种根据前一阶段(即迭代)获得的错误率(即损失)来微调神经网络权重的做法。权重的适当调整可确保较低的错误率,从而通过增加泛化性使模型可靠。

关于损失函数优化函数的概念可参考我的另一边文章,这里不再重复。

首先,让我们设置模型组件
想象一下,我们有一个需要训练的深层神经网络。 训练的目的是建立一个模型,该模型使用两个输入和三个隐藏的单元来执行XOR(异或)功能,从而使训练集(真值表)如下所示:
X1 | X2 | Y
0 | 0 | 0
0 | 1 | 1
1 | 0 | 1
1 | 1 | 0

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

f(a) = a

我们还需要一个假设函数,该函数确定**函数的输入是什么。
h(X) = W0.X0 + W1.X1 + W2.X2
or
h(X) = sigma(W.X) for all (W, X)

我们还选择损失函数作为逻辑回归的常用成本函数,该函数看起来有点复杂,但实际上相当简单:

BP网络学习笔记

此外,我们将使用“梯度下降”优化功能来确定我们应该朝着哪个方向调整权重,以使损失比目前的损失更低。 最后,学习率将为0.1,所有权重将初始化为1。

以上就是我们需要的各种条件。

最后, 它看起来应该像这样:

BP网络学习笔记

最左边的层是输入层X0=1, 中间的层是第一个隐藏层Z0=1,最后,输出层只有一个输出单元D0,其**值是模型的实际输出(即h(x))。

现在是时候将信息从一层转发到下一层了。 这需要通过网络中每个节点/单元执行的两个步骤:
1-使用我们前面定义的h(x)函数获得特定单位输入的加权总和。
2-将我们从步骤1中获得的值插入到**函数中 (在此示例中,f(a)= a)) ,然后使用获得的**值 (即**函数的输出) 作为所连接对象的输入特征 下一层中的节点。
请注意,单元X0,X1,X2和Z0没有任何连接到它们的单元并提供输入。 因此,上述步骤不会在那些节点中发生。 但是,对于其余节点/单元,这就是训练集中第一个输入样本在整个神经网络中的所有情况:
Unit Z1:
h(x) = W0.X0 + W1.X1 + W2.X2
= 1 . 1 + 1 . 0 + 1 . 0
= 1 = a
z = f(a) = a => z = f(1) = 1 (**函数)

其他单位也是如此:

**Unit Z2:
h(x) = W0.X0 + W1.X1 + W2.X2
= 1 . 1 + 1 . 0 + 1 . 0
= 1 = a
z = f(a) = a => z = f(1) = 1

Unit Z3:
h(x) = W0.X0 + W1.X1 + W2.X2
= 1 . 1 + 1 . 0 + 1 . 0
= 1 = a
z = f(a) = a => z = f(1) = 1

Unit D0:
h(x) = W0.Z0 + W1.Z1 + W2.Z2 + W3.Z3
= 1 . 1 + 1 . 1 + 1 . 1 + 1 . 1
= 4 = a
z = f(a) = a => z = f(4) = 4**

如前所述,最终单元(D0)的**值(z)是整个模型的**值。 因此,我们的模型为输入{0,0}的集合预测了输出1。 计算当前迭代的损失/成本如下:
Loss = actual_y - predicted_y
= 0 - 4
= -4

Actual_y值来自训练集,而predicted_y值是我们的模型得出的结果。 因此,此迭代的成本等于-4。

根据我们的示例,我们现在有一个模型,该模型无法给出准确的预测(它给我们的值是4而不是1),并且该模型归因于尚未调整其权重(它们都等于1)的事实。 。 我们也有损失,等于-4。 反向传播就是要以这种方式向后反馈这种损耗,以便我们可以基于其微调权重。 优化函数(在我们的示例中为“梯度下降”)将帮助我们找到权重,希望能够在下一次迭代中产生较小的损失。 因此,让我们开始吧!

更具**函数以及损失函数求导得出:

f’(a) = 1
J’(w) = Z . delta

其中Z只是我们从前馈步骤中的**函数计算中获得的z值,而delta是层中单位的损耗。

现在我们需要找到神经网络中每个单元/节点的损耗。深度学习模型到达的每一个损失实际上都是由所有结点累加成一个数引起的混乱。 因此,我们需要找出哪个节点造成每一层的大部分损耗,以便可以在某种意义上通过赋予其较小的权重值并因此减少模型的总损耗来对其进行。
delta_0 = w . delta_1 . f’(z)

其中值delta_0,w和f’(z)是相同单位的值,而delta_1是加权链接另一侧的单位损失。 例如:

BP网络学习笔记

可以这样想,为了得到一个节点的损失(例如Z0),我们将其对应的f’(z)的值通过连接两个节点的链接的权重乘以下一层(delta_1)所连接的节点的损失。

这正是反向传播的工作方式。 我们在每个单元上执行增量计算步骤,将损耗反向传播到神经网络中,并找出每个节点/单元负责什么损耗。

下面让我们计算出这些增量:W=weight
delta_D0 = total_loss = -4
delta_Z0 = W . delta_D0 . f’(Z0) = 1 . (-4) . 1 = -4
delta_Z1 = W . delta_D0 . f’(Z1) = 1 . (-4) . 1 = -4
delta_Z2 = W . delta_D0 . f’(Z2) = 1 . (-4) . 1 = -4
delta_Z3 = W . delta_D0 . f’(Z3) = 1 . (-4) . 1 = -4

这里有一些注意事项:

1.最终单位(即D0)的损失等于整个模型的损失。 这是因为它是输出单位,并且它的损失是所有单位加在一起的累积损失,就像我们之前所说的那样。

2.无论输入(即z)等于多少,函数f’(z)始终会给出值1。 这是因为如我们前面所说,偏导数为:f’(a)= 1 因为和**函数有关。

3.输入节点/单元(X0,X1和X2)没有增量值,因为这些节点在神经网络中没有任何控制。 它们只是作为数据集和神经网络之间的链接而存在。 这仅仅是为什么整个层通常不包括在层数中的原因。

现在剩下的就是更新神经网络中所有的权重。 这遵循“梯度下降”公式:
W := W - alpha . J’(W)
其中W是权重,alpha是学习率(在我们的示例中为0.1),而J’(W)是成本函数J(W)相对于W的偏导数。

J’(W)= Z*delta
其中Z是通过正向传播获得的Z值,而delta是加权链接另一端的单位处的损耗

BP网络学习笔记

现在,我们利用在每个步骤上获得的偏导数,对所有权重使用“梯度下降”权重更新。 值得强调的是,输入节点(X0,X1和X2)的Z值分别等于1、0、0。 1是偏置单位的值,而零实际上是来自数据集的特征输入值。 最后要注意的是,没有特定的顺序来更新权重。 只要您没有在同一迭代中两次更新任何权重的错误,就可以按照任意顺序更新它们。
为了计算新的权重,让我们在神经网络名称中给出链接:

BP网络学习笔记

W10 := W10 - alpha . Z_X0 . delta_Z1
= 1 - 0.1 . 1 . (-4) = 1.4
W20 := W20 - alpha . Z_X0 . delta_Z2
= 1 - 0.1 . 1 . (-4) = 1.4
. . . . .
. . . . .
. . . . .
W30 := 1.4
W11 := 1.4
W21 := 1.4
W31 := 1.4
W12 := 1.4
W22 := 1.4
W32 := 1.4
V00 := V00 - alpha . Z_Z0 . delta_D0
= 1 - 0.1 . 1 . (-4) = 1.4
V01 := 1.4
V02 := 1.4
V03 := 1.4

在此必须注意的是,该模型尚未正确训练,因为我们仅通过训练集中的一个样本进行反向传播。 我们对所有样本都进行一遍又一遍的处理,将产生一个精度更高的模型,以使每一步都接近最小的损失/成本。