资源技术动态神经网络进阶

神经网络进阶

2019-10-29 | |  92 |   0

原标题:神经网络进阶

来源:AI研习社      链接:https://www.yanxishe.com/TextTranslation/2081


这篇文章将介绍一些在神经网络中使用的更高级的话题,并将涵盖在神经网络研究中经常论及的几个重要话题。

1572290067232060.png


图源:训练1个模型,获得M个模型


本文的主题包括:


● 迁移学习

● 调整学习率

● 如何处理过拟合

● Dropout

● 剪枝


您可以访问下面的前几篇文章。第一篇为不熟悉神经网络的人提供了一个简单的介绍。第二篇文章将更多地讨论了其中的细节,如激活函数、神经网络结构和损失函数。第三篇文章将介绍更高级话题,如动量、自适应学习率和批归一化。第四篇文章是关于神经网络超参数调优的深入教程。 


神经网络的简单介绍

综合介绍神经网络体系结构

神经网络优化方法

神经网络超参数调试的简单指南


这些教程主要基于哈佛大学和斯坦福大学计算机科学和数据科学系多个班级的笔记和例子。 


本文和后续教程中讨论的关于(全连接)神经网络话题的所有代码都可以通过我的GitHub代码库中的Neural-Networks工程访问,可以在下面的链接中找到。 


mrdragonbear/Neural-Networks  


迁移学习


假设您在一家小公司工作,拥有有限的计算资源,但被要求开发一种最先进的算法来对不同植物物种的图片进行分类。对于任何试图开发利用计算机视觉(面向视觉的机器学习)的商业解决方案的公司来说,这都是一个相当常见的问题。 


在这种情况下,您(至少)有两个问题。您可以访问的数据量可能比较有限,计算能力也有限。很明显,为了创建起码的可用的产品,直接利用几十个gpu训练一个150层深的神经网络,并且训练一个神经网络模型需要几个星期以区分最简单的你当前有的数据的1000个植物物种,是不实际的。 


在这种情况下,你能做些什么来让这些事情更加简单呢? 


幸运的是,像谷歌和微软这样的几家公司已经发布了最先进的神经网络架构,这些架构针对图像识别进行了优化。这些公司拥有巨大的资源和专业知识,因此您可以相信,这些模型的性能将优于您可以创建的任何自己的模型。 


然而,有一个问题是,这些算法所训练的数据可能没有(实际上也没有)训练过这1000种你想用算法来区分的植物。 


但是,有一个解决办法:迁移学习。迁移学习就是这样,你把学习从一个模型转移到另一个模型,这个模型可以验证与原始模型非常相似的数据。在这种情况下,原始模型用于一般图像识别(通常在CIFAR数据集上),这与我们正在尝试做的工作非常接近。然后,我们可以根据自己的数据对网络的最后几层进行重新训练,以便为特定的应用微调模型。

1572290219204114.png

预训练模型的权重被加载到新模型的体系结构中。输出层的权重被训练,而其他网络层被冻结。得到的模型将针对所需的应用进行微调。 


这是怎么做到的呢?我们首先使用Keras构建原始模型的体系结构,然后加载训练好的网络的模型权重(您需要先下载这些模型;它们通常是.h5格式)。 


我们需要做的第二件事是通过将网络层参数设置为trainable=False,来冻结初始网络的权重。这样做的原因是卷积神经网络(用于处理图像)的初始层包含关于图像的简单信息,比如对线、边、形状和其他低层特征的解释。随着我们深入网络,特征变得更加复杂和高级,这就是网络开始更能清晰区分图像内容的地方。 


这里的想法是,我们并没有试图教网络验证图像,因为它已经被谷歌或微软训练得很好。我们只需要针对我们的用例对它进行微调。 


因此,我们可以在输出处设置所有的全连接层(或其中的部分全连接层)为可训练的,或者设置最后的卷积层(如果我们有足够的数据)为可训练的,然后根据我们的数据训练网络。 


这个过程还有一个额外的好处,即需要更少的数据来训练模型——因为网络可训练参数的数量只是网络中总参数数量的一小部分。

1572290262133507.png

与网络的后一层(如第6层和第7层)相比,输入层(如第1-4层)对迁移学习的输出影响相对较小。 


只有在分析的两个数据集非常相似时,迁移学习才有效。因此,转移学习最常用于图像识别或语音识别,在这种情况下,可以让训练网络对图像或声音或给定语言进行通用的识别。与从头开始训练整个网络相比,使用迁移学习训练网络所需的数据和计算时间要少得多。  


