[Python人工智能] 七.加速神经网络、激励函数和过拟合

2023-11-14

从本系列文章开始,作者正式开始研究Python深度学习、神经网络及人工智能相关知识。前六篇文章讲解了神经网络基础概念、Theano库的安装过程及基础用法、theano实现回归神经网络、theano实现分类神经网络、theano正规化处理,这篇文章讲解加速神经网络训练的方法,为什么有激励函数以及过拟合,均是基础性知识。主要是学习"莫烦大神" 网易云视频的在线笔记,后面随着深入会讲解具体的项目及应用。基础性文章和在线笔记,希望对您有所帮助,本系列作者采用一篇基础一篇代码的形式讲解,也建议大家一步步跟着学习,同时文章中存在错误或不足之处,还请海涵~

"莫烦大神" 网易云视频地址:http://study.163.com/provider/1111519/course.html

同时推荐前面作者另外三个Python系列文章。

从2014年开始,作者主要写了三个Python系列文章,分别是基础知识、网络爬虫和数据分析。

这里写图片描述 这里写图片描述 这里写图片描述

前文参考:
[Python人工智能] 一.神经网络入门及theano基础代码讲解
[Python人工智能] 二.theano实现回归神经网络分析
[Python人工智能] 三.theano实现分类神经网络及机器学习基础
[Python人工智能] 四.神经网络和深度学习入门知识
[Python人工智能] 五.theano实现神经网络正规化Regularization处理
[Python人工智能] 六.神经网络的评价指标、特征标准化和特征选择

 

PSS:最近参加CSDN2018年博客评选,希望您能投出宝贵的一票。我是59号,Eastmount,杨秀璋。投票地址:https://bss.csdn.net/m/topic/blog_star2018/index


五年来写了314篇博客,12个专栏,是真的热爱分享,热爱CSDN这个平台,也想帮助更多的人,专栏包括Python、数据挖掘、网络爬虫、图像处理、C#、Android等。现在也当了两年老师,更是觉得有义务教好每一个学生,让贵州学子好好写点代码,学点技术,"师者,传到授业解惑也",提前祝大家新年快乐。2019我们携手共进,为爱而生。

 

一. 为什么需要激励函数

首先,为什么需要激励函数(Activation Function)呢?

因为现实并没有我们想象的美好,激励函数是为了解决我们日常生活中不能用线性概括的问题而提出,如二分类问题。假设女生越漂亮,喜欢的男生人数越多,这是一个线性方程(Linear)问题,但假设场景发生在校园里,校园里男生人数有限,这就变成了一个非线性问题,并且女生不可能是无线漂亮的。
 


神经网络中的每个节点接受输入值,并将输入值传递给下一层,输入节点会将输入属性值直接传递给下一层(隐层或输出层)。在神经网络中,隐层和输出层节点的输入和输出之间具有函数关系,这个函数称为激励函数。

 


首先把整个神经网络简化为一个式子:y = W · x
其中,y称为预测值、W是参数、x称为输入值。那么,非线性方程如何描述这个问题呢?我们增加一个AF()函数,如下所示。
 

 

非线性方程:y = AF( W · x )
其中,AF就是所谓的激励函数。如下所示,常见的激励函数包括relu(x为-1时值为0,x为1时值为1)、sigmoid、tanh等。这些激励函数能够强行将原有线性结构弄弯,使输出结果具有非线性特征。
Sigmoid函数:是连续、可导、有界,关于原点对称的增函数,呈S形,具体可用反正切函数arctan或指数函数exp来实现,如f(x)=arctan(x)/(pi/2), f(x)=1/(1+e-x)。
 


我们甚至可以创造自己的激励函数,但需要保证它们是可以微分的,因为误差反向传递时,只有这些可微分的激励函数才能把误差传递回去(不太理解)。
 


当使用AF激励函数,如果神经层只有2-3层时,对于隐藏层使用任意激励函数都能掰弯直线,而当存在多层神经层时,随意选择AF会造成梯度爆炸、梯度消失等问题。
激励函数选择:
  1.少量神经层,多种选择;
  2.卷积神经网络,使用Relu;
  3.循环神经网络,使用Relu、Tanh。
 

  

 

 

 

