《深度学习的数学》给予了我极大的启发,作者阐述的神经网络的思想和数学基础令我受益颇多,但是由于书中使用Excel作为示例向读者展示神经网络,这对我这样一个不精通Excel的人来说很头疼,因此我打算使用Python来实现书中的一个简单网络模型,即识别数字0和1的模型。
这个网络模型极其简单,比号称机器学习中的“Hello World”的手写数字识别模型更简单,它基本没有实用价值,但是我之所以推崇它,只因为它褪去了神经网络的复杂性,展示了神经网络中最基本、最根本的东西。
模型总共分为三层,第一层为输入层,第二层为隐藏层,第三层为输出层。输入层包括12个输入输出变量 x i ( i = 1 , 2 , . . . , 12 ) x_i (i=1,2,...,12) xi(i=1,2,...,12),隐藏层包括三个神经单元,输出层包括两个神经单元。
下面是涉及到的数学知识。
神经网络的参数是通过将代价函数(损失函数)最小化来确定的,本文所使用的的最小化方法是梯度下降法,但是直接计算梯度是很困难的,因此引入了误差反向传播法,通过计算出输出层的误差,然后通过误差的递推公式计算出隐藏层的误差。
<隐藏层>
z 1 2 z_1^2 z12= ∑ i = 1 12 w 1 i 2 x i + b 1 2 \sum_{i=1}^{12}w_{1i}^2x_i+b_1^2 ∑i=112w1i2xi+b12
z 2 2 z_2^2 z22= ∑ i = 1 12 w 2 i 2 x i + b 2 2 \sum_{i=1}^{12}w_{2i}^2x_i+b_2^2 ∑i=112w2i2xi+b22
z 3 2 z_3^2 z32= ∑ i = 1 12 w 3 i 2 x i + b 3 2 \sum_{i=1}^{12}w_{3i}^2x_i+b_3^2 ∑i=112w3i2xi+b32
a i 2 = a ( z i 2 ) ( i = 1 , 2 , 3 ) a_i^2=a(z_i^2) (i=1,2,3) ai2=a(zi2)(i=1,2,3)
<输出层>
z 1 3 z_1^3 z13= ∑ i = 1 3 w 1 i 3 a i 2 + b 1 3 \sum_{i=1}^{3}w_{1i}^3a_i^2+b_1^3 ∑i=13w1i3ai2+b13
z 2 3 z_2^3 z23= ∑ i = 1 3 w 2 i 3 a i 2 + b 2 3 \sum_{i=1}^{3}w_{2i}^3a_i^2+b_2^3 ∑i=13w2i3ai2+b23
a i 3 = a ( z i 3 ) ( i = 1 , 2 ) a_i^3=a(z_i^3) (i=1,2) ai3=a(zi3)(i=1,2)
C = 1 / 2 ∗ ( ( t 1 − a 1 3 ) 2 + ( t 2 − a 2 3 ) 2 ) C=1/2*((t_1-a_1^3)^2+(t_2-a_2^3)^2) C=1/2∗((t1−a13)2+(t2−a23)2),其中 z j l z_j^l zjl为层l的第j个神经单元的加权输入的值, w i j l + 1 w_{ij}^{l+1} wijl+1为层l的第j个神经单元指向层l+1的第i个神经单元的箭头的权重, b j l b_j^l bjl表示层l的第j个神经单元的偏置, a j l a_j^l ajl为层l的第j个神经单元的输出,a(z)为激活函数,C为平均误差,
含义 | 图像为0 | 图像为1 | |
---|---|---|---|
t 1 t_1 t1 | 0的正解变量 | 1 | 0 |
t 2 t_2 t2 | 1的正解变量 | 0 | 1 |
图像为0 | 图像为1 | |
---|---|---|
a 1 3 a_1^3 a13 | 接近1的值 | 接近0的值 |
a 2 3 a_2^3 a23 | 接近0的值 | 接近1的值 |
输出层L的误差公式
δ j L = ∂ C ∂ a j L a ′ ( z j L ) δ_j^L= \frac{\partial C}{\partial a_j^L}a'(z_j^L) δj