文章目录
前言
BP神经网络(Back propagation neural network)全称为多层前馈神经网络,其用于解决非线性问题。整个神经网络的步骤为:输入层接收外界的输入,隐藏层和输出层的神经元对输入的特征或信号通过权重矩阵进行加工,最终输出结果。过程中最重要的是获得加工所要的权重,本质上说神经网络的学习过程就是在学习神经元与神经元之间连接的权重。
提示:以下是本篇文章正文内容,下面案例可供参考
第一步:正向传播激活神经网络
A.变量说明
关于BP神经网络的正向传播,我们以上图为例对变量进行一下说明:
- x i ( i n ) , a i ( i n ) x^{(in)}_i ,a^{(in)}_i xi(in),ai(in) : 二者均表示输入层的第 i i i个输入单元(这样做是为了和后面的进行统一,二者相等的原因是输入层的神经元不起激活作用);
- w m , h ( h ) w^{(h)}_{m,h} wm,h(h) :输入层的第 m m m个单元与隐藏层的的第 h h h个单元之间的权重(⚠️权重的标识很重要,而且不同的参考书用的也不同,读者一定要弄清楚)
- z i ( h ) z^{(h)}_i zi(h) : 隐藏层的第 i i i的净输入单元, z i ( h ) = w 1 , i ( h ) a 1 ( i n ) + . . . + w m , i ( h ) a m ( i n ) z^{(h)}_i =w^{(h)}_{1,i}a^{(in)}_1+ ...+w^{(h)}_{m,i}a^{(in)}_m zi(h)=w1,i(h)a1(in)+...+wm,i(h)am(in);
- a i ( h ) a^{(h)}_i ai(h) : 隐藏层的第 i i i的隐藏单元, a i ( h ) = ϕ ( z i ( h ) ) a^{(h)}_i = \phi (z^{(h)}_i) ai(h)=ϕ(zi(h));
- w h , t ( o ) w^{(o)}_{h,t} wh,t(o) :隐藏层的第 h h h个单元与输出层的的第 t t t个单元之间的权重(⚠️权重的标识很重要,而且不同的参考书用的也不同,读者一定要弄清楚)
- z i ( o u t ) z^{(out)}_i zi(out) : 输出层的第 i i i的净输入单元, z i ( o u t ) = w 1 , i ( o u t ) a 1 ( h ) + . . . + w h , i ( o u t ) a h ( h ) z^{(out)}_i =w^{(out)}_{1,i}a^{(h)}_1+ ...+w^{(out)}_{h,i}a^{(h)}_h zi(out)=w1,i(out)a1(h)+...+wh,i(out)ah(h);
- a i ( o u t ) a^{(out)}_i ai(out) : 输出层的第 i i i的输出单元, a i ( o u t ) = ϕ ( z i ( o u t ) ) a^{(out)}_i = \phi (z^{(out)}_i) ai(out)=ϕ(zi(out));
- y [ i ] , a [ i ] y^{[i]},a^{[i]} y[i],a[i]: 分别代表一组数据的实际结果中的第 i i i个(上角标视为索引),经过神经网络输出的第 i i i个;
- 关于激活函数,我们采用 sigmoid 函数 ϕ ( x ) = 1 1 + e − x \phi (x) = \cfrac{1}{1 + e^{-x}} ϕ(x)=1+e−x1 ;
B.正向传播
熟悉完上面的量的意义之后,我们通过线性代数的知识导出BP神经网络的正向传播过程:
首先,输入层的各个单元 A ( i n ) \bm A^{(in)} A(in)(不妨设阶数为:n*m )和通过指向隐藏层的权重矩阵 W ( h ) \bm W^{(h)} W(h)(阶数:m * h)做点乘,得到隐藏层的净输入向量: Z ( h ) \bm Z^{(h)} Z(h)(阶数: n * h);
其次,将隐藏层的净输入向量进行激活,得到 A ( h ) \bm A^{(h)} A(h), A ( h ) = ϕ ( Z ( h ) ) \bm A^{(h)} = \phi(\bm Z^{(h)}) A(h)=ϕ(Z(h))(阶数:n * h);
再其次: a ( h ) \bm a^{(h)} a(h)通过指向输出层的权重矩阵 W ( o u t ) \bm W^{(out)} W(out)(阶数:h * t),得到输出层的净输入向量: Z ( o u t ) \bm Z^{(out)} Z(out)(n * t);
最后,将输出层的净输入向量进行激活,得到得到 A ( o u t ) \bm A^{(out)} A(out), A ( o u t ) = ϕ ( Z ( o u t ) \bm A^{(out)} = \phi(\bm Z^{(out}) A(out)=ϕ(Z(out)(阶数:n * t),即我们的输出结果。
这其中涉及的矩阵运算罗列如下:
- Z ( h ) = A ( i n ) W ( h ) \bm Z^{(h)} = \bm A^{(in)}\bm W^{(h)} Z(h)=A(in)W(h);
- Z ( o u t ) = A ( h ) W ( o u t ) \bm Z^{(out)} = \bm A^{(h)}\bm W^{(out)} Z(out)=A(h)W(out);
BP神经网络的正向传播过程相对比较简单,弄清楚需要对上面变量的标识熟练掌控以及要有线性代数的基础,另外上面👆的表述并没牵扯到偏置单元,下面我们介绍下偏置单元的内容
C.偏置单元
关于偏置单元的设置,通常输入层的激发单元(神经元)组成的是输入单元和偏置单元,隐藏层的激发单元(神经元)组成的是隐藏单元和偏置单元。但是为方便起见,将偏置单元更改为单独的偏置向量,单独的偏置向量的设定和之前的以权重变量作为偏置(也就是偏置单元设定为1)的操作二者相同,只是形式不同。
采用这样形式的优点:
- 代码更加高效并且便于阅读,权重矩阵的维度可完全用层与层之间的神经元个数表示,而无偏置单元的参与;
- 这样的操作也在常用的深度学习库中被采用;
如上图所示:输入层(Input layer)中共有3+1个输入单元,1个为偏置单元。隐藏层(Hidden layer)中共有4 + 1个隐藏单元,1个为偏置单元。采用偏置单元更改为单独的偏置向量的形式,尚若我们有100组数据,一组数据对应3个特征值,那么我们就只需考虑输入层(Input layer)和隐藏层(Hidden layer)之间的权重矩阵为: 一个 3 * 4的权重矩阵 + 一个 1 * 4 的偏置向量;
可能读者有疑问🤔️两个向量个维度不相同,那么计算不会报错吗?不会,因为numpy具有广博机制,一个权重矩阵的列数和第二个单元的行数相同,就会采用广播机制,见下面👇代码示例。
print(np.array([[1,2],[1,2]]),'\n')
print(np.array([3,2]),'\n')
print(np.array([[1,2],[1,2]])+np.array([3,2]),'\n')
#s输出结果如下,可见计算正常进行
[[1 2]
[1 2]]
[3 2]
[[4 4]
[4 4]]
第二步:误差逆向传播
1.损失函数
我们通过第一步进行了BP神经网络的正向传播,得到输出结果向量,输出结果向量和实际的向量之间存在差异,如何用数学的形式进行表示?这就需要损失函数的发挥作用。为简单起见,我们首先从1组输入数据(阶数:1 * m)入手再过渡到多组数据(阶数:n * m)的形式,由易到难。
损失函数的一般形式(线性回归形式):
J ( W ) = 1 2 ∥ a o u t − y ∥ 2 2 = 1 2 ∑ i = 1 m ( y [ i ] − a [ i ] ) 2 J(\bm W)= \bf\tfrac{1}{2}{\lVert a^{out}-y \rVert ^{2}_{2}= \tfrac{1}{2}\displaystyle\sum_{i=1}^m(y^{[i]}-a^{[i]})^2} J(W)=21∥aout−y∥2<