本文主要参考文献如下:
1、吴恩达《深度学习》视频。
2、周志华. 《机器学习》3.2.清华大学出版社。
3、陈明等,《MATLAB神经网络原理与实例精解》,清华大学出版社。
这部分强烈推荐吴恩达的《深度学习》视频,讲解得非常浅显易懂。
前面介绍的Logistic回归,实际上就构成了一个神经元。如果有多个层,同时每个层有多个神经元,就形成了多层神经网络。我们这里所说的BP神经网络,实际上是多层前馈神经网络+误差反向传播算法,换句话说前者计算神经网络的输出,后者则根据估计输出与实际输出的误差,从后往前逆向更新每一层的参数。我们想从一个简单的两层BP网络入手,再推广到多层的情况。
1、2层前馈神经网络模型
我们先来考虑2层NN。我们假定输入层、隐含层和输出层的神经元个数分别为 n [ 0 ] = 3 n^{[0]}=3 n[0]=3, n [ 1 ] = 4 n^{[1]}=4 n[1]=4, n [ 2 ] = 1 n^{[2]}=1 n[2]=1,前馈NN模型如图1所示,我们从输出层向后,逐层推导其输出 y ^ \hat y y^。
(1) 单个样本
我们先来推导单个样本是BP网络的前馈输出。
- 输入层
a [ 0 ] = x = [ x 1 x 2 x 3 ] ∈ R n [ 0 ] × 1 (1) \tag{1} {\bf a}^{[0]}={\bf x}=\left[\begin{aligned}x_1\\x_2\\x_3 \end{aligned}\right]\in {\mathbb R}^{n^{[0]}\times 1} a[0]=x=⎣⎢⎡x1x2x3⎦⎥⎤∈Rn[0]×1(1) - 隐含层
W [ 1 ] = [ w 1 [ 1 ] w 2 [ 1 ] w 3 [ 1 ] w 4 [ 1 ] ] ∈ R n [ 1 ] × n [ 0 ] , b [ 1 ] = [ b 1 [ 1 ] b 2 [ 1 ] b 3 [ 1 ] b 4 [ 1 ] ] ∈ R n [ 1 ] × 1 (2) \tag{2} {\bf W}^{[1]}=\left[\begin{aligned}{\bf w}^{[1]}_1\\ {\bf w}^{[1]}_2\\ {\bf w}^{[1]}_3\\ {\bf w}^{[1]}_4 \end{aligned}\right]\in {\mathbb R}^{n^{[1]}\times n^{[0]}}, {\bf b}^{[1]}=\left[\begin{aligned}{b}^{[1]}_1\\ {b}^{[1]}_2\\ {b}^{[1]}_3\\ {b}^{[1]}_4 \end{aligned}\right]\in {\mathbb R}^{n^{[1]}\times 1} W[1]=⎣⎢⎢⎢⎢⎢⎡w1[1]w2[1]w3[1]w4[1]⎦⎥⎥⎥⎥⎥⎤∈Rn[1]×n[0],b[1]=⎣⎢⎢⎢⎢⎢⎡b1[1]b2[1]b3[1]b4[1]⎦⎥⎥⎥⎥⎥⎤∈Rn[1]×1(2)其中,每一行对应一个神经元的加权系数。显然,每个神经元会进行两步运算,第一步是线性叠加
z [ 1 ] = W [ 1 ] a [ 0 ] + b [ 1 ] ∈ R n [ 1 ] × 1 (3) \tag{3} {\bf z}^{[1]}={\bf W}^{[1]} {\bf a}^{[0]}+{\bf b}^{[1]}\in {\mathbb R}^{n^{[1]}\times 1} z[1]=W[1]a[0]+b[1]∈Rn[1]×1(3)第二步为激活函数,因此隐含层的输出为
a [ 1 ] = g ( z [ 1 ] ) (4) \tag{4} {\bf a}^{[1]}=g({\bf z}^{[1]}) a[1]=g(z[1])(4)这里的 g ( ⋅ ) g(\cdot) g(⋅)为激活函数,后面我们设其为sigmoid函数。 - 输出层
由于 n [ 2 ] = 1 n^{[2]}=1 n[2]=1,即只有一个输出,因此可以得到
W [ 2 ] = [ w 1 [ 2 ] ] ∈ R n [ 2 ] × n [ 1 ] , b [ 2 ] = [ b 1 [ 2 ] ] ∈ R n [ 2 ] × 1 (5) \tag{5} {\bf W}^{[2]}=\left[\begin{aligned}{\bf w}^{[2]}_1\\ \end{aligned}\right]\in {\mathbb R}^{n^{[2]}\times n^{[1]}}, {\bf b}^{[2]}=\left[\begin{aligned}{b}^{[2]}_1\\ \end{aligned}\right]\in {\mathbb R}^{n^{[2]}\times 1} W[2]=[w1[2]]∈Rn[2]×n[1],b[2]=[b1[2]]∈Rn[2]×1(5)同样需要两步处理,第一步
z [ 2 ] = W [ 2 ] a [ 1 ] + b [ 2 ] ∈ R n [ 2 ] × 1 (6) \tag{6} {\bf z}^{[2]}={\bf W}^{[2]} {\bf a}^{[1]}+{\bf b}^{[2]}\in {\mathbb R}^{n^{[2]}\times 1} z[2]=W[2]a[1]+b[2]∈Rn[2]×1(6)第二步输出为
a [ 2 ] = g ( z [ 2 ] ) (7) \tag{7} {\bf a}^{[2]}=g({\bf z}^{[2]}) a[2]=g(z[2])(7)因此,对于二分类问题,与Logistic回归类似,我们会将 a [ 2 ] {a}^{[2]} a[2]作为 y ^ = 1 \hat y=1 y^=1的概率进行判决。
(2) 多个样本时的矩阵表示
如果对多个样本进行批量处理,我们可以用矩阵形式运算速度会更快。下面我们考虑一共有 m m m个样本输入的情况。
- 输入层
显然输入层不再是向量,而变成矩阵。
A [ 0 ] = [ a 1 [ 0 ] , a 2 [ 0 ] , … , a m [ 0 ] ] = [ x 1 , x 2 , … , x m ] ∈ R n [ 0 ] × m (8) \tag{8} {\bf A}^{[0]}=[{\bf a}^{[0]}_1,{\bf a}^{[0]}_2,\ldots,{\bf a}^{[0]}_m]=[{\bf x}_1,{\bf x}_2,\ldots,{\bf x}_m]\in {\mathbb R}^{n^{[0]}\times m} A[0]=[a1[0],a2[0],…,am[0]]=[x1,x2,…,xm]∈Rn[0]×m(8) - 隐含层
隐含层的参数不受样本数的影响,重写如下
W [ 1 ] = [ w 1 [ 1 ] w 2 [ 1 ] w 3 [ 1 ] w 4 [ 1 ] ] ∈ R n [ 1 ] × n [ 0 ] , b [ 1 ] = [ b 1 [ 1 ] b 2 [ 1 ] b 3 [ 1 ] b 4 [ 1 ] ] ∈ R n [ 1 ] × 1 (9) \tag{9} {\bf W}^{[1]}=\left[\begin{aligned}{\bf w}^{[1]}_1\\ {\bf w}^{[1]}_2\\ {\bf w}^{[1]}_3\\ {\bf w}^{[1]}_4 \end{aligned}\right]\in {\mathbb R}^{n^{[1]}\times n^{[0]}}, {\bf b}^{[1]}=\left[\begin{aligned}{b}^{[1]}_1\\ {b}^{[1]}_2\\ {b}^{[1]}_3\\ {b}^{[1]}_4 \end{aligned}\right]\in {\mathbb R}^{n^{[1]}\times 1} W[1]=⎣⎢⎢⎢⎢⎢⎡w1[1]w2[1]w3[1]w4[1]⎦⎥⎥⎥⎥⎥⎤∈Rn[1]×n[0],b[1]=⎣⎢⎢⎢⎢⎢⎡b1[1]b2[1]b3[1]b4[1]⎦⎥⎥⎥⎥⎥⎤∈Rn[1]×1(9)因此,可以得到
Z = [ z 1 [ 1 ] , z 2 [ 1 ] , … , z m [ 1 ] ] = W [ 1 ] A [ 0 ] + [ b [ 1 ] , b [ 1 ] , … , b [ 1 ] ] ∈ R n [ 1 ] × m (10) \tag{10} {\bf Z}=[{\bf z}^{[1]}_1,{\bf z}^{[1]}_2, \ldots,{\bf z}^{[1]}_m]={\bf W}^{[1]} {\bf A}^{[0]}+[{\bf b}^{[1]},{\bf b}^{[1]},\ldots,{\bf b}^{[1]}]\in {\mathbb R}^{n^{[1]}\times m} Z=[z1[1],z2[1],…,zm[1]]=W[1]A[0]+[b[1],b[1],…,b[1]]∈Rn[1]×m(10)则隐含层的输出为
A [ 1 ] = g ( Z [ 1 ] ) ∈ R n [ 1 ] × m (11) \tag{11} {\bf A}^{[1]}=g({\bf Z}^{[1]})\in {\mathbb R}^{n^{[1]}\times m}