请参阅“进一步阅读”部分的开源文献文献,以研究迁移学习的更多细节。


剪枝


模型剪枝试图在深度神经网络的各种连接矩阵中产生稀疏性,从而减少模型中非零值参数的数量。 


“剪枝”这个词来自于它在决策树中的应用,在决策树中,树枝作为模型正则化的一种形式被修剪。类似地,神经网络中被认为不重要或很少触发的权重可以从网络中删除,而不会产生什么后果。事实上,大多数神经元对模型性能的影响相对较小,这意味着即使剔除大量参数,我们也能达到较高的精度。  


为了获得合理的模型运行时间,随着神经结构和数据集的增大,减少网络中的参数变得越来越重要。 


研究论文”剪枝或不剪枝:探索用于模型压缩的剪枝算法的功效”验证了神经网络作为稀疏的函数(有效的百分比神经元删除)的性能,发现即使减少神经元网络中的75%,该模型性能也没有显著影响。实际上,将参数数量减小仅仅降低了0.1%的精确度。 

1572290343903869.png

1572290399219389.png

剪枝通常是应用在卷积神经网络中的,然而,由于卷积模型中的大部分参数发生在全连接(普通)神经网络层中,因此大部分参数从网络的这一部分中删除。 


在深度神经网络中,有多种方法可以进行修剪模型。最常见的方法是剪枝。权重剪枝——按权重大小排序,因为权重较大的参数更容易激活,因此更加重要。 


另一种方法是神经元剪枝,这种方法将权重矩阵中的整个列设置为零,实际上就是删除相应的输出神经元。在这里,为了达到k%的稀疏性,我们根据权重矩阵的l2范数对列进行排序,并删除最小的k%的列。 


第三种更高级的方法是使用费希尔(Fisher,原文拼写错误,参考原论文)剪枝,该算法依赖于费希尔信息。 费希尔信息生成一个被称为Fischer-Rao范数的范数,该范数可用于对参数排序。人们猜测费希尔信息和参数冗余之间存在联系,这就是为什么这项技术似乎产生了较好的结果。你可以在下面阅读更多关于费希尔剪枝的内容:


剪枝神经网络:近期的两篇论文

我想简要强调一下最近两篇关于剪枝神经网络的论文(免责声明,其中一篇是我们的):Christos… 


要查看标准的VGG16网络的剪枝代码实现,我推荐阅读下面这篇优秀的文章: 


修剪深度神经网络,使其更快、更小 

我的PyTorch实现[1611.06440  用于资源高效推理的卷积神经网络剪枝]…

 

调整学习率


正如你可能已经从自己的神经网络经历中,也可能从其他文章和研究文献中认识到的那样,学习率是神经网络训练的一个非常重要的部分。 


学习率本质上决定了网络学习的“快慢”,它决定了移动的步长。较高的学习速度导致更快的学习,但收敛更困难,而且往往不稳定。较小的学习速度导致较慢的学习,虽然是可能收敛的,但这有可能只发生在非常多的时间之后,这种方式计算效率是较低的。 


显然,在这两者之间有一个最佳平衡点,对于给定的神经结构来说是最优的——这个点是唯一的,并且是神经损失曲面的函数。然而,由于我们对网络进行训练,神经网络是动态的,不断变化,导致最优学习率的失真。除了依赖时间外,最佳点在空间上也有依赖关系,因为损失表面的某些位置可能有极尖锐或极浅的梯度,这进一步使问题复杂化。  


那么我们如何选择一个能给我们最好结果的学习率呢?显然,我们可以使用一个恒定的学习率,但如果我们这样做了,当我们得到次优解时,我们就不能抱怨了。 


获得更好结果的唯一方法是使用动态学习率,它试图利用最佳学习率的空间和时间变化。这不是一项简单的工作,但是已经有了几种技术来完成这项工作。


神经网络的周期性学习率

周期性学习率简直是不言自明的,它们本质上是振荡的——学习率来回振荡。循环学习率的主要用途是避免局部极值点,特别是尖锐的局部极小值(过拟合)。在高维空间中鞍点非常多,收敛速度非常慢,如果不是不可能的话。因此,如果我们使用一个纯下降的学习速度,很容易陷入一个单一的位置,特别是在高维情况下。  


周期性学习率周期性地增加学习率。这有一个短期的负面影响,但有助于实现长期的有益作用。  


