多层感知机识别垃圾短信

感知器(Perceptron)是ANN人工神经网络的一个概念,由Frank Rosenblatt于1950s第一次引入。
单层感知器(Single Layer Perceptron)是最简单的ANN人工神经网络。它包含输入层和输出层,而输入层和输出层是直接相连的。单层感知器仅能处理线性问题,不能处理非线性问题。本次我们进行实验的是MLP多层感知器。
MLP多层感知器是一种前向结构的ANN人工神经网络, 多层感知器(MLP)能够处理非线性可分离的问题。MLP可以被看做是一个有向图,由多个节点层组成,每一层全连接到下一层。除了输入节点,每个节点都是一个带有非线性激活函数的神经元。使用BP反向传播算法的监督学习方法来训练MLP。MLP是感知器的推广,克服了感知器不能对线性不可分数据进行识别的弱点。
相对于单层感知器,MLP多层感知器输出端从一个变到了多个;输入端和输出端之间也不光只有一层,而是两层:输出层和隐藏层。下图展示了一个多层感知机的神经网络图
在这里插入图片描述

基于反向传播学习的是典型的前馈网络, 其信息处理方向从输入层到各隐层再到输出层,逐层进行。隐层实现对输入空间的非线性映射,输出层实现线性分类,非线性映射方式和线性判别函数可以同时学习。
MLP为了使用反向传播算法进行有效学习,激活函数必须限制为可微函数。由于具有良好可微性,双曲正切函数(Hyperbolictangent)及Sigmoid函数常被采用为激活函数。
在这里插入图片描述
在这里插入图片描述

激活函数的作用是将非线性引入神经元的输出。因为大多数现实世界的数据都是非线性的,希望神经元能够学习非线性的函数表示,所以这种应用至关重要。
接下来我们看看MLP原理:
前馈神经网络是最先发明也是最简单的人工神经网络。它包含了安排在多个层中的多个神经元。相邻层的节点有连接或者边(edge)。所有的连接都配有权重。
一个前馈神经网络可以包含三种节点:
1)输入节点(Input Nodes):也称为输入层,输入节点从外部世界提供信息,。在输入节点中,不进行任何的计算,仅向隐藏节点传递信息。
2)隐藏节点(Hidden Nodes):隐藏节点和外部世界没有直接联系。这些节点进行计算,并将信息从输入节点传递到输出节点。隐藏节点也称为隐藏层。尽管一个前馈神经网络只有一个输入层和一个输出层,但网络里可以没有也可以有多个隐藏层。
3)输出节点(Output Nodes):输出节点也称为输出层,负责计算,并从网络向外部世界传递信息。
在前馈网络中,信息只单向移动——从输入层开始前向移动,然后通过隐藏层,再到输出层。在网络中没有循环或回路。
在这里插入图片描述

MLP多层感知器就是前馈神经网络的一个例子,除了一个输入层和一个输出层以外,至少包含有一个隐藏层。单层感知器只能学习线性函数,而多层感知器也可以学习非线性函数。
MLP训练过程:
一般采用BP反向传播算法来训练MPL多层感知器。采用BP反向传播算法就像从错误中学习。监督者在人工神经网络犯错误时进行纠正。MLP包含多层节点;输入层,中间隐藏层和输出层。相邻层节点的连接都有配有权重。学习的目的是为这些边缘分配正确的权重。通过输入向量,这些权重可以决定输出向量。在监督学习中,训练集是已标注的。这意味着对于一些给定的输入,能够知道期望的输出。
MLP训练过程大致如下:
1)所有边的权重随机分配;
2)前向传播:利用训练集中所有样本的输入特征,作为输入层,对于所有训练数据集中的输入,人工神经网络都被激活,然后经过前向传播,得到输出值。
3)反向传播:利用输出值和样本值计算总误差,再利用反向传播来更新权重。
4)重复2)~3), 直到输出误差低于制定的标准。
上述过程结束后,就得到了一个训练过的MLP网络。

