反向传播算法推导例子

431 阅读4分钟

好的,我来给您举一个简单的例子来说明反向传播算法的具体步骤。

假设我们有一个三层的全连接神经网络,其中输入层有两个节点,隐藏层有三个节点,输出层有一个节点。网络的参数由权重矩阵 W1W_1W2W_2 组成,偏置向量由 b1b_1b2b_2 组成。

我们使用一个样本 (x,y)(x,y),其中输入 x=[1,2]x = [1, 2],标签 y=1y = 1。损失函数使用平方误差函数。

首先,进行正向传播计算,得到输出 y^\hat{y}

z1=xW1+b1h1=σ(z1)z2=h1W2+b2y=σ(z2)z1=xW1+b1h1=σ(z1)z2=h1W2+b2y=σ(z2)z1=x⋅W1+b1h1=σ(z1)z2=h1⋅W2+b2y^=σ(z2)z1​=x⋅W1​+b1​h1​=σ(z1​)z2​=h1​⋅W2​+b2​y^​=σ(z2​)

其中,σ\sigma 表示 sigmoid 函数。

然后,计算输出层的误差:

δ2=(yy)σ(z2)δ2=(y^−y)⊙σ′(z2) δ2=(yy)σ(z2)δ2​=(y^​−y)⊙σ′(z2​)

其中,\odot 表示向量的点积,σ\sigma' 表示 sigmoid 函数的导数。

接下来,计算隐藏层的误差:

δ1=(δ2W2)σ(z1)δ1=(δ2W2⊤​)σ(z1)δ1=(δ2⋅W2⊤)⊙σ′(z1)δ1​=(δ2​⋅W2⊤​)⊙σ′(z1​)

其中,W2W_2^\top 表示 W2W_2 的转置。

现在,我们可以计算参数的梯度了。对于输出层的参数,梯度为:

LW2=h1δ2Lb2=δ2W2L=h1⊤​δ2b2L=δ2∂L∂W2=h1⊤⋅δ2∂L∂b2=δ2∂W2​∂L​=h1⊤​⋅δ2​∂b2​∂L​=δ2​

对于隐藏层的参数,梯度为:

LW1=xδ1Lb1=δ1W1L=xδ1b1L=δ1∂L∂W1=x⊤⋅δ1∂L∂b1=δ1∂W1​∂L​=x⊤⋅δ1​∂b1​∂L​=δ1​

其中,LL 表示损失函数的值。

最后,使用梯度下降算法更新参数:

W1=W1αLW1W_1 = W_1 - \alpha \cdot \frac{\partial L}{\partial W_1}

b1=b1αLb1b_1 = b_1 - \alpha \cdot \frac{\partial L}{\partial b_1}

W2=W2αLW2W_2 = W_2 - \alpha \cdot \frac{\partial L}{\partial W_2}

其中,α\alpha 是学习率,LL 是损失函数的值,LW1\frac{\partial L}{\partial W_1}Lb1\frac{\partial L}{\partial b_1}LW2\frac{\partial L}{\partial W_2} 分别表示损失函数对 W1W_1b1b_1W2W_2 的偏导数。

————————————————————————————————————————————————————————————————————————————

好的,让我们按照你的要求重新推导一遍,假设隐藏层使用 Sigmoid 激活函数,输出层使用 Sigmoid 激活函数,公式如下:

σ(z)=11+ez\sigma(z) = \frac{1}{1+e^{-z}}

其中 zz 是输入值。

现在我们来按照步骤进行推导。

  1. 前向传播:将输入数据送入神经网络,经过一系列的计算和激活函数的处理,得到最终的输出结果。

设输入数据为 x1x_1x2x_2,隐藏层的权重为 W(1)W^{(1)},偏置为 b(1)b^{(1)},输出层的权重为 W(2)W^{(2)},偏置为 b(2)b^{(2)}。则隐藏层的输出为:

z(1)1=x1W(1)1,1+x2W2,1(1)+b(1)1z^{(1)}*1 = x_1W^{(1)}* {1,1} + x_2W^{(1)}_{2,1} + b^{(1)}*1

