机器学习策略
机器学习策略:在优化深度学习系统时,通过一些分析机器学习问题的方法来制定一些策略,在优化过程中能够朝着有希望的过程中标前进。
正交化
正交化:如果两个方向成90o夹角,那么这两个方向正交。正交化其实就是把要解决的问题分成不同并互不影响的维度来解决。
举例:如果要调节一个视屏屏幕的大小,如果有一个按钮能同时调节屏幕的长和宽。那么这样在调节长的时候宽在变,在调节宽的时候长在变,这样就很难把屏幕调到目标大小。如果我们把一个按钮分成长和宽两个调节按钮,因为这两个按钮分别调节不同的维度,在调节长的时候宽不变,在调节宽的时候长不变,这样可以说这两个按钮是正交化了的,那么这样你就能够更准确地调节长和宽了。
单一数字评估指标
个人理解:用一个数值化的标准来评估训练结果。
查准率(P):在你的分类器标记为猫的例子中,有多少真的是猫。(假设有120张图片,分类器A说有100张图片是猫,事实真的是猫的只有95张图片,那么分类器A的查准率为95%)
查全率(R):对于所有真猫的图片,你的分类器正确识别出了多少百分比。(假设有100张图片全是真的猫,然后分类器A却说只有90张是真的猫,那么分类器A的查全率为90%)
F1分数:$ \frac{2}{\frac{1}{P}+\frac{1}{R}} $
在数学中,这个函数叫做查准率和查全率的调和平均数。但非正式来说,你可以将它看成是某种查准率和查全率的平均值,只不过你算的不是直接的算术平均,而是用这个公式定义的调和平均。
满足和优化指标
满足指标:只要满足在阀值内就行的指标。(例如跑步比赛不能超过起跑线,那么距离起跑线多远都在规则内)
优化指标:指越优化性能越好的指标。(例如百米赛跑中当然是速度越快越好,那么跑步的速度就是优化指标)
训练/开发/测试集划分
三类数据集定义:
- training set:顾名思义,是用来训练模型的。因此它占了所有数据的绝大部分。
- development set:用来对训练集训练出来的模型进行测试,通过测试结果来不断地优化模型。
- test set:在训练结束后对训练出的模型进行一次最终的评估所用的数据集。
在选择开发和训练集时最好能够对数据集均匀化,例如有A, B, C, D这来自四种不同地区的数据,如果开发集选择A, B测试集选择C, D的话,那么可能训练的系统不能够满足测试集的需求,所以最好把A, B, C, D这四类数据混合到一起再分配到开发集和测试集当中去。
开发集和测试集的大小
大部分数据都集中在训练集上,除非你需要对最终投产系统有一个很精确的指标,所以开发集和测试集往往不需要很大。
什么时候该改变开发/测试集和指标?
分类错误率指标:$ Error = \frac{1}{m_{dev}}\sum_{i=1}^{m_{dev}}I\left \{ y_{pred}^{\left ( i \right )} \neq y^{\left ( i \right )}\right \} $
这个式子表示预测值与正确值不相等的个数占例子总数的比例。
加权重后指标:$ Error = \frac{1}{m_{dev}}\sum_{i=1}^{m_{dev}}w^{\left ( i \right )}I\left \{ y_{pred}^{\left ( i \right )} \neq y^{\left ( i \right )}\right \} $
在预测值不等于实际值时的前提下,预测值是特别不满意的数值,就在此预测结果上加上权重来表示自己想要的错误率。
归一化常数错误指标:$ Error = \frac{1}{\sum w^{\left ( i \right )}}\sum_{i=1}^{m_{dev}}w^{\left ( i \right )}I\left \{ y_{pred}^{\left ( i \right )} \neq y^{\left ( i \right )}\right \} $
此式子能够让所有错误率相加等于一,就是所谓的归一化。
为什么是人的表现?
算法发展过快已经能和人进行比较了。
可避免偏差
贝叶斯错误率:指理论上错误率的上限。
可避免偏差:贝叶斯错误率或者对贝叶斯错误率的估计和训练错误率之间的差值。
当可避免偏差过大时说明可以优化的空间比较大,说明还可以继续做调整。
理解人的表现
贝叶斯错误率一定是最优错误率,不管多少团队还是个人都无法比这个错误率更优。有时候可以用人的错误率来近似代替贝叶斯错误率来计算可避免偏差。
超过人的表现
当计算机训练到接近人类水平或者超越人类水平的时候,以后的学习速度会越来越慢。
改善你的模型的表现
进行错误分析
通过人工的观察错误样本并从错误样本并人工统计错误样本中导致错误的最大可能的原因然后系统的分析错误样本来对制定之后的优化策略。
清除标注错误的数据
标注错误:在数据集中经常会遇到图片与对应的标注不匹配的错误。
随机错误:如果标注的人员没注意不小心把标注错了,只要产生错误足够随机。
系统错误:比如标记本来猫对应着是1,但是标记人员认为狗对应着是1,然后一直给狗标记为1,这就是系统错误。
深度学习算法对随机误差很健壮,但对系统性的错误就没那么健壮了。如果是随机错误,数据集过大,实际的错误率就不会太高。但如果是系统错误,对结果的影响就很大了。最后通过分析标注错误所占错误率的比例来判断是否有必要修改标记错误。
快速搭建你的第一个系统,并进行迭代
先不要想太多,快速搭建系统然后再慢慢优化。初始系统的全部意义在于,有一个学习过的系统,有一个训练过的系统,让你确定偏差方差的范围,就可以知道下一步应该优先做什么,让你能够进行错误分析,可以观察一些错误,然后想出所有能走的方向,哪些是实际上最有希望的方向。
使用来自不同分布的数据,进行训练和测试
当有一大部分是理想的数据集,还有一小部分是普通的数据集的时候,不应该把这两种数据集混合在一起均匀分配到每个集合中。应该将普通的数据当做把心才能更好的满足用户的需求。
不匹配数据划分的偏差与方差
先加了个train_dev的错误率,这部分的数据集是来自训练的数据集,如果train_dev的错误率与train的错误率差值过大,则说明是算法的问题,如果train_dev的错误率与dev的错误率差值过大说明是数据集的问题。