二. 什么是过拟合

实际生活中,机器学习过于自信,甚至自负,在自己的小圈子里非凡,但在大圈子里却处处碰壁。机器学习中的自负表现在哪些方面呢?
 

  

 

 

 

这条直线是希望机器学习学到的直线。假设蓝色直线与所有黄色点的总误差为10,有时机器过于追求误差小,它学到的可能是红色这条虚曲线,它经过了所有的数据点,误差为1。
 

 

可是,误差小真的好吗?当我们拿这个模型预测实际值时,如下图所示“+”号;这时,蓝色误差几乎不变,而红色误差突然升高,而红线不能表达除训练数据以外的数据,这就叫做过拟合。
 


同样,分类中的过拟合如下图所示,有黄色两个“+”号没有很好的被分隔,这就是过拟合在作怪。

 

 

那么,怎么解决过拟合呢?
方法一:增加数据量
大多数过拟合的原因是数据量太小,如果有成千上万数据,红线也会被拉直,没有这么扭曲,所以增加数据量能在一定程度上解决过拟合问题。

方法二:L1, L2 Regularization
正规化是处理过拟合的常见方法,该方法适合大多数机器学习。
机器学习:y = W · x
其中,W是参数。过拟合中W往往变化太大,为了让变化不会太大,我们在计算误差时需要做些手脚。
     L1:cost = (Wx - real y)^2 + abs(W)
=>L1正规化是预测值与真实值平方,加上W的绝对值

     L2:cost = (Wx - real y)^2 + (W)^2

=>L2正规化是预测值与真实值平方,加上W的平方
     L3:加立方,L4:加四次方

由于过度依赖的W会很大,我们在上述L1和L2公式中惩罚了这些大的参数。如果W变化太大,我们让cost也跟着变大,变成一种惩罚机制,把W自己也考虑进来,从而解决过拟合。

 



方法三:Droput Regularization
该方法是训练时,随机忽略一些神经元和连接,神经网络会变得不完整,用不完整的神经网络训练一次,紧接着第二次再随机训练,忽略另一部分的神经元和连接,让每次结果不依赖特定的神经元,Droput从根本上解决过拟合。

 

  

 

 

 

 

 

三. 加速神经网络

Speed Up neural network training process
如何加速神经网络训练呢?

越复杂的神经网络,越多的数据,我们需要花费在神经网络上的时间就越多,其原因是计算量太大了,可是往往为了解决复杂的问题、复杂的结构和大数据,又是不可避免的。所以我们需要找一些方法,让神经网络变得聪明起来、快起来。

 

  


最简单方法:SGD(Stochastic Gradient Descent)

 

假设红色方块是我们要训练的数据Data,如果使用普通的训练方法,需要重复的将整套数据放入神经网络NN中训练,这样消耗的计算资源会很大。我们需要换一种思路,将数据拆分成小批小批的,然后再分批不断放入NN中计算,这就是SGD的正确打开方式。

 

SGD每次使用批量数据,虽然不能反映整体数据的情况,但在很大程度上加速神经网络的训练过程,而且不会丢失太多准确率。

 

  

 

如果还是嫌SGD训练速度太慢,怎么办呢?
事实证明,SGD并不是训练最快的方法,图中红线是SGD的训练过程,时间相对较长,其他途径可以加速训练。
 

 

 


方法二:Momentum
大多数其他方法是在更新神经网络参数时动手脚,如下所示:

 

 

W += - Learning rate * dx

参数W的更新,是将原始W累加上一个负的学习效率(Learning rate)乘以校正值(dx),这种方法可能会让学习过程曲折无比,看起来就像一个喝醉酒的人回家时摇摇晃晃走了很多弯路,所以我们把这个人从平地上放到斜坡上,只要他往下坡的方向走一点点,由于向下的惯性,他走的弯路也会不自觉的变小 ,称为Momentum的方法,它的数学形式如下所示。

 

