这是一个主要问题:许多组织没有你需要的数据。
如果没有最基本的原材料,我们如何原型化和验证机器学习思想?在资源稀缺的情况下,如何有效地利用数据获取和创造价值?
在我的工作场所,我们为客户制作了很多功能原型。正因为如此,我经常需要让小数据走得更远。在本文中,我将分享7个技巧来改进使用小型数据集进行原型设计时的结果。
1. 要意识到你的模型不能很好地推广
这应该是目前最重要的。你正在建立一个模型,它的知识是浩瀚的知识海洋中的一小部分,而这种情况应该是必然的。
如果你正在构建一个基于室内照片的计算机视觉原型,不要期望它在户外工作得很好。如果你有一个基于聊天室玩笑的语言模型,不要期望它适用于梦幻的小说。
确保你的经理或客户能理解这一点。这样,每个人都可以对模型应该交付的结果有一个现实的期望。它还为提出有用的新的KPI提供了机会,以便在原型范围内外对模型性能进行量化。
2.建立良好的数据基础设施
在许多情况下,客户端没有你需要的数据,公共数据也不是一个选项。如果原型的一部分需要收集和标记新数据,请确保你的基础设施尽可能少地产生摩擦。
你需要确保数据标记非常简单,以便非技术人员也可以使用。我们已经开始使用Prodigy,我认为这是一个很好的工具:既可访问又可扩展。根据项目的大小,你可能还想设置一个自动数据摄取器,它可以接收新数据并自动将其提供给标记系统。
如果将新数据快速而简单地导入系统,你将获得更多的数据。
3.做一些数据扩充
通常可以通过增加现有的数据来扩展数据集。它是对数据进行微小的更改,而不应该显著地更改模型输出。例如,如果一只猫旋转了40度,它的图像仍然是一只猫的图像。
在大多数情况下,增强技术允许你生成更多的"semi-unique"数据点来训练模型。首先,可以尝试在数据中添加少量高斯噪声。
对于计算机视觉,有许多简单的方法来增强图像。我对Albumentations库有很多的经验,它做了许多有用的图像转换,同时保持你的标签完好无损。
许多人发现另一种有用的增强技术是Mixup。这种技术实际上是获取两个输入图像,将它们混合在一起并组合它们的标签。
在扩展其他输入数据类型时,需要考虑哪些转换会更改标签,哪些不会。
4.生成一些合成数据
如果你已经用尽了扩展真实数据的选项,你可以开始考虑创建一些假数据。生成合成数据也是覆盖真实数据集没有的一些边缘情况的好方法。
例如,许多机器人强化学习系统(如OpenAI的Dactyl)在部署到真实机器人之前,都是在模拟的3D环境中进行训练的。对于图像识别系统,你同样可以构建3D场景,为你提供数千个新的数据点。
有许多方法可以创建合成数据。在Kanda,我们正在开发一个基于 turntable-based 的解决方案,来创建用于对象检测的数据。如果你有很高的数据需求,你可以考虑使用Generative Adverserial Networks 来创建合成数据。要知道GAN是出了名的难训练,所以首先要确保它是可以创建的。
有时你可以将这些方法结合起来:苹果有一个非常聪明的方法,使用GAN来处理3D建模人脸的图像,使其看起来更像照片。
5. 小心幸运的分割
在训练机器学习模型时,通常会将数据集按照一定的比例随机分割成训练集和测试集。通常情况下这很好。但是,在处理小数据集时,由于训练示例的数量较少,存在很高的噪声风险。
在这种情况下,你可能会意外地得到一个幸运的分割:一个特定的数据集分割,你的模型将在其中执行并很好地推广到测试集。
而在这种情况下,k-fold交叉验证是更好的选择。本质上,你将数据集分割为k个"folds",并为每个k训练一个新的模型,其中一个folds用于测试集,其余的用于训练。这控制了你所看到的测试性能不仅仅是由于幸运(或不幸)的分割。
6. 使用迁移学习
如果你使用的是某种标准化的数据格式,比如文本、图像、视频或声音,那么你可以利用其他人之前在这些领域所做的所有工作来进行迁移学习。这就像站在巨人的肩膀上。
当你进行迁移学习时,你采用别人建立的模型(通常,"其他人"是谷歌、Facebook或一所主要大学),并根据你的特殊需要对它们进行微调。
迁移学习之所以有效,是因为大多数与语言、图像或声音有关的任务都具有许多共同的特征。对于计算机视觉,它可以检测特定类型的形状、颜色或图案。
最近,研究出来一个高精度的目标检测原型。通过微调一个MobileNet单镜头检测器,我可以极大地加快开发速度,该检测器是在谷歌的Open Images v4数据集(约900万标记图像!)上训练的。经过一天的训练,我能够使用~1500张带标签的图像生成一个相当健壮的对象检测模型,测试图为0.85。
迁移学习是有效的,因为与语言、图像或声音有关的大多数任务都有许多共同特征。 对于计算机视觉,它可以是检测某些类型的形状、颜色或图案。
7. 尝试一组"weak learners"
有时候,你不得不面对这样一个事实:你没有足够的数据来做任何花哨的事情。幸运的是,有许多传统的机器学习算法可以使用,它们对数据集的大小不那么敏感。
当数据集较小且数据点维度较高时,支持向量机等算法是一个很好的选择。
不幸的是,这些算法并不总是像***进的方法那样精确。这就是为什么他们可以被称为"weak learners",至少与高度参数化的神经网络相比。
提高性能的一种方法是将这些"weak learners"(这可以是一组支持向量机或决策树组合起来,以便他们"一起工作"来生成预测。这就是集成学习的全部内容