机器学习之深度学习

本文基于台大机器学习技法系列课程进行的笔记总结。

一、主要内容


topic 1  深度神经网络结构

从类神经网络结构中我们已经发现了神经网络中的每一层实际上都是对前一层进行的特征转换,也就是特征抽取。一般的隐藏层(hidden layer)较少的类神经网络结构我们称之为shallow,而当隐藏层数比较多的类神经网络结构我们称之为deep。如下图所示:


从两者的对比中可以明显发现,随着类神经网络结构的层数逐渐变多,由shallow转向deep,训练的效率会下降,结构变得复杂,那么对应的能力(powerful)呢?实际上shallow的类神经网络已经很强的powerful了,那么多增加layer的目的到底是什么呢?是如何的更加富有意义(meaningful)呢?且往下看:


图中所示的一个非常常见的问题:识别手写体数字的模式识别问题。最原始的特征就是我们的原始数字化的图像(raw features:pixels),从pixels出发,通过第一层的转换我们可以得到一些稍微复杂一点点的features:笔画特征,然后我们再由这些笔画特征开始输入到下一层中,就可以得到更加抽象的认识特征(将像素组合成笔画,然后再由笔画的组成去构成对数字的认识,进而识别数字)。上图中可以看出,数字1可以由第一层的左边三个笔画构成,而数字5可以由第一层右边四个笔画构成,从第一层到第二层,链接权重红色表示抑制,蓝色表示激励,其实就是模仿人类神经元的工作机制(最简单的模仿:激励和抑制)。那么这个手写体数字的模式识别问题就可以通过这一层一层的类神经网络结构得到解决。但是问题是,类神经网络的结构如何确定,模型复杂度如何评估(会不会overfitting呢),以及优化的方式和计算复杂度的评估呢?且看下图总结:


对于第一个问题,如何确定类神经网络的结构,可以通过domain knowledge来解决,比如在图像处理中应用的卷积神经网络,就是利用了像素在空间上的关系。

对于第二个问题,我们知道一个非常经典的关系,overfitting与模型复杂度、数据量、噪声的关系:模型复杂度越大,数据量越小,噪声越大,就越容易发生overfitting,反之亦然。所以,如果我们训练时候的数据量足够大,就完全可以消弭由于模型复杂度带来的overfitting的风险。所以,对于模型复杂度,要保证足够大的数据量。当然,另外一种我们最熟悉的用来抑制模型复杂度的工具就是regularization,通过对噪声的容忍(noise-tolerant)对象不同可以有两种regularization的方式:对网络节点退化可以容忍的dropout以及对输入数据退化可以容忍的denoising,都表现在对噪声的抑制。所以,第二个问题可以通过在数据量上的保证和对噪声的抑制来解决。

对于第三个问题,deep learning的layer越多,权重也就越多,在进行优化的时候就更加容易出现局部最优,因为变量多了,想象一下,似乎连绵起伏的山一样,局部最优的情况也就更加容易发生。那么如果克服发生局部最优的优化问题呢?可以通过一个叫做pre-training的方法,慎重的对权重进行初始化,使得权重一开始就出现在全局最优的那个“山峰”上,然后通过梯度下降或者随机梯度的方式往下滚,直到全局最优。所以,这个pre-training就可以克服局部最优的问题,后面也将是我们讲解的一个重点。

对于第四个问题,计算的复杂度是与deep learning的结构复杂度正相关的,但是不用担心,一个强有力的硬件支持或者架构支持已经被用来进行深度神经网络的训练和计算,那就是GPU或FPGA这种可以进行大量的硬件上的并行计算的处理器。所以第四个问题只要通过选择专用的硬件平台就可以解决。

那么四个问题都加以了分析和解决,我们下面的重点在于pre-training的机制,如何获得较好的网络初始值呢?

上图就是典型的深度神经网络的训练过程,先通过pre-training进行网络参数的初始设置,然后再通过第二步利用误差回传机制对网络参数进行调优(fine-tune)。

那么这个pre-training的具体是如何进行的呢?实际上就是如上图所示,每次只进行两层之间的参数训练,确定之后再往其紧接着的上面两层参数进行训练,就这样逐层的训练。那么训练的机制呢?就是今天的第二个topic,autoencoder,自动编码器。

topic 2  自动编码器

