神经网络与深度学习笔记汇总二


结构化机器学习项目

正交化(方便调整参数)

将你可以调整的参数设置在不同的正交的维度上,调整其中一个参数,不会或几乎不会影响其他维度上的参数变化,这样在机器学习项目中,可以让你更容易更快速地将参数调整到一个比较好的数值

迭代

是重复反馈过程的活动,其目的通常是为了逼近所需目标或结果。每一次对过程的重复称为一次"迭代",而每一次迭代得到的结果会作为下一次迭代的初始值。

单实数评估指标(判断几种手段/方法哪个更好)

加速改进机器学习算法的迭代过程
F1分数:查全率P查准率R的平均值(调和平均数)

指标选取

优化指标:准确率,尽可能好
满足指标:需要满足该指标
权衡N个不同的准则,你可能需要考虑将其中N-1个作为满足指标,需要这N-1个满足一个特定值。然后定义最后一个为优化指标

训练集、开发集、测试集作用与用途

训练集(training set)用于运行你的学习算法。
开发集(保留交叉验证集)用于调整参数,选择特征,以及对学习算法做出其他决定。
测试集(test set)用于评估算法的性能,但不会据此决定使用什么学习算法或参数。
训练集是用来训练模型的,通过尝试不同的方法和思路使用训练集来训练不同的模型,再通过验证集使用交叉验证来挑选最优的模型,通过不断的迭代来改善模型在验证集上的性能,最后再通过测试集来评估模型的性能。
如果开发集和测试集来自不同的分布,可能导致:
1.过拟合开发集;
2.测试集比开发集更难识别。所以你的算法可能已经做得和预期一样很好,也没有可能进一步显著得改进;
3.测试集不一定更难识别,但是和开发集(的分布)不同。所以在开发集表现很好,不一定在测试集上表现很好。在这种情况下,提高开发集性能的工作可能都是一种浪费;
建议选择来源于相同分布的开发集和测试集,这会让你的团队更有效。
一般,60%训练集,20%开发集,20%测试集,70/30不再适用
但在现代机器学习中,我们更习惯操作规模大得多的数据集,比如说你有1百万个训练样本,这样分可能更合理,98%作为训练集,1%开发集,1%测试集,我们用D和T缩写来表示开发集和测试集。

评估指标

修改评估指标的方法:加个权重项

如果图片不是色情图片,则。如果是色情图片,可能就是10甚至100,这样你赋予了色情图片更大的权重,让算法将色情图分类为猫图时,错误率这个项快速变大
如果你希望得到归一化常数,在技术上,就是对所有求和,这样错误率仍然在0和1之间

尝试定义一个新的指标,如果你对旧的错误率指标不满意,那就不要一直沿用你不满意的错误率指标
(用实际应用定义指标)

贝叶斯最优错误率:理论上可能达到的最优错误率,就是说没有任何办法设计出一个x到y的函数,让它能够超过一定的准确度

对于人类擅长的任务,只要你的机器学习算法比人类差,你就可以从让人帮你标记数据,你可以让人帮忙或者花钱请人帮你标记例子,这样你就有更多的数据可以喂给学习算法

可避免偏差:贝叶斯错误率或者说贝叶斯错误率的估计和训练错误率直接的差值

人类水平错误率比贝叶斯错误率高一点,因为贝叶斯错误率是理论上限,但人类水平错误率离贝叶斯错误率不会太远
接近贝叶斯错误率,你就知道没有太多改善的空间了,不能继续减少你的训练错误率了,你也不会希望它比贝叶斯错误率好得多,因为这种目标只能通过可能需要提供更进一步的训练
如果有更多的改进空间,可以将这个距缩小一点,使用减少方差的手段应该可行,比如正则化,或者收集更多的训练数据

你到贝叶斯错误率估计值的差距,告诉你可避免偏差问题有多大,可避免偏差问题有多严重,而训练错误率和开发错误率之间的差值告诉你方差上的问题有多大,你的算法是否能够从训练集泛化推广到开发集

判断算法是好是坏

性能上限:最好能到哪里,改善算法性能的上限

