第三门课 结构化机器学习项目-笔记
作者:互联网
正交化(Orthogonalization)
正交化的概念是指,你可以想出一个维度,这个维度你想做的是控制转向角,还有另一个维度来控制你的速度,那么你就需要一个旋钮尽量只控制转向角,另一个旋钮,在这个开车的例子里其实是油门和刹车控制了你的速度。但如果你有一个控制旋钮将两者混在一起,比如说这样一个控制装置同时影响你的转向角和速度,同时改变了两个性质,那么就很难令你的车子以想要的速度和角度前进。然而正交化之后,正交意味着互成90度。设计出正交化的控制装置,最理想的情况是和你实际想控制的性质一致,这样你调整参数时就容易得多。可以单独调整转向角,还有你的油门和刹车,令车子以你想要的方式运动。
单一数字评估指标(Single number evaluation metric)
调和平均数.\(\frac{2}{\frac{1}{P} +\frac{1}{R}}=F_{1}\) F1分数
满足和优化指标(Satisficing and optimizing metrics)
比如模型的精准度和速度。优化指标就是精准度,当然是越高越好(不过拟合的情况下),速度也很重要,但是达到一定的范围内就好了。比如一个模型运行10秒才能出结果你觉得太慢了。1秒以内出结果这样体验比较好,但至于1秒内是800ms 600ms 甚至是10ms其实差距不大,都在可接受(1秒内
)的范围内所以不一定要优化那么极致(够用就行),这种就是满足指标,满足一个阈值就好。
所以更一般地说,如果你要考虑\(N\)个指标,有时候选择其中一个指标做为优化指标是合理的。所以你想尽量优化那个指标,然后剩下\(N-1\)个指标都是满足指标,意味着只要它们达到一定阈值,例如运行时间快于100毫秒,但只要达到一定的阈值,你不在乎它超过那个门槛之后的表现,但它们必须达到这个门槛。
训练/开发/测试集划分(Train/dev/test distributions)
训练集(training set)用于运行你的学习算法。
开发(dev)集也叫做开发集(development set),有时称为保留交叉验证集(hold out cross validation set)。然后,机器学习中的工作流程是,你尝试很多思路,用训练集训练不同的模型,然后使用开发集来评估不同的思路,然后选择一个,然后不断迭代去改善开发集的性能,直到最后你可以得到一个令你满意的成本,然后你再用测试集去评估。
测试集(test set)用于评估算法的性能,但不会据此改变学习算法或参数。
- 开发集和测试集来自同一分布
- 在设立开发集和测试集时,要选择这样的开发集和测试集,能够反映你未来会得到的数据
设立开发集以及评估指标,真的就定义了你要瞄准的目标。我们希望通过在同一分布中设立开发集和测试集,你就可以瞄准你所希望的机器学习团队瞄准的目标。而设立训练集的方式则会影响你逼近那个目标有多快.
开发集和测试集的大小(Size of dev and test sets)
测试集的目的是评估你最终的成本偏差,你只需要设立足够大的测试集,可以用来这么评估就行了
比如说你有1百万个训练样本,这样分可能更合理,98%作为训练集,1%开发集,1%测试集
什么时候该改变开发/测试集和指标?(When to change dev/test sets and metrics)
根据实际业务需求。总体方针就是,如果你当前的指标和当前用来评估的数据和你真正关心必须做好的事情关系不大,那就应该更改你的指标或者你的开发测试集,让它们能更够好地反映你的算法需要处理好的数据。指标也一样。
为什么是人的表现?(Why human-level performance?)
首先有个概念贝叶斯最优错误率一般认为是理论上可能达到的最优错误率,就是说没有任何办法设计出一个\(X\)到\(Y\)的函数,让它能够超过一定的准确度。
例如,对于语音识别来说,如果\(X\)是音频片段,有些音频就是这么嘈杂,基本不可能知道说的是什么,所以完美的准确率可能不是100%。或者对于猫图识别来说,也许一些图像非常模糊,不管是人类还是机器,都无法判断该图片中是否有猫。所以,完美的准确度可能不是100%。
人类相当擅长的任务,包括看图识别事物,听写音频,或阅读语言,人类一般很擅长处理这些自然数据。对于人类擅长的任务,错误率和贝叶斯最优错误率很接近,所以,当算法超越人类的表现之后也许没有太多的空间继续改善了。但第二个原因是,只要你的表现比人类的表现更差,那么实际上可以使用某些工具来提高性能。一旦你超越了人类的表现,这些工具就没那么好用了。
只要你的机器学习算法比人类差,你就可以从让人帮你标记数据,你可以让人帮忙或者花钱请人帮你标记例子,这样你就有更多的数据可以喂给学习算法。而一旦你的算法做得比人类好,这三种策略(人为提供标注数据,分析算法错误为什么人可以做对,偏差方差优化分析)就很难利用了。所以这可能是另一个和人类表现比较的好处,特别是在人类做得很好的任务上。
可避免偏差(Avoidable bias)
锚定一个贝叶斯错误率,贝叶斯错误率可以锚定一个人类,或者人类专家,或者人类专家组。具体的锚定对象根据业务需求。
然后这个锚定的贝叶斯错误率减去训练误差就是可避免偏差。如果偏差过大就优化偏差(欠拟合,修改优化算法,更大的神经网络。)
如果开发集的误差和训练的误差的差更大就是方差更大,优化方差(过拟合,采用更多训练数据,Dropout,正则化。)
理解人的表现(Understanding human-level performance)
锚定一个贝叶斯错误率,贝叶斯错误率可以锚定一个人类,或者人类专家,或者人类专家组。具体的锚定对象根据业务需求。
对人类水平有大概的估计可以让你做出对贝叶斯错误率的估计,这样可以让你更快地作出决定是否应该专注于减少算法的偏差,或者减少算法的方差。这个决策技巧通常很有效,直到你的系统性能开始超越人类,那么你对贝叶斯错误率的估计就不再准确了,但这些技巧还是可以帮你做出明确的决定。
超过人的表现(Surpassing human- level performance)
一个人类专家团和单个人类专家的表现和以前一样,但你的算法可以得到0.3%训练错误率,还有0.4%开发错误率。现在,可避免偏差是什么呢?现在其实很难回答,事实上你的训练错误率是0.3%,这是否意味着你过拟合了0.2%,或者说贝叶斯错误率其实是0.1%呢?或者也许贝叶斯错误率是0.2%?或者贝叶斯错误率是0.3%呢?你真的不知道。但是基于本例中给出的信息,你实际上没有足够的信息来判断优化你的算法时应该专注减少偏差还是减少方差,这样你取得进展的效率就会降低。还有比如说,如果你的错误率已经比一群充分讨论辩论后的人类专家更低,那么依靠人类直觉去判断你的算法还能往什么方向优化就很难了。所以在这个例子中,一旦你超过这个0.5%的门槛,要进一步优化你的机器学习问题就没有明确的选项和前进的方向了。这并不意味着你不能取得进展,你仍然可以取得重大进展。但现有的一些工具帮助你指明方向的工具就没那么好用了。
改善你的模型的表现(Improving your model performance)
监督学习的两个基本假设:
- 模型可以很好地适应训练集。
- 训练集的性能可以很好地推广到开发/测试集。
所以我想要让一个监督学习算法达到实用,基本上希望或者假设你可以完成两件事情。首先,你的算法对训练集的拟合很好,这可以看成是你能做到可避免偏差很低。还有第二件事你可以做好的是,在训练集中做得很好,然后推广到开发集和测试集也很好,这就是说方差不是太大。
就是期望泛化误差 = 偏差 + 方差 + 噪声
至于怎么改善,手段很多。。。
如果你想用尽一切办法减少可避免偏差,我建议试试这样的策略:比如使用规模更大的模型,这样算法在训练集上的表现会更好,或者训练更久。使用更好的优化算法,比如说加入momentum或者RMSprop,或者使用更好的算法,比如Adam。你还可以试试寻找更好的新神经网络架构,或者说更好的超参数。这些手段包罗万有,你可以改变激活函数,改变层数或者隐藏单位数,虽然你这么做可能会让模型规模变大。或者试用其他模型,其他架构,如循环神经网络和卷积神经网络。在之后的课程里我们会详细介绍的,新的神经网络架构能否更好地拟合你的训练集,有时也很难预先判断,但有时换架构可能会得到好得多的结果。
另外当你发现方差是个问题时,你可以试用很多技巧,包括以下这些:你可以收集更多数据,因为收集更多数据去训练可以帮你更好地推广到系统看不到的开发集数据。你可以尝试正则化,dropout正则化或者我们在之前课程中提到的数据增强。同时你也可以试用不同的神经网络架构,超参数搜索,看看能不能帮助你,找到一个更适合你的问题的神经网络架构。
标签:结构化,门课,训练,错误率,笔记,贝叶斯,算法,测试,人类 来源: https://www.cnblogs.com/huajiasama/p/15689209.html