手把手教学 - MLP算法实现

本文详述了多层感知器(MLP)的实现过程,从理解MLP、网络工作流程,到正向传播、损失函数、反向传播和梯度更新,最后讨论模型的使用。使用numpy实现,以鸢尾花数据集为例进行分类,网络结构包括4个输入节点、20个隐藏节点和3个输出节点,激活函数为tanh,损失函数为均方误差。
摘要由CSDN通过智能技术生成

手把手教学 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 Irissetosa 这一类别的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}} wkjEn以及 ∂ E n ∂ w j i \frac{\partial E_{n}}{\partial w_{j i}} wjiEn, 对于梯度的计算,小鱼我认为主要在于推导,当推导出公式后,其计算过程就是将公式用代码表示出来就可以了。

  • 接着分别去更新 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=1dwji[x

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值