Classes 3 结构化机器学习项目
1 机器学习策略
在机器学习中,可以观察你的系统,然后说这一部分是错的,它在训练集上做的不好、在开发集上做的不好、它在测试集上做的不好,或者它在测试集上做的不错,但在现实世界中不好,这就很好。必须弄清楚到底是什么地方出问题了,然后刚好有对应的旋钮,或者一组对应的旋钮,刚好可以解决那个问题,那个限制了机器学习系统性能的问题。
1.2 单一数字评测指标
一般做法:
- 有想法,编程序,跑实验,看看效果如何,然后使用这些实验结果来改善想法,然后继续走这个循环,不断改进算法
有这样一个开发集,加上单实数评估指标,迭代速度肯定会很快,它可以加速改进机器学习算法的迭代过程
有一个单实数评估指标真的可以提高效率,或者提高团
队做出这些决策的效率
1.3 满足和优化指标
准确度与时间上面的综合权衡
考虑𝑁个指标,有时候选择其中一个指标做为优化指标是合
理的。所以你想尽量优化那个指标,然后剩下𝑁 − 1个指标都是满足指标,意味着只要它们达到一定阈值,例如运行时间快于 100 毫秒,但只要达到一定的阈值,你不在乎它超过那个门槛之后的表现,但它们必须达到这个门槛。
1.4 训练集 验证集 测试集的划分
用训练集训练不同的模型,然后使用开发集来评估不同的思路,然后选择一个,然后不断迭代去改善开发集的性能,直到最后你可以得到一个令你满意的成本,然后你再用测试集去评估
注意:
- 开发集和测试集来自同一分布,将所有数据随机洗牌,放入开发集和测试集
- 针对目标收集数据集
划分比例:
- 机器学习早期: 全部数据用 70/30 比例分成训练集和测试集。或者如果你必须设立训练集、开发集和测试集,分 60%训练集,20%开发集,20%测试集。(数据集小的时候,几千-1w)
- 深度学习时代:百万级别数据,98%作为训练集,1%开发集,1%测试集
改变数据集:
- 如果你当前的指标和当前用来评估的数据和你真正关心必须做好的事情关系不大,那就应该更改你的指标或者你的开发测试集,让它们能更够好地反映你的算法需要处理好的数据
- 对于错分的样本需要加大损失权重
1.5 提升模型的性能
好的模型就两件事:
- 算法对训练集的拟合很好,这可以看成是你能做到可避免偏差很低
- 在训练集中做得很好,然后推广到开发集和测试集也很好,这就是说方差不是太大
偏差上的提升(欠拟合):
- 使用规模更大的模型,
- 训练更久
- 使用更好的优化算法,比如说加入 momentum 或者RMSprop、 Adam
- 更好的新神经网络架构
- 更好的超参数:激活函数、隐藏层数、隐藏节点数
方差上的提升(过拟合):
- 收集更多数据
- 尝试正则化,包括𝐿2正则化,dropout 正则化
- 数据增强。
- 不同的神经网络架构
- 超参数搜索
2 机器学习策略
2.1 进行误差分析
搭建应用系统,那这个简单的人工统计步骤,错误分析,可以节省大量时间,可以迅速决定什么是最重要的,或者最有希望的方向
进行错误分析,应该找一组错误样本,可能在开发集里或者测试集里,观察错误标记的样本,看看假阳性(false positives)和假阴性(false negatives),统计属于不同错误类型的错误数量
如果这些标记错误严重影响了你在开发集上评估算法的能力,那么就应该去花时间修正错误的标签。如果它们没有严重影响到你用开发集评估成本偏差的能力,那么可能就不应该花宝贵的时间去处理。
在构造实际系统时,通常需要更多的人工错误分析,更多的人类见解来架构这些系统,尽管深度学习的研究人员不愿意承认这点
2.2 快速搭建你的第一个系统,并进行迭代
应该尽快建立你的第一个系统原型,然后快速迭代
主要目标是弄出能用的系统,并不是发明全新的机器学习算法。可以从现有大量学术文献为基础出发,一开始就搭建比较复杂的系统。
2.3 使用来自不同分布的数据进行训练和测试
越来越多的团队都用来自和开发集、测试集分布不同的数据来训练,这里有一些微妙的地方,一些最佳做法来处理训练集和测试集存在差异的情况。
这是由于项目任务所针对的图片类型决定的,比如手机app要识别的是用户手机拍摄的猫,而这类数据集少,网上爬虫的数据集大,但与任务的数据不是同一个分布,将其混合起来再划分这样的方法并不好,这是由于混一起后验证集、测试集中任务所要针对的图片占的比例很低。
开发集和测试集都是手机图。而训练集包含了来自网页的 20 万张图片,还有 5000 张来自应用的图片,开发集就是 2500 张来自应用的图片,测试集也是 2500 张来自应用的图片。这样将数据分成训练集、开发集和测试集的好处在于,现在你瞄准的目标就是你想要处理的目标。
有助于提高你的学习算法的性能,但是,潜在问题就不只是偏差和方差问题,这样做会引入第三个潜在问题,数据不匹配。
将训练集划分为训练集与训练-验证集(不用来训练,只测试)来看偏差与方差的关系。
2.4 处理数据不匹配问题
- 对训练数据与开发数据进行错误分析,把训练集变得更像开发集
- 尽可能地收集到相似的训练数据
- 人工数据合成(注意过拟合)
存在数据不匹配问题,建议你做错误分析,或者看看训练集,或者看看开发集,试图找出,试图了解这两个数据分布到底有什么不同,然后看看是否有办法收集更多看起来像开发集的数据作训练。
2.5 迁移学习
把神经网络最后的输出层拿走,就把它删掉,还有进入到最后一层的权重删掉,然后为最后一层重新赋予随机权重,然后让它在放射诊断数据上训练。
如果你有足够多的数据,你可以重新训练神经网络中剩下的所有层。经验规则是,如果你有一个小数据集,就只训练输出层前的最后一层,或者也许是最后一两层。
- 预训练:拿通用数据训练网络模型
- 微调:固定之前的层,拿专用数据只训练后面的一层
优点: 需要的数据少,学得快
2.6 多任务学习
在多任务学习中,同时开始学习的,试图让单个神经网络同时做几件事情,然后希望这里每个任务都能帮到其他所有任务。
什么时候可以使用多任务学习:
- 第一,如果你训练的一组任务,可以共用低层次特征。
- 第二,这个准则没有那么绝对,所以不一定是对的。如果想要从多任务学习得到很大性能提升,那么其他任务加起来必须要有比单个任务大得多的数据量
- 第三,一些场合:训练一个足够大的神经网络,那么多任务学习肯定不会或者很少会降低性能,我们都希望它可以提升性能,比单独训练神经网络来单独完成各个任务性能要更好。
多任务学习能让你训练一个神经网络来执行许多任务,这可以给你更高的性能,比单独完成各个任务更高的性能
2.7 端到端的深度学习
以前有一些数据处理系统或者学习系统,它们需要多个阶段的处理。那么端到端深度学习就是忽略所有这些不同的阶段,用单个神经网络代替它。
输入数据,构建网络模型,直接得到结果。这需要大量的数据以及好的应用场景。
如果不好一步到位,使用分任务的方式将其串起来也是很好的解决方案。
优点:
- 端到端学习真的只是让数据说话,可能更能够捕获数据中的任何统计信息,而不是被迫引入人类的成见。
- 所需手工设计的组件更少,所以这也许能够简化设计工作流程,不需要花太多时间去手工设计功能,手工设计这些中间表示方式
缺点:
- 可能需要大量的数据
- 排除了可能有用的手工设计组件