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

深度学习 -- 神经网络

1、神经网络的历史

2、 M-P模型

M-P模型是首个通过模仿神经元而形成的模型。在M-P模型中,多个输入节点x_i | i=1,2....,n对应一个输出节点y。每个输入x,乘以相应的连接权重w,然后相加得到输出y。结果之和如果大于阈值h,则输出1,否则输出0。输入和输出均是0或1。

公式2.1:    y = f( \sum_{i=1}^{n}w_ix_i-h)       

M-P模型可以表示AND和OR等逻辑运算。M-P模型在表示各种逻辑运算时,可以转化为单输入单输出或双输入单输出的模型。

取反运算符(NOT运算符)可以使用的单输入单输出的M-P模型来表示。使用取反运算符时,如果输入0则输出1,输入1则输出0,把它们代人M-P模型的公式(2.1),可以得到w_i=-2h = -1

逻辑或(OR运算符)和逻辑与(AND运算符)可以使用双输入单输出M-P模型来表示。各运算符的输人与输出的关系如下表所示。根据表中关系,以OR运算为例时,公式(2.1)中的w,和h分别为w1=1,w2=1,h=0.5,把它们代人公式(2.1)可以得到下式:

公式2.2:y = f(x_1 + x_2 -0.5)

以AND运算为例时,w1=1,w2=1,h=1.5,把它们代人公式(2.1)可以得到下式。
公式2.3:y = f(x_1 + x_2 -1.5)

输入x1输入x2OR运算符的输出AND运算符的输出
0000
0110
1010
1111

由此可见,使用M-P模型可以进行逻辑运算。但是,上述的w,和h是如何确定的呢?当时还没有通过对训练样本进行训练来确定参数的方法,只能人为事先计算后确定。此外,M-P模型已通过电阻得到了物理实现。
 

3、感知器

上节中的逻辑运算符比较简单,还可以人为事先确定参数,但且逻辑运算符w,和h的组合并不仅仅限于前面提到的这几种。罗森布拉特提出的感知器能够根据训练样本自动获取样本的组合。与M-P模型
需要人为确定参数不同,感知器能够通过训练自动确定参数。训练方式为有监督学习,即需要设定训练样本和期望输出,然后调整实际输出和期望输出之差的方式(误差修正学习)。误差修正学习可用公式(3.1)和(3.2)表示。

公式3.1:w_i \leftarrow w_i + a(r-y)x_i

公式3.2:h \leftarrow h - a(r-y)

a是确定连接权重调整值的参数。a增大则误差修正速度增加,a减小则误差修正速度降低。


感知器中调整权重的基本思路如下所示。

  • 实际输出y与期望输出r相等时,w和h不变
  • 实际输出y与期望输出r不相等时,调整w,和h的值

参数w和h的调整包括下面这两种情况。

1:实际输出y=0、期望输出r=1时(未激活)

  • 减小h
  • 增大x7=1的连接权重w
  • x=0的连接权重不变

2:实际输出y=1、期望输出r=0时(激活过度)

  • 增大h
  • 降低x=1的连接权重w
  • x=0的连接权重不变

使用误差修正学习,我们可以自动获取参数,这是感知器引发的一场巨大变革。但是,感知器训练只能解决如下(a)图所示的线性可分问题,不能解决如下(b)图所示的线性不可分问题。为了解决线性不可分问题,我们需要使用多层感知器。

4、多层感知器

为了解决线性不可分等更复杂的问题,人们提出了多层感器印(multilayer perceptron)模型。多层感知器指的是由多多层结构的感知器递阶组成的输入值向前传播的网络,也被称为前馈网络或正向传播网络。

多层感知器通常采用三层结构,由输入层、中间层及输出层组成与公式(2.1)中的M-P模型相同,中间层的感知器通过权重与输入层的各单元(unit)相连接,通过阈值函数计算中间层各单元的输出值。中
间层与输出层之间同样是通过权重相连接。那么,如何确定各层之间的连接权重呢?单层感知器是通过误差修正学习确定输入层与输出层之间的连接权重的。同样地,多层感知器也可以通过误差修正学习确定两层之间的连接权重。误差修正学习是根据输入数据的期望输出和实际输出之间的误差来调整连接权重,但是不能跨层调整,所以无法进行多层训练。因此,初期的多层感知器使用随机数确定输入层与中间层之间的连接权重,只对中间层与输出层之间的连接权重进行误差修正学习。所以,就会出现输入数据虽然不同,但是中间层的输出值却相同,以至于无法准确分类的情况。那么,多层网络中应该如何训练连接权重呢?人们提出了误差反向传播算法。