那么我们看,自动编码器是如何实现的。在这之前,先说明一个概念:information preserving,就是信息保持,我们在层与层之间的进行的特征转换实际上就是一个编码的过程,那么一个好的编码就是能够做到information preserving。所以一个好的特征转换就是转换后的特征能够最大限度地保留原始信息,而不至于使得信息变得面目全非。转换后的特征是raw features的一个好的representation。且看下图:

我们还以原来的手写体数字的识别为例,将原始特征(raw features,pixels)转换为笔画特征是一个好的特征转换吗?能够保持原始信息吗?那么如何衡量这个信息是不是丢失了呢?自然而然就想到了,我把数字1的转化成了笔画,那么这些笔画能不能重新组合表示为数字1呢?根据上面的介绍,我们可以做到从1到笔画,然后还可以从笔画再到1的过程。这就是很好的信息保持(information preserving)。那么根据这种由输入通过一层hidden layer,然后再转变为输入的机制去评估信息保持的效果,去衡量特征转化的品质。那么就得到以下的一个训练机制,且看下图:

这就是我们要将的pre-training的机制。由输入经编码权重得到原始数据的特征转换,然后再由特征转换经解码权重得到原始数据的机制。整个映射实际上就是一个identity function,因为输出=输入嘛!

那么实际上我们设计的这个训练过程能够应用到监督学习和非监督学习。对于监督学习,我们可以用来学习数据的informative representation,hidden layer的输出就是。对于非监督学习,我们可以用来进行密度估计(density estimation):当g(x)≈x时的x处的密度更大;还可以用来进行outlier检测:那些g(x)与x相差远的x就可以作为outlier。那些g(x)≈x的隐藏层输出,能够作为x的典型表示(typical representation)。

因此,一个基本的autoencoder的完整流程就有了,且看下图:

因为上面解释的就比较多了,下面就不再对这个流程进行详细说明。一个需要点出的就是使得编码权重Wij与解码权重Wji相等可以用来作为一种形式的regularization。而整个训练一层一层的进行实际上就是一个只有两层的类神经网络,进行误差回传和梯度下降计算的复杂度都不会很大。

有了pre-training,于是乎我们的deep learning的过程就变成了下图:

上面讲完了通过pre-training得到较好的初始权重,以便于整个deep learning能够在开始训练的时候就站在一个非常好的位置,即在一定程度上避免由于模型结构复杂度导致的overfitting发生的风险。由此引出的autoencoder。

那么前面讲为了克服overfitting的风险,还可以从另一个角度:noise的角度出发。下面我们就进行denoising autoencoder的相关内容。

topic 3  去噪自动编码器

在类神经网络中其实已经介绍过一些用于regularization的方法,比如通过限制模型输出的精度、权重的消减或者提前终止训练等,那么下面介绍的是一种比较另类的regularization的方法。

上面说了,基于消除噪声的方式,一般直接的想法或者常用的是data cleaning/pruning,那么我们这里介绍的也不是这种常规的方法,而是一种反向思维的方式:如果我直接往输入数据中加入人工的噪声呢?会发生什么样的情况。这就是我们下面要探讨的去噪自动编码器。

这种往input中添加噪声的思维是以robustness健壮性出发的,试想如果我加完噪声后的数据作为输入,经过编码和解码后,如果输出依然等于加入噪声前的数据,这样的类神经网络结构是不是非常的稳健,也就说抗干扰能力很强。基于此想法,我们就得到denoising autoencoder的方法,且看下图

所以输入时x+人工噪声,标签是x,这样来对网络进行训练,这样的神经网络结构自然就具备了denosing的效果。

topic 4  线性自动编码器与主成分分析

所以前面讲的都是直接基于非线性映射的结构,而一般上我们常常是先通过线性的解释,然后再拓展至非线性。那么我们看看线性自动编码器是怎样的,看下图:

我们依然通过平方误差进行推导,推导过程见下图,总之就是一堆矩阵的运算,如果学过矩阵分析课程看起来并不复杂,实际上就是进行谱分解,看不懂也没关系,只要知道处理过程就好,求输入矩阵的最大特征值和其对应的特征向量,实际上这也是PCA处理的过程(PCA基于matlab的代码链接,小弟资源分不够,求个资源分勿怪)。

那么实际上,linear 的autoencoder实际上与主成分分析是非常相近的,只不过主成分分析具有统计学的说明。进行特征转换后的方差要大。我们把数据进行零均值化作为autoencoder的输入,结果就跟PCA一样了。具体的关系可以看下图说明:

