0%

深度学习-改善训练结果

深度学习-机器学习策略

什么是机器学习策略

因为在训练过程中,如果通常会有很多选择可以深试,但如果做出了错误的选择,就有可能浪费时间向错误的方向前进,所有需要机器学习策略来迅速判断跟哪些想法是靠谱的,或者提出新想法等,进而指引朝向最有可能的方向前进

正交化

调整多个互不影响(正交)的参数,进而调整训练效果

机器学习的假设链

  1. 确保系统在训练集上得到的结果不错(否则采取更深的网络、Adam等法处理)
  2. 在验证集上表现不错(否则采取正则化、增大训练集等操作)
  3. 在测试集上表现不错(否则采取增大验证集等操作)
  4. 在实际应用中表示不错(否则回去改变验证集或修改Cost function)

单个数字评估指标

查准率(Precision)和召回率(Recall)

以猫分类为例:

查准率是在分类器标记为猫的例子中,有多少真的是猫;

查全率(召回率)是对于所有真猫的图片,分类器正确识别出了多少百分比

查准率和查全率通常不能同时达到非常高,往往需要折衷

使用查准率和查全率作为评价指标,通常是很好的,但当两个分类器,一个在查准率上表现好,一个在查全率上表现好时,则无法判断哪个分类器表现更好。

因此,在评估一个分类器时,通常使用一个新的评估指标,可以结合查准率和查全率,那就是F1 score,记查准率为P,查全率为R,则\(F_1 = \frac{2}{\frac{1}{P}+\frac{1}{R}}\)

这种单一评价指标可以加速机器学习

满足和优化指标

优化指标:尽量达到最好

满足指标:必须足够好,达到之后则不在乎这个指标有多好

训练集、验证集、测试集划分

  1. 验证集、测试集尽量来自同一分布
  2. 选择很重要的数据或能够反映将来会得到的数据作为验证集和测试集

验证集和测试集的大小

过去的划分方式:将所有数据按照7:3分成训练集和测试集或按照6:2:2划分训练集、验证集和测试集

但在现在的大数据型的数据集中,例如有1,000,000数据,则可以划分98%作为训练集,而只需要1%验证集和1%测试集,因为1,000,000的1%已经是10,000,对于验证集和测试集来说已经足够了

对于测试集而言:需要让测试集足够大,保证能够以较高置信度的评估系统整体性能,因此,除非需要对最终投产系统有一个很精确的指标,一般来说,测试集不需要上百万个例子

什么时候更改验证集、测试集和指标

一个猫分类的例子:

有两个算法可能将图片中的关于猫的图片分类出来

算法A错误率:3%;算法B错误率:5%

但A会将一些不能被用户或公司接受的图片分类到猫类,而B则不会

所以从单一错误率指标看,可能会选A,但实际上更可能会选B

即:在训练和验证集的基础上,偏向于A,因为A的错误率更低,但公司和用户更倾向于B,因此,当评估指标无法正确衡量算法之间的优劣排序时,这就意味着应该改变评估指标了,或要改变验证集和测试集。

其中一个修改评估指标的方法是加一个权重项,当图片是正常图片时,w为1,当图片是无法接受的图片时,w为10或更大,同时要将之前分类器错误率计算中的\(\frac{1}{m}\)改为\(\frac{1}{\sum_iw^{(i)}}\)

为猫图片分类做正交化

  1. 明白如何定义一个指标来衡量想做的事情的表现(设定目标)
  2. 然后可以分开考虑如何改善系统在这个指标上的表现(调试如何精确)

另一个例子:仍然是两个算法A和B,错误率同上,但可能训练和验证集用的图片都是高清图片,实际使用时使用的图片比较模糊,而B在这些模糊图片中表现的更好。

方针:如果指标在当前验证集或验证和测试集的分布中表现的很好,但在实际应用中真正关注的地方表现不好,则需要修改指标,或验证测试集

和人类表现比较

1. 为什么是人类

  1. 随着深度学习的的进步,机器学习算法的表现突然表现很好了,在许多机器学习的应用邻域已经开始见到一些算法可以威胁到人类的表现了
  2. 当试图让机器做人类能做的事情时,可以设计机器学习系统的工作流程,使工作流程效率更高,因此在这些场合,将机器和人类相比是很自然的

人类在许多任务上表现是很好的,因此,在机器学习中,如果机器表现不如人类时你可以:

  1. 从人类处获取标签数据
  2. 从人工错误分析中获得洞察力
  3. 更好的分析偏差和方差

2. 可避免偏差

Eg: 对于猫分类案例中,

假设人类错误率1%,训练集错误率8%,验证集错误率10%,那么你如果想在训练集上得到更好的结果,从减少偏差和方差的角度来看,这种情况下,一般会把重点放在偏差上,因此需要做的是:训练更大的神经网络或运行更久的训练,深度在训练集上表现更好;

假设人类错误率是7.5%了,训练集错误率8%,验证集错误率10%,则通常把重点放在方差上,可以尝试正则化

将贝叶斯错误率或对贝叶斯错误率的估计和训练错误率之间的差值称为可避免差值

而训练错误率和开发错误率之间的差值则说明了算法在方差问题上还有多少改善空间

3. 理解"人类表现"的定义

人类水平错误率可以作为贝叶斯错误率的代表

以医疗图像分类为例:

假设普通人错误率是3%;普通医生的错误率是1%;专家的错误率是0.7%;经验丰富的医生团队的错误率是0.5%

那么人类水平定义为多少呢?

答案是人类水平错误率是想要替代或估计贝叶斯错误率的,那么贝叶斯错误率 <= 0.5%,所以最优错误率必须在0.5%以下,因此将人类水平定义为0.5%

4. 超过人类表现水平

假设对于一个问题:

团队讨论的错误率是0.5%;单个人的错误率是1%;训练错误率是0.6%;验证集错误率是0.8%。那么由于可避免偏差的估计=0.6%-0.5%=0.1%;方差=0.8%-0.6%=0.2%,因此相比减少可避免误差而言,减少方差的可能空间更大

假设对于另一个问题:

团队讨论的错误率是0.5%,单人错误率是1%;但训练错误率是0.3%,验证错误率是0.4%,这种情况下,验证集错误率都已经超过了人类,因此会导致继续下去时就没有明确的选项和前进方向了

目前机器在以下方面可能已经超过人类的表现了:

  • 在线广告
  • 产品推荐
  • 物流预测
  • 贷款预测

而以上四个例子都是从结构化数据中学习得来的,而并不是自然感知问题,不是计算机视觉问题或语音识别或自然语言处理任务,人类往往在自然感知问题上表现的更好,但是如今也已经有一些特定的自然感知问题上机器 的表现已经优于人类了。

总结改善模型的表现的方法

想要一个监督学习算法达到衫,基本上需要能完成两个事情

  1. 算法对训练集的拟合很好,可以看成可能做到可避免偏差很低
  2. 推广到验证集和测试集上也很好,也就是说方差不是太大

降低可避免偏差和方差:

  1. 计算训练错误率和贝叶斯错误率估计值之间的差值(即train error和human error),从而知道可避免偏差有多大

    减小可避免偏差的措施:

    • 使用规模更大的模型
    • 训练更久或使用更好的优化算法(momentum、RMSprop、Adam)
    • 尝试寻找更好的新的神经网络架构或更好的超参数
  2. 计算验证错误率和训练错误率之间的差值,从而知道方差问题有多大

    减小方差的措施:

    • 收集更多的数据
    • 正则化(L2、Dropout、数据扩增)
    • 尝试使用不同的神经网络架构或超参数搜索