深度学习@产品程序员

机器学习常用神经网络架构和原理

2018-01-18  本文已影响174人  _两只橙_

一、为什么需要机器学习?

有些任务直接编码较为复杂,我们不能处理所有的细微之处和简单编码,因此,机器学习很有必要。相反,我们向机器学习算法提供大量数据,让算法不断探索数据并构建模型来解决问题。比如:在新的杂乱照明场景内,从新的角度识别三维物体;编写一个计算信用卡交易诈骗概率的程序。

机器学习方法如下:它没有为每个特定的任务编写相应的程序,而是收集大量事例,为给定输入指定正确输出。算法利用这些事例产生程序。该程序与手写程序不同,可能包含数百万的数据量,也适用于新事例以及训练过的数据。若数据改变,程序在新数据上训练且被更新。大量的计算比支付手写程序要便宜的多。

机器学习的应用如下:

1、模式识别:识别实际场景的面部或表情、语言识别。

2、识别异常:信用卡交易顺序异常,核电厂传感器读数模式异常。

3、预测:未来股价或货币汇率,个人观影喜好。

二、什么是神经网络?

神经网络是一种通用机器学习模型,是一套特定的算法集,在机器学习领域掀起了一场变革,本身就是普通函数的逼近,可以应用到任何机器学习输入到输出的复杂映射问题。一般来说,神经网络架构可分为3类:

1、前馈神经网络:是最常见的类型,第一层为输入,最后一层为输出。如果有多个隐藏层,则称为“深度”神经网络。它能够计算出一系列事件间相似转变的变化,每层神经元的活动是下一层的非线性函数。

2、循环神经网络:各节点之间构成循环图,可以按照箭头的方向回到初始点。循环神经网络具有复杂的动态,难以训练,它模拟连续数据,相当于每个时间片段具有一个隐藏层的深度网络,除了在每个时间片段上使用相同的权重,也有输入。网络可以记住隐藏状态的信息,但是很难用这点来训练网络。

3、对称连接网络:和循环神经网络一样,但单元间的连接是对称的(即在两个方向的连接权重相同),它比循环神经网络更容易分析,但是功能受限。没有隐藏单元的对称连接的网络被称为“Hopfiels网络”,有隐藏单元的对称连接的网络则被称为“波兹曼机器”。

三、感知机(Perceptron)

作为第一代神经网络,感知机是只有一个神经元的计算模型。首先将原始输入矢量转化为特征矢量,再用手写程序定义特征,然后学习如何对每个特征加权得到一个标量,如果标量值高于某一阈值,则认为输入矢量是目标类的一个积极样例。标准的感知机结构是前馈模型,即输入传送到节点,处理后产生输出结果:从底部输入,顶部输出,如下图所示。但也有其局限性:一旦确定了手写编码特征,在学习上就受到了较大限制。这对感知器来说是毁灭性的,尽管转换类似于翻译,但是模式识别的重点是识别模式。如果这些转换形成了一个组,学习的感知器部分不能学会识别,所以需要使用多个特征单元识别子模式的转换。

没有隐藏单元的网络在输入输出映射建模上也有很大局限性。增加线性单元层也解决不了,因为线性叠加依然是线性的,固定的非线性输出也不能建立这种映射。因此需要建立多层自适应的非线性隐藏单元。

四、卷积神经网络(Convolutional Neural Network)

一直以来,机器学习研究广泛集中在对象检测上,但仍有诸多因素使其难以

识别对象:1.对象分割、遮挡问题;2.照明影响像素强度;3.物体以各种不同的形式展现;4.相同功能的对象具有不同的物理形状;5.视觉不同带来的变化;6.维度跳跃问题。

复制特征方法是当前CNN用于目标检测的主要方法,大规模的复制不同位置上相同的特征检测图,大大减少了要学习的自由参数数量。它使用不同的特征类型,每种类型都有自己的复制检测图,也允许以各种方式表示每个图像块。

CNN可用于手写数字识别到3D对象识别等,但从彩色图像中识别对象比手写数字识别要复杂,它的类别、像素是数字的100倍(1000 vs 100,256256彩色vs2828灰度)。

2012年的ILSVRC-2012竞赛中的ImageNet提供一个包含120万张高分辨率训练图像的数据集。测试图像没有标注,参赛者需要识别图像中对象的类型。获胜者 Alex Krizhevsky开发了一个深度卷积神经网络,除了一些最大池化层,架构还有7个隐藏层,前面都是卷积层,最后2层是全局连接。激活函数在每个隐藏层都是线性单元,比逻辑单元速度更快,还使用竞争性规范标准抑制隐藏活动,有助于强度变化。硬件上,在两个Nvidia GTX 580 GPU(超过1000个快速内核)上使用一个高效卷积网络实现,非常适合矩阵乘法,具有很高的内存带宽。

五、循环神经网络( Recurrent Neural Network)

循环神经网络(RNN)有两个强大的属性可以计算任何计算机计算出来的东西:(1)允许存储大量有效信息的分布式隐藏状态(2)用复杂的方式允许更新隐藏状态的非线性动态。RNN强大的计算能力和梯度消失(或爆炸)使其很难训练。通过多层反向传播时,若权重很小,则梯度呈指数缩小;若权重很大,则梯度呈指数增长。典型的前馈神经网络的一些隐藏层可以应对指数效应,另一方面,在长序列RNN中,梯度容易消失(或爆照),即使有好的初始权重,也很难检测出当前依赖于多个时间输入的目标输出因此很难处理远程依赖性。