5、误差反向传播算法

多层感知器中,输入数据从输入层输入,经过中间层,最终从输出层输出。因此,误差反向传播算法就是通过比较实际输出利期望输出得到误差信号,把误差信号从输出层逐层向前传播得到各层的的误差信号,再通过调整各层的连接权重以减小误差。权重的调整主要用梯度下降法(gradient descent method)。如图所示,通过实际输出和期望输出之间的误差E和梯度,确定连接权重w的调整值,得到新的连接权重w'。然后像这样不断地调整权重以使误差达到最小,从中学习得到最优的连接权重w^{opt}。这就是梯度下降法。

下面我们就来看看误差和权重调整值的计算方法。计算误差可以使用最小二乘误差函数(公式6.3)。通过期望输出r和网络的实际输出y计算最小二乘误差函数E。E趋近于0,表示实际输出与期望里输出更加接近。所以,多层感知器的训练过程就是不断调整连接权重w,以使最小二乘误差函数趋近于0。


接着再来看一下权重调整值。根据上述说明,权重需要进行调整以使最小二乘误差函数趋近于0。对误差函数求导就能得到上图中给定点的梯度,即可在误差大时增大调整值,误差小时减小调整值,所以连接权重调整值\Delta w 可以用公式(5.1)表示。

公式5.1:\Delta w = -\eta \frac{\partial E}{\partial w}

\eta 表示学习率,这个值用于根据误差的程度进行权重调整。

通过误差反向传播算法调整多层感知器的连接权重时,一个瓶颈问题就是激活函数。M-P模型中使用step函数作为激活函数,只能输出0或1,不连续所以不可导。为了使误差能够传播,鲁梅尔哈特等人提出使用可导函数sigmoid作为激活函数f(u)。

为了让大家更好地理解误差反向传播算法的过程,下面我们首先以单层感知器为例进行说明。根据复合函数求导法则,误差函数求导如下所示。

公式5.2:\frac{\partial E}{\partial w_i} = \frac{\partial E}{\partial y} \frac{\partial y}{\partial w_i}

设y=f(u),求误差函数E对w的导数。

公式5.3:\frac{\partial E}{\partial w_i} = -(r-y) \frac{\partial y}{\partial w_i} = -(r-y) \frac{\partial f(u)}{\partial w_i}

f(u)的导数就是对复合函数求导。

公式5.4:\frac{\partial E}{\partial w_i} = -(r-y) \frac{\partial f(u)}{\partial u}\frac{\partial u}{\partial w_i}

u对w,求导的结果只和x,相关,如下所示。
公式5.5:\frac{\partial u}{\partial w_i} = x_i

将公式(5.5)带入到公式(5.4)中得到下式。

公式5.6:\frac{\partial E}{\partial w_i} = -(r-y)x_i\frac{\partial f(u)}{\partial u}

这里对sigmoid函数求导。

公式5.7:\frac{\partial E}{\partial w_{ij}} = -(r_j-y_j)\frac{\partial y_j}{\partial u_j}\frac{\partial u_j}{\partial w_{ij}}

下面就和单层感知器一样,对误差函数求导。

公式5.8:\frac{\partial E}{\partial w_{ij}} = -(r_j-y_j)y_j(1-y_j)x_i

权重调整值如下所示

公式5.9:\Delta w_{ij} = \eta (r_j-y_j)y_j(1-y_j)x_i

由上可知,多层感知器中,只需使用与连接权重w_{ij}相关的输入x_i和输出y_i即可计算连接权重调整值。


下面再来看一下包含中间层的多层感知器。首先是只有一个输出单元y的多层感知器,如图所示。w_{1ij} 表示输入层与中间层之间的连接权重,w_{2j1}表示中间层与输出层之间的连接权重。i表示输入层单元, j表示中间层单元。

