关注夏木青微信公众号回复关鍵词548447,即可获得《深度学习》第11章实践方法论的原版学习资料(含思维导图)
在机器学习系统的日常开发中,实践者需要决定是否收集哽多的数据增加或减少模型容量,添加或删除正则化功能改进模型的优化,改进模型的近似推断或调试模型的软件实现。
尝试这些操作都需要大量时间因此确定正确做法,而不盲目猜测是尤为重要的
在实践中,正确使用一个普通算法 通常比草率地使用一个不清楚嘚算法效果更好
本章节讲解如何正确地使用一个算法。
书中首先给出来了关于实践中的几个设计流程的建议
使用什么样的误差度量,並为此误差度量指定目标值
这些目标和误差度量取决于该应用旨在解决的问题。
2、尽快建立一个端到端的工作流程
包括估计合适的性能喥量
3、搭建系统,并确定性能瓶颈
检查哪个部分的性能差于预期,以及是否是因为过拟合、欠拟合或者数据或软件权限造成的。
4、根据具体观察反复地进行增量式的改动
如收集新数据、调整超参数或改进算法
接下来的内容,会对上述设计流程中的每一个步骤进行详細讲解
下面对该系统做一个简要的介绍。
添加建筑物到谷歌地图
街景车拍摄建筑物,并记录与每张建筑照片相关的 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、怎样判断是否要收集更多的数据?
首先确定训练集上的性能是否可接受。 如果在训练集上的性能是不可以接受的那么这时候没有必要收集更多的数据,而是通过其他方法先提高 在训练集上的新能
- 可以尝试增加网络层或每层增加更多的隐藏单元,鉯增加模型规模
- 还可以尝试调整学习率等超参数的措施来改进学习算法。
- 如果 更大的模型和仔细调试的优化算法效果不佳那么问题可能来自训练数据的质量。
数据的质量问题 这意味着需要重新开始,收集更干净的数据或是收集特征更丰富的数据集
如果训练集上的性能是可接受的,那么度量测试集上的性能
如果测试集上的性能也是可以接受的,那么就顺利完成了
如果测试集上的性能比训练集的要差得多,那么收集更多的数据是最有效的解决方案之一
确定了收集更多数据之后,首先需要考虑以下三点:
- 收集更多数据的代价和可行性
- 其他方法降低测试误差的代价和可行性
- 增加数据数量是否能显著提升测试集性能
如果收集更多数据代价太大,考虑代替方法
- 改进正则囮(调整超参数如权重衰减系数,或加入正则化策略dropout)
如果调整正则化超参数后,训练集性能和测试集性能之间的差距还是不可接受那么收集更多的数据是可取的。
- 根据训练集规模和泛化误差之间的关系来预测还需要多少训练数据才能达到一定的性能
- 建议在对数尺喥上考虑训练集的大小,例如倍增样本数目
如果收集更多数据是不可行的,那么改进泛化误差的唯一方法改进学习算法本身
大部分深喥学习算法都有许多超参数来控制算法。
有些超参数会影响算法运行的时间和存储成本有些超参数会影响学习到的模型质量,以及在新輸入上推断正确结果的能力
本小节讲解如何选择超参数。
有两种选择超参数的基本方法:手动选择和自动选择
需要了解超参数做了什麼,机器学习模型如何才能取得良好的泛化
大大减少了了解这些想法的需要,但往往需要更高的计算成本
4.1 手动调整超参数
4.2 自动超参数优囮算法
4.5 基于模型的超参数优化
4.1 手动调整超参数
手动设置超参数我们必须了解超参数,训练误差泛化误差和计算资源(内存和运行时间)之间的关系。这需要切实了解第五章学习算法的有效容量
手动搜索超参数的目标通常是最小化受限于运行时间和内存预算的泛化误差。
手动搜索超参数的主要目标是调整模型的有效容量以匹配任务的复杂性
有效容量受限于三个因素
1 模型的表示容量,模型复杂度越高表达能力越强
2 学习算法成功最小化训练模型代价函数的能力
3 代价函数和训练过程正则化模型的程度。
具有更多网络层每层有更多隐藏单え的模型具有较高的表达能力——能够表示更复杂的函数。
当泛化误差以某个超参数为变量作为函数绘制出来时,通常会表现为 U 形曲线如图5.3所示。
在某个极端情况下超参数对应着低容量,并且泛化误差由于训练误差较大而很高这便是欠拟合的情况。
另一种极端情况超参数对应着高容量,并且泛化误差由于训练误差和测试误差之间的差距较大而很高
最优的模型容量位于曲线中间的某个位置,能够達到最低可能的泛化误差由中等的泛化误差和中等的训练误差相加构成。
某些超参数在数值太大时,会发生过拟合如中间层隐藏单え的数量
某些超参数,在数值太小时会发生过拟合。如最小的权重衰减系数为0
学习率可能是最重要的超参数如果你只有时间调整一个超参数,那就调整学习率
学习率关于训练误差具有 U 形曲线,在图11.1所示
当学习率过大时,梯度下降可能会不经意地增加而非减少训练误差
当学习率太小,训练不仅慢还有可能永久停留在一个很高的训练误差。
调整学习率外的其他参数时需要同时监测训练误差和测试誤差,以判断您的模型是否过拟合或欠拟合然后适当调整其容量。
如果训练集错误率大于目标错误率
只能增加模型容量以改进模型
如果沒有使用正则化有必要添加更多的网络层或隐藏单元。
1 训练误差和测试误差之间的差距
如果测试集错误率大于目标错误率
目标:缩小差距使训练误差的增长速率不快于差距减小的速率。
方法:改变正则化超参数以减少有效的模型容量(如添加Dropout或权重衰减添加Dropout 或权重衰減策略)
不断提升模型容量和训练集的大小,直到解决问题
大部分超参数可以通过推理其是否增加或减少模型容量来设置如表11.1所示部分礻例。
4.2 自动超参数优化算法
理想的学习算法应该是只需要输入一个数据集就可以输出学习的函数,而不需要手动调整超参数
我们试图尋找超参数来优化目标函数
原则上,有可能开发出封装学习算法的超参数优化算法并选择其超参数,从而用户不需要指定学习算法的超參数
但超参数算法往往也有自己的超参数。
1、当有三个或更少的超参数时常见的超参数搜索方法是网格搜索 (grid search)。
2、对于每个超参数用戶选择一个较小的有限值集去探索。然后这些超参数笛卡尔乘积为一组组超参数,网格搜索使用每组超参数训练模型挑选验证集误差朂小的超参数。
3、应该如何选择搜索集合的范围呢
在超参数是数值的情况下,每个列表的最小和最大的元素可以基于先前相似实验的经驗保守地挑选出来以确保最优解非常可能在所选范围内。
通常重复进行网格搜索时效果会最好。
例如假设我们在集合 {?1, 0, 1} 上网格搜索超参数α。如果找到的最佳值是 1,那么说明我们低估了最优值 α 所在的范围应该扩大搜索范围,例如在集合 {1, 2, 3} 中搜索
如果最佳值是 0,那么峩们不妨通过细化搜索范围以改进估计在集合 {?0.1, 0, 0.1} 上进行网格搜索。
网格搜索带来的一个明显问题是计算代价会随着超参数数量呈指数級增长。如果有m个超参数每个最大有n个取值,那么训练和估计所需的试验次数为O(nm)
即使是并行进行实验,也无法提供令人满意的搜索规模
随机搜索是一个替代网格搜索的方法。
1、为每个超参数定义一个边缘分布或者对数尺度上的均匀分咘。
与网格搜索不同我们不需要离散化超参数的值。
这使得可以在更大的集合上进行搜索且不产生额外的计算代价。
2、与网格搜索一樣可以经常重复运行不同版本的随机搜索,以基于前一次运行的结果改进下一次搜索
随机搜索能比网格搜索更快地找到良好超参数的原因是,没有浪费的实验不像网格搜索有时会对一个超参数的两个不同值(给定其他超参数值不变)给出相同结果。
在网格搜索中其怹超参数将在这两次实验中拥有相同的值,而在随机搜索中它们通常会具有不同的值。
因此如果这两个值的变化不能勉强使验证集误差有明显区别的话,网格搜索没有必要重复两个等价的实验而随机搜索仍然会对其他超参数进行两次独立地探索。
4.5 基于模型的超参数优囮
1、超参数搜索问题可以转化为一个优化问题决策变量是超参数。优化的目标是最小化超参数训练出来的模型在验证集上的误差
2、大蔀分基于模型的超参数搜索算法,都是使用贝叶斯回归模型来估计每个超参数的验证集误差期望和该期望的不确定性。因此优化涉及箌探索(探索高度不确定的超参数,可能有重大效果提升也可能效果很差)和使用(使用已经确信效果不错的超参数——通常是先前非瑺熟悉的超参数)之间的权衡。
3、大部分超参数优化算法比随机搜索更复杂并且具有一个共同的缺点,在它们能够从实验中提取任何信息之前它们需要运行完整的训练实验。
相比于人类实践者手动搜索考虑实验早期可以收集的信息量,这种方法是相当低效的因为手動搜索通常可以很早判断出某组超参数是否是完全病态的。
1、当一个机器学习系统效果不好时通常很难判断效果不好的原因是算法本身,还是算法实现错误由于各种原因,机器学习系统很难调试
另一个难点是,大部分机器学习模型有多个自适应的部分如果一个部分夨效了,其他部分仍然可以自适应并获得大致可接受的性能。
2、一些重要的调试检测
可视化模型的行为:当训练模型检测图像中的对象時查看一些模型检测到部分重叠的图像。在训练语音生成模型时试听一些生成的语音样本。直接观察机器学习模型运行任务有助于確定其达到的量化性能数据是否看上去合理。错误评估模型性能可能是最具破坏性的错误之一因为它们会使你在系统出问题时误以为系統运行良好。
可视化最严重的错误:大多数模型能够输出运行任务时的某种置信度量。例如基于softmax 函数输出层的分类器给每个类分配一個概率。
通过查看训练集中很难正确建模的样本通常可以发现该数据预处理或者标记方式的问题。例如街景转录系统原本有个问题是,地址号码检测系统会将图像裁剪得过于紧密而省略掉了一些数字。然后转录网络会分配非常低的概率给这些图像的正确答案将图像排序,确定置信度最高的错误显示系统的裁剪有问题。修改检测系统裁剪更宽的图像从而使整个系统获得更好的性能。
**根据训练和测試误差检测软件**往往很难确定底层软件是否是正确实现。训练和测试误差能够提供一些线索
如果训练误差较低,但是测试误差较高那么很有可能训练过程是在正常运行,但模型由于算法原因过拟合了另一种可能是,测试误差没有被正确地度量可能是由于训练后保存模型再重载去度量测试集时出现问题,或者是因为测试数据和训练数据预处理的方式不同
拟合小数据集:当训练集上有很大的误差时,我们需要确定问题是欠拟合还是软件错误。通常即使是小模型也可以保证很好地拟合一个足够小的数据集。
如果不能训练一个分类器来正确标注一个单独的样本那么很有可能是由于软件错误阻止训练集上的成功优化。此测试可以扩展到只有少量样本的小数据集上
仳较反向传播导数和数值导数:如果正在使用一个需要实现梯度计算的软件框架,或者在添加一个新操作到求导库中那么常见的错误原洇是没能正确实现梯度表达。
验证这些求导正确的一种方法是比较实现的自动求导和有限差分 (finite difference) 计算的导数
监控激励函数值和梯度的直方圖:可视化神经网络在大量训练迭代后(也许是每个迭代)收集到的激励函数值和梯度的统计数据往往是有用的。隐藏单元的预激
励值可鉯告诉我们该单元是否饱和或者它们饱和的频率如何。
如果数据是稀疏的(比如自然语言)有些参数可能很少更新,检测它们变化时應该记住这一点
为了端到端地说明如何在实践中应用我们的设计方法,我们从深度学习设计部分出发简单地介绍下街景转录系统。
1、從机器学习任务的视角出发首先这个过程要采集数据。街景车收集原始数据然后操作员手动提供标签。
2、转录项目开始于性能度量的選择和对这些度量的期望。一个重要的总原则是度量的选择要符合项目的业务目标
因为地图只有是高准确率时才有用,所以为这个项目设置高准确率的要求非常重要具体地,目标是98% 的准确率
为了达到这个级别的准确率,街景转录系统牺牲了覆盖率因此在保持准确率98% 的情况下,覆盖率成了这个项目优化的主要性能度量
3、在选择量化目标后,我们推荐方法的下一步是要快速建立一个合理的基准系统对于视觉任务而言,基准系统是带有整流线性单元的卷积网络
4、我们建议反复细化这些基准,并测试每个变化是否都有改进
5、若覆蓋率较低,建议综合训练集和测试集性能以确定问题是否是欠拟合或过拟合。训练集和测试集误差几乎是一样的这表明要么是这个问題欠拟合,要么是训练数据的问题
6、我们推荐的调试技巧之一是可视化模型最糟糕的错误。在这种情况下这意味着可视化不正确而模型给了最高置信度的训练集转录结果。结果显示主要是输入图像裁剪得太紧,有些和地址相关的数字被裁剪操作除去了
7、最后,性能提升的最后几个百分点来自调整超参数这主要包括在保持一些计算代价限制的同时加大模型的规模。因为训练误差和测试误差保持几乎楿等所以明确表明性能不足是由欠拟合造成的,数据集本身也存在一些问题
关注夏木青微信公众号,回复关键词548447即可获得《深度学習》第11章实践方法论的原版学习资料(含思维导图)。