深层神经网络的基本结构如图所示:由1层输入层,若干层隐藏层,和1层输出层构成。我们称“n层神经网络”,指的是隐藏层加输出层 = n =n =n,不包括输入层。每一层都有特定数目的神经元(对于输入层,即为特征的数量),神经原对输入数据进行计算,并输出计算结果。每一层的输出作为下一层的输入,不断传播,最终的一个输出结果 y ^ \hat{y} y^。
以图像处理为例,输入层输入的是一副图片的像素块(或特征),将三维矩阵按照一个特定的规则reshape为向量,因此输入向量中的每一个元素都是一个像素单元
n n n 层神经网络中含有 n − 1 n-1 n−1 层隐藏层,第 i i i 层的输出做为第 i + 1 i+1 i+1 层的输入,每个隐藏层中含有不同数目的神经元(计算单元)
在吴老师的这门课里,这里的神经元对输入进行两步计算。每个神经元中含有一组参数向量 w \bm{w} w 和参数 b b b 以及一个激活函数 σ \sigma σ,对于上一层神经元的输出 a [ i − 1 ] a^{[i-1]} a[i−1], 首先进行线性运算: z [ i ] = w [ i ] a [ i − 1 ] + b [ i ] z^{[i]} = \bm{w^{[i]}}a^{[i-1]}+b^{[i]} z[i]=w[i]a[i−1]+b[i],然后利用激活函数进行非线性计算: a [ i ] = σ ( z [ i ] ) a^{[i]} = \sigma(z^{[i]}) a[i]=σ(z[i]), a [ i ] a^{[i]} a[i] 即为这个神经元的输出。在这门课中,吴老师在隐藏层神经元用的激活函数是relu函数,而输出层shen’n’jin用的是
在这个模型里,对于每一个训练数据,输出层为一个标量值,即模型的预测值,将预测值与标签值进行比较,可计算出损失函数值,函数值越小,则说明网络的拟合度越高(平均意义上)
总体来说分为3个阶段:初始化参数,循环迭代训练,及输出预测
首先要知道要搭建一个网络,我们有哪些已知量:带标签的训练集(即 X X X 和 Y Y Y),超参数(即训练网络的层数,每一层需要的神经元个数,学习率,迭代次数),而我们要初始化的参数,是每一层神经元的参数矩阵 W \bm{W} W 和 向量 b \bm{b} b,故我们初始化阶段我们需要依赖我们想实现的神经网络层数和每层的神经元个数。然后可通过numpy库调用随机数生成器随机初始化
循环迭代式训练神经网络的核心,在训练中对每一个训练数据进行训练迭代,而在每一次训练中,又可分为前向传播,计算loss,反向传播,以及更新参数这四个环节。
前向传播是指,每一层的神经元接受上一层神经元传过来的计算结果,并利用自己保存的参数再次进行计算,然后传到下一层神经元的过程。前向传播由输入层开始,经过多层隐藏层的计算后,最后再次通过输出层,输出计算的结果,这样完成了一次前向传播的过程。在前向传播的过程中,每一层输出的结果是经过了激活函数的结果,但为了便于之后的反向传播,也要同时保存只经过线性运算后的结果,即 z \bm{z} z 的值
前向传播公式如下:
线性传播: Z [ l ] = W [ l ] A [ l − 1 ] + b [ l ] \bm{Z^{[l]}=W^{[l]}A^{[l−1]}+b^{[l]}} Z[l]=W[l]A[l−1]+b[l]
非线性激活: A [ l ] = σ ( Z [ l ] ) \bm{A^{[l]}}=σ(\bm{Z^{[l]}}) A[l]=σ(Z[l])
其中 σ ( ⋅ ) σ(·) σ(⋅) 函数为relu函数或sigmoid函数
在经过多层计算后,最后得到结果 y ^ \bm{\hat{y}} y^
用前向传播得到的 y ^ \bm{\hat{y}} y^ 与训练数据标签的真实值 y \bm{y} y 进行比较,通过如下公式计算loss,即“真实值与计算值的差异程度”,loss越小,说明对于这个数据样例,模型拟合的越好,在网络中,我们需要计算的是平均损失程度,即对所有测试样例的平均值:
J = − 1 m ∑ i = 1 m ( Y log ( Y ^ ) + ( 1 − Y ) log ( 1 − Y ^ ) ) \bm{J} = -\frac{1}{m}\sum_{i=1}^m (\bm{Y}\log(\bm{\hat{Y}})+(1-\bm{Y})\log(1-\bm{\hat{Y}})) J=−m1i=1∑m(Ylog(Y^)+(1−Y)log(1−Y^))
用上面的损失函数,对前面隐藏层的每个神经元的参数 W , b \bm{W,b} W,b 分别计算导数,需要用到微积分中的链式法则,依次对第 n − 1 , n − 2 … … 1 n-1,n-2 ……1 n−1,n−2……1 层中的 A , Z , W , b A,Z,W,b A,Z,W,b 求导数,导数公式如下:
d A L = − ( Y A L − 1 − Y 1 − A L ) dA^L = - (\frac{Y} {A^L} - \frac{1 - Y} {1 - A^L}) dAL=−(ALY−1−AL1−Y)
d Z [ l ] = d A [ l ] ∗ g ′ ( Z [ l ] ) dZ^{[l]}=dA^{[l]}∗g′(Z^{[l]}) dZ[l]=dA[l]∗g′(Z[l])
d W [ l ] = 1 m d Z [ l ] A [ l − 1 ] T dW^{[l]}=\frac{1}{m}dZ^{[l]}A^{[l−1]^T} dW[l]=m1dZ[l]A[l−1]T
d b [ l ] = 1 m ∑ i = 1 m d Z [ l ] ( i ) db^{[l]}=\frac{1}{m}\sum_{i=1}^mdZ^{[l](i)} db[l]=m1i=1∑mdZ[l](i)
d A [ l − 1 ] = W [ l ] T d Z [ l ] dA^{[l−1]}=W^{[l]T}dZ^{[l]} dA[l−1]=W[l]TdZ[l]
用反向传播计算得到的导数值,根据梯度下降法更新每一个神经元的参数
W [ l ] = W [ l ] − α d W [ l ] W^{[l]}=W^{[l]}−α dW^{[l]} W[l]=W[l]−αdW[l]
b [ l ] = b [ l ] − α d b [ l ] b^{[l]}=b^{[l]}−α db^{[l]} b[l]=b[l]−αdb[l]
利用更新好的参数,按照上述步骤重复执行并再次更新参数,循环往复,迭代次数越多,损失函数值越低
在若干次训练之后,就可以用训练好的模型来预测了,预测的过程就是正向传播的过程,而 y ^ \hat{y} y^ 就是预测结果。在预测之前,可以跑一便测试数据集,计算一下该网络的正确率