当前位置: 首页 > news >正文

感知机和神经网络

  首先推荐一篇文章:神经网络浅讲:从神经元到深度学习,介绍的一些神经网络的发展过程等等,能够在一定程度上面帮助我们理解神经网络。

 

M-P神经元

  计算机当中的神经网络是模仿生物神经网络。单个的神经元是由树突,轴突,还有细胞核组成,刺激由树突传递到细胞核,当这些阈值超过一定的值以后,这个神经元激活,然后再由轴突将刺激传递出去。典型的神经元结构如下所示(图片来自维基百科):

image

 

  所以根据神经元的这种构造,McCulloch和Pitts抽象出来一种神经元模型“M-P神经元模型”,这是根据两个作者的名字起得。如下所示:

image

  我们以$x_i$表示来自第i个神经元的输入,$w_i$表示第i个神经元的链接权重  $\theta$表示阈值 f表示激活函数,输出为$y$,$y = f( \sum \limits_{i=1}^{n} w_i x_i – \theta)$ 表示在各种输入下,超过一定阈值以后由激活函数激活的输出。理想的激活函数是阶跃函数,也叫符号函数sign(x),但是该函数不连续,所以可以使用Sigmod(x)函数。

  当然还有别的神经元模型,如考虑了电位脉冲发放时间而不是累积电位的脉冲神经元(spiking neuron)模型。但是,M-P神经元模型是目前用的最多的和最广的,可谓是现在神经网络的基石。

 

感知机(Perceptron)

  感知机是由两层神经元组成,输入层接受外界输入信号以后传递给输出层,输出层是M-P神经元,如下图所示:

 

image 

 

  感知机是二分类的线性分类模型,输入为实例的特征向量,输出为实例的类别,取+1和-1二值。线性分类模型表现在:感知机需要学习出一个在正类和负类之间的超平面$\mathbf{w} \mathbf{x} + b$,使得正类和负类能够正确的划分。下面将会看到感知机是如何进行建模以及如何求解参数的。

 

感知机学习的损失函数 

  假设数据集$T= \{(\mathbf{x}_1,y_1),(\mathbf{x}_2,y_2),...,(\mathbf{x}_N,y_N)\}$,该数据集必须是线性可分数据集,感知机要求得的超平面是能够正确划分出该数据集的超平面。使用阶跃函数作为激活函数的感知机损失函数如下:

  $L(\mathbf{w},b) = – \sum \limits_{\mathbf{x}_i \in M} y_i (\mathbf{w}_i \mathbf{x}_i+b)$   其中$M$是误分类点的集合。

 

感知机学习的求解方法

  这里只说原始形式,我们要求得参数$\mathbf{w},b$使上面的损失函数 $L(\mathbf{w},b) $最小:

    $\min \limits_{\mathbf{w},b}L(\mathbf{w},b) = – \sum \limits_{\mathbf{x}_i \in M} y_i (\mathbf{w}_i \mathbf{x}_i+b)$

  采用随机梯度下降法来进行优化。刚开始随机选择一个参数$\mathbf{w}_0, b_o$,然后每次随机从误分类点中选取一个点,让其梯度下降。

  误分类点集合M是固定的情况下,损失函数  $L(\mathbf{w},b)$的梯度如下:

  $\nabla_{\mathbf{w}} L(\mathbf{w},b) = – \sum \limits_{\mathbf{x}_i \in M} y_i \mathbf{x}_i$

  $\nabla_{b} L(\mathbf{w},b) = – \sum \limits_{\mathbf{x}_i \in M} y_i $

  随机选取一个误分类点$(\mathbf{x_i},y_i )$,也就是上面的M取1这种情况,对w和b,采用步长$\eta$进行更新的公式如下:

  $\mathbf{w} \gets \mathbf{w} + \eta y_i \mathbf{x}_i$

  $b \gets b+ \eta y_i$

 

感知机算法完整描述