z(1)3=x1W(1)1,3+x2W(1)2,3+b3(1)z^{(1)}*3 = x_1W^{(1)}* {1,3} + x_2W^{(1)}* {2,3} + b^{(1)}_3

其中 Wi,j(1)W^{(1)}_{i,j} 表示隐藏层第 ii 个神经元到输入层第 jj 个神经元的权重,bi(1)b^{(1)}_i 表示隐藏层第 ii 个神经元的偏置。然后将隐藏层的输出经过 Sigmoid 激活函数处理,得到输出值:

a1(1)=σ(z1(1))a^{(1)}_1 = \sigma(z^{(1)}_1) a2(1)=σ(z2(1))a^{(1)}_2 = \sigma(z^{(1)}_2) a3(1)=σ(z3(1))a^{(1)}_3 = \sigma(z^{(1)}_3)

接下来,将隐藏层的输出经过权重 W(2)W^{(2)} 和偏置 b(2)b^{(2)} 的处理,得到输出层的输出:

z(2)=a1(1)W1(2)+a2(1)W2(2)+a3(1)W3(2)+b(2)z^{(2)} = a^{(1)}_1W^{(2)}_1 + a^{(1)}_2W^{(2)}_2 + a^{(1)}_3W^{(2)}_3 + b^{(2)}

然后将输出层的输出经过 Sigmoid 激活函数处理,得到最终的输出值:

a(2)=σ(z(2))a^{(2)} = \sigma(z^{(2)})

  1. 反向传播:计算损失函数对每个参数的导数,利用链式法则将误差从输出层反向传播到输入层,并根据误差大小对每个参数进行更新。

假设我们的目标输出为 yy,损失函数为均方误差,即: 3. 反向传播:计算损失函数对每个参数的导数,利用链式法则将误差从输出层反向传播到输入层,并根据误差大小对每个参数进行更新。

假设我们的目标输出为 yy,损失函数为均方误差,即:

L=12(ya(2))2\mathcal{L} = \frac{1}{2}(y - a^{(2)})^2

根据链式法则,我们需要计算出 LW(2)i\frac{\partial\mathcal{L}}{\partial W^{(2)}*i}Lb(2)\frac{\partial\mathcal{L}}{\partial b^{(2)}}LW(1)i,j\frac{\partial\mathcal{L}}{\partial W^{(1)}* {i,j}}Lbi(1)\frac{\partial\mathcal{L}}{\partial b^{(1)}_i}

首先,计算输出层的误差:

δ(2)=Lz(2)=(ya(2))a(2)(1a(2))\delta^{(2)} = \frac{\partial\mathcal{L}}{\partial z^{(2)}} = (y - a^{(2)})a^{(2)}(1-a^{(2)})

然后,根据输出层误差计算隐藏层的误差:

δi(1)=Lzi(1)=δ(2)Wi(2)ai(1)(1ai(1))\delta^{(1)}_i = \frac{\partial\mathcal{L}}{\partial z^{(1)}_i} = \delta^{(2)}W^{(2)}_i a^{(1)}_i(1-a^{(1)}_i)

接下来,我们可以根据误差来更新参数。对于权重 Wi(2)W^{(2)}_i 和偏置 b(2)b^{(2)},更新公式为:

Wi(2)Wi(2)+ηδ(2)ai(1)W^{(2)}_i \leftarrow W^{(2)}_i + \eta\delta^{(2)}a^{(1)}_i b(2)b(2)+ηδ(2)b^{(2)} \leftarrow b^{(2)} + \eta\delta^{(2)}

其中 η\eta 是学习率。

对于隐藏层的权重 Wi,j(1)W^{(1)}_{i,j} 和偏置 bi(1)b^{(1)}_i,更新公式为:

W(1)i,jW(1)i,j+ηδi(1)aj(0)W^{(1)} *{i,j} \leftarrow W^{(1)}* {i,j} + \eta\delta^{(1)}_ia^{(0)}_j bi(1)bi(1)+ηδi(1)b^{(1)}_i \leftarrow b^{(1)}_i + \eta\delta^{(1)}_i