*************************************************************************************************************************************

通过以上的介绍,相信对整个deep learning的架构有了一定认识,当然这里面介绍的大部分都是入门级的知识,不过有了一个guideline之后,再去对更加细节的设计方法进行学习时就能有更加宏观方向的把握。


转载于:https://www.cnblogs.com/huty/p/8519323.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/405422.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

FlexViewer2.3中拉帘Widget下载

http://www.giser.net/?p280 由于最新的ArcGIS API for flex2.x使用了Flex SDK4,因此造成了对之前ArcGIS API for flex1.x制 作的拉帘Widget无法使用,因此重新制作了拉帘工具供大家使用。 下载地址: Swipe 使用方法:将下载后的sw…

五种I/O 模式——阻塞(默认IO模式),非阻塞(常用语管道),I/O多路复用(IO多路复用的应用场景),信号I/O,异步I/O

From: http://blog.163.com/xychenbaihuyeah/blog/static/13222965520112163171778/ 五种I/O 模式: 【1】 阻塞 I/O (Linux下的I/O操作默认是阻塞I/O,即open和socket创建的I/O都是阻塞I/O) 【2】 非阻塞 I/O (可以通过f…

Linux tm time_t timeval timespec以及与时间相关函数用法

一、时间类型 linux中编程通常需要用到时间变量&#xff0c;和相关的时间操作函数。常用的时间类型有&#xff1a; time_t 、struct timeval、struct timespec、struct tm。 在用到相关的类型和函数时&#xff0c;需要加上头文件&#xff1a;#include <time.h> …

C语言编程对缓冲区的理解

解析C语言编程对缓冲区的理解 转载自&#xff1a;http://soft.chinabyte.com/database/47/12481547.shtml 下面介绍缓冲区的知识。 一、什么是缓冲区 缓冲区又称为缓存&#xff0c;它是内存空间的一部分。也就是说&#xff0c;在内存空间中预留了一定的存储空间&#xff0c;这些…

ftp文档服务器设置,ftp服务器基本设置

ftp服务器基本设置 内容精选换一换在迁移Agent中输入华为云账号AK/SK以后&#xff0c;AK/SK校验失败。Windows系统提示用户&#xff1a;"AK/SK authentication failed. Ensure that the system time is consistent with the standard time and the AK and SK are corre服务…

树莓派移植SX1278 LoRa通信--使用wiringPiSPI移植SPI通信接口

一、SPI接口 树莓派3B上的SPI接口如下所示&#xff0c;有两组SPI&#xff0c;分别由CE0和CE1来进行选择。 首先查看树莓派的SPI是否启用&#xff0c;在/dev查看是否有spidev0.0和spidev0.1 如果不存在spi设备号&#xff0c;需要在raspi-config中启用&#xff0c;在命令行输入&…

饥荒专用服务器全图显示代码,饥荒开全图代码

用记事本打开游戏目录\data\DLC0001\scripts\prefabs\player_common.lua文件&#xff0c;在inst:AddComponent("resurrectable")下一行插inst:AddComponent("resurrectable")下一行插入以下内容&#xff1a;  TheInput:AddKeyUpHandler(KEY_1&#xff0c…

树莓派移植SX1278 LoRa通信--使用wiringPi 移植GPIO中断

一、SX1278 数字接口状态映射 从官方文档可知sx1278的数字接口状态映射明细&#xff0c;移植的代码中主要用查询的方式来判断在连续模式下是否接收和发送完成&#xff0c;因此只需要用到DIO0。如果要用到CAD&#xff0c;则需要DIO1管脚。 发送时&#xff1a;DioMapping1寄存器…

VMware View 与 Citrix Xendesktop 管理大比拼

一篇写得非常不错的博文&#xff0c;从管理角度来对比虚拟桌面产品的差异&#xff0c;而这一点往往被代理商和用户忽略&#xff0c;值得花时间看看。 大部分用户决定使用桌面虚拟化的最大原因是简化管理。我深刻的记得2006年在X福记用户那推补丁管理软件时&#xff0c;结…

matlab 画箱线图boxplot简单用法

