前向传播

假设我们选择的激活函数是 σ(z)\sigma(z) ;隐藏层和输出层的输入值为 zz ,上标表示第几层,下标表示本层单元的index;隐藏层和输出层的输出值为 aa ,上标表示第几层,下标表示本层单元的index。则对于下图的三层DNN,利用和感知机一样的思路,我们可以利用上一层的输出计算下一层的输出,也就是所谓的DNN前向传播算法。

对于第二层的输出 a1(2),a2(2),a3(2)a_1^{(2)},a_2^{(2)},a_3^{(2)}ww 的下标第一个数表示当前层的index,第二个数表示前一层的index,上标 (2)(2) 代表第一层到第二层,我们有

a1(2)=σ(z1(2))=σ(w11(2)x1+w12(2)x2+w13(2)x3+b1(2))a_1^{(2)}=\sigma(z_1^{(2)})=\sigma(w^{(2)}_{11}x_1+w_{12}^{(2)}x_2+w_{13}^{(2)}x_3+b_1^{(2)})

a2(2)=σ(z1(2))=σ(w21(2)x1+w22(2)x2+w23(2)x3+b3(2))a_2^{(2)}=\sigma(z_1^{(2)})=\sigma(w^{(2)}_{21}x_1+w_{22}^{(2)}x_2+w_{23}^{(2)}x_3+b_3^{(2)})

a3(2)=σ(z1(2))=σ(w31(2)x1+w32(2)x2+w33(2)x3+b3(2))a_3^{(2)}=\sigma(z_1^{(2)})=\sigma(w^{(2)}_{31}x_1+w_{32}^{(2)}x_2+w_{33}^{(2)}x_3+b_3^{(2)})

对于第三层的输出 a1(3)a_1^{(3)} ,我们有

a1(3)=σ(z1(3))=σ(w11(3)x1+w12(3)x2+w13(3)x3+b1(3))a_1^{(3)}=\sigma(z_1^{(3)})=\sigma(w^{(3)}_{11}x_1+w_{12}^{(3)}x_2+w_{13}^{(3)}x_3+b_1^{(3)})

将上面的例子一般化,假设第 l1l-1 层共有 mm 个神经元,则对于第 ll 层的第 jj 个神经元的输出 ajla^{l}_j

aj(l)=σ(zj(l))=σ(k=1mwjk(l)ak(l1)+bj(l))a^{(l)}_j=\sigma(z^{(l)}_j)=\sigma(\sum\limits_{k=1}^mw^{(l)}_{jk}a^{(l-1)}_k+b^{(l)}_j)

可以看出,使用代数法一个个的表示输出比较复杂,而如果使用矩阵法则比较的简洁。假设第 l1l-1 层共有 mm 个神经元,而第 ll 层共有 nn 个神经元,则第 ll 层的线性系数 ww 组成了一个 n×mn\times m 的矩阵 WlW^l ,第 ll 层的偏倚 bb 组成了一个 n×1n\times 1 的向量 blb^l ,第 l1l-1 层的输出 aa 组成了一个 m×1m \times 1 的向量 a(l1)a^{(l-1)} ,第 ll 层的未激活前线性输出 zz 组成了一个 n×1n\times 1 的向量 z(l)z^{(l)} ,第 ll 层的输出 aa 组成了一个 n×1n\times 1 的向量 a(l)a^{(l)} 。则用矩阵法表示,第 ll 层的输出为:

a(l)=σ(z(l))=σ(W(l)a(l1)+b(l))a^{(l)}=\sigma(z^{(l)})=\sigma(W^{(l)}a^{(l-1)}+b^{(l)})

所谓的DNN的前向传播算法也就是利用我们的若干个权重系数矩阵 WW 和偏倚向量 bb 来和输入值向量 xx 进行一系列线性运算和激活运算,从输入层开始,一层层的向后计算,一直到输出层,得到输出结果为止。

输入:总层数 LL ,所有隐藏层和输出层对应的矩阵 WW ,偏倚向量 bb ,输入值向量 xx

输出:输出层的输出 a(L)a^{(L)}

  • (1)初始化 a(1)=xa^{(1)}=x

  • (2)for ll in (2,L)(2,L)

  • a(l)=σ(z(l))=σ(W(l)a(l1)+b(l))a^{(l)}=\sigma(z^{(l)})=\sigma(W^{(l)}a^{(l-1)}+b^{(l)})

最后结果即输出 a(L)a^{(L)}

Source

Last updated