上文提到BP反向传播算法,反向传播算法(Backpropagation)是目前用来训练人工神经网络(Artificial Neural Network,ANN)的最常用且最有效的算法。
反向传播算法主要由两个环节(激励传播、权重更新)反复循环迭代,直到网络的对输入的响应达到预定的目标范围为止。
BP算法的学习过程由正向传播过程和反向传播过程组成。在正向传播过程中,输入信息通过输入层经隐含层,逐层处理并传向输出层。如果在输出层得不到期望的输出值,则取输出与期望的误差的平方和作为目标函数,转入反向传播,逐层求出目标函数对各神经元权值的偏导数,构成目标函数对权值向量的梯量,作为修改权值的依据,网络的学习在权值修改过程中完成。误差达到所期望值时,网络学习结束
激励传播
每次迭代中的传播环节包含两步:
(前向传播阶段)将训练输入送入网络以获得激励响应;
(反向传播阶段)将激励响应同训练输入对应的目标输出求差,从而获得隐层和输出层的响应误差。
权重更新
对于每个突触上的权重,按照以下步骤进行更新:
将输入激励和响应误差相乘,从而获得权重的梯度;
将这个梯度乘上一个比例并取反后加到权重上。
这个比例将会影响到训练过程的速度和效果,因此称为“学习率”或“步长”。梯度的方向指明了误差扩大的方向,因此在更新权重的时候需要对其取反,从而减小权重引起的误差。
为了说明这一过程,以下图三层神经网络为例,有两个输入和一个输出,如下图中所示
在这里插入图片描述在这里插入图片描述

每个神经元是由两个单元组成的。第一个方块包含权重系数和输入信号。第二个方块实现非线性函数,称为神经元激活函数。
e是上一层summing junction的输出信号,y = f(e)是非线性元件的输出信号。信号y也是神经元的输出信号。
我们需要的神经网络训练数据集。训练数据集由输入信号(x_1和x_2)分配相应的目标(预期的输出)为z。网络训练是一个迭代的过程。在每个迭代中权重系数的节点会用新的训练数据集的数据进行修改。修改计算使用下面描述的算法:每个步骤都是从训练集中的两个输入信号开始,在这个阶段我们可以确定每个网络层中的每个神经元的输出信号值。图片下面的说明信号是通过网络传播,符号w(x_m)_n代表网络输入x_m和神经元n层之间的连接权重,符号y_n代表神经元n的输出信号。
在这里插入图片描述

传播的信号需要通过隐藏层。符号w_mn代表m和输入和输出神经元n之间的连接权重。
在这里插入图片描述

传播信号通过输出层。
在这里插入图片描述

以上都是正向传播。算法的下一步,计算得出的输出y和训练集和的真实结果z有一定的误差,这个误差就叫做误差信号。用误差信号反向传递给前面的各层,来调整网络参数。
在这里插入图片描述

之前的算法是不可能直接为内部神经元计算误差信号,因为这些神经元的输出值是未知的。因此反向传播算法对此问题进行了解决。这个算法的创新点就是传播误差信号δ=z-y,返回到所有神经元,输出信号会根据输入神经元进行更改。
在这里插入图片描述

权重系数的W_mn用来传播误差信号δ,它是等于通过计算得出输出值,便会得到新的误差δ_m。只有数据流的方向是改变(信号传播从输出到输入一个接一个的进行权值更新)。这一技术是用于所有网络层。如果当传播错误来自一些神经元。将误差δ根据之前的权重会获得每个神经元的各自误差δ_5,δ_4,…δ_1.
在这里插入图片描述

当每个神经元的误差都计算完后,每个神经元的权重系数也会更新。下面的公式就是神经元的激活函数(更新权重),利用误差δ_1和之前的权重以及之前e函数的倒数来获得新的权重w’.这里η是系数,它影响着权重改变大小的范围。

在这里插入图片描述在这里插入图片描述

在这里插入图片描述