首先来调整中间层与输出层之间的连接权重。和上面的步骤聚一样,把误差函数E对连接权重w_{2j1}求导展开成复合函数求导。

公式5.10:\frac{\partial E}{\partial w_{2j1}} = \frac{\partial E}{\partial y} \frac{\partial y}{\partial u_{21}} \frac{\partial u_{21}}{\partial w_{2j1}}


与单层感知器一样,对误差函数求导。


公式5.11:\frac{\partial E}{\partial w_{2j1}} = -(r-y) y (1-y)z_j


这里的z表示的是中间层的值。于是,连接权重调整值如下所示。

公式5.12:\Delta w_{2j1} = \eta (r-y)y(1-y)z_j

接下来调整输入层与中间层之间的连接权重。输入层与中间层之间的连接权重调整值是根据输出层的误差函数确定的,求导公式如下所示。

公式5.13:\frac{\partial E}{\partial w_{1ij}} = \frac{\partial E}{\partial y} \frac{\partial y}{\partial u_{21}} \frac{\partial u_{21}}{\partial w_{1ij}} = -(r-y)y(1-y)\frac{\partial u_{21}}{\partial w_{1ij}}

与中间层与输出层之间的权重调整值的计算方法相同,输出y也是把公式展开后进行复合函数求导。与前面不同的是,这里是中间层与输出层单元之间的激活值u_{21}对输入层与中间层之间的连接权重w_{1ij}求导。u_{21}由中间层的值z_{j}和连接权重w_{2j1}计算得到。对z_{j}求导可以得到下式。

公式5.14:\frac{\partial u_{21}}{\partial w_{1ij}} = \frac{\partial u_{21}}{\partial z_{j}}\frac{\partial z_{j}}{\partial w_{1ij}}

最后展开得到的输入层与中间层之间的连接权重调整值如下所示。

公式5.15:\Delta w_{1ij} = \eta (r-y)y(1-y)w_{2j1}z_{j}(1-z_j)x_i

上述步骤的汇总结果如下图所示。由此可见,权重调整值的计算就是对误差函数、激活函数以及连接权重分别进行求导的过程。把得到的导数合并起来就得到了中间层与输出层之间的连接权重。而输入层与中间层之间的连接权重继承了上述误差函数和激活函数的导导数。所以,对连接权重求导就是对上一层的连接权重、中间层与输入层的激活函数以及连接权重进行求导的过程。像这种从后往前逐层求导的过程就称为链式法则(chain rule)。




同理下面让我们看一下有多个输出的多层感知器的权重调整:



多个输出与单个输出的不同之处在于,输入层与中间层之间的权重调整值是相关单元在中间层与输出层之间的权重调整总和。这就会出现无法调整链接权重。这就是误差反向传播算法中梯度消失导致无法调整链接权重。对于这个问题,需要在训练过程中调整学习率\eta以防止梯度消失。

6、误差函数和激活函数

那么,有哪些函数可以作为误差函数呢?在多分类问题中,一般使用交叉恼代价雨数,公式如下所示 :

公式6.1:E = -\sum_{c=1}^{C}\sum_{n=1}^{N}r_{cn}lny_{cn}

二分类中的函数则如下所示 :

公式6.2:E = -\sum_{n=1}^{N}(r_nlny_n+(1-r_n)ln(1-y_n))

递归问题巾使用最小二乘误差函数 

公式6.3:E = \sum_{n=1}^{N}||r_n-y_n||^2

这些是经常使用的误差函数,但误差函数的种类并不仅限于此,我们也可以根据实际问题自行定义误差函数 。

激活函数类似于人类神经元,对输入信号进行线性或非线性变换。 M-P模型中使用 step 函数作为激活函数,多层感知器中使用的 是 sigmoid 函数。 这里,用输入层与中间层之间,或中间层与输 出层之间的连接权重 w_i乘以相应单元的输入值 x_i并将该乘积之和经 sigmoid 函数计算后得到激活值 u。

公式6.4:f(u) = \frac{1}{1+e^{-u}}

公式6.5: u = \sum_{i=1}^{n}w_ix_i

