JobPlus知识库 IT 大数据 文章
为什么你需要改进训练数据,如何改进?

Andrej Karpathy 在他的 Train AI 演讲中展示了这张胶片,我非常喜欢。这张胶片完美地揭示了深度学习在研究与生产间的区别。通常来说,学术论文的主要精力是放在开发新的、先进的模型上面,在数据集方面一般都是从公开的数据集取一部分使用。而相反,那些我所知道的想用深度学习技术做实际应用的开发者们,他们绝大部分的精力都花在了担心他们的训练数据上面。

有许多好的原因可以解释为什么那些研究员会将精力放在模型架构上,而对于那些想要在实际生产过程中运用机器学习的人来说,相关的指导材料就比较少。为了解决这个问题,我在此次会议上的演讲主题是「关于训练数据上不可以思议的效果」,并且我想在这篇 blog 中进一步说明为什么优化训练数据是如此重要,并给出一些实用的建议。

在我的工作中经常与许多研究员与生产团队有紧密的合作,而我之所以如此相信优化数据的魔力是因为我亲眼目睹了它们在构建模型时所发挥的作用以及所带来的巨大收益。对于大多数应用来说,能否使用深度学习的最大障碍是模型精度能否达到实际使用的要求,而据我所知,最快捷的提升精度的方式就是优化训练集。并且如果在部署过程中你还受限于例如时延或存储大小等因素,那么你可能需要在一个满足性能要求,经过折衷的较小模型架构上来提升模型精度。

语音控制

我不能分享我在所生产系统中观察到的,但是我能从一个开源项目的例子中来证明这点。去年我通过 Tensorflow 框架搭建了一个简单的语音识别系统,但在实现的过程中发现没有现成的数据集可以让我来训练模型。在大量志愿者的帮助下,我收集了 60000 个 1 秒钟的语音片段,这里要感谢 Open Speech 网站中的 AIY 团队。通过这个数据集,最终训练出来的模型是可用的,但是精度没有达到我的预期。为了看看这是否是由于我所设计模型所导致的,我在 Kaggle 上用同样的训练集发起了一个竞赛。在竞赛中,许多竞赛者设计的模型要比我的效果好,但即使是来自不同团队不同方法,最终的精度也就只能达到 91%。对我来说这暗示着数据集中存在一些基本的错误,确实,有竞赛者也向我指出了许多关于训练集的错误,如:有些音频标签打错了,有些音频不完整。这促使我有了发布一个新数据集的动力,解决他们所指出的那些问题并且再补充更多的样本。

我通过查看错误的度量标准去理解什么样的词汇是模型难以识别的。结果显示「其他」种类(当语音辨识系统识别语音时该单词却不在模型所训练到的词汇中)的是最容易识别错误的。为了解决这个问题,我们获取了更多不同的单词以确保训练数据的多样性。

自从 Kaggle 竞赛者报告了标签错误这一问题,我就请人做了额外的验证环节,请人去听每个语音片段然后确保它与预期的标签相符。另外由于 Kaggle 数据集还被发现了又很多几乎没有声音或者很短的声音,因此我写了能自动做一些音频分析并且剔除这些不太好的数据的小程序。最终,虽然删除了很多不太好的语音数据但还是将语音数据增加到了十万,这多亏了志愿者与一些受雇人员的努力。

为了帮助其他人更好地使用数据集(不要重蹈我的覆辙!)我将这一切相关的都写在一篇 Arixiv 论文当中了,以及更新后的准确率。最重要的结论是,在不改变模型和测试集数据的情况下,top-one(第一次预测类)的准确率从 85.4% 提高到 89.7%,整整提高了超过 4%。这是一个令人惊叹的提升,这样的提升对于将模型部署在安卓或树莓派小应用的人来说这是十分满意的了。另外,我也很有自信在使用的模型架构落后于现有先进水平的情况下通过花费一定时间来调整模型获得进一步的少量提高。

这是在实际应用过程中一次又一次获得过好结果的过程,然而如果你想做一样的尝试,那么从哪开始对于你来说其实是比较困难的。你可以从我刚才对语音数据的处理中得到一些启发,但是我这里有一些更实用的方法。

首先,观察你的数据

这个似乎是显而易见的,但其实你首先需要做的是随机观察你的训练数据。将其中一部分复制到你的本地机,并且花费几个小时去预览它们。如果你的数据是一些图片,那么使用一些类似 MacOs 系统的查看器非常快速的查看数千张缩略图。对于音频来说,可以播放它们的预览,又或者对于文本来说,可以随机的转储一些片段到终端设备。我没有用足够的时间在第一次语音中做这样的工作,因此导致 Kaggle 参赛者发现非常多的问题。