其中 aj(0)a^{(0)}_j 是输入层第 jj 个神经元的输出。

这样,我们就完成了一次反向传播的过程。重复执行多次反向传播,直到损失函数收敛或达到预定的训练次数为止,就可以训练出一个较好的神经网络模型。 ———————————————————————————————————————————————————————————————————————————————— 好的,让我们来推导一下。假设输入数据为 x1x_1x2x_2,神经网络结构如下:

  • 输入层:2个节点
  • 隐藏层:3个节点
  • 输出层:1个节点

激活函数使用 sigmoid 函数。

  1. 正向传播:计算输出值 a(2)a^{(2)}

输入层的输出为 a(0)=[x1,x2]Ta^{(0)} = [x_1, x_2]^T。假设隐藏层的权重矩阵为 W(1)W^{(1)},偏置向量为 b(1)b^{(1)},输出层的权重矩阵为 W(2)W^{(2)},偏置为 b(2)b^{(2)}。则隐藏层的加权输入和输出分别为:

z(1)=W(1)a(0)+b(1)z^{(1)} = W^{(1)}a^{(0)} + b^{(1)}

a(1)=σ(z(1))a^{(1)} = \sigma(z^{(1)})

其中,σ\sigma 表示 sigmoid 函数。类似地,输出层的加权输入和输出为:

z(2)=W(2)a(1)+b(2)z^{(2)} = W^{(2)}a^{(1)} + b^{(2)}

a(2)=σ(z(2))a^{(2)} = \sigma(z^{(2)})

  1. 计算损失函数 L\mathcal{L}

假设目标输出为 yy,则损失函数可以表示为:

L=12(ya(2))2\mathcal{L} = \frac{1}{2}(y - a^{(2)})^2

  1. 反向传播:计算损失函数对每个参数的导数,利用链式法则将误差从输出层反向传播到输入层,并根据误差大小对每个参数进行更新。

根据链式法则,我们需要计算出 LW(2)i\frac{\partial\mathcal{L}}{\partial W^{(2)}*i}Lb(2)\frac{\partial\mathcal{L}}{\partial b^{(2)}}LW(1)i,j\frac{\partial\mathcal{L}}{\partial W^{(1)}* {i,j}}Lbi(1)\frac{\partial\mathcal{L}}{\partial b^{(1)}_i}

首先,计算输出层的误差:

δ(2)=Lz(2)=(ya(2))a(2)(1a(2))\delta^{(2)} = \frac{\partial\mathcal{L}}{\partial z^{(2)}} = (y - a^{(2)})a^{(2)}(1-a^{(2)})

然后,根据输出层误差计算隐藏层的误差:

δi(1)=Lzi(1)=δ(2)Wi(2)ai(1)(1ai(1))\delta^{(1)}_i = \frac{\partial\mathcal{L}}{\partial z^{(1)}_i} = \delta^{(2)}W^{(2)}_i a^{(1)}_i(1-a^{(1)}_i)

接下来,我们可以根据误差来更新参数。对于权重 Wi(2)W^{(2)}_i 和偏置 b(2)b^{(2)},更新公式为:

Wi(2)Wi(2)+ηδ(2)ai(1)W^{(2)}_i \leftarrow W^{(2)}_i + \eta\delta^{(2)}a^{(1)}_i 对于偏置 b(2)b^{(2)},更新公式为:

b(2)b(2)+ηδ(2)b^{(2)} \leftarrow b^{(2)} + \eta\delta^{(2)}

其中,η\eta 表示学习率。

接下来,对于隐藏层的权重 Wi,j(1)W^{(1)}_{i,j} 和偏置 bi(1)b^{(1)}_i,更新公式为:

W(1)i,jW(1)i,j+ηδj(1)ai(0)W^{(1)} *{i,j} \leftarrow W^{(1)}* {i,j} + \eta\delta^{(1)}_ja^{(0)}_i

bi(1)bi(1)+ηδi(1)b^{(1)}_i \leftarrow b^{(1)}_i + \eta\delta^{(1)}_i

最后,重复以上过程,反复进行正向传播和反向传播,直到训练收敛或达到预设的迭代次数。