学习RNN的方法如下:

长短期记忆:用具有长期记忆值的小模块制作RNN。

Hessian Free Optimization:使用优化器处理梯度消失问题。

回声状态网络:初始化输入→隐藏和隐藏→隐藏和输出→隐藏链接,使隐藏状态有一个巨大的弱耦合振荡器储备,可以选择性的由输入驱动。

用动量初始化:和回声状态网络一样,再用动量学习所有连接。

六、长短期记忆网络(Long/Short Term Memory Network)

Hochreiter & Schmidhuber(1997年)构建了长短期记忆网络,解决了获取RNN长时间记忆问题,使用乘法逻辑线性单元设计存储单元,只要保持“写入”门打开,信息就会写入并保持在单元中,也可以打开“读取”门从中获取数据。

RNN可以阅读行书,笔尖的输入坐标为(x,y,p),p代表笔是向上还是向下,输出则为一个字符序列,使用一系列小图像作为输入而不是笔坐标。Graves & Schmidhuber(2009年)称带有LSTM的RNN是阅读行书的最佳系统。

七、霍普菲尔德网络(Hopfield Networks)

非线性循环网络有很多种表现方式,较难分析:能达到稳定、震荡或馄饨状态这三种表现形式。Hopfield网络是由有循环连接的二进制阈值单元组成。1982年,约翰·霍普菲尔德发现,如果连接对称,则存在一个全局能量函数,整个网络的每个二进制“结构”都有能量,而二进制阈值决策规则使网络为能量函数设置一个最小值。使用这种计算类型最简单的方法是将记忆作为神经网络的能量最小值。使用能量最小值表示记忆给出了一个内容可寻内存,可通过了解局部内容来访问整个项目。

每记忆一次配置,都希望能产生一个能量最小值。但若有两个最小值就会限制Hopfield网络容量。伊丽莎白·加德纳发现有一个更好的存储规则,它使用了所有的权重。而不是试图一次存储多个矢量,她通过训练集进行多次循环,并用感知器收敛程序训练每个单元,使该矢量的所有其它单元具有正确的状态。

八、玻尔兹曼机(Boltzmann Machine Network)

玻尔兹曼机是一种随机循环神经网络,可以被看作是Hopfield网络的随机生成产物,是最先学习内部representations的神经网络之一。该算法旨在最大限度地提高机器在训练集中分配给二进制矢量的概率的乘积,相当于最大化其分配给训练矢量的对数概率之和,方法如下:(1)网络没有外部输入时,使网络在不同时间分布稳定;(2)每次对可见矢量采样。

2012年,Salakhutdinov和Hinton为玻尔兹曼机写了有效的小批量学习程序。2014年将模型更新,称之为受限玻尔兹曼机,详情请查看原文。

九、深度信念网络(Deep Belief Network)

反向传播,是人工神经网络计算处理一批数据后每个神经元的误差分布的标准方法,但是也存在一些问题。首先要标注训练数据,但几乎所有数据都没有标注;其次,学习时间不足,这意味着隐藏层数较多的网络较慢;第三,可能会使局部陷入最不利局面。因此,对于深度网络来说这远远不够。

无监督学习方法克服了反向传播的限制,使用梯度方法调整权重有助于保持架构的效率和简单性,还可以将它用于对感官输入结构建模。特别的是,它调整权重,将产生感官输入的生成模型概率最大化。信念网络是由随机变量组成的有向非循环图,可推断未观测变量的状态,还可以调整变量间的交互,使网络更可能产生训练数据。

早期图形模型是专家定义图像结构和条件概率,这些图形是稀疏连接的,他们专注于做正确的推论,而不是学习。但对于神经网络来说,学习是重点,其目的不在于可解释性或稀疏连接性使推断变得更容易。

十、深度自动编码器(Deep Auto-encoders)

该架构提供了两种映射方式,好像是一个做非线性降维非常好的方法,它在训练事例的数量上是线性的(或更好的),而最终编码模型相当紧凑和快速。然而,使用反向传播优化深度自动编码器很困难,若初始权重较小,反向传播梯度会消失。我们使用无监督逐层预训练或像回声状态网络一样认真的初始化权重。

对于预训练任务有三种不同类型的浅自动编码器:
(1)RBM作为自动编码器;
(2)去噪自动编码器;
(3)压缩自动编码器。对于没有大量标注的数据集,预训练有助于后续的判别式学习。即便是深度神经网络,对于大量的标注数据集,无监督训练对权重初始化并不是必要的,预训练是初始化深度网络权重的第一个好方法,现在也有其它方法。但如果扩大网络,需要再次做预训练。

总结:传统的编程方法是我们告诉计算机做什么,将大问题分解成很多小而精确的且计算机可以轻松执行的任务。神经网络则不需要告诉计算机如何解决问题,而是从观测到的数据中学习,找到解决问题的办法。

上一篇下一篇

猜你喜欢

热点阅读