降低学习率可能仍然有助于在最后减少错误。这可以通过降低循环学习率的值来实现,周期性学习率会随着时间慢慢衰减为零。  


1566976746445798.png

周期性学习率的例子 


虽然这是一个较好的想法,但它并没有告诉我们应该设置什么样的学习速率策略以及这些学习速率的大小。 


估计学习率


我们怎样才能得到一个好的学习率估计呢?这看起来很复杂,但实际上并不难。 


首先,我们可以从一个小的学习率开始,然后每个batch后以指数级的速度增加学习率。同时,我们可以计算验证集上的损失函数。这也适用于寻找周期性学习速率的边界。 


下图显示了学习率随时间的指数增长。 


1566976754461471.png

跨epoch的指数增长的学习率 


 同时,我们计算每一个学习率的损失函数。 

1572290668821906.png

损失函数为学习率的函数。 


我们可以看到,在这两个极端之间有一个陡峭区域,在这个区域内,学习是稳定的,并且在不断的减少。这就我们想要确保我们在训练过程中,学习率所在的区域。 


热重启随机梯度下降法


热重启是一个非常简单的想法:在指定epoch之后重新开始学习。例如,学习率从最初的0.1开始,并随着时间呈指数级下降。经过30次迭代,学习率调度程序将学习率重置为与epoch 1相同的值,然后学习速率调度程序不断进行指数式衰减。每次在重新设置学习率之前,都会记录最佳估计值。  


这种思想类似于周期性学习速率,除了学习速图通常看起来更像锯齿波,而不是对称的、周期性的。  


需要注意的是,重新开始并不是从零开始,而是根据最后的估计值,并且学习率提高了。因此,重新启动有与周期性学习率相同的大部分好处,比如能够避免极端的局部极小值。  

1566976751281902.png

Cifar10数据集中每50次迭代,使用余弦退火重启动 


快照集成:训练一个网络, 得到M个模型


快照集成是一个非常好的想法,如果您感兴趣,我建议您阅读研究论文。  


集成网络比单个网络更健壮和准确。它们构成了另一种正则化技术。其新颖之处在于,训练一个单一的神经网络,却能得到M个不同的模型。其思想是收敛到M个不同的局部最优解,并保存网络参数。  

1572290795297504.png


左图:用典型的学习率调整的SGD优化图例。该模型在训练结束时收敛到最小值。右图:快照集成图例。该模型经历了多个学习率退火周期,收敛于多个局部极小值,并从多个局部极小值中跳出。来源 


对于你们中那些经验丰富的数据科学家而言,您可能还记得,发展集成或混合模型在用于分类时,通常比单个模型提供了更好结果——尽管,有几个要求需要确保满足,如模型之间具有相对较高的相关性。从某种意义上说,这只是该技术在神经网络上的延伸。 


那么它是怎样工作的呢?


在每个训练周期结束时,该模型的训练损失函数达到局部最小值。因此,在提高学习率之前,我们对模型权重进行“快照”。M个周期训练后,我们有M个模型快照,f₁, f₂,...,每一个都将在最后的集成模型中使用。在集成模型中,我们取所有模型快照的平均值,并以此来获得我们的结果,实现了一个参数平滑的神经网络,从而降低了总噪声,从而降低了总误差。 


需要强调的是,M个快照模型的总训练时间与单个标准模型训练的时间相同。这意味着我们有一个简单的方法来获得神经网络的集成,而不需要任何额外的训练成本。 


然而,快照集成并不完美,可能会选择不同的初始化点或超参数选择,从而收敛到不同的局部极小值。尽管这些局部极小值可能在平均误差方面表现得类似,但它们可能不会犯相同的错误。 


集成方法训练大量神经网络,然后通过多数投票进行优化,或者对预测输出进行平均——这与平均权重和使用这些权重进行预测相反。最后的集成模型包括优化路径过程中的快照模型。 


下面的结果显示了快照集成用于测试神经网络模型时,在几个常见数据集上的结果。 

1572290850839036.png


CIFAR-10和CIFAR-100数据集的错误率(%)。同一组中的所有方法都经过相同迭代次数的训练。集成方法的结果用蓝色表示,并以粗体显示每个网络/数据集对的最佳结果。 


从实验结果可以看出,快照集成性能优于标准模型,也优于周期性集成和dropout模型。


Polyak-Ruppert平均