一个完整的感知机的算法如下所示:


  输入:训练数据集$T= \{(\mathbf{x}_1,y_1),(\mathbf{x}_2,y_2),...,(\mathbf{x}_N,y_N)\}$,其中$\mathbf{x}_i \in \mathbb{R}^n$, $y_i=\{-1,+1\}$,i=1,2,...,N; 学习率$\eta(0 < \eta \leq1)$;

  输出: $\mathbf{w},b$;感知机模型$f(x) = sign(\mathbf{w} \mathbf{x}+b)$

  (1) 选取初值 $\mathbf{w}_0, b_0$

  (2) 在训练集中选取数据$(\mathbf{x}_i, y_i)$

  (3) 如果$y_i (\mathbf{w} \mathbf{x}_i + b) \leq 0$

                     $\mathbf{w} \gets \mathbf{w} + \eta y_i \mathbf{x}_i$

                     $b \gets b+ \eta y_i$

  (4) 转至(2),直到训练集中没有误分类点


  从上面当中的算法可以看出来,感知机算法是利用那些分类错误的实例点不断的调整其中的参数,最后达到没有错误分类的效果既可以了。 实际上感知机算法是后面多层神经网络和支持向量的基础。 多层神经网络在结构上是有多层的感知机,并且参数更新过程也和感知机类似。支持向量则是使得正负样本到直线的距离最大,而不仅仅满足正确分类这一条件。

 

多层前馈神经网络

 

多层前馈神经网络的结构

  从上面的感知机算法当中我们可以发现,它有一个致命的缺点,那就是只能对线性的样本进行分类,所以对于异或这样的简单非线性问题,感知机是解决不了的。而对于两层的感知机来说,计算量太大,当时没有好的计算方法,所以导致神经网络的研究陷入一段低谷时期。

  在感知机中间增加一层节点,这层节点叫做隐层,隐层和输出层一样,都是含有激活函数的功能神经单元,单隐层神经网络也可以叫做两层神经网络,(当我们说几层神经网络的时候,这里面的“层”是带有运算单元还有激活函数的层数,所以不把输入层算作内)。单隐层神经网络和双隐层神经网络的图形如下所示,这样的神经网络也叫做“多层前馈神经网络”,所谓的前馈指的是,数据从输入节点到输出节点向前传递,没有输出的信息传递到输入层,即没有反馈,表现在图形上是有向图没有回路。当然还有反馈网络,比如Hopfield网络,还有布尔兹曼机(但是受限布尔兹曼机是一种前馈网络)等。

image

 

误差逆传播算法

  当网络增加到多层的时候,我们需要寻求一种更好的算法来对我们的模型进行运算来求解。误差逆传播(error BackPropagation 简称BP)算法就是一种很好的算法。

  给定训练集$D= \{(\mathbf{x}_1,\mathbf{y}_1),(\mathbf{x}_2,\mathbf{y}_2),...,(\mathbf{x}_m,\mathbf{y}_m)\} ,x \in \mathbb{R}^d  ,y \in \mathbb{R}^l$,这里的d代表输入有$d$维的特征向量,$l$代表输出l维向量。这里的激活函数选择Sigmoid函数 $f(x) = \frac{1}{1+e^{-x}}$下图给出一个单隐层的神经网络(双层神经网络):

 