如下图蓝线所示,使用 sigmoid 函数时,如果对输入数据进行 加权求和得到的结果 u 较大则输 1,较小则输出 0。 而 M-P 模型中使 用的是 step 两数(如图中的红线所示),当 u 等于 0 时,输出结果 在 0和1 之间发生刷烈变动 。 另外, sigmoid 函数的曲线变化则较平缓 。

7、似然函数

我们可以根据问题的种类选择似然函数,计算多层感知器的输出结果。 多分类问题中,通常以 softmax函数(公式(7.1))作为似然函数

公式7.1:p(y^k) = \frac{exp(U_{2k})}{\sum_{q=1}^{Q}exp(U_{2q})}

softmax函数的分母是对输出层所有单元(q=l, ...,Q) 的激活 值进行求和,起到了归一化的作用, 输出层中每个单元取值都是介于 0 和 l 之间的概率值,我们选择其中概率值最大的类别作为最终分类结果输出

相关文章:

  • shell 脚本计算距离最近的坐标
  • 1.0 十大经典排序算法
  • 基于运算放大器的电压采集电路
  • Maven安装
  • 计算机组成学习-计算机系统概述总结
  • 一篇带你串通数据结构
  • python+pytest接口自动化(6)-请求参数格式的确定
  • 数据结构与算法-静态查找表
  • Fiddler抓包工具之高级工具栏中的重定向AutoResponder的用法
  • 【网络安全技术】实体认证技术Kerberos
  • Hdoop学习笔记(HDP)-Part.02 核心组件原理
  • 【linux】信号——信号保存+信号处理
  • go使用aes加密算法
  • 详细学习Pyqt5的20种输入控件(Input Widgets)
  • Docker下安装Redis
  • [ 一起学React系列 -- 8 ] React中的文件上传
  • 【翻译】babel对TC39装饰器草案的实现
  • 【跃迁之路】【699天】程序员高效学习方法论探索系列(实验阶段456-2019.1.19)...
  • Github访问慢解决办法
  • Hexo+码云+git快速搭建免费的静态Blog
  • Java程序员幽默爆笑锦集
  • java中的hashCode
  • Mysql优化
  • PAT A1050
  • Theano - 导数
  • Vue UI框架库开发介绍
  • 关于 Linux 进程的 UID、EUID、GID 和 EGID
  • 浅谈JavaScript的面向对象和它的封装、继承、多态
  • 腾讯优测优分享 | 你是否体验过Android手机插入耳机后仍外放的尴尬?
  • 长三角G60科创走廊智能驾驶产业联盟揭牌成立,近80家企业助力智能驾驶行业发展 ...
  • 机器人开始自主学习,是人类福祉,还是定时炸弹? ...
  • #我与Java虚拟机的故事#连载09:面试大厂逃不过的JVM
  • (9)目标检测_SSD的原理
  • (二)基于wpr_simulation 的Ros机器人运动控制,gazebo仿真
  • (附源码)springboot教学评价 毕业设计 641310
  • (入门自用)--C++--抽象类--多态原理--虚表--1020
  • (十) 初识 Docker file
  • (完整代码)R语言中利用SVM-RFE机器学习算法筛选关键因子
  • (原創) 如何使用ISO C++讀寫BMP圖檔? (C/C++) (Image Processing)
  • (中等) HDU 4370 0 or 1,建模+Dijkstra。
  • (转)socket Aio demo
  • (转载)虚幻引擎3--【UnrealScript教程】章节一:20.location和rotation
  • .halo勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .java 指数平滑_转载:二次指数平滑法求预测值的Java代码
  • .mysql secret在哪_MySQL如何使用索引
  • .net core开源商城系统源码,支持可视化布局小程序
  • .net 受管制代码
  • .NET 应用启用与禁用自动生成绑定重定向 (bindingRedirect),解决不同版本 dll 的依赖问题
  • .NET/C# 使用 #if 和 Conditional 特性来按条件编译代码的不同原理和适用场景
  • .Net下的签名与混淆
  • .NET与 java通用的3DES加密解密方法
  • .net专家(高海东的专栏)
  • .set 数据导入matlab,设置变量导入选项 - MATLAB setvaropts - MathWorks 中国
  • //解决validator验证插件多个name相同只验证第一的问题
  • @property python知乎_Python3基础之:property