考虑到快照集成和Polyak平均之间的相似性,我认为最好介绍下这个。Polyak平均法是另一种解决不稳定学习问题的方法,并促进了快照集成的使用。该信息利用在训练结束时多个模型权重的平均。1566976747120047.png



Polyak平均法的动机--学习率大的梯度下降法不能有效收敛到全局最小值。 


假设在t次迭代的参数为θ¹,θ²,等等。然后,我们可以取这些参数的时间平均值,以获得一个更平滑的真实参数估计器。 

1566976751335832.png


这可以通过几种不同的方式加以利用: 


● 在训练结束时(如上所述),在几个不同epoch使用同一模型的权重。  

● 将来自多个模型的权重用于单个模型的训练(集成平均对比与时间平均)。  

● 利用快照模型中的权重,然后对这些权重进行平均,用于集成预测(集成和时间平均的混合方法)。  


Polyak平均法保证了在凸设置下的强收敛性。然而,在非凸曲面(一般都是这种情况)中,不同区域的参数空间可能有很大的差异。在这种情况下,求平均值就不那么有用了。在这种情况下,通常考虑指数衰减的平均值:

1572291007432240.png


根据选择的α值,在新参数或参数值之间加入附加的权重,即旧参数的重要性随时间而指数衰减。 


希望您能够清楚地了解Polyak平均法和快照集成法之间的异同。它们只是对神经网络不稳定学习过程中明显存在的随机误差进行平滑处理的不同方法。 


在这里可以找到应用于神经网络的Polyak平均法的一个很好的案例:


利用Keras (Polyak平均法)计算集成神经网络模型的权值

神经网络的训练过程是一个具有挑战性的优化过程,往往不能收敛。这可以…

machinelearningmastery.com  


如何处理过拟合


在深度神经网络中,过度拟合是如此常见,甚至于你永远无法真正确信你从一个训练过的网络中得到的结果是最佳结果。鉴于它们的普遍存在,我们将研究一些方法来解决神经网络中的过拟合问题。 


估计

点估计是试图提供一些兴趣点的单一“最佳”预测:

1572291137798273.png


从频率论的角度θ是固定的,但未知,并且数据是随机的。这意味着我们的估计量是一个随机变量。每个随机变量都容易受到偏差和方差的影响。 


● 偏差:与真实值的期望偏差。  

● 方差:与预期估计值的波动。  

1572291185428669.png

诊断偏差-方差  


那么我们如何在神经网络中分析这种偏差-方差平衡呢? 


在高维情况下,我们无法绘制决策曲线来检验偏差-方差。作为替代,我们计算误差值来推断训练集和验证集上的误差源。为了确定偏差,我们需要一个基准,例如人类的表现。 

1572291214662775.png

贝叶斯误差率是随机结果分类器的最低可能误差率,类似于不可约误差。对于所有的意图和目的,在一个完美的模型去除所有可避免的偏差和方差时,贝叶斯误差是我们可以获得的最小误差。  


我们可以分析和比较训练集和验证集上的错误样本,从而推断出错误的原因,无论是可避免的偏差还是可避免的方差(我们不太可能得到贝叶斯误差率)。 

1572291264723817.png

正交化是另一种技术;它的目的是分解过程来调整神经网络的性能。它假定误差来自不同的来源,并使用系统化的方法来最小化它们。 


Mc.ai对这一点有一个很好的类比,就像用来调节收音机的旋钮一样。收音机的设计者努力工作以确保一个特定的旋钮控制信号的一个特定方面,例如音量或频率。如果没有多个参数同时变化,则更容易调到特定的无线电频率并获得所需的声音。 


提早停止也是一种常用的正则化机制,但同时存在偏差和方差误差。 


其他的减少偏差更有效的方法是训练更大的模型(增加模型的可解释性)、训练更长时间的模型(达到收敛)、调整神经结构或进行大量的超参数搜索。 


减少方差的有效方法是获得更多的数据,使用正则化机制(提早停止是一种常见的正则化技术,它将偏差和方差误差耦合在一起)。  

1572291294891520.png


能够分析网络的结果并确定问题是由偏差或方差引起的,这对于网络故障排除和提高网络性能非常有用。例如,如果您正在处理方差问题,并且尝试将网络训练更长时间,那么这显然不会有什么帮助。但是,在这种情况下,添加更多的数据或正则化是更精明的做法。 


Dropout


到目前为止,与我在本文中讨论的其他项相比,大多数人可能更熟悉dropout。Dropout易于实现,但更难以掌握其基本理念。 