进行错误分析:你应该找一组错误样本,可能在你的开发集里或者测试集里,观察错误标记的样本,看看假阳性(false positives)和假阴性(false negatives),统计属于不同错误类型的错误数量。在这个过程中,你可能会得到启发,归纳出新的错误类型。

如果标记错误严重影响了你在开发集上评估算法的能力,那么就应该去花时间修正错误的标签

开发集的主要目的是,你希望用它来从两个分类器A和B中选择一个

不管用什么修正手段,都要同时作用到开发集和测试集上

搭建全新的机器学习程序,就是快速搭好你的第一个系统,然后开始迭代
初始系统的全部意义在于,有一个学习过的系统,有一个训练过的系统,让你确定偏差方差的范围,就可以知道下一步应该优先做什么,让你能够进行错误分析,可以观察一些错误,然后想出所有能走的方向,哪些是实际上最有希望的方向

让你的训练集数据来自和开发集、测试集不同的分布,这样你就可以有更多的训练数据

如果开发集和测试集来自相同的分布,但训练集来自不同的分布。我们要做的是随机打散训练集,然后分出一部分训练集作为训练-开发集,就像开发集和测试集来自同一分布,训练集、训练-开发集也来自同一分布
训练误差是1%,训练-开发集上的误差是9%,算法存在方差问题
假设训练误差为1%,训练-开发误差为1.5%,但当你开始处理开发集时,错误率上升到10%当你转到开发集时,错误率就大大上升了,所以这是数据不匹配的问题

开发集表现和测试集表现有很大差距,那么你可能对开发集过拟合了,需要一个更大的开发集

偏差度量了学习算法的期望预测与真实结果的偏离程序, 即 刻画了学习算法本身的拟合能力 .
方差度量了同样大小的训练集的变动所导致的学习性能的变化, 即 刻画了数据扰动所造成的影响

数据不匹配问题:做错误分析,或者看看训练集,或者看看开发集,试图找出,试图了解这两个数据分布到底有什么不同,然后看看是否有办法收集更多看起来像开发集的数据作训练。
人工数据合成,有可能从所有可能性的空间只选了很小一部分去模拟数据

迁移学习

起作用的场合是,在迁移来源问题中你有很多数据,但迁移目标问题你没有那么多数据
如果你想从任务A学习并迁移一些知识到任务B,那么当任务A和任务B都有同样的输入x时(都是图像/音频),迁移学习是有意义的。当任务A的数据比任务B多得多时,迁移学习意义更大
做法:数据集换成新的对,现在这些变成放射科图像,而是你想要预测的诊断,你要做的是初始化最后一层的权重,让我们称之为和随机初始化。
预训练:重新训练神经网络中的所有参数,那么这个在图像识别数据的初期训练阶段称为预训练
微调:更新所有权重
果你可以训练一个足够大的神经网络,那么多任务学习肯定不会或者很少会降低性能
端到端深度学习就是忽略所有这些不同的阶段,用单个神经网络代替它,需要大量数据才能让系统表现良好
弊端之一是它把可能有用的人工设计的组件排除在外

总结

让一个监督学习算法达到实用:1、你的算法对训练集的拟合很好,这可以看成是你能做到可避免偏差很低。2、在训练集中做得很好,然后推广到开发集和测试集也很好,这就是说方差不是太大。

减少可避免偏差:1、使用规模更大的模型,这样算法在训练集上的表现会更好,或者训练更久。2、使用更好的优化算法,比如说加入momentum或者RMSprop,或者使用更好的算法,比如Adam。3、你还可以试试寻找更好的新神经网络架构,或者说更好的超参数。

方差出现问题:你可以收集更多数据,因为收集更多数据去训练可以帮你更好地推广到系统看不到的开发集数据。你可以尝试正则化,包括正则化,dropout正则化。同时你也可以试用不同的神经网络架构,超参数搜索,看看能不能帮助你,找到一个更适合你的问题的神经网络架构。

往期回顾

吴恩达神经网络和深度学习笔记(广播,激活函数).
神经网络与深度学习笔记汇总一.
神经网络与深度学习笔记汇总二.
神经网络与深度学习笔记汇总三.
神经网络与深度学习笔记汇总四.
神经网络与深度学习笔记汇总五.

猜你喜欢

转载自blog.csdn.net/qq_43337502/article/details/108032022
今日推荐