代码示例&#xff1a; data1rand(5,1);%列向量 data2rand(5,1);%列向量 data3rand(5,1);%列向量 data[data1,data2,data3]; boxplot(data,Labels,{data1,data2,data3}); 更多请参考&#xff1a; matlab官网文档&#xff1a;https://www.mathworks.com/help/stats/boxplot.htm…

“FormCRUD.csProj.FormMain.Name”隐藏了继承的成员“System.Windows.Forms.Control.Name”。如果是有意隐藏,请使用关键字 new。...

“FormCRUD.csProj.FormMain.Name”隐藏了继承的成员“System.Windows.Forms.Control.Name”。如果是有意隐藏&#xff0c;请使用关键字 new。 一旦运行就显示&#xff1a;“FormCRUD.csProj.FormMain.Name”隐藏了继承的成员“System.Windows.Forms.Control.Name”。如果是有意…

VC++文件监控(一) ReadDirectoryChangesW

From: http://www.cnblogs.com/doublesnke/archive/2011/08/16/2141374.html VC实施文件监控&#xff1a;实例和详解 相关帮助: http://hi.baidu.com/jiahaosoft/blog/item/b441d1218eebece0d6cae274.html 我这里只介绍采用ReadDirectoryChangesW对文件目录实施监控 关键代码…

深度学习--Matlab使用LSTM长短期记忆网络对负荷进行分类

一、概述 关于LSTM同系列的前一篇文章写的是利用LSTM网络对电力负荷进行预测【LSTM预测】&#xff0c;其本质是sequence-to-sequence problems&#xff0c;序列到序列的预测应用。这里做一下sequence-to-label classification problems&#xff0c;序列到标签的分类应用【LSTM…

VC跨进程数据(结构体)传递-WM_COPYDATA

两个测试程序&#xff0c;都是MFC基于对话框的应用程序&#xff0c;一个是发送者&#xff0c;一个是接收者。 两个程序都使用同一个结构体&#xff1a; typedef struct {char imsi[20];char options[512]; }_tagResult;发送者&#xff1a;按钮点击事件&#xff1a; void CCa…

咨询的真相8:咨询业的“前世今生”

第四节 咨询业的奶酪究竟有多大 2001年&#xff0c;又是从美国&#xff0c;传来了一本风靡全球的畅销书&#xff0c;讲的是四个老鼠和一块奶酪的故事。从此&#xff0c;奶酪就成了众人争抢之物的代名词。美国人的创新精神不得不佩服&#xff0c;忒俗的一个道理经他们仅从形式上…

带界面的OCX制作实例

制作一个有界面的OCX&#xff0c;并进行测试。代码下载 一、制作一个有界面的OCX&#xff1a; 设置该对话框的属性&#xff08;关键噢&#xff09;&#xff1a; 给添加的对话框资源关联一个类CDlgTest&#xff0c;基类是&#xff1a;CDialog&#xff0c;如下&#xff1a; 给CO…

从淘宝数据结构来看电子商务中商品属性设计

淘宝名词解释 产品 和 商品的区别: 淘宝标准化产品&#xff0c;由类目关键属性唯一确定。如&#xff1a;手机类目&#xff0c;关键属性是品牌和型号&#xff0c;Nokia N95就是一个产品,nokia是品牌&#xff0c;N95是型号。产品除了关键属性还包括一般信息、销售属性和非关键属性…

linux串口驱动分析

linux串口驱动分析硬件资源及描述 s3c2440A 通用异步接收器和发送器&#xff08;UART&#xff09;提供了三个独立的异步串行 I/O&#xff08;SIO&#xff09;端口&#xff0c;每个端口都可以在中断模式或 DMA 模式下操作。UART 使用系统时钟可以支持最高 115.2Kbps 的波特率。每…

Linux 进程通信 -- 信号

一、概述 信号用于保持进程间的通信&#xff0c;可以备发送到一个进程或者一组进程&#xff0c;发送给进程的这个唯一信息通常是标志信号的一个数。信号可从键盘终端产生、虚拟内存中非法访问系统资源等情况下产生。信号异步发生&#xff0c;收到信号的进程可以采取某种动作或…

简单理解Socket

&#xfeff;&#xfeff;TCP/IP 要想理解socket首先得熟悉一下TCP/IP协议族&#xff0c; TCP/IP&#xff08;Transmission Control Protocol/Internet Protocol&#xff09;即传输控制协议/网间协议&#xff0c;定义了主机如何连入因特网及数据如何再它们之间传输的标准&…