在上一篇 神经网络的Python实现(一)了解神经网络 中,我们简单介绍了感知机模型和多层网络的基础结构。在这篇博文中,我们将使用python-numpy库搭建多层神经网络模型、介绍和实现BP算法。理论部分有部分参考。
更好的阅读效果,欢迎前往我的个人博客地址
全连接网络
首先,简单介绍一下全连接网络(Fully-Connected Network),即在多层神经网络中,第 n n n 层的每个神经元都分别与第 n − 1 n-1 n−1 层的神经元相互连接。如下图便是一个简单的全连接网络:
我们使用圆圈来表示神经网络的输入,标上 + 1 +1 +1 的圆圈被称为偏置节点,也就是截距项。神经网络最左边的一层叫做输入层,最右的一层叫做输出层(上图中,输出层只有一个节点)。中间所有节点组成的一层叫做隐藏层,因为我们不能在训练样本集中观测到它们的值。同时可以看到,以上神经网络的例子中有3个输入单元(偏置单元不计在内),3个隐藏单元及一个输出单元。
我们用 n l n_l nl 来表示网络的层数,上图例子中 n l = 3 n_l=3 nl=3 ,我们将第 $ l $ 层记为 L l L_l Ll ,于是 L 1 L_1 L1 是输入层,输出层是 L n l L_{n_l} Lnl 。本例神经网络有参数 ( W , b ) = ( W ( 1 ) , b ( 1 ) , W ( 2 ) , b ( 2 ) ) (W,b) = (W^{(1)}, b^{(1)}, W^{(2)}, b^{(2)}) (W,b)=(W(1),b(1),W(2),b(2)) ,其中 W i j ( l ) W^{(l)}_{ij} Wij(l) 是第 l l l 层第 j j j 单元与第 l + 1 l+1 l+1 层第 i i i 单元之间的联接参数(其实就是连接线上的权重,注意标号顺序), b i ( l ) b^{(l)}_i bi(l) 是第 l + 1 l+1 l+1 层第 i i i 单元的偏置项。因此在本例中, W ( 1 ) ∈ ℜ 3 × 3 W^{(1)} \in \Re^{3\times 3} W(1)∈ℜ3×3 , W ( 2 ) ∈ ℜ 1 × 3 W^{(2)} \in \Re^{1\times 3} W(2)∈ℜ1×3 。注意,没有其他单元连向偏置单元(即偏置单元没有输入),因为它们总是输出 + 1 +1 +1。同时,我们用 s l s_l sl 表示第 l l l 层的节点数(偏置单元不计在内)。
接下来详细介绍神经网络的前向和反向的计算过程。
前向传播
我们用 a i ( l ) a^{(l)}_i ai(l) 表示第 l l l 层第 i i i 单元的激活值(输出值)。当 l = 1 l=1 l=1 时, a i ( 1 ) = x i a^{(1)}_i = x_i ai(1)=xi ,也就是第 i i i 个输入值(输入值的第 i i i 个特征)。对于给定参数集合 W , b W,b W,b ,我们的神经网络就可以按照函数 h W , b ( x ) h_{W,b}(x) hW,b(x) 来计算输出结果。本例神经网络的计算步骤如下:
a 1 ( 2 ) = f ( W 11 ( 1 ) x 1 + W 12 ( 1 ) x 2 + W 13 ( 1 ) x 3 + b 1 ( 1 ) ) a 2 ( 2 ) = f ( W 21 ( 1 ) x 1 + W 22 ( 1 ) x 2 + W 23 ( 1 ) x 3 + b 2 ( 1 ) ) a 3 ( 2 ) = f ( W 31 ( 1 ) x 1 + W 32 ( 1 ) x 2 + W 33 ( 1 ) x 3 + b 3 ( 1 ) ) h W , b ( x ) = a 1 ( 3 ) = f ( W 11 ( 2 ) a 1 ( 2 ) + W 12 ( 2 ) a 2 ( 2 ) + W 13 ( 2 ) a 3 ( 2 ) + b 1 ( 2 ) ) \begin{aligned} a_1^{(2)} &= f(W_{11}^{(1)}x_1 + W_{12}^{(1)} x_2 + W_{13}^{(1)} x_3 + b_1^{(1)}) \\ a_2^{(2)} &= f(W_{21}^{(1)}x_1 + W_{22}^{(1)} x_2 + W_{23}^{(1)} x_3 + b_2^{(1)}) \\ a_3^{(2)} &= f(W_{31}^{(1)}x_1 + W_{32}^{(1)} x_2 + W_{33}^{(1)} x_3 + b_3^{(1)}) \\ h_{W,b}(x) &= a_1^{(3)} = f(W_{11}^{(2)}a_1^{(2)} + W_{12}^{(2)} a_2^{(2)} + W_{13}^{(2)} a_3^{(2)} + b_1^{(2)}) \end{aligned} a1(2)a2(2)a3(2)hW,b(x)=f(W11(1)x1+W12(1)x2+W13(1)x3+b1(1))=f(W21(1)x1+W22(1)x2+W23(1)x3+b2(1))=f(W31(1)x1+W32(1)x2+W33(1)x3+b3(1))=a1(3)=f(W11(2)a1(2)+W12(2)a2(2)+W13(2)a3(2)+b1(2))
我们用 z i ( l ) z^{(l)}_i zi(l) 表示第 l l l 层第 i i i 单元输入加权和(包括偏置单元),比如, z i ( 2 ) = ∑ j = 1 n W i j ( 1 ) x j + b i ( 1 ) z_i^{(2)} = \sum_{j=1}^n W^{(1)}_{ij} x_j + b^{(1)}_i z