我总是会感觉到这个观察数据的过程有点傻,但是我从未后悔过。每次我这么做之后都会发现很多关于数据集的一些很关键的问题,像是类别不均衡问题,无法读入的数据(例如 PNG 格式的图片被加上了 JPG 格式的后缀),错误的标签亦或者令人奇怪的组合。Tom White 在预先观察数据的过程中在 ImageNet 数据集中有一些奇特的发现,例如将一个用于放大太阳光的古老设备标记为「太阳镜」,一张有魅力的图片被标记为」垃圾车」,一个穿着红斗篷的女人被标记为「斗篷」。Andrej 手工区分从 ImageNet 中的照片的工作也教会了我很多对于数据集的理解,包括即使对于一个人来说区分狗的种类也是很困难的事。

你所采取的行动取决于你的发现,但其实你应该坚持在做其他的数据清洗工作之前有这样的对于数据预先观察的过程,因为在这个过程中你会获取一些直觉信息以帮助你在其他步骤里作出决策。

快速选择模型

不要花太多时间在模型选择上。如果你需要做图像分类,可以看看 AutoML,TensorFlow 的 model repository,或者 Fast.AI 的 collection of examples,这些模型库里一般可以找到一些解决类似于你产品的问题的模型。最重要的是尽快开始迭代你的模型,这样你就可以尽早地让真实用户来测试你的模型。你总会有机会在后续的过程中来提高你的模型,也可能会得到更好的结果,但是首先你必须保证你的数据在一开始就是有效的。深度学习依然遵从最基本的计算定律,输入无效数据,那么就输出无效的结果。因此,即使最好的模型也受限于训练数据中的瑕疵。通过选择一个模型并对其进行测试,你会找到训练数据中存在的问题并对这些问题进行改进。

为了进一步提高你的迭代速度,可以从一个已经在大样本数据上训练过的模型开始,利用迁移学习在一个你所收集的可能小很多的数据集上来对模型参数进行微调。相比直接用你的小样本数据来对模型进行训练,这样通常可以更快地得到更好的结果,你也可以由此找到一些感觉需要怎样对你收据收集的方式做一些必要的调整。这样做最重要的效果是你可以把你训练得到的结果反馈到数据收集的过程中去,边学习边调整,而不是把数据采集作为一个独立的在训练之前的一个步骤。

创造之前先模拟

研究建模和产品建模之间最大的区别在于前者通常在一开始就有一个非常明确的问题描述,而后者对于模型的许多要求一开始并不明确,而是存在于用户的脑中,需要一步一步挖掘出来。例如,我们希望 Jetpac 能提供好的照片给自动化的城市旅游指南。开始的时候,我们让打分的人来给照片贴标签,如果他们觉得照片「好」,就给照片做标记。但是,我们最后得到了很多带有微笑的人像的照片,因为打分者认为这些是「好」照片。我们把这些标记了的照片用到我们的产品模型中,看看测试用户的反应。可想而知,他们并不满意最后的结果。

为了解决这个问题,我们把标记照片时的问题改成了:「这张照片会吸引你去这个地方旅游吗?」这使得我们得到的标记照片质量提高很多,但是,我们还是得到了一些这样的标记照片,一些东南亚寻找工作的人认为在大酒店里有很多西装革履拿着酒杯的会议照片非常吸引人。这些被不正确标记的照片提醒我们当下生活的泡沫时代,但是这是个实际的问题,因为我们的目标人群是美国人,他们会觉得会议照片非常的乏味又无趣。最终,我们 Jetpac 组的六个人手动标记了超过 200 万的照片,因为我们比任何其他人更清楚打分的标准是什么。

这是一个比较极端的例子,但是它说明了数据标记过程很大程度上取决于你应用的要求。对于大部分产品应用的案例,开发人员需要花很长的时间来搞清楚我们到底需要模型回答一个什么样的问题,而搞清楚这个问题是非常关键的。如果你的模型在回答一个错误的问题,那么在这个基础上,你将永远不能创造一个好的用户体验。


如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!

¥ 打赏支持
6人赞 举报
分享到
用户评价(0)

暂无评价,你也可以发布评价哦:)

扫码APP

扫描使用APP

扫码使用

扫描使用小程序