《Machine Learning Yearning》是人工智能和深度学习大佬吴恩达新出的一本书,该书着重介绍如何让机器学习算法能够工作,以及如何构建机器学习项目。在本文中,我们从该书精选出了七条非常有用的建议。
吴恩达介绍道:
本书的重点不在于教授机器学习算法,而在于如何使机器学习算法发挥作用。一些技术人工智能课程会给你一个锤子;这本书教你如何使用锤子。如何你渴望成为人工智能的技术领导者并想学习如何为你的团队准确找到方向,这本书将会有所帮助。我们已经读完了目前已更新的所有章节,并从中选出了七条最有意思、最有用的建议:
1. 优化和满意度指标
你应该考虑使用多个评估指标,而不是使用单个公式或指标来评估算法。做到这一点的一种方法是通过“优化”和“满意度”的指标。
(Combining Multiple Evaluation Metrics)
以上图所示为例,我们可以首先定义可接受的运行时间,比如小于 100 毫秒,这可以视为我们的“满意度”指标。你的分类器必须“足够好”,因为要求它的运行时间小于 100 毫秒这个值,仅此而已。此处的准确度(Accuracy)是“优化”指标。它可以是评估算法的一种非常有效、简单的方法。
2. 快速选择开发 / 测试集——如有必要,不要害怕改变它们
在开始一个新项目时,吴恩达解释说,他为了给团队一个明确定位的目标,会试图快速选择开发 / 测试集。设定好初始的一周目标,最好的做法是,提出一些不完美的想法,然后迅速行动起来,而不是在这个阶段考虑过多。
话虽如此,但如果你突然意识到,你选择的初始开发 / 测试集不正确的话,不要害怕改变。之所以会选择错误的开发 / 测试集,有三个可能的原因:
- 你需要做得很好的实际分布,与开发 / 测试集不同;
- 你的开发 / 测试集过拟合;
- 该指标测量的是其他东西,并非项目需要优化的内容。
请记住,改变,并不是什么大不了的事。只要这样做,就可以让你的团队知道你的新方向。
3. 机器学习是一个迭代过程;不要期望它第一次就发挥作用
吴恩达表示,构建机器学习软件有三种方法:
- 从一个想法开始;
- 用代码实践这个想法;
- 进行一个实验,总结这个想法的效果
Machine Learning Iterative Process
见上图所示,当你绕着这个圈跑得越快,那么你取得的进步就越快。这也是为什么吴恩达强调事先选择开发 / 测试集很重要的原因,因为它可以在迭代过程中节省宝贵的时间。对这个数据集进行性能测试可以让你快速了解事情是否朝着正确方向发展。
4. 快速构建第一个系统,然后迭代
正如第三点所述,构建机器学习算法是一个迭代过程。吴恩达专门写了一个章节,解释快速构建第一个系统,然后从此开始的好处:“不要试图去设计、构建完美的系统。相反,要快速构建并训练一个基本的系统,而这也许只需短短几天就完成了。就算这个基本的系统离你所能构建的‘最佳’系统还很远,但你要明白,研究基本系统的功能还是有很大价值的:你会很快发现线索,并找到如何将时间投入最有希望的方向。”
5. 并行地评估多个想法
当你的团队在如何改进算法有很多想法时,你可以并行地、有效地评估这些想法。通过创建一个能够检测猫类图片的算法,吴恩达解释了他是如何创建一个表格,并在查看约 100 个错误分类的开发 / 测试集图像时填写表格,如下图所示。
Evaluating Multiple Ideas Parallel
在这种表格中,包括对每张图片的分析,失败的原因,以及其他可能有助于未来反思的意见。完成之后,你可以看到哪些想法能够消除更多的错误,因此应该进行哪些操作。
6. 考虑清理错误的开发 / 测试集是否值得
在你的错误分析过程中,你可能会注意到开发 / 测试集中的一些样本被错误标记了。也就是图像被人为错误标记了。如果你怀疑其中一小部分错误是由于此原因造成的,那么就在表格中中添加一个额外的类别:
Evaluating Mislabeled Images
在完成这些操作之后,你就可以考虑,花时间来解决这些问题是否值得。吴恩达给出了两种可能的情况,来判断这些问题是否值得修正。
示例 1:
Overall accuracy on dev set.………………. 90% (10% overall error)
Errors due to mislabeled examples……. 0.6% (6% of dev set errors)
Errors due to other causes………………… 9.4% (94% of dev set errors)
“此处,相对于你所能改善的 9.4% 的错误而言,由于错误标记导致的 0.6% 可能远远没有那么重要。在开发集中,手动修复错误标记的图像并没有什么害处,但这样做并不重要:就算你不知道系统总体错误是 10% 还是 9.4%,可能都没有什么问题。”
示例 2:
Overall accuracy on dev set.………………. 98.0% (2.0% overall error)
Errors due to mislabeled examples……. 0.6%. (30% of dev set errors)
Errors due to other causes………………… 1.4% (70% of dev set errors)
“30% 的错误,是由于开发集图像错误标记所致,这样对准确度的估计会增加重大误差。这情况下,很有必要改进开发集的标记质量。处理错误标记的样本将有助于你查看分类器的错误是接近 1.4% 还是 2%,这是一个显著的相对偏差。”
7. 将开发集分成单独的子集
吴恩达解释,如果你有一个大型的开发集,其中 20% 存在一个错误率,那么将它们分成两个单独的子集是值得的:
“使用该算法对开发集 5000 个样本中的 1000 个样本进行了错误的分类。假设我们要手动检查,对大约 100 个错误进行错误分析(10% 的错误)。你应该随机选择 10% 的开发集,并将它放置到我们称为 Eyeball 的开发集中,提醒自己我们是用眼睛观看的。(在有关语音识别的项目中,你会听到音频剪辑的说法,也许你可以称之为 Ear 开发集)。因此,Eyeball 开发集有 500 个样本,我们希望能够对大约 100 个错误进行分类。”
开发集的第二个子集,称为 Blackbox 开发集,将拥有剩下的 4500 个样本。你可以使用 Blackbox 开发集通过测量错误率来自动评估分类器。当然,你还可以使用它来选择算法或者调优超参数。但是,你应该避免用眼睛去观看。我们使用“Blackbox”这个术语,是因为我们只会使用这些数据的子集来获得“Blackbox”对分类器的评估。