Dropout是一种用于深度神经网络的正则化技术。它是在训练时使用的,随机消除了一些神经元的输出。这有助于防止网络过分依赖单个神经元,从而防止过度拟合。相反,知识被传播到所有的神经元,有助于获得一个更健壮的网络。在测试时,所有的神经元都存在,并且它们的激活概率是按比例缩放的,因为在训练时神经元的数量比以前更多。 


Dropout可以与其他正则化技术(如L2、批归一化等)结合使用。 

1572291357842491.png

目的:防止一组神经元特征检测器的协同适应,避免过拟合。 


● 它强制神经元在给定总体表现的情况下,发挥各自的作用。  

● 由于没有一个神经元是一直激活的,因此更倾向于使训练权重在整个神经网络中分散。  


解释:训练样本提供来自不同的、随机抽样的体系结构的梯度。 


直接实现:


● 训练时:随机剔除部分神经元的输出。  

● 测试时:所有神经元都存在。  

1572291438626956.png


反向Dropout


对于测试时的正常Dropout,你必须通过dropout比率p来缩放激活值,因为你没有丢弃任何一个神经元,所以你需要匹配训练时的期望值。 


对于反向Dropout来说,缩放激活值也应用在训练时。首先,通过dropout因子p对所有激活进行dropout,然后通过反向dropout因子1/p对其进行缩放。 


反向dropout有一个优势,您在测试时不需要做任何事情,这使得推断更快。 


由于这种更快的推断,当前大多数的实现使用了反向dropout: 


● 加权是在训练中进行的  

● 在测试时,不再需要加权计算


特别地,对于第l层, 

1566976753444287.png

1566976754226308.png

1566976755621252.png

反向Dropout— 与传统的Dropout相反,在训练时间而不是测试时间对权重进行缩放。  


初始化策略


在我的其他一些文章中已经讨论过神经网络的权值初始化,但是在这里有必要简要地重申一下。 


在学习率较小的凸问题中,无论什么样的初始化,都保证了收敛性(虽然可能很慢)。 


但是,在非凸区域,初始化更为重要。一些参数初始化可能是不稳定的,并且可能不收敛。对于有准则的、数学上较好的初始化策略,神经网络还没有很好地被理解,因此启发式方法通常用于选择一组合理的初始权值,利用这些权值中训练网络。 


对于m个输入n个输出的全连接层,我们可以从以下均匀分布中采样,得到初始权值:


1566976750732695.png

另外,流行的Xavier初始化使用以下参数来实现其均匀分布。 

1566976747814609.png


Xavier初始化源于考虑到网络由不含非线性的矩阵乘法组成,并在实际应用中取得了良好的效果。 


有关权重初始化方案的完整列表,请查看Keras文档中的Initializers 部分。有一打或两个初始化器,也可以使用您自己的自定义初始化器。请参阅参考资料的进一步阅读相关部分。  


最后

谢谢你的阅读,希望你能觉得这篇文章比较有见解。如果你喜欢这篇文章,请关注我以后关于神经网络的文章。 

其他与全连接神经网络相关的高级主题,我将在以后的文章中提到,读者可能会感兴趣:

● Batch/Layer/Instance/Group归一化(Normalization)

● 张量处理单元 (TPUs)

● DropConnect

● 部分池化(Fractional Pooling)

● 随机深度(Stochastic Depth)

● CutOut

● MixUp

● Kaiming/MSRA初始化


发起:唐里 校对:唐里 审核:鸢尾

参与翻译(1人):had_in

英文原文:Advanced Topics in Neural Networks

THE END

免责声明:本文来自互联网新闻客户端自媒体,不代表本网的观点和立场。

合作及投稿邮箱:E-mail:editor@tusaishared.com

上一篇:权重不可知神经网络 (WANNs) 探索

下一篇:BERT将给自然语言处理带来巨大革新!

用户评价
全部评价

热门资源

  • 应用笔画宽度变换...

    应用背景:是盲人辅助系统,城市环境中的机器导航...

  • GAN之根据文本描述...

    一些比较好玩的任务也就应运而生,比如图像修复、...

  • 端到端语音识别时...

    从上世纪 50 年代诞生到 2012 年引入 DNN 后识别效...

  • 人体姿态估计的过...

    人体姿态估计是计算机视觉中一个很基础的问题。从...

  • 谷歌发布TyDi QA语...

    为了鼓励对多语言问答技术的研究,谷歌发布了 TyDi...