无标题

  输入层为$d$维度的特征,输出层为$l$维的向量,输入节点的个数和输出节点的个数是根据特征数和输出向量的维数来确定的,所以输入节点为d个,输出节点为l个。中间节点为q个,节点的个数是可以自己选择的。

  输入层第i个节点到隐层第h个节点的权重为$v_{ih}$,隐层第h个节点到输出层第j个节点的权重为$w_{hj}$。隐层第h个神经元的阈值为$\gamma_h$,输出层第j个神经元的阈值为$\theta_j$。

  对于输入层第i个神经元,它的输入为$x_i$。

  对于隐层第h个神经元:

    输入 $\alpha_h = \sum \limits_{i=1}^{d} v_{ih} x_i$                    (1)

    输出 $b_h = f(\alpha_h – b_h)$                  (2)

  对于输出层第j个神经元

    输入为$\beta_j = \sum \limits_{h=1}^{q} w_{hj} b_h$                 (3)

    输出为$y_j = f(\beta_j – \theta_j)$

  损失函数的构建:

  对于第k条训练集$(\mathbf{x}_k, \mathbf{y}_k)$,假设神经元的输出为$\hat{\mathbf{y}_k} = \{ \hat{y}_1^k, \hat{y}_2^k,...,\hat{y}_l^k \}$。输出计算公式为:

                  $\hat{y}_j^k = f(\beta_j – \theta_j)$                          (4)

  那么损失函数为二分之一的均方误差:

                 $E_k = \frac{1}{2} \sum \limits_{j=1}^{l}(\hat{y}_j^k – y_j^k)^2$                   (5)

 

  BP算法优化过程:

  在优化的时候,采用和上面感知机一样的优化方法:使用梯度下降的方法,迭代更新每个参数,对于参数$v$:

  $v \gets v + \Delta v$。

  对于参数$w_{hj}$来说,在给定学习率$\eta$的情况下,

  $\Delta w_{hj} = – \eta \frac{\partial E_k}{\partial w_{hj}}$

  结合上面的公式3,4,5,可以得知各个变量的依赖关系:$w_{hj} \to \beta_j \to \hat{y}_j^k \to E_k$ ($\to$可以理解为影响),所以上述的求导变为了:

  $\frac{\partial  E_k }{\partial  w_{hj} } = \frac{\partial  E_k }{\partial  \hat{y}_j^k } \cdot \frac{\partial  \hat{y}_j^k}{\partial \beta_j } \cdot \frac{\partial  \beta_j }{\partial  w_{hj} }$

  根据公式3 很容易求得:$\frac{\partial  \beta_j }{\partial  w_{hj} } = b_h$ 

  Sigmoid函数f(x)有这样的性质:$f’(x) = f(x)(1-f(x))$,定义一个中间项$g_i $ :

  $g_i= - \frac{\partial  E_k }{\partial  \hat{y}_j^k } \cdot \frac{\partial  \hat{y}_j^k}{\partial \beta_j }= \hat{y}_j^k (1-\hat{y}_j^k)(y_j^k - \hat{y}_j^k)  $               (6)

  这样 $\Delta w_{hj}  = \eta g_j b_h$                                               (7)

  同样可以求出 $\Delta \theta_j = – \eta g_j$                                        (8)

  对于$\Delta v_{ih}$,我们要求$\frac{\partial E_k}{\partial v_{ih}}$,结合上面的公式1,2,3,4,5,我们可以找到这样的影响链 $v_{ih} \to \alpha_h \to b_h \to \beta_j \to \hat{y}_j^k \to E_k$  可以求得

  $\Delta v_{ih} = \eta e_h x_i $                                                      (9)

  $\Delta \gamma_h = –\eta e_h$                                                       (10)

  其中$e_h = b_h (1-b_h) \sum \limits_{j=1}^l w_{hj} g_j$                             (11)

 

误差逆传播算法的完整描述

  下面是误差逆传播算法的完整描述


输入:训练集$D = \{   (\mathbf{x}_k ,\mathbf{y}_k )   \}_{k=1} ^m $  学习率$\eta$

输出:连接权与阈值确定的多层前馈神经网络

  (1) 在(0,1)范围内随机初始化网络中所有连接权和阈值

  (2) repeat

         for all $(\mathbf{x}_k ,\mathbf{y}_k ) \in D$ do

             根据当前参数和式子(4)计算当前样本的输出$\hat{\mathbf{y}}_k$

             根据式子(6)计算输出层神经元的梯度项目$g_j$

             根据式子(11)计算隐层神经元的梯度项$e_h$

             根据式(7,8,9,10)更新连接权$w_{hj}, v_{ih}$与阈值$\theta_j , \gamma_h$

        end for

  (3) until 达到停止条件


 

 

 

 

