文章目录
- 1 机器学习策略一
- 1.1 为什么是ML策略?
- 1.2 正交化
- 1.3 单一数字评估指标
- 1.4 满足和优化指标
- 1.5 训练、开发及测试集划分
- 1.6 开发集和测试集的大小
- 1.7 什么时候改变开发、测试集和指标?
- 1.8 为什么是人的表现?
- 1.9 可避免偏差
- 1.10 理解人的表现
- 1.11 超越人的表现
- 1.12 改善你的模型的表现
- 2 机器学习策略二
- 2.1 进行误差分析
- 2.2 清除标注错误的数据
- 2.3 快速搭建第一个系统,并进行迭代
- 2.4 使用来自不同分布的数据进行训练和测试
- 2.5 数据分布不匹配时的偏差与方差的分析
- 2.6 处理数据不匹配问题
- 2.7 迁移学习
- 2.8 多任务学习
- 2.9 什么是端到端的深度学习?
- 2.10 是否要使用端到端的深度学习?
1 机器学习策略一
1.1 为什么是ML策略?
改善系统的策略:
1、收集更多数据
2、训练集多样性(如,识别猫,收集各种姿势的猫,以及反例)
3、训练的时间更长一些
4、尝试不同的优化算法(如 Adam优化)
5、尝试规模 更大 / 更小 的神经网络
6、尝试 DropOut 正则化
7、尝试添加 L2 正则化
8、修改网络架构(修改激活函数,隐藏单元数目)
需要判断哪些是值得一试的,哪些是可以舍弃的
1.2 正交化
1、 要弄好一个监督学习系统,要确保四件事情
1> 确保至少系统在训练集上得到的结果不错,所以训练集上的表现必须通过某种评估,达到能接受的程度。
2> 在训练集上表现不错之后,希望系统也能在开发集上有好的表现
3> 希望系统在测试集上有好的表现
4> 希望系统在测试集上系统的成本函数在实际使用中表现令人满意
2、
1>在成本函数上不能很好地拟合训练集
可以训练更大的网络
可以切换到更好的优化算法<如Adam优化算法>
2>在训练集上做得很好,但开发集<验证集>不行
可以通过正则化进行调节
3>在开发集上做的不错,但测试集不行,意味着对开发集过拟合了
可以使用更大的开发集
4>在测试集上做得很好,但无法给应用用户提供良好的体验
可以改变开发集或成本函数
注:训练神经网络时,一般不使用early stopping,如果使用,那么对训练集的拟合就不太好,但它同时也用来改善开发集的表现,所以它没那么正交化。
1.3 单一数字评估指标
查准率§和查全率®
查准率:如果分类器A有95%的查准率,这意味着你的分类器说这图有猫的时候,有95%的机会真的是猫。
查全率:如果分类器A查全率是90%,这意味着对于所有的图像,比如说你的开发集都是真的猫图,分类器准确地分辨出了其中的90%。
结合查准率和查全率的标准方法是F1分数(P和R的调和平均数)
我们快速选出分类器A,淘汰B
除了F1 分数之外,我们还可以使用平均值作为单值评价指标来对模型进行评估
总:单实数评估指标可以提高做决策的效率。
1.4 满足和优化指标
Accuracy是优化指标,Running time是满足指标。
只要运行时间小于100毫秒,用户就不在乎运行时间是100毫秒还是50毫秒,在这种情况下分类器B最好,因为在所有运行时间小于100毫秒的分类其中,它的准确度是最高的。
考虑N个指标,有时候选择其中一个作为优化指标是合理的。
尽量优化那个指标,然后剩下 N-1个指标都是满足指标,意味着只要它们达到一定阈值,你不再关心指标在阈值内的大小。
1.5 训练、开发及测试集划分
如何设立开发集和测试集?
开发集(dev set)有时也叫(development set),有时称为保留交叉验证集(hold out cross validation set)。
机器学习中的工作流程是你尝试很多思路,用训练集训练不同的模型,然后使用开发集来评估不同的思路,然后选择一个,然后不断迭代去改善开发集的性能,直到最后你可以得到一个令你满意的成本,然后你再用测试集去评估。
设立开发集以及评估指标:定义类要瞄准的目标
设立训练集的方式:会影响逼近那个目标有多快
前四个作为开发集,后四个作为测试集,这个想法非常糟糕,因为开发集与测试集来自不同的分布。
建议:将所有数据随机洗牌,放入开发集和测试集,所以开发集和测试集都有来自八个地区的数据,并且开发集和测试集来自同一分布,这分布就是所有数据混在一起。
1.6 开发集和测试集的大小
测试集的目的是完成系统开发之后,测试集可以评估投产系统的性能,及评估最终的成本偏差。
不单独分出一个测试集也是可以的,但不建议在搭建系统时省略测试集,因为有个单独的测试集比较安心。因为可以使用这组不带偏差的数据来测量系统的性能。
1.7 什么时候改变开发、测试集和指标?
例:构建一个猫分类器,试图找到很多猫的照片,向爱猫人士用户展示,决定使用的指标是分类错误率。所以算法A和B分别有3%错误率和5%错误率,所以算法A似乎做得更好。但是算法A由于某些原因,把很多色情图片分类成猫了。从用户接受的角度来看,算法B实际上是一个更好的算法,因为它不让任何色情图像通过。
这个公式就统计了分类错误的样本。这个评估指标的问题在于,它对色情图片和非色情图片一视同仁。
改进:引入一个权重项<赋予色情图片更大的权重,让算法将色情图分类为猫图时,错误率快速变大>
并进行归一化,使错误率仍保持在0-1之间
我们定义了一个评估指标帮助我们更好的把分类器排序,能够区分出他们在识别色情图片的不同水平,这实际上是一个正交化的例子
注:在处理机器学习时,分为两个独立的步骤,第一步是设定目标,第二步在逼近目标的时候,也需学习算法对某个成本函数优化,最小化训练集上的损失。
可以修改这个,引入权重,最后修改这个归一化常数。
总方针:如果当前指标和当前用来评估的数据和真正关心必须做好的事情关系不大,那就应该更改你的指标或者开发测试集,让它们能够更好地反应算法需要处理好的数据。
1.8 为什么是人的表现?
超越人类表现,进展会慢下来的原因:
1> 人类水平在很多任务中离贝叶斯最优错误率已经不远了,人们非常擅长看图像,分辨里面有没有猫或者听写音频。所以,当你超越人类的表现之后也许没有太多的空间继续改善了。
2> 只要你的表现比人类的表现更差,那么实际上可以使用某些工具来提高性能。一旦你超越了人类的表现,这些工具就没那么好用了。
1.9 可避免偏差
算法在训练集上的表现和人类水平的表现有很大差距的话,说明算法对训练集的拟合并不好,重点放在减少偏差上。
可避免偏差:贝叶斯错误率或者对贝叶斯错误率的估计和训练错误率之间的差值称为可避免偏差。
即7%的可避免偏差<7%衡量了可避免偏差大小,而2%衡量了方差大小>
1.10 理解人的表现
最优错误率肯定在5%以下,可以用0.5%来估计贝叶斯错误率
贝叶斯错误率或者说贝叶斯错误率的估计和训练错误率直接的差值就衡量了所谓的可避免偏差,这(训练误差与开发误差之间的差值)可以衡量或者估计你的学习算法的方差问题有多严重。
1.11 超越人的表现
一旦超过0.5%这个门槛,要进一步优化机器学习问题就没有明确的选项和前进的方向了。
机器学习超越人类水平的实例:
1> 网络广告:估计某个用户点击广告的可能性
2> 提出产品建议,推荐电影或书籍之类的任务。
3> 物流预测,从A到B开车需要多久,或者预测快递车从A开到B需要多少时间。
4> 预测某人会不会偿还贷款,这样你就能判断是否批准这人的贷款
1.12 改善你的模型的表现
训练集误差与贝叶斯估计误差之间的差距:可避免偏差
训练集误差与开发集误差之间的差距:方差
减少可避免方差:
更大规模的模型
训练更久、迭代次数更多
更好的优化算法(Momentum、RMSprop、Adam)
更好的新的神经网络结构
更好的超参数
改变激活函数、网络层数、隐藏单元数
其他模型(循环神经网络<CNN>,卷积神经网络<RNN>)
改进方差:
收集更多的数据去训练
正则化(L2正则、dropout正则、数据增强)
更好的新的神经网络结构
更好的超参数
2 机器学习策略二
2.1 进行误差分析
<猫分类器中>收集n个预测错误的开发集样本,手动检查
(错误分类的图片里面有多少比例是狗🐶,假如错误率10%,其中狗占5%,那么你完全解决了狗的问题,能降低错误率到 9.5%,结合你花费的时间,评估下值不值当;如果错误分类中,狗占50%,那么解决狗的问题,就能降低错误率到 5%,还是很值得一试的)
通常做法,统计各种误差的比例,检查哪种误差占比较高,优先解决
2.2 清除标注错误的数据
倒数第二张是标记错误的图片,即为标记错误的样本。
深度学习算法对于训练集中的随机错误是相当健壮的。如果错误足够随机,那么放着这些错误不管可能也没问题。
如果在开发集和测试集有错误标记的样本:
如果你要更正标签,请注意:
同时在开发集和测试集上操作(同一分布)
检查了判断错误的样本,也需要考虑到判断正确的样本(可能是标签就错了,恰好预测的一致),但通常此步不会做,太耗时了(比如98%的判对了,检查98%的数据?太多了)
只修正开发集/测试集的标签,而不修正训练集的标签是合理的,训练集通常比前2者大得多,算法是相当健壮的。
2.3 快速搭建第一个系统,并进行迭代
快速设立开发集和测试集还有指标,如果目标定错了,之后改也是可以的
找到训练集,并进行训练
在开发及和测试集,评估指标表现如何
建立好第一个系统之后,就可以用到偏差方差分析,还有错误分析来确定下一步优先做什么。
2.4 使用来自不同分布的数据进行训练和测试
第一种选择:随机分配到训练、开发和测试集中,开发集、测试集各包含2500个样本,训练集有205000个样本。
结果:观察开发集,2500个样本很多都是来自网页下载的图片,并不是真正关心的 数据分布,真正要处理的是来自手机的图片。建立开发集的目的是瞄准目标,而这个选择瞄准目标的方式,大部分精力用于优化来自网页下载的图片。
第二种选择:训练集包含来自网页的20万图片以及来自手机拍摄5000张图片,开发集是2500张来自应用的图片,测试集也是2500张来自应用的图片。
结果:好处:瞄准的目标就是想要处理的目标。训练集和开发集、测试集的分布不一样,在长期能够给你带来更好的系统性能。
2.5 数据分布不匹配时的偏差与方差的分析
训练-开发集是从训练集的分布中挖出来的,因此训练-开发集与训练集具有相同的分布。即开发集与测试集来自同一分布,而训练集与训练-开发集来自同一分布。
训练误差&训练-开发误差,差距 8 %,但是两者数据是同分布的,所以问题是泛化性能差,高方差问题
训练误差&训练-开发误差,差距0.5 %,方差问题很小,但是在开发集上误差为 10%,训练-开发集&开发集上的数据,模型都没有在上面训练过,由于他们是不同分布,模型擅长前者,而你关心的开发集,模型表现不好,这称之为数据不匹配
2.6 处理数据不匹配问题
发现有严重的数据不匹配,亲自做误差分析,了解训练集和开发集/测试集的具体差异
为了避免对测试集过拟合,要做误差分析,应该人工去看开发集而不是测试集
例:
1、开发一个语音激活的后视镜应用,你可能要听一下开发集的样本,弄清楚开发集和训练集有什么不同:发现很多开发集样本汽车噪音很多,后视镜经常识别错误街道号码。
2、如果你发现车辆背景噪音是主要误差来源,那么你可以模拟车辆噪声数据;
或者你发现很难识别街道号码,你可以有意识地收集更多人们说数字的音频数据,加到你的训练集里
3、如果目标是让训练数据更接近开发集,其中一种技术是人工合成数据。
人工数据合成有一个潜在问题:你在安静的背景里录得 10000小时 音频数据,你只录了1小时车辆背景噪音,将这1小时汽车噪音循环放10000次,并叠加到上面的语音,结果:人听起来,这个音频没什么问题,但是有一个风险,有可能你的学习算法对这1小时汽车噪音过拟合,你只录了1小时汽车噪音,只模拟了全部数据空间的一小部分(噪声过于单一),所以找 10000 小时不同的噪声叠加在音频上是合理的。
2.7 迁移学习
如果放射科数据很小,则需要重新训练最后一层的权重,就是w[L]和b[L],并保持其他参数不变。即只需训练输出层前的最后一层,或者也许是最后一两层。
如果有很多数据,也许可以重新训练网络中的所有参数。
如果你重新训练神经网络中的所有参数,那么这个在图像识别数据的初期训练阶段,有时称为预训练,因为你在用图像识别数据去预先初始化,或者预训练神经网络的权重。然后,如果你以后更新所有权重,然后在放射科数据上训练,有时这个过程叫微调
迁移学习发挥作用的场合:
在迁移来源问题中有很多数据,但迁移目标问题没有那么多数据。(例如:你有100万张图像识别数据,而只有100张X射线图像)
数据量如果反过来了,迁移学习可能就没有意义了(没有太大的帮助)
2.8 多任务学习
输入图像x(i),这里有4个标签,即y(i)是一个4*1向量。整体来看这个训练集标签和以前类似,我们将训练集的标签水平堆叠起来
则对于整个训练集的平均损失:
L指的是logistic损失:
整个训练集的平均损失和之前分类猫的例子主要区别在于,现在你要对j=1到4求和
与softmax回归的主要区别在于,与softmax回归不同,softmax将单个标签分配给单个样本
多任务学习什么时候有意义?
1> 如果你训练的一组任务,可以共用低层次特征
2> 单项任务可以从多任务学习得到很大性能提升,前提:其他任务数据总量加起来必须比单个任务的数据量大的多
3> 训练一个足够大的神经网络,多任务学习肯定不会或者很少会降低性能,比单独训练神经网络来单独完成各个任务性能要更好
注:多任务学习 的使用频率要低于迁移学习计算机视觉
一个例外是物体检测,人们经常训练一个神经网络同时检测很多不同物体,这比训练单独的神经网络来检测视觉物体要更好。
2.9 什么是端到端的深度学习?
以前有一些数据处理系统或者学习系统,它们需要多个阶段的处理。那么端到端深度学习就是忽略所有这些不同的阶段,用单个神经网络代替它。
例:语音识别为例,端到端深度学习做的是,训练一个巨大的神经网络,输入就是一段音频,输出直接是听写文本。
端到端深度学习的挑战之一:需要大量数据才能让系统表现良好。
人脸识别门禁:
比起一步到位,把这个问题分解为两个更简单的步骤。
首先,弄清楚脸在哪里:观察一张图,找出人脸所在的位置,把人脸图像框出来,有很多标签数据(x,y),x是图片,y是人脸的位置
第二步,看着脸,弄清楚这是谁:(x,y)其中x是门禁系统拍摄的图像,y是那人的身份。
2.10 是否要使用端到端的深度学习?
端到端深度学习的好处:
1>首先端到端(end-to-end)学习真的只是让数据说话。如果有足够多的数据,直接输入去训练神经网络,更能捕获数据中的信息,而不是引入人类的成见
2>所需手工设计的组件更少,所以这也许能够简化你的设计工作流程,你不需要花太多时间去手工设计功能。
端到端深度学习的缺点:
1>它可能需要大量的数据。
2>它排除了可能有用的手工设计组件
在构建一个新的机器学习问题时,在决定是否使用端到端深度学习,关键问题(key question)是,你有足够的数据能够直接学到从x映射到y足够复杂的函数吗?
注:纯粹的端到端深度学习方法,前景不如更复杂的多步方法(比如人脸识别,人脸每次的位置是变化的,先识别出有人脸,然后把人脸区域截取出来,再对其进行预测,分步进行)。因为目前能收集到的数据,还有我们现在训练神经网络的能力是有局限的。