吴恩达的机器学习使用总结
1.建立开发集和测试集
1. 传统学习算法似乎并不知道要如何来处理现今这般规模量级的数据。
在同样的监督学习任务下,选择训练一个小型的神经网络(neutral network, NN),你可能会
获得较好的性能表现:
2. 深度学习都是基于神经网络实现的
3. 开发集和训练集的定义:
为提高泛化能力,我们要将样本划分为训练集、开发集、测试集
• 训练集(training set)用于运行你的学习算法。
• 开发集(development set)用于调整参数,选择特征,以及对学习算法作出其它决定。
有时也称为留出交叉验证集(hold-out cross validation set)。
• 测试集(test set)用于评估算法的性能,但不会据此改变学习算法或参数。
在定义了开发集(development set)和测试集(test set)后,你的团队将可以尝试许多的想 法,比如调整学习算法的参数来探索哪些参数的使用效果最好。开发集和测试集能够帮助你的 团队快速检测算法性能。 换而言之,开发集和测试集的使命就是引导你的团队对机器学习系统做出最重要的改变。
4. 开发集和测试集应该服从同一分布
5. 开发集和测试集应该有多大?
测试集的大小又该如何确定呢?它的规模应该大到使你能够对整体系统的性能进行一个高 度可信的评估。
我们并不需要将开发集 和测试集的规模提升到远远超过评估算法性能所需的程度,也就是说,开发集和测试集的规模 并不是越大越好。
6. 使用单值评估指标进行优化
你可以通过使用单值评估指标(如准确率),根据所有的模型在此指标上的表现 ,进行排序,从而能够快速确定哪一个模型的性能表现最好。
取平均值或者加权平均值是将多个指标合并为一个指标的最常用方法之一
7. 优化指标和满意度指标
组合多个评估指标的一种方法
用优化指标和满意度指标来代替单个公式计算导出单个指标
若有N项不同的标准,则需设置N-1个满意度指标,下一步定义优化指标
8. 通过开发集和度量指标加速迭代
迭代过程:想法,代码,实验
开发集和度量指标可以帮助你快速评估想法的性能好坏
9. 何时修改开发集,测试集和指标
有三个主要原因可能导致开发集/评估标准错误实现
1.你需要实际处理的数据分布与开发集/测试集数据的分布情况不同
2.算法在开发集上过拟合了
3.该指标不是项目应当优化的目标
2.基础误差分析
1.误差分析 根据开发集样本评估想法
误差分析指的是检查被算法误分类的开发集样本的过程,以便帮助你找到造成这些误差的原因,从而改进有了方向。
帮助你在不同的想法中发现哪些想法更有前景
2.清洗误标注的开发集和测试集样本
在项目初始阶段容许一些误标注的开发集/测试集样本并不罕见,你可以选择在系统改进到一 定程度时再来考虑被误标注的样本,因为这些误差在整体误差中的占比会逐渐增大。
3.将大型开发集拆分为两个子集,专注其一
在误差分析时没必要了解所有图片,将开发集分为两个子集,但只人工检查其中一个,在其上过拟合,明确误差来源,另一部分可以在调参时使用。
一个是Eyeball开发集,一个是Blackbox开发集
4. Eyeball 和 Blackbox 开发集该设置多大?
Eyeball 开发集应该大到能够让你对算法的主要错误类别有所察觉。
分类器的错误率越低,为了获得足够多的错误样本进行误差分析,需要的 Eyeball 开发集就越大
如果你只有一个 Eyeball 开 发集,你可以在这个开发集上进行误差分析、模型选择和超参数调整,缺点是过拟合开发集的风险更大。
3.偏差与方差
- 机器学习中误差的两大来源:偏差和方差
偏差:算法在训练集上的错误率(提高算法在训练集上的性能)
方差:算法在开发集上的表现比训练集上的表现差多少(帮助算法从训练集到开发集上更好的泛化)
- 过拟合:偏差很低,方差很高
欠拟合:偏差很高,方差很低
- 与最优错误率比较:
最优错误率:不可避免偏差
可避免偏差:训练集偏差—最优错误率
方差:开发集偏差—训练集偏差(拥有足够大的训练集,方差可以避免)
最优错误率也被称为贝叶斯错误率,也称贝叶斯率
- 处理偏差和方差
处理偏差和方差最简单的两种形式:
如果具有较高的可避免偏差,那么加大模型的规模(例如通过添加层/神经元数量来增 加神经网络的大小)。
如果具有较高的方差,那么增加训练集的数据量。
加大模型的规模通常可以减小偏差,但有可能加大方差或出现过拟合
但使用正则化可以避免过拟合风险
- 减少可避免偏差的技术
加大模型规模(例如神经元/层的技术);根据误差分析结果修改输入特征;减少或者去除正则化;修改模型架构
- 训练集误差分析
除了用于处理高偏差的技术外,通常也会在训练数据上进行误差分析,类似于在开发集上设置一个Eyeball开发集,从而知道训练集误差的主要种类
- 减少方差的·技术
增添更多的训练集;加入正则化;加入提前终止;通过特征选择减少输入特征的数量和种类;减少模型规模;根据误差分析结果修改输入特征;修改模型结构
4.学习曲线
5.与人类表现水平对比
1. 为何与人类表现水平进行对比:在处理人类擅长的学习任务时,构建一个机器学习系统会更加简单
原因:易于从人为标签中获取数据;基于人类直觉进行误差分析;使用人类表现水平来估计最优错误率,并设置可达到的“期望错误率”
2. 超越人类表现水平:
只要在开发集上存在着一些人类能正确处理而算法不能的样本,前面提到的 技术就能够被应用。即使你的算法在整个开发集或是测试集上的表现已经超过了人类,这样做 也是正确的。
6.在不同的分布上测试与训练
1. 选择开发集和测试集以反映你在将来想要正确处理的数据
2. 如何决定你是否使用你所有的数据?
若能构建一个足够多隐藏层的神经网络,则可以将所有数据加入到你的隐藏层中,若没有足够大的神经网络,那么应该更加关注训练数据,与开发集/测试集的数据相匹配
3. 给数据增添权重
通过对额外的网络图像赋予更少的权重,你不需要构建一个庞大的神经网络来确保算法在这两种类型的任务上都能很好地完成。只有当你怀疑这些额外的数据与开发/测试集分布不一致,或者额外的数据规模比与相同分布的开发/测试集数据规模大得多时,这种类型的权重加权才需要
4. 从训练集泛化到开发集
数据不匹配:它能够很好地泛化到与训练集相同分布的未知数据,但不能很好地泛化到与开发/测试集相同分布的未知数据。
将训练集数据划分为两个子集,算法将进行训练的实际训练集,以及一个单独的集合,我们称之为“训练开发”集,我们将不会对它进行训练。
训练开发集:这些数据来自与训练集相同的分布(例如,互联网图像+移动应用图
像)。它通常比训练集要小;它只需要足够大到来评估和跟踪我们的学习算法的进展
5. 评估方面:
训练误差,对训练集进行评估。
该算法能够泛化到与训练集相同分布数据的能力,并对训练开发集进行评估。
算法在你实际关心的任务上的性能,通过对开发集或测试集评估。
6. 数据不匹配问题:
解决方法:
尝试理解数据属性在训练集和开发集分布之间的差异。
尝试找到更多的训练数据,以便更好地匹配你的算法碰到的开发集样本。
误差分析的目的是了解训练集和开发集之间的显著差异,这正是导致数据不匹配的原因
7.调试推理算法
1. 优化验证测试
搜索算法 /目标(得分函数)存在问题?
想要在实践中运用优化验证测试,你需要在开发集中检测这些误差样本。对于每一个误差样本,你都需要测试是否有 ScoreA (S*) > ScoreA (Sout ) . 开发集中所有满足该不等式的样本都将被标记为优化算法自身所造成的误差,而满足不等式 ScoreA (S*) ≤ ScoreA (Sout ) 的样本将被记为是计算得分 ScoreA (.) 造成的误差。
在人工智能领域,这是一种非常常见的 “设计模式”,首先要学习一个近似的得分函数 Scorex (.),然后使用近似最大化算法。如果你能够发现这种模式,就能够使用优化验证测试来 理解造成误差的来源。
- 端到端深度学习
- 兴起示例:
要构建一个系统来对产品的线上评论进行检查
这种识别正面与负面评论的问题被称为 “情感分类
解析器(parser):一种通过识别关键词汇来对文本进行注释的系统
情感分类器(sentiment classifier):一种学习算法,它可以输入带注释的文本,并预 测整体的情感
更倾向于用一种单一的学习算法取代此类流水线。该任务的端到端学习算法只需输入一个原始的文本,接着尝试直接识别其中的情感
神经网络通常用于端到端学习系统,“端到端” 这个术语指的是我们要求学习算法直接从输入得 到期望的输出,即学习算法将系统的 “输入端” 连接到 “输出端”
- 端到端学习的优缺点
流水线中的人工设计成分限制了语音系统的潜在性能,当数据量不多时,人工设计会补充更多知识。
而端到端学习缺乏人工设计知识,当训练集很大,如果学习算法是一个足够大的神经网络,且喂进去许多的训练数据,就有可能做得更好,甚至达到最优错误率。端到端学习系统在 “两端” —— 输入端和输出端拥有大量标记数据时,往往做得更好。
- 流水线组建的选择:数据可用性
如果有大量的数据可以被用来训练流水线的 “中间模块” (例如汽车检测器 或行人检测器),你便可以考虑使用多段的流水线架构。因为可以使用所有可用数据进行训练 ,所以这种结构可能是更优的。
- 流水线组建的选择:任务简单性
当决定流水线组件的内容组成时,试着构建这样的流水线,其中每个组件都是一个 相对 “简单” 的功能,因此只需要从少量的数据中学习
- 根据组件进行误差分析
- 组件误差分析与人类水平对比
组件误差分析告诉我们:哪些组件的性能是最值得尽力去改进的。
如果你发现其中一个组件远低于人类水平的表现,那么你现在可以专注于提高该组件的性能。 当我们尝试自动化人类可以做的事情时,许多误差分析过程将表现得最好,因此可以对人类水 平的表现进行基准测试。 我们前面的大多数例子都有这个隐含的假设。
即使每个组件都具有人类级别的性能(请记住,你要与被给予与组件相同 输入的人类进行比较),流水线整体上也不会达到人类水平的性能,则表明流水线有缺陷,应该重新设计