以上就是正向传入输入值,获得误差,根据误差反向传播误差,获得每一个神经元的误差值,在根据误差值和e的倒数来更新权重,达到了对整个网络的修正。

来看看本次使用的数据集。本次实验的数据集来自SMS Spam Collection.,官网如下所示
在这里插入图片描述

由 5574 条英语短信组成的数据集。该语料库是从Internet上免费或免费获取的,以供研究,分别从
->从Grumbletext网站手动提取了425条SMS垃圾短信。这是一个英国论坛,手机用户在其中公开发表有关SMS垃圾短信的声明。
-> NUS SMS语料库(NSC)的3375条SMS随机选择的正常短信的子集,该消息是由新加坡国立大学计算机科学系收集的约10,000条合法消息的数据集。这些信息主要来自新加坡人,并且主要来自就读大学的学生。这些消息是从志愿者那里收集的,他们知道他们的贡献将被公开提供
->从Caroline Tag的博士学位论文中收集的450条SMS正常消息的列表。等等
总共有4831条正常短信和747骚扰短信
打开txt文件查看
在这里插入图片描述

可以看到这个txt文件是每条短信内容的集合,在短信内容的前面有ham或者spam来表示正常短信或垃圾短信

接下来是代码实现部分
加载数据集,和我们之前看到的一样,由于每行数据都是由标记和内容组成的,中间使用制表符分割,所以这里我们使用split对其进行切分。并根据标记内容打标签,ham表示正常短信,给其打标签0,spam表示垃圾短信,给其打标签1.然后随机划分训练集和测试集,test_size=0.4指定测试集占40%
在这里插入图片描述

我们在短信内容中存在各种标点符号,这些符号可能对判断垃圾短信也有用,举个例子,比如收到内容为,,?;‘【】这样的短信,就可以直接判定为垃圾短信。我们可以在这些符号前后加上空格,然后使用split切割时就可以保留下这些符号。(换句话说,将每个符号同样都作为一个单词对待)
在这里插入图片描述

为训练集和测试集都标注好
在这里插入图片描述

获取向量。tags[0]是根据标签找向量,reshape的意思是重新按照这个矩阵大小排列。例如 a = np.arange(6).reshape((3, 2)) 输出([[0, 1],[2, 3],[4, 5]])
在这里插入图片描述

通过doc2vec提取特征。这里dm=0表示使用Doc2vec的DBOW算法,min_count=2 :表示忽略词频小于2的词语,negative=5 表示使用负采样,并指定应制5个“噪音词”(通常在5-20之间)。 如果设置为0,则不使用负采样;hs=0 ,这里如果设置为0,则负数将不为零,负采样将会用到;workers=cores : 指定多少个工作线程来训练模型(在多核CPU上训练,速度更快),iter=60表示训练60次
模型训练完成后将其保存,这样的话下次就通过if的判断,可以直接使用该模型。之后通过调用前面定义过的getVecs来获取向量并返回
在这里插入图片描述

搭建神经网络,使用训练集训练,并用测试集测试,打印出准确率。
这里的solver=’lbfgs’指定参数的优化算法为lbfgs,hidden_layer_sizes=(10,5)表示该神经网络拥有两个隐藏层,第一个隐藏层有10个神经元,第二个隐藏层有5个神经元
在这里插入图片描述

测试如下
在这里插入图片描述

可以看到准确率达到了80%左右

参考:
1.https://blog.csdn.net/qimiejia5584/article/details/78975810
2.https://zhuanlan.zhihu.com/p/46934912
3.https://archive.ics.uci.edu/ml/datasets/SMS+Spam+Collection
4.https://www.cnblogs.com/jaww/p/12302543.html
5.https://mp.ofweek.com/ai/a845673521216
6.http://www.cs.unibo.it/~roffilli/pub/Backpropagation.pdf
7.https://www.jiqizhixin.com/graph/technologies/7332347c-8073-4783-bfc1-1698a6257db3
8.《web安全与机器学习》
9.https://github.com/duoergun0729/1book/

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值