—————————————————————————————
博文发表于夏木青 | JoselynZhao,欢迎访问博文原文。
—————————————————————————————
关注夏木青微信公众号,回复关键词548447,即可获得《深度学习》第11章实践方法论的原版学习资料(含思维导图)。
深度学习 | 绪论
深度学习 | 线性代数基础
深度学习 | 机器学习基础
深度学习 | 实践方法论
深度学习 | 应用
深度学习 | 安装conda、opencv、pycharm以及相关问题
深度学习 | 工具及实践(TensorFlow)
深度学习 | TensorFlow 命名机制和变量共享、变量赋值与模型封装
深度学习 | TFSlim介绍
深度学习 | TensorFlow可视化
深度学习 | 训练及优化方法
深度学习 | 模型评估与梯度下降优化
深度学习 | 物体检测
深度学习| 实战1-python基本操作
深度学习 | 实战2-TensorFlow基础
深度学习 | 实战3-设计变量共享网络进行MNIST分类
深度学习 | 实战4-将LENET封装为class,并进行分类
深度学习 | 实战5-用slim 定义Lenet网络,并训练测试
深度学习 | 实战6-利用tensorboard实现卷积可视化
深度学习 | 实战7- 连体网络MINIST优化
深度学习 | 实战8 - 梯度截断
深度学习 | 实战9- 参数正则化
在实践中,正确使用一个普通算法 通常比草率地使用一个不清楚的算法效果更好。
本章节讲解如何正确地使用一个算法。
章节内容概要
书中首先给出来了关于实践中的几个设计流程的建议。
1、明确目标
使用什么样的误差度量,并为此误差度量指定目标值。
这些目标和误差度量取决于该应用旨在解决的问题。
2、尽快建立一个端到端的工作流程
包括估计合适的性能度量。
3、搭建系统,并确定性能瓶颈。
检查哪个部分的性能差于预期,以及是否是因为过拟合、欠拟合,或者数据或软件权限造成的。
4、根据具体观察反复地进行增量式的改动
如收集新数据、调整超参数或改进算法。
接下来的内容,会对上述设计流程中的每一个步骤进行详细讲解。
书中将使用街景地址号码转录系统(Goodfellow et al., 2014d) 作为一个正在运行的示例。
下面对该系统做一个简要的介绍。
目标
添加建筑物到谷歌地图。
方法
街景车拍摄建筑物,并记录与每张建筑照片相关的 GPS 坐标。
卷积神经网络识别每张照片上的地址号码
谷歌地图数据库在正确的位置添加该地址
1、确定目标,即使用什么误差度量,是必要的第一步,因为误差度量将指导接下来的所有工作。
2、对于大多数应用而言,不可能实现绝对零误差。因为输入特征可能无法包含输出变量的完整信息,或是系统可能本质上是随机的。我们还会受限于有限的训练数据。
3、训练数据的数量会因为各种原因受到限制。想要进一步的减少误差,可能需要收集更多的数据。但是科研中,目标通常是在某个确定基准下探讨哪个算法更好,一般会固定训练集,不能收集更多的数据。
4、如何确定合理的性能期望?在学术界,通常我们可以根据先前公布的基准结果来估计预期错误率。一旦你确定了想要达到的错误率,那么你的设计将由如
何达到这个错误率来指导。
5、除了考虑性能度量之外,还需要考虑度量的选择。
有时,一种错误可能会比更一种错误更严重。例如,垃圾邮件检测系统会有两种错误:将正常邮件归为垃圾邮件,将垃圾邮件归为正常邮件。阻止正常消息比通过可疑消息更糟糕。
这个时候我们会考虑是度量精度(precision)和召回率(recall)。
精度:模型报告的检测正确的比例
召回率:真实事件被检测到的比率。
精度是查准率,是预测正确的正例 占 所有预测为正例的比率
召回率是查全率,是预测正确的正例 占 所有真实正例的比率
6、当使用精度和召回率时,通常会画 PR 曲线, y 轴表示精度,x 轴表示召回率。
7、很多情况下,我们希望用一个数而不是曲线来概括分类器的性能, 所以有F分数。
F分数可以通过精度p和召回率r 按照下面的公式转换得到。
另一种方法 可以代替 f分数的方式 是报告PR曲线下方的总面积(称为AP值(average precision),AP越大,性能越高)
有时候系统可能会拒绝做出判断,我们把这种情况下的性能度量称作覆盖率。覆盖率是机器学习系统能够产生响应的样本所占的比率。
我们可以通过降低覆盖率,来确保到达一定的精度。
确定性能度量和目标后,任何实际应用的下一步是尽快建立一个合理的端到端 的系统。 本节给出了一些建议,在不同情况下使用哪种算法作为第一个基准方法。
1、如果问题属于 “AI-完成’’ 类的,如对象识别,语音识别,机器翻译,等等,那么项目开始于一个合适的深度学习模型,效果会比较好。
2、根据数据的结构选择一类合适的模型。
如果项目是以固定大小的向量作为输入的监督学习,那么可以使用全连接的前馈网络。
如果输入有已知的拓扑结构(例如,输入是图像),那么可以使用卷积网络。
如果输入或输出是一个序列,可以使用门限循环网络(LSTM或GRU)。
如果我们的任务和另一个被广泛研究的任务相似,可以通过复制先前研究中已知性能良好的模型和算法得到很好的效果。
具有衰减学习率动量的SGD是一个合理的优化算法选择, 另一个非常合理的选择是Adam 算法。
batch normalization对优化性能有着显著的影响, 特别是对卷积网络和具有sigmoid非线性函数的网络而言。
除非训练集包含数千万以上的样本,否则项目应该在一开始就包含一些简单的正则化。Dropout是一个很容易实现,且兼容很多模型和训练算法的良好正则化项。
提前终止也应该普遍采用。
1、在建立第一个端到端的系统后,就可以度量算法性能,改进算法。许多机器学习新手都忍不住尝试很多不同的算法来进行改进。然而,往往收集更多的数据比改
进学习算法要见效得多。
2、怎样判断是否要收集更多的数据?
首先,确定训练集上的性能是否可接受。 如果在训练集上的性能是不可以接受的,那么这时候没有必要收集更多的数据,而是通过其他方法先提高 在训练集上的新能。
如
数据的质量问题。 这意味着需要重新开始,收集更干净的数据或是收集特征更丰富的数据集。
如果训练集上的性能是可接受的,那么度量测试集上的性能。
如果测试集上的性能也是可以接受的,那么就顺利完成了。
如果测试集上的性能比训练集的要差得多,那么收集更多的数据是最有效的解决方案之一。
确定了收集更多数据之后,首先需要考虑以下三点:
如果收集更多数据代价太大,考虑代替方法
如果调整正则化超参数后,训练集性能和测试集性能之间的差距还是不可接受,那么收集更多的数据是可取的。
需要确定收集多少数据
如果收集更多数据是不可行的,那么改进泛化误差的唯一方法,改进学习算法本身
大部分深度学习算法都有许多超参数来控制算法。
有些超参数会影响算法运行的时间和存储成本。有些超参数会影响学习到的模型质量,以及在新输入上推断正确结果的能力。
本小节讲解如何选择超参数。
有两种选择超参数的基本方法:手动选择和自动选择。
1 手动选择
需要了解超参数做了什么,机器学习模型如何才能取得良好的泛化。
2 自动调参
大大减少了了解这些想法的需要,但往往需要更高的计算成本
章节内容
4.1 手动调整超参数
4.2 自动超参数优化算法
4.3 网格搜索(grid search)
4.4 随机搜索
4.5 基于模型的超参数优化
手动设置超参数,我们必须了解超参数,训练误差,泛化误差和计算资源(内存和运行时间)之间的关系。这需要切实了解第五章学习算法的有效容量。
手动搜索超参数的目标通常是最小化受限于运行时间和内存预算的泛化误差。
手动搜索超参数的主要目标是调整模型的有效容量以匹配任务的复杂性。
有效容量受限于三个因素
1 模型的表示容量,模型复杂度越高,表达能力越强
2 学习算法成功最小化训练模型代价函数的能力
3 代价函数和训练过程正则化模型的程度。
具有更多网络层,每层有更多隐藏单元的模型具有较高的表达能力——能够表示更复杂的函数。
参数和训练误差
当泛化误差以某个超参数为变量,作为函数绘制出来时,通常会表现为 U 形曲线,如图5.3所示。
在某个极端情况下,超参数对应着低容量,并且泛化误差由于训练误差较大而很高。这便是欠拟合的情况。
另一种极端情况,超参数对应着高容量,并且泛化误差由于训练误差和测试误差之间的差距较大而很高。
最优的模型容量位于曲线中间的某个位置,能够达到最低可能的泛化误差,由中等的泛化误差和中等的训练误差相加构成。
某些超参数,在数值太大时,会发生过拟合。如中间层隐藏单元的数量
某些超参数,在数值太小时,会发生过拟合。如最小的权重衰减系数为0
学习率可能是最重要的超参数。如果你只有时间调整一个超参数,那就调整学习率。
学习率关于训练误差具有 U 形曲线,在图11.1所示。
当学习率过大时,梯度下降可能会不经意地增加而非减少训练误差。
当学习率太小,训练不仅慢,还有可能永久停留在一个很高的训练误差。
调整学习率外的其他参数时,需要同时监测训练误差和测试误差,以判断您的模型是否过拟合或欠拟合,然后适当调整其容量。
如果训练集错误率大于目标错误率
只能增加模型容量以改进模型
如果没有使用正则化,有必要添加更多的网络层或隐藏单元。
测试误差是两部分之和
1 训练误差和测试误差之间的差距
2 训练误差
如果测试集错误率大于目标错误率
目标:缩小差距,使训练误差的增长速率不快于差距减小的速率。
方法:改变正则化超参数,以减少有效的模型容量(如添加Dropout或权重衰减添加Dropout 或权重衰减策略)
实践中的暴力方法
不断提升模型容量和训练集的大小,直到解决问题
大部分超参数可以通过推理其是否增加或减少模型容量来设置。如表11.1所示部分示例。
理想的学习算法应该是只需要输入一个数据集,就可以输出学习的函数,而不需要手动调整超参数。
我们试图寻找超参数来优化目标函数
原则上,有可能开发出封装学习算法的超参数优化算法,并选择其超参数,从而用户不需要指定学习算法的超参数。
但超参数算法往往也有自己的超参数。
1、当有三个或更少的超参数时,常见的超参数搜索方法是网格搜索 (grid search)。
2、对于每个超参数,用户选择一个较小的有限值集去探索。然后,这些超参数笛卡尔乘积为一组组超参数,网格搜索使用每组超参数训练模型。挑选验证集误差最小的超参数。
3、应该如何选择搜索集合的范围呢?
在超参数是数值的情况下,每个列表的最小和最大的元素可以基于先前相似实验的经验保守地挑选出来,以确保最优解非常可能在所选范围内。
通常,网格搜索大约会在对数尺度 (logarithmic scale) 下挑选合适的值,例如,一个学习率的取值集合是 {0.1,0.01,10−3,10−4,10−5},或者隐藏单元数目的取值集合 {50,100,200,500,1000,2000}。
通常重复进行网格搜索时,效果会最好。
例如,假设我们在集合 {−1, 0, 1} 上网格搜索超参数α。如果找到的最佳值是 1,那么说明我们低估了最优值 α 所在的范围,应该扩大搜索范围,例如在集合 {1, 2, 3} 中搜索。
如果最佳值是 0,那么我们不妨通过细化搜索范围以改进估计,在集合 {−0.1, 0, 0.1} 上进行网格搜索。
网格搜索带来的一个明显问题是,计算代价会随着超参数数量呈指数级增长。如果有m个超参数,每个最大有n个取值,那么训练和估计所需的试验次数为O(nm)。
即使是并行进行实验,也无法提供令人满意的搜索规模。
随机搜索是一个替代网格搜索的方法。
较网格搜索的优点
搜索过程
1、为每个超参数定义一个边缘分布,或者对数尺度上的均匀分布。
其中,u(a, b) 表示区间 (a, b) 上均匀采样的样本。
与网格搜索不同,我们不需要离散化超参数的值。
这使得可以在更大的集合上进行搜索,且不产生额外的计算代价。
2、与网格搜索一样,可以经常重复运行不同版本的随机搜索,以基于前一次运行的结果改进下一次搜索。
随机搜索能比网格搜索更快地找到良好超参数的原因是,没有浪费的实验,不像网格搜索有时会对一个超参数的两个不同值(给定其他超参数值不变)给出相同结果。
在网格搜索中,其他超参数将在这两次实验中拥有相同的值,而在随机搜索中,它们通常会具有不同的值。
因此,如果这两个值的变化不能勉强使验证集误差有明显区别的话,网格搜索没有必要重复两个等价的实验,而随机搜索仍然会对其他超参数进行两次独立地探索。
1、超参数搜索问题可以转化为一个优化问题。决策变量是超参数。优化的目标是最小化超参数训练出来的模型在验证集上的误差。
2、大部分基于模型的超参数搜索算法,都是使用贝叶斯回归模型来估计每个超参数的验证集误差期望,和该期望的不确定性。因此,优化涉及到探索(探索高度不确定的超参数,可能有重大效果提升,也可能效果很差)和使用(使用已经确信效果不错的超参数——通常是先前非常熟悉的超参数)之间的权衡。
3、大部分超参数优化算法比随机搜索更复杂,并且具有一个共同的缺点,在它们能够从实验中提取任何信息之前,它们需要运行完整的训练实验。
相比于人类实践者手动搜索,考虑实验早期可以收集的信息量,这种方法是相当低效的,因为手动搜索通常可以很早判断出某组超参数是否是完全病态的。
1、当一个机器学习系统效果不好时,通常很难判断效果不好的原因是算法本身,还是算法实现错误。由于各种原因,机器学习系统很难调试。
另一个难点是,大部分机器学习模型有多个自适应的部分。如果一个部分失效了,其他部分仍然可以自适应,并获得大致可接受的性能。
2、一些重要的调试检测
可视化模型的行为:当训练模型检测图像中的对象时,查看一些模型检测到部分重叠的图像。在训练语音生成模型时,试听一些生成的语音样本。直接观察机器学习模型运行任务,有助于确定其达到的量化性能数据是否看上去合理。错误评估模型性能可能是最具破坏性的错误之一,因为它们会使你在系统出问题时误以为系统运行良好。
可视化最严重的错误:大多数模型能够输出运行任务时的某种置信度量。。例如,基于softmax 函数输出层的分类器给每个类分配一个概率。
通过查看训练集中很难正确建模的样本,通常可以发现该数据预处理或者标记方式的问题。例如,街景转录系统原本有个问题是,地址号码检测系统会将图像裁剪得过于紧密,而省略掉了一些数字。然后转录网络会分配非常低的概率给这些图像的正确答案。将图像排序,确定置信度最高的错误,显示系统的裁剪有问题。修改检测系统裁剪更宽的图像,从而使整个系统获得更好的性能。
**根据训练和测试误差检测软件。**往往很难确定底层软件是否是正确实现。训练和测试误差能够提供一些线索。
如果训练误差较低,但是测试误差较高,那么很有可能训练过程是在正常运行,但模型由于算法原因过拟合了。另一种可能是,测试误差没有被正确地度量,可能是由于训练后保存模型再重载去度量测试集时出现问题,或者是因为测试数据和训练数据预处理的方式不同。
拟合小数据集:当训练集上有很大的误差时,我们需要确定问题是欠拟合,还是软件错误。通常,即使是小模型也可以保证很好地拟合一个足够小的数据集。
如果不能训练一个分类器来正确标注一个单独的样本,那么很有可能是由于软件错误阻止训练集上的成功优化。此测试可以扩展到只有少量样本的小数据集上。
比较反向传播导数和数值导数:如果正在使用一个需要实现梯度计算的软件框架,或者在添加一个新操作到求导库中,那么常见的错误原因是没能正确实现梯度表达。
验证这些求导正确的一种方法是比较实现的自动求导和有限差分 (finite difference) 计算的导数。
监控激励函数值和梯度的直方图:可视化神经网络在大量训练迭代后(也许是每个迭代)收集到的激励函数值和梯度的统计数据往往是有用的。隐藏单元的预激
励值可以告诉我们该单元是否饱和,或者它们饱和的频率如何。
如果数据是稀疏的(比如自然语言),有些参数可能很少更新,检测它们变化时应该记住这一点。
为了端到端地说明如何在实践中应用我们的设计方法,我们从深度学习设计部分出发,简单地介绍下街景转录系统。
1、从机器学习任务的视角出发,首先这个过程要采集数据。街景车收集原始数据,然后操作员手动提供标签。
2、转录项目开始于性能度量的选择,和对这些度量的期望。一个重要的总原则是度量的选择要符合项目的业务目标。
因为地图只有是高准确率时才有用,所以为这个项目设置高准确率的要求非常重要。具体地,目标是98% 的准确率。
为了达到这个级别的准确率,街景转录系统牺牲了覆盖率。因此在保持准确率98% 的情况下,覆盖率成了这个项目优化的主要性能度量。
3、在选择量化目标后,我们推荐方法的下一步是要快速建立一个合理的基准系统。对于视觉任务而言,基准系统是带有整流线性单元的卷积网络。
4、我们建议反复细化这些基准,并测试每个变化是否都有改进。
5、若覆盖率较低,建议综合训练集和测试集性能,以确定问题是否是欠拟合或过拟合。训练集和测试集误差几乎是一样的。这表明要么是这个问题欠拟合,要么是训练数据的问题。
6、我们推荐的调试技巧之一是可视化模型最糟糕的错误。在这种情况下,这意味着可视化不正确而模型给了最高置信度的训练集转录结果。结果显示,主要是输入图像裁剪得太紧,有些和地址相关的数字被裁剪操作除去了。
7、最后,性能提升的最后几个百分点来自调整超参数。这主要包括在保持一些计算代价限制的同时加大模型的规模。因为训练误差和测试误差保持几乎相等,所以明确表明性能不足是由欠拟合造成的,数据集本身也存在一些问题。
关注夏木青微信公众号,回复关键词548447,即可获得《深度学习》第11章实践方法论的原版学习资料(含思维导图)。