机器学习研究人员需要了解的八种神经网络架构
为什么我们需要“机器学习”?
对于过于复杂而无法直接编程的任务来说,机器学习是必要的。有些任务非常复杂,人类不可能完成任务的所有细节并对其进行准确编程。所以我们给了我们的机器学习算法大量的数据,让算法通过探索数据并找到可以实现程序员目标的模型来解决问题。
让我们看两个例子:
- 编写一个程序,在复杂场景的光照条件下从新的角度识别三维物体是很困难的。我们不知道要编写什么程序,因为我们不知道我们的大脑是如何工作的。即使我们知道如何实现它,我们编写的程序也可能非常复杂。
- 编写计算信用卡欺诈概率的程序很困难。由于可能不存在简单可靠的规则,因此我们必须结合许多弱规则来判断。欺诈可以改变目标,程序需要不断改变。
然后是机器学习方法:我们只需收集大量示例并确定特定输入的正确输出,而不是手动编程每个特定任务。机器学习算法使用这些示例来生成执行特定任务的程序。由学习算法生成的程序可能与典型的手写程序有很大不同,后者可能包含数百万个数字。如果我们做得正确,该程序将像训练集中的样本一样对待新样本。如果数据发生变化,程序也可以通过新数据的训练来改变。你必须记住,今天的大多数计算都比付钱给程序员为某项任务编写程序要便宜。
据此,最适合机器学习的任务示例包括:
- 模式识别:真实场景中的物体、面部识别或面部表情、口语。
- 异常识别:信用卡交易的异常序列、核电厂传感器读数的异常模式。
- 预测:未来的股票价格或货币汇率,人们喜欢什么电影。
什么是神经网络?
神经网络是机器学习文献中的一类模型。例如,如果您参加 Coursera 机器学习课程,您将了解神经网络。神经网络是一组特殊的算法,它彻底改变了机器学习领域。它们受到生物神经网络的启发,深度神经网络已被证明运行良好。神经网络本身是通用函数近似,因此它们可以应用于几乎任何具有从输入到输出空间的复杂映射的机器学习问题。
这里有三个理由说服你学习神经计算:
- 了解大脑是如何工作的:它很大很复杂,如果它被损坏就会杀死大脑,所以我们必须使用计算机模拟。
- 了解受神经元和自适应连接启发的并行计算风格:这种风格不同于顺序计算。
- 使用受大脑启发的新颖学习算法来解决现实世界的问题:学习算法即使不是大脑的工作方式也是有用的。
完成 Andrew Ng 的 Coursera 机器学习课程后,我对神经网络和深度学习产生了兴趣,因此我搜索了最好的在线资源来了解该主题,并找到了 Geoffrey Hinton 的机器学习神经网络课程。如果您正在研究深度学习技术或想进入深度学习/机器学习领域,那么您应该学习本课程。 Geoffrey Hinton 绝对是深度学习的教父,他对该课程提供了令人难以置信的见解。在这篇博文中,我想分享八种神经网络架构,我认为机器学习研究人员应该了解这些架构,以使他们的工作更加轻松。
总的来说,这种架构可以分为三类:
1。前馈神经网络
这是实际应用中最常见的神经网络类型。第一层是输入,最后一层是输出。如果有多个隐藏层,我们将其称为“深度”神经网络。他计算了几个改变样本方程的变换。每层神经元的活动是前一层活动的非线性函数。
2. 循环网络
循环网络在连接图中具有循环方向,这意味着您可以按照箭头返回到开始的位置。它们可能具有复杂的动态,这使得它们难以训练。它们在生物学上更真实。
如何有效地训练循环网络如今引起了很多关注。循环神经网络是对连续数据进行建模的一种非常自然的方法。它们类似于每个时间片有一个隐藏层的深度网络;只不过它们在每个时间片中使用相同的权重和输入。他们可以长时间记住隐藏的状态信息,但很难训练他们利用这种潜力。
3。对称连接网络
对称连接网络与循环网络类似,但单元之间的连接是对称的(它们在两个方向上具有相同的权重)。对称连接的网络比循环网络更容易分析。这些网络有更多的限制,因为它们遵循能量函数定律。没有隐藏单元的对称连接网络称为“Hopfield 网络”。对称隐藏单元的网络称为玻尔兹曼机。
下面介绍了研究人员应该注意的8种神经网络架构。
1。感知器
当第一代神经网络出现时,感知器只是单个神经元的计算模型。它在 20 世纪 60 年代初由美国计算机科学家弗兰克·罗森布拉特 (Frank Rosenblatt) 推广。学习算法非常强大,号称能够学习很多东西。1969 年,Minsky 和 Papert 出版了一本名为《感知机》的书,分析了该算法的功能并解释了其局限性。许多人对所有神经网络模型都超过了这个限制。然而,感知器学习过程仍然广泛用于具有包含数百万个特征的大型特征向量的任务。
在统计模式识别的标准范式中,我们首先将原始输入向量转换为特征激活向量。然后,根据大家的共识,通过手动编程来定义特征。接下来,我们学习如何对每个特征激活进行加权以获得单个标量。如果这个标量超过某个阈值,我们就认为输入向量是目标平面中的正样本。
标准感知器架构遵循前馈模型,其中输入被发送到神经元并处理输出。下图中,网络显示为自下而上读取:底部输入,顶部输出。
然而,感知器有局限性:如果你使用手动设置的特征,并且使用足够的特征,你可以做任何事情。对于二值输入向量,我们可以为更多指数二值向量设置特征单元,这样我们就可以区分二值输入向量。然而,一旦识别出手工编程的特征,感知器可以学习的内容就会受到一些限制。
这个结果对于感知器来说是毁灭性的,因为模式识别是识别变换中的模式。明斯基和派珀特的“群不变定理”指出,当变换来自群时,感知器的学习部分无法学习。为了识别上述情况,需要更多的特征单元来识别模式中包含的子信息。因此,模式识别的技巧部分必须由手工编码的特征检测器来解决,而不是学习过程。
没有隐藏单元的网络在模型可以学习的输入输出映射方面受到严重限制。仅添加一些线性单位不会有帮助,因为结果仍然是线性的。固定输出非线性也不够,所以我们需要一些自适应非线性隐藏单元层。问题是如何训练网络。我们需要一种有效的方法来容纳所有重量,而不仅仅是最后一层,所以这很困难。将权重学习到隐藏层类似于学习特征,这是非常困难的,因为没有人直接告诉你隐藏层应该做什么。
2。卷积神经网络
机器学习研究主要集中在目标检测问题上。有多种因素导致物体识别变得困难:
- 图像分割:真实场景总是与其他物体混合在一起。很难确定哪些部分属于同一对象。一个对象的某些部分可以隐藏在另一个对象后面。
- 物体照明:像素强度受照明影响很大。
- 图像变形:对象可以以各种非仿射方式变形。例如,手写体也可以有一个大圆圈或只有一个尖头。
- 情境支持:对象所属的类别通常是根据它们的使用方式来定义的。例如,椅子是为人们坐而设计的,因此它们有各种各样的物理形状。
- 视角:由标准学习方法无法处理的视点变化引起的图像变化,并且得到的信息随着输入维度(即像素)的变化而变化。
- 跳跃维度:想象一个医疗数据库。通常用于了解体重的神经元现在突然用于了解患者的年龄!为了实现机器学习,我们需要消除这种维度跳跃。
复制特征方法是目前神经网络解决目标检测问题的主要方式。在多个位置使用相同的特征提取器。它还可以在尺寸和方向上进行复制,这是困难且昂贵的。复制大大减少了需要学习的自由参数的数量。它使用几种不同类型的特征,每种特征都有自己的副本检测器图像。它还允许每个图像块以多种方式表示。
那么复制特征检测器是如何工作的呢?
- 激活值等变化:特征复制方法不能使神经元的激活值不变,但可以使激活值相同。
- 知识不变:如果在训练期间,特征在多个位置有效,那么在测试期间,特征检测器在多个位置有效。
1998 年,Yann LeCun 和他的同事开发了 LeNet,一种手写数字识别方法。它在前馈网络中使用反向传播。这个前馈网络不仅仅是识别,它有很多隐藏层,每一层都有很多复制单元映射,收集附近复制单元的输出,并且有能力同时处理多个字符的宽网络,并且有一种简洁的方式训练完整的系统。随后它被正式命名为卷积神经网络。有趣的事实:该网络用于读取北美大约 10% 的支票。
卷积神经网络可用于与对象识别相关的一切,从手写数字到 3D 对象。然而,从从互联网下载的彩色照片中识别真实物体比识别手写数字更复杂。它比手写数字的类别(1000:10)大一百倍,比手写数字的像素(256×256颜色:28×28灰度)大数百倍,是三张二维图像方面。 - 维度视图。这需要对混沌场景进行分割,并且每个Image都有多个对象。在这种情况下,同类型的卷积神经网络可以工作吗?
接下来的2012年ILSVRC ImageNet竞赛(该竞赛被称为计算机视觉的年度奥运会),主题是包含大约120万张高分辨率训练图像的数据集。测试图像没有显示初始注释(没有分割或标签),并且算法预计会生成识别图像中任何对象的标签。来自 Oxford、INRIA、XRCE 等的高级计算机视觉小组将最佳的可用计算机视觉方法应用于该数据集。通常计算机视觉系统是复杂的多级系统,通常需要在早期阶段通过手动参数调整进行优化。
竞赛获胜者 Alex Krizhevsky(NIPS 2012)开发了一种由 Yann LeCun 首创的深度卷积神经网络。其架构由 7 个隐藏层组成(不包括池化层)。前五层是卷积层,最后两层是全连接层。激活函数在每个隐藏层中被转换为线性单元。火车比物流单位速度更快、表现力更强。此外,它还使用竞争归一化来减少附近单位活动较强时的隐藏活动,从而导致强度变化。
有一些技术技巧可以显着提高神经网络的泛化能力:
- 从 256×256 图像中随机选择一个 224×224 的 patch 来获取更多数据,并使用图像的左右阴影。为了进行测试,组合了 10 个不同的图像:四个角加上中心,加上五个相同的水平翻转图像。
- 使用“dropout”设置全局连接层权重(包括很多参数)。 Dropout是指随机去除每个训练样本所在层的一半隐藏单元,使其不会过多依赖于其他隐藏单元。
在硬件方面,Alex 在 2 个 NVIDIA GTX 580 GPU(超过 1000 个快速小核)上使用了非常高效的卷积网络实现。 GPU 非常适合矩阵乘法,并且具有非常高的内存带宽。这样可以训练网络一周,并在测试时间内快速整合 10 个图像补丁的结果。如果我们能够快速改变状态,我们就可以将网络分布在多个核心上。随着核心变得更便宜和数据集变得更大,大型神经网络将比旧的计算机视觉系统发展得更快。
3。循环神经网络
要了解循环神经网络,我们需要对序列建模进行简要概述。当机器学习应用于序列时,我们常常希望将输入序列转换为不同领域的输出序列;例如,将声音重音顺序转换为词序。当没有单独的目标序列时,我们可以通过尝试预测输入序列中的下一项来进行网络学习。目标输出序列是输入序列中的下一步。这似乎比尝试根据图像中的其他像素来预测像素或根据其他图像来预测部分更自然。预测序列中的下一个项目削弱了监督学习和无监督学习之间的差异。它使用专为监督学习设计的方法,但不需要单独的目标数据。
无记忆模型是完成此任务的标准方法。具体来说,自回归模型可以通过使用“抽头延迟”从固定数量的先前项目中预测下一个项目,而前馈神经网络是使用一层或多层非线性隐藏单元的通用自回归模型。然而,如果我们给出一些隐藏状态的生成模型,并使这些隐藏状态动态化,我们会得到一个更有趣的模型:可以在隐藏状态中长期存储信息。如果产生隐藏状态输出的隐藏状态的动态是有噪声的,我们将不知道隐藏状态。我们能做的是推断隐藏状态向量空间上的概率分布。此推论仅适用于 2 个隐藏状态模型。
循环神经网络非常强大,因为它们结合了两个属性:1)它们传播隐藏状态,使它们能够有效地存储有关过去的信息; 2)非线性动力学,允许它们以复杂的方式执行更新隐藏状态。只要有足够的神经元和时间,RNN 就可以计算计算机可以计算的任何内容。那么,RNN 可以执行哪些行为?它们可以振动,可以在点吸引子中保持稳定,因此行为混乱。您还可以使用潜在状态的不同子集运行多个小程序,每个小程序捕获一条知识,并且所有这些都可以一起运行并以更复杂的方式进行交互。
然而,RNN 的计算能力使其难以训练。由于梯度爆发和梯度消失,RNN 训练相当困难。当我们进行多层反向传播时,梯度的大小会发生什么变化?如果权重很小,梯度会呈指数收缩。如果权重很大,梯度会呈指数增长。典型的前馈神经网络可以克服这种指数效应,因为它只有几个隐藏层。然而,当在长序列上训练 RNN 时,梯度很容易爆炸或消失。即使初始权重选择得当,也很难检测到依赖于前几步输入的当前目标输出,因此 RNN 很难处理序列中的长程依赖性。
实际上有 4 种有效的方法来学习 RNN:
- 长短期记忆:使用 RNN 来存储长期记忆值的小模块。
- Hessian 自由优化:使用一个很酷的优化器来处理丢失梯度的问题,该优化器可以检测具有低曲率的小梯度。
- 回声状态网络:通过仔细初始化层之间的连接(输入 -> 隐藏层,隐藏层 -> 隐藏层,输出 -> 隐藏层),确保隐藏状态具有非常弱的振荡存储,这可以旁路 选择性输入驱动该振荡器。
- 使用动量进行良好的初始化:像回声状态网络一样开始,然后使用动量来学习所有连接。
4。长短期记忆网络
Hochreiter and Schmidhuber (1997)通过构建短期记忆网络解决了RNN的长期记忆(例如数百个时间步)的问题。他使用具有乘法相互作用的逻辑和线性单元设计了存储单元。每次“写”门打开时,信息就会进入单元格。当“保持”门打开时,信息将保存在装置中。通过打开“读取”门可以从设备中读取信息。
手写草书识别是一项非常适合 RNN 的任务。输入是笔尖的 (x, y, p) 坐标序列,其中 p 指示笔是向上还是向下。输出是一个字符序列。 Graves 和 Schmidhuber (2009) 表明,带有 LSTM 的 RNN 是目前草书识别的最佳系统。简而言之,它使用一系列缩略图作为输入,而不是笔坐标。
5。 Hopfield Networks
循环网络的非线性元素通常很难分析。它们可以以不同的方式表现:进入稳定状态、振荡或遵循不可预测的混乱轨迹。 Hopfield 网络由二进制阈值单元组成,它们之间具有连续的连接。 1982年,约翰·霍普菲尔德(John Hopfield)意识到,如果连接是对称的,则存在全局能量函数。整个网络的每个二元“结构”都具有能量,二元阈值决策规则可以让网络获得能量函数的最小值。利用此类计算的一个好方法是使用内存作为神经网络的最小能量。使用最少的能量来表示存储器,以便可以对存储器进行寻址。您可以访问仅了解其部分内容的项目。这会对硬件造成严重损坏。
每个配置都被记住,我们想要创建一个新的能量最小值。但是如果中间位置附近有两个最小值怎么办?这限制了 Hopfield 网络的容量。那么我们如何增加Hopfield网络的容量呢?物理学家相信众所周知的数学可以解释大脑的工作原理。许多关于 Hopfield 网络和存储容量的论文已发表在物理期刊上。最后,伊丽莎白·加德纳认为有一个更好的存储规则——“全程”使用重量。它不是保存一次向量,而是多次循环训练集,并使用感知器收敛过程来训练每个单元,使其在给定向量中所有其他单元的状态的情况下具有正确的状态。统计学家将这种技术称为“伪似然”。
Hopfield 网络还有其他计算功能。我们不再使用网络来存储记忆,而是用它从感官输入中构建信息。使用可见单元来表示输入,使用隐藏节点状态来表达来自输入节点的信息,并使用能量来表示信息的坏处(低能量状态表示良好的解释)。
6。玻尔兹曼机网络
玻尔兹曼机是一种随机循环神经网络。它可以看作是一对随机的 Hopfield 网络。它是第一个可以学习内部表示、能够表示和解决困难的组合问题的神经网络之一。
学习玻尔兹曼机器学习算法的目的是最大化玻尔兹曼机给出的概率与训练集中的二进制向量的乘积。这相当于最大化玻尔兹曼为训练向量定义的对数概率的数量。也就是说,如果我们执行以下操作,我们将最大化获得 N 个训练案例的可能性:1)使网络在没有外部输入的情况下在时间上稳定分布; 2)矢量样本一次出现一次。
2012 年,Salakhutdinov 和 Hinton 提出了一种针对玻尔兹曼机的高效小批量学习程序。
- 对于正阶段,首先将隐藏概率设置为0.5,将数据向量钳位在可见单元中,然后并行更新所有隐藏单元,并使用平均场方法并行更新隐藏单元直至收敛。网络收敛后,记录每对连接的单元 Pi Pj 并在最小批次中对所有数据进行平均。
- 对于负相:首先,保存一组“幻想粒子”(由(Si,Sj)对组成的系统?)。每个粒子在全局配置中都有一个值。然后连续多次更新每个幻想粒子中的所有单元格。对于每个连接的单元,SiSj 是所有幻想粒子的平均值。
在常规玻尔兹曼机中,单元的随机更新必须是连续的。有一种特殊的架构可以实现更高效的交替并行更新(无层内连接,无跳层连接)。这种小批量过程使得玻尔兹曼机的更新更加并行。这称为深度玻尔兹曼机(DBM),是一种具有许多缺失连接的常规玻尔兹曼机。
2014 年,Salakhutdinov 和 Hinton 提出了他们模型的升级版本,称为受限玻尔兹曼机(RBM)。它们通过限制连接性(只有一层隐藏单元并且隐藏单元之间没有连接)使推理和学习变得更容易。在 RBM 中,当暴露的单元被夹紧时,只需要一个步骤即可实现热平衡。
另一个高效的小批量RBM学习过程是:
- 对于正相,首先钳位可见细胞数据向量。然后计算所有可见和隐藏单元对的 的精确值。对于每对连接的单元,对迷你集合中的所有 数据进行平均。
- 对于负相,还保留了一组“鬼粒子”(由对(Vi,Hj)组成的系统?)。然后并行地多次改变每个幻想粒子中的所有细胞。对于每对连接的单元,所有 ViHj 幻想粒子均被平均。
7。深度置信网络
反向传播被认为是人工神经网络中的标准方法,用于在处理一批数据后计算每个神经元的误差贡献。然而,使用反向传播存在一些重要问题。首先,它需要标记的训练数据;几乎所有数据都未标记。其次,学习时间不是最优的,这意味着具有许多隐藏层的网络速度很慢。第三,它可能会陷入局部最小值,因此它对于深度网络来说仍然没有什么用处。
为了克服反向传播的局限性,研究人员考虑使用无监督学习方法。这有助于保持使用梯度方法调整权重的效率和简单性,并且还可以用于对感觉输入的结构进行建模。特别是,他们调整权重以最大化生成模型产生感官输入的可能性。问题是我们应该学习什么生成模型?它会是像玻尔兹曼机那样的能量模型吗?或者因果模型由理想化的神经元组成?或者两者的混合?
置信网是由随机变量组成的有向无环图。使用信念网,我们可以观察几个变量。我们要解决两个问题:1)推理问题:推断未观察到的变量的状态; 2)学习问题:调整变量之间的交互作用,使网络能够更好地生成训练数据。
初始图模型的图结构和条件概率由专家定义。当时,图表很少连接,因此第一批研究人员专注于做出正确的结论而不是学习。对于神经网络来说,学习是关键,手写知识并不酷,因为这些知识来自于学习训练数据。神经网络的目的不是通过稀疏连接轻松解释或推理。然而,还有一个神经网络版本的信念网络。
由随机二元神经元组成的生成神经网络有两种类型: 1)使用基于能量的对称连接来连接二元随机神经元以获得玻尔兹曼机; 2)我们在有向 SBN 中使用因果关系,该 SBN 通过连接非循环图中的二进制随机神经元获得。这两种类型的描述超出了本文的范围。
8。深度自动编码器
最后,我们来讨论一下深度自动编码器。深度自动编码器是一种出色的非线性降维方法,原因如下:它们提供了两种灵活的映射方法。训练示例的学习时间是线性的(或更好),并且最终的编码模型非常紧凑且快速。然而,使用反向传播优化深度自动编码器很困难。在初始权重较小的情况下,反向传播梯度消失。现在我们有更好的方法来优化它,使用无监督的逐层预训练或像回声状态网络一样仔细初始化权重。
对于预训练任务,实际上存在三种类型的浅层自动编码器:
- 约束玻尔兹曼机作为自动编码器:当我们训练具有一步对比散度的约束玻尔兹曼机时,它会尝试进行重建。像数据一样。它就像一个自动编码器,但它在隐藏层中使用二进制运算来实现正则化。经过最大似然训练后,受限玻尔兹曼机的行为不像自动编码器。我们可以用浅层自动编码器堆栈替换用于预训练的 RBM 堆栈;然而,如果通过惩罚平方权重来调整浅层自动编码器,则训练效率低下(对于后续的判别)。
- 去噪自动编码器:通过将许多分量设置为 0(例如,如果输入数据丢失),向输入向量添加噪声。他们仍然需要重建组件,因此他们需要提取捕获输入之间相关性的特征。如果我们使用代表自动编码器的堆栈,预训练会非常有效。与预训练 RBM 一样好或更好。由于我们可以很容易地计算出目标函数值,因此更容易评估预训练。 RBM 的可接受变化没有限制,但这只是一个理论问题。
- 压缩自动编码器:配置自动编码器的另一种方法是使隐藏单元活动对输入不敏感,但不能忽略该输入,因为它必须重建。我们通过惩罚每个隐藏活动相对于输入的平方梯度来实现这一点。压缩自动编码器经过训练后效果很好。该代码倾向于使一小部分隐藏单元对输入变化敏感。
简而言之,逐层进行特征预训练有不同的方式。对于没有太多标记样本的数据集,预训练有助于后续的判别学习。对于具有非常大标签的数据集,无需使用无监督预训练来初始化监督学习中使用的权重,即使对于深度网络也是如此。预训练是开始深层组织重量的第一个很好的方法,但现在还有其他方法。然而,如果我们创建一个非常大的网络,如果没有预训练,我们就无法做到这一点!
最终奖励
神经网络是有史以来最好的编程范例之一。在传统的编程方法中,我们告诉计算机要做什么,将大问题分解为计算机可以轻松确定的许多小任务。相比之下,在神经网络中,我们不会告诉计算机如何解决我们的问题,而是让它从观察到的数据中学习以确定当前问题的解决方案。
目前,深度神经网络和深度学习在计算机视觉、语音识别、自然语言处理等许多重要问题上都有良好的表现。它们由谷歌、微软和 Facebook 等公司大规模分发。
我希望这篇文章可以帮助您学习神经网络的核心概念,包括深度学习的现代技术。您可以从我们的 GitHub 存储库 (https://github.com/khanhnamle1994/neural-nets) 获取 Hinton Coursera 课程的所有课程幻灯片、研究论文和编程作业。
版权声明
本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。