m = b1*m - Learning rate * dx

W += m

 

 

方法三:AdaGrad
该方法是在学习率上动手脚,使得每一个参数的更新都有与众不同的学习效率,它的作用和Momentum类似,不过不是给喝醉的人安排一个斜坡,而是给喝醉酒的人一双不好走的鞋子,使得他摇晃走路时,发现脚疼,鞋子变成了走弯路的阻力,逼着他往前直着走,它的数学形式如下。

 

v += dx^2

W += -Learning rate * dx / √v
 

 


方法四:RMSProp
如果把下坡和不好走的鞋子结合起来,是不是就更好呢?我们这就有了RMSProp方法,通过Momentum的惯性原则,加上AdaGrad对错误发生了阻力,就合并成如下所示的RMSProp,同时具有两则优点。

 

 



不过细心的同学可能发现了RMSProp中少了些什么?原来我们是没有完全合并Momentum,少了Momentum中的“-Learning rate * dx”部分,所以我们会在Adam中补上这种想法。
计算m时有Momentum的下坡属性,计算v时有AdaGrad的阻力属性 ,然后再更新参数时,把m和v都考虑进去。实验证明,大多数使用Adam都能又快又好的达到目标,迅速收敛,所以在加速神经网络训练时,一个下坡,一双破鞋,就能实现。

 





