机器学习的致命缺陷之负样本识别问题
当我们做一个分类问题时,比如手写数字识别,识别的是 0-9 几种数字。前提是给的就是 0-9 的测试样本,那我们如果给模型一个手写的 x ,显然它依旧会把 x 归为 0-9 的某个类别,可能还会输出一个较大的概率。
那我们训练机器学习时候怎么做的呢?首先,我们收集这 10 类的样本,使用有监督学习的方式训练一个模型。这里有个重要的概念:正负样本。正样本其实就是某个类的那些图像,比如都是 0 的图像。那么 其他类的图像 ,即 1-9 的图像加一起是该类的负样本。如果我们的场景是一个封闭集的识别问题,即假设所给的数据肯定是 0-9 这些数字图像,那么该模型是没有问题的。但是如果给了一张手写的 x 的图像呢?那么 负样本的定义就是不完备的,因为缺失其他负样本的信息,这就可能导致 模型对 x 的判定不确定。因为常用 softmax 输出一个概率向量,理想情况下,模型应该输出 10个 0.1 ,表示模型不知道 x 属于哪一类。但是理想往往是不可及的,模型可能会输出一个较大的概率,我们通过阈值就把 x 归于了那个类别。
如果我们训练 10 个二分类器呢?显然,同样负样本也是不完备的。
那么我们加入一些负样本数据呢?这就带来许多问题?加入什么数据?加多少这些数据?
- 是把收集的那些负样本数据放到新的类中,变成 11 类分类问题呢?
- 还是 训练 10 个分类器,把它们都放在负样本中?这时负样本还包含 其它 9 类的数据。
- 还是先训练一个 异常检测的二分类模型,把这 10 个类的数据当作正样本,收集的那些负样本数据当作负样本呢?
这些对于我都是感觉困难的问题。因为异常样本可能是难以收集的,数量应该选择放多少可能也是困难的。
让 “机器学习模型懂得说不” 确实是一个麻烦的问题!
同样,对于目标检测问题,该问题也是存在的。我们常常在测试模型中会遇到误识别的问题。即把一个无关的区域识别为目标。显然目前的目标检测算法也是基于正负样本的。比如基于 anchor 的算法,与标注框重叠小的 anchor 就是负样本,这些可能是背景图像,可能只有一点目标的区域。显然,目标检测的负样本比分类任务的正样本要多多了,因为整个图像的某些区域可能都是负样本。可能这种方式使得通过检测模型得到的结果要比直接把图像丢进去分类,会把更少的负样本识别为正样本。但是,CNN 到底是基于什么来识别目标呢?这可能还没有定论,有人说是基于纹理,那么纹理类似的目标就可能被识别为正样本,比如把 老虎识别为猫?那么我们有什么解决方案吗?
- 把误识别的样本复制到带有正样本的某些区域中,而它们是没有标签的。但是问题是,这些误识别的样本怎么收集(需要不停的测试工作)?这可能需要不停的迭代模型,每次都微调模型吧。
copy-paste 方法有效吗?即把正样本贴到某些背景图中,我理解的该方法增加了负样本的多样性,可能能解决部分背景误识别为目标的问题。对于把猫分为狗这种问题可能并没有帮助。换句话说,就是给定一个属于预定义类别的图像,模型该错的还是错。这种方式如果负样本加的过多,可能偏离真实应用场景了,可能使得模型偏向预测为负样本。