手把手教学 M L P MLP MLP 算法实现
在上一次的推送 M L P MLP MLP算法推导小记中对反向传播进行了详细的推导, 本文将详细讲解该算法如何用 n u m p y numpy numpy来实现。
本次实验中输入层为4个结点,隐藏层为20个结点,再加上偏置,激活函数为 t a n h tanh tanh,输出层为3个结点,损失函数为均方误差 ,上次的推导也是基于此进行的。
对于不同的激活函数或者损失函数的推导都类似,可以基于上次的推送重新推导出网络权值更新公式即可。本文的激活函数和损失函数都是固定的,是小鱼我之前一次实验的精简版本,后面如果大家需要,可以推出能够自定义激活函数和损失函数的版本。
M L P MLP MLP也可以称为全连接前馈神经网络,理解了 M L P MLP MLP也可以帮助我们更好的理解深度学习框架中的全连接层。
1. M L P MLP MLP 理解
对于 M L P MLP MLP网络已经很熟悉的就可以跳过这部分, 这里主要是可以让我们对多层感知器的工作流程有一个直观的认识。
首先要明白这次实验是要对鸢尾花数据集进行分类, 网络可以简单的看为一个函数,函数中有参数可以调整,从而调整函数的输出值。
-
输入有四个数据, 分别为四个特征
-
输出有三个数据, 形式为[1,0,0](类别1), [ 1 , 0 , 0 ] , [ 0 , 1 , 0 ] , [ 0 , 0 , 1 ] [1,0,0],[0,1,0],[0,0,1] [1,0,0],[0,1,0],[0,0,1]代表三个类别.
对于训练过程就是给一组四个特征,通过调整函数里的参数,使得函数的输出为对应的类别,如[1,0,0]。本次实验中的batch大小为1,即每次采用一组数据进行训练。将训练集中的所有数据都训练一遍就称为一个epoch。
当通过函数里调整过的参数计算得出的输出,能够让我们判断该组特征是属于鸢尾花的什么类别,就可以认为训练完成。
测试时,我们只需要将测试数据输入函数,取输出三个数据中最大的下标,就可以得到该特征对应的鸢尾花预测类别。
2. 网络工作流程
为了对网络工作的流程说明清楚, 本文取数据集中的第一组数据为例, 在实验中将所有数据一组一组的送入网络进行训练即可
sepal length | sepal width | petal length | petal width | class |
---|---|---|---|---|
5.1cm | 3.5cm | 1.4cm | 0.2cm | Iris-setosa |
那么对于 I r i s − s e t o s a Iris-setosa Iris−setosa 这一类别的label表示为
y_{1} | y_{2} | y_{3} |
---|---|---|
1 | 0 | 0 |
首先要初始化网络, 包括输入结点数为4, 隐藏层结点数为20, 输出层结点数为3, 网络权值 w i j [ 5 , 20 ] w_{i j}[5 ,20] wij[5,20] (其中第一行1*20为隐藏层的偏置), w j k [ 20 , 3 ] w_{j k}[20,3] wjk[20,3]的随机初始化 ,学习率 η \eta η 为0.001
对于训练过程
正向传播
-
输入层:输入大小为1*4的矩阵 [ 5.1 , 3.5 , 1.4 , 0.2 ] [5.1, 3.5, 1.4, 0.2] [5.1,3.5,1.4,0.2]
-
隐藏层:输入的1*4的矩阵加上偏置项,相当于输入(1,5)的矩阵 [ 1 , 5.1 , 3.5 , 1.4 , 0.2 ] [1,5.1, 3.5, 1.4, 0.2] [1,5.1,3.5,1.4,0.2] 与隐藏层的网络权值 w i j [ 5 , 20 ] w_{i j}[5 ,20] wij[5,20] 内积得到(1,20)的矩阵
-
输出层:输入(1,20)的矩阵与输出层的网络权值 w j k [ 20 , 3 ] w_{j k}[20,3] wjk[20,3] 内积得到(1,3)的矩阵
-
(1,3)的矩阵即为 y k y_{k} yk ,但因为网络权值在一定范围内随机初始化的,因此现在的输出肯定是不满足要求 [ 1 , 0 , 0 ] [1,0,0] [1,0,0]
反向传播
-
由于此时的输出不满足要求,因此要去更新网络权值, 根据前面推出的公式就可以计算出 ∂ E n ∂ w k j \frac{\partial E_{n}}{\partial w_{k j}} ∂wkj∂En以及 ∂ E n ∂ w j i \frac{\partial E_{n}}{\partial w_{j i}} ∂wji∂En, 对于梯度的计算,小鱼我认为主要在于推导,当推导出公式后,其计算过程就是将公式用代码表示出来就可以了。
-
接着分别去更新 w i j [ 5 , 20 ] w_{i j}[5 ,20] wij[5,20], w j k [ 20 , 3 ] w_{j k}[20,3] wjk[20,3] 即可
就这样进行迭代训练, 在一次又一次的训练中, 正向传播的输出就被慢慢纠正, 最后趋近于 [ 1 , 0 , 0 ] [1,0,0] [1,0,0] 了
对于测试过程, 那就是只要用到正向传播的过程, 得到网络的输出, 判断是哪一类别, 就可以得知分类是否正确
3. 正向传播过程
3.1 输入层
输入层为4个特征结点, 表示为 x i x_{i} xi, 其中 i {i} i 代表第 i {i} i 个特征, 其中有一个常数1的输入为偏置。
x i ′ = [ 1 , x i ] x_{i}' =\left[\begin{array}{ll} {1},&x_{i} \end{array}\right] xi′=[1,xi]
3.2 隐藏层
隐藏层为20个结点, 因此隐藏层网络的权值为 w i j w_{i j} wij, 即一个大小为(5, 20)的矩阵, 其转置为 w j i w_{j i} wji
进入隐藏层第一部分后输出为 a j a_{j} aj , 输出为一个大小(1,20)的向量其为
a j = ∑ i = 1 d w j i [ x 1 , . . . , x i ] + w j 0 = ∑ i = 0 d w j i ( 1 ) x i ′ \begin{aligned} a_{j} &=\sum_{i=1}^{d} w_{j i} [x_{1},...,x_{i}] + w_{j 0}\\&=\sum_{i=0}^{d} w_{j i}^{(1)} x'_{i} \end{aligned} aj=i=1∑dwji[x