参考:

  李航 《统计学习方法》   感知机的内容参考自本书,更详细的推导可以参考这本书。

  周志华 《机器学习》 本文中的很多图片来自这一本书

  感知机(python实现) 这个博客也是参考《统计学习方法》,并给出了感知机的代码

转载于:https://www.cnblogs.com/jiaxin359/p/9011457.html

相关文章:

  • 团队作业6——展示博客(alpha阶段)
  • 关于形如--error LNK2005: xxx 已经在 msvcrtd.lib ( MSVCR90D.dll ) 中定义--的问题分析解决...
  • Api接口开发实例
  • 填坑app:compileDebugJavaWithJavac
  • [洛谷1156]垃圾陷阱(DP)
  • 微信小程序扫码接口,wx.scanCode(OBJECT)
  • zabbix安装后提示:Zabbix server is not running
  • Batch Normalization层
  • enter键触发事件的清除
  • 由“量子通信”想到“马蓉劈叉”
  • 中台架构的新一代业务支撑体系是如何实现
  • Redis二探
  • BZOJ5334:[TJOI2018]数学计算——题解
  • LVS/NAT + keepalived负载均衡实现
  • 学号 2017-2018-20172309 《程序设计与数据结构》第10周学习总结
  • angular学习第一篇-----环境搭建
  • Electron入门介绍
  • interface和setter,getter
  • javascript面向对象之创建对象
  • JavaWeb(学习笔记二)
  • mac修复ab及siege安装
  • mysql innodb 索引使用指南
  • Promise面试题,控制异步流程
  • windows下如何用phpstorm同步测试服务器
  • 测试开发系类之接口自动化测试
  • 从setTimeout-setInterval看JS线程
  • 翻译--Thinking in React
  • 个人博客开发系列:评论功能之GitHub账号OAuth授权
  • 基于Volley网络库实现加载多种网络图片(包括GIF动态图片、圆形图片、普通图片)...
  • 紧急通知:《观止-微软》请在经管柜购买!
  • 深度学习中的信息论知识详解
  • 手机app有了短信验证码还有没必要有图片验证码?
  • 小程序button引导用户授权
  • 再谈express与koa的对比
  • 阿里云重庆大学大数据训练营落地分享
  • 国内开源镜像站点
  • (01)ORB-SLAM2源码无死角解析-(66) BA优化(g2o)→闭环线程:Optimizer::GlobalBundleAdjustemnt→全局优化
  • (pojstep1.1.2)2654(直叙式模拟)
  • (待修改)PyG安装步骤
  • (顶刊)一个基于分类代理模型的超多目标优化算法
  • (附源码)ssm旅游企业财务管理系统 毕业设计 102100
  • (官网安装) 基于CentOS 7安装MangoDB和MangoDB Shell
  • (牛客腾讯思维编程题)编码编码分组打印下标题目分析
  • (转)GCC在C语言中内嵌汇编 asm __volatile__
  • (转)ObjectiveC 深浅拷贝学习
  • (转)自己动手搭建Nginx+memcache+xdebug+php运行环境绿色版 For windows版
  • .Mobi域名介绍
  • .NET Remoting学习笔记(三)信道
  • .NET 中 GetProcess 相关方法的性能
  • .NET开源全面方便的第三方登录组件集合 - MrHuo.OAuth
  • @property @synthesize @dynamic 及相关属性作用探究
  • [ C++ ] STL---仿函数与priority_queue
  • [Android]Android开发入门之HelloWorld
  • [Docker]五.Docker中Dockerfile详解
  • [ffmpeg] x264 配置参数解析