基础性文章,希望对您有所帮助,推荐大家阅读莫烦大神的学习视频,也建议大家一步步跟着学习,同时文章中存在错误或不足之处,还请海涵~真是太忙了,有时候挤点时间出来写文章,才能让自己放平心态,谁又能写一辈子博客呢?又有几个人能做自己喜欢的事情,哎。看到学生也开始写文章,还是高兴的。
(By:Eastmount 2018-06-25 晚上12点
  http://blog.csdn.net/eastmount/ )

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

[Python人工智能] 七.加速神经网络、激励函数和过拟合 的相关文章

随机推荐

  • Altium Designer使用-----如果Bill of Materials卡住

    Altium Designer使用 如果Bill of Materials卡住 是没有安装office软件
  • 01背包问题

    01 背包问题 输入 n个商品组成集合O 每个商品有两个属性vi和pi 分别表示体积和价格 背包容量为C 输出 求解一个商品子集包含于O 令价格和最大 容量不超过C 直观上 价格高优先 体积小优先 性价比高优先 都不能得到最优解 解决方案一
  • JDK以及IDEA的安装和配置【JAVA学习--安装配置学习工具】

    目录 一 JDK的安装和环境配置 1 准备工作 2 配置JDK环境变量 3 验证环境配置是否成功 二 安装配置IDEA 创建项目 一 JDK的安装和环境配置 1 准备工作 在Oracal官方网站下载适合自己电脑版本的JDK 并进行安装 注意
  • Linux 查看操作系统

    转载 linux查看操作系统版本信息 这个常用 放在这里备忘 转载上面的链接 一 linux下如何查看已安装的centos版本信息 1 Linux查看当前操作系统版本信息 cat proc version Linux version 2 6
  • Oracle入门笔记(一)——环境配置及简单介绍

    Oracle环境配置及目录结构说明 1 引言 2 Oracle简介 3 Oracle版本迭代说明 4 Oracle的安装与配置 5 Oracle数据库目录介绍 6 Oracle用户说明 7 Oracle启动与关闭 8 参考文献 1 引言 害
  • 负载测试和压力测试的区别

    这两个测试都属于性能测试的一部分 我之前都一直有盲区 每次想起对于这两个概念都不是很清晰 在网上看了一篇文章后 终于有些理解了 特记录下来方便大家理解 这个是网上看到的一篇文章 如果大家还是有些不懂可以在参考一下这篇文章 我所理解的性能测试
  • tp6重定向

    引入 use think exception HttpResponseException 方法 public function redirect args throw new HttpResponseException redirect a
  • 计算机毕业设计-社区疫情防控管理系统springboot-小区疫情管理系统java代码

    计算机毕业设计 社区疫情防控管理系统springboot 小区疫情管理系统java代码 注意 该项目只展示部分功能 如需了解 评论区咨询即可 1 开发环境 开发语言 Java 架构 B S 框架 SpringBoot 前端 HTML CSS
  • Docker-容器

    容器 容器的状态用 docker contaier ls 启动容器 启动一个容器的终端 并允许交互 docker run it ubuntu 16 04 bin bash 当利用 docker run 来创建容器时 Docker 在后台运行
  • uvm message printing mechnism

    原文链接 http www sunburst design com papers CummingsSNUG2014AUS UVM Messages pdf 本文主要介绍了如何控制消息打印的等级 以及禁止消息打印等
  • 使用nginx+uwsgi+flask实现python服务的负载均衡---(2)uwsgi的安装

    0 安装uwsgi 转自官网 使用pip install uwsgi就可以 当然了也可以下载源码自己make 1 配置uwsgi uwsgi 有多种配置可用 1 ini 2 xml 3 json 4 yaml 这里我使用的ini 当然也可以
  • selenium-server-standalone selenium-server 和 selenium-java 的区别

    selenium1 0还是 seleniumRC的时候 需要启动selenium server standalone包 用来做server selenium RC通过server来给code和broswer建立通道 同时 该jar包包括我们
  • BATJ面试必会之Java IO 篇

    一 概览 二 磁盘操作 三 字节操作 实现文件复制 装饰者模式 四 字符操作 编码与解码 String 的编码方式 Reader 与 Writer 实现逐行输出文本文件的内容 五 对象操作 序列化 Serializable transien
  • DDL和DML常用语句总结

    DDL语句 常用来操作数据库 数据库表 用到的语句 create show alter drop 1 操作数据库 CRUD 1 C Create 创建 创建数据库 create database 数据库名称 创建数据库 判断不存在 再创建
  • 前端页面性能优化 - 字体加载优化

    相比于英文的字库来说 中文字库的体积非常之大 小则1M 动辄几十 M 的体积非常常见 所以在前端页面性能优化中 字体加载的优化就显得尤为重要 阅读了相关的知识和文章 在研究了市面上字体加载方案之后 我总结出了目前可行的方案 1 font s
  • 实对称矩阵的特征值求法_机器学习与线性代数 - 特殊矩阵

    在线性代数中 有一些特殊的矩阵具有易于分析和操作的特性 它们的特征向量可能具有特定的特征值或特殊关系 还有一些方法可以将一个矩阵分解成这些 更简单 的矩阵 操作复杂性的降低提高了可伸缩性 然而 即使这些矩阵都是特殊的 它们也不是罕见的 在机
  • linux创建文件软连接和硬链接详解

    前言 linux系统中链接文件仔细区分可以分为软连接 符号链接 和硬链接 软链接比硬链接应用更广泛 所以也可以认为linux链接文件就是指软链接文件 本文将会在第2部分介绍创建软链接和硬链接的基本命令 在第3部分从linux文件系统的角度出
  • 联合体union在立体几何中的妙用

    联合体union在立体几何中的妙用 为了更好地理解三维游戏编程 我开始研究了立体几何 注意 是立体解析几何 里面涉及到了很多元组 向量和矩阵的知识 虽然还有
  • 编写一个密码类,其中包含一个 str 密码字符串私有成员数据,一个“==”运算 符重载成员函数,用于比较用户输入的密码是否正确。并用数据测试该类。

    define CRT SECURE NO WARNINGS 编写一个密码类 其中包含一个 str 密码字符串私有成员数据 一个 运算 符重载成员函数 用于比较用户输入的密码是否正确 并用数据测试该类 include
  • [Python人工智能] 七.加速神经网络、激励函数和过拟合

    从本系列文章开始 作者正式开始研究Python深度学习 神经网络及人工智能相关知识 前六篇文章讲解了神经网络基础概念 Theano库的安装过程及基础用法 theano实现回归神经网络 theano实现分类神经网络 theano正规化处理 这