深度学习的成功建立在大量的干净数据和深度模型基础上,但是在现实场景中数据和模型往往不会特别理想,比如数据里存在很多标签噪音,或者考虑到模型的推理速度,神经网络的层数不够深等。特别是对于业务场景,数据往往存在很多缺陷,因此让模型能够自适应的从缺陷数据里学习是业务成功的保障。
近几年,腾讯优图不断迭代数据和模型缺陷情况下神经网络的有效训练方法,相关技术已经在众多业务场景上(行人重识别,内容审核等)落地。本文是腾讯优图实验室高级研究员Louis,在腾讯优图和腾讯云大学、AICUG、AI科技评论联合主办的「优Tech沙龙」的分享整理。
定义带噪学习目标
现实数据中存在的标签噪音(label noise)根据Feature可以分成两种:Feature independent noise和Feature dependent noise。Feature independent noise是与特征无关的,比如将一只狗的图片误标记成汽车,狗和汽车没有什么相似特征,所以属于这类。Feature independent noise是与特征有关的,比如说狗和狼具有很多相似特征属性,标注人员可能把狗误标记成狼,那就属于这类。其实现实场景更多存在都是feature dependent noise。
噪音普遍存在,所以我们需要训练神经网络进行带噪学习,并且要能实现比较好的性能。那么noise label learning的目标是,loss function,使得在noisy labels下训练得到的解,在性能上接近在clean labels下训练得到的解。
各有千秋:主要带噪学习方法分析
关于带噪学习,近些年有一些重要论文。AAAI 2017年发表的这篇研究说明,MAE以均等分配的方式处理各个sample,而CE(cross entropy)会向识别困难的sample倾斜。因此,针对noisy labels,MAE比CE更加鲁棒,不容易让模型过拟合到label noise上。
当然,CE也有自身优势。2018年的这篇文章是接着前面一篇文章往下做的。这篇文章指出,MAE虽然比CE在noisy label更加鲁棒,但是CE的准确度更高,拟合也更快。
那么,如何结合CE和MAE的优势呢?这篇文章提出这样一个loss function,也就叫做GCE loss(Generalized Cross Entropy loss)。它如何结合二者的优势?这里q是一个0到1之间的超参数,当q趋近于0的时候,这个Lq就退化成了一个CE loss,当 q趋近于1时,Lq就退化成了MAE loss。所以在真实场景中,只要对q进行调整,就会让这个loss在一些noise label数据下有很好的表现。
还有的论文是基于信息论设计的loss function,Deterministic information loss。它的Motivation是想寻找一个信息测度(information measure)I。假设在I下任意存在两个分类器f、f’,如果在噪音数据集下,通过I, f比f’表现得更好,那么在干净数据集下,f比f’表现得也好,也就是说它在噪音数据集和干净数据集上满足一致性。如果在噪音数据集下它表现得好,那通过这个一致性,那么在干净数据集下表现得也一定很好。
把时间往前推进一下,讲一些目前正在审稿中的文章,关于Peer loss。我们构造的时候它等于两个loss的加权,α是权重系数,衡量l1和l2的大小关系,Xi和Y ̃是样本和对应的label。
为什么peer loss可以很好地解决noisy labels问题?为了方便,这里先把l1、l2都定义成CE loss,那么在第一项,它表现的像positive learning,因为它就是一个传统的CE function,而在第二项,它像 negative learning,也就是在标记错的时候,比如把狗标成汽车,如果用positive learning进行学习的话那就出现问题了,它是随机从一个label中进行抽取,希望让模型学到它不是一个鸟,狗不是一个鸟,它的语义关系首先是成立的,是正确的,这样一来,第二项对模型也能起到一个积极的导向作用。
更加有意思的是,单独训练第一项和单独训练第二项都不可能使模型达到理论上的最优,因为模型存在noisy labels。但是我们证明了它们两项联合训练,在统计上是可以让模型达到最优。
我们提出了一个主要定理,α是权重项,我们证明了存在一个最优的α,用peer loss在noisy labels下进行优化,它得出的神经网络的解等价于用l1在clean labels下进行优化,可以把l1理解成CE loss。所以我们理论证明了peer loss的最优性。
看一下peer loss在数据集下的表现,这里使用的数据集是CIFAR-10,然后我们让CIFAR-10数据集里面有40%的uniform noise或者说symmetric noise。图中的蓝色代表clean label分布,橘黄色代表noisy label分布。通过peer loss优化后,神经网络可以把两类比较完美地区分开,而且中间间隔很大,所以说证明了peer loss不仅在理论上成立,在实际上其实效果也不错。
再看一下数值的实验结果。我们在MNIST、Fashion MNIST、CIFAR-10上进行了实验,可以看到MNIST和Fashion MNIST上,用peer loss优化的结果超过了一些其他的结果,包括DMI的结果三四十个点,这是非常大的进步。在CIFAR-10上也超过将近5个点,四个多点左右这样的一个结果。而且,我们发现peer loss尤其对Sparse,High这种noise type表现得特别明显。
以上讲的方法主要是设计loss function的思路,让网络能够抵抗noisy labels。但其实还有很多其他方法,比如samples selection和label correction,这两个方法是通过选择样本和对样本进行纠正来进行带噪学习训练。
这篇发表在2018年NeurlPS的文章是关于Co-teaching。它的基本假设是认为noisy labels的loss要比clean labels的要大,于是它并行地训练了两个神经网络A和B,在每一个Mini-batch训练的过程中,每一个神经网络把它认为loss比较小的样本,送给它其另外一个网络,这样不断进行迭代训练。
接下来介绍腾讯优图在2019年底发表的一篇文章,解决一类特殊的label noise。这类label noise不是人为标注产生的,而是在训练中产生的。比如说有这样一批没有标记的样本,然后通过一个聚类算法得到inliers和outliers,outliers是聚类算法中认为这一点是孤立点或者是噪音点,它没法归到聚类算法的ID里面,就叫做outliers,inliers是聚类算法对这些样本进行聚类后得到一个个id,但每一个id里面可能存在noise,比如说对于id1里面有一个三角,这个三角更应该是id3里面的样本。它是在模型的聚类过程中产生,所以说这是一类特殊的noise type。
腾讯优图提出了一个框架,叫Asymmetric Co-teaching。因为聚类中存在inlier和outliers,这两个不同源,所以用非对称的思想去解决noise label的问题。
具体来说,首先有很多 Target Data,经过模型聚类得到Inliers和Outliers。然后通过k近邻将outiers进行label。下面一步是比较关键的,和Co-teaching一样,我们也并行训练两个神经网络C和M,但是我们往C和M送到的样本是非同源的,一个Inlier一个outliers。然后C和M互相发送他们认为loss比较小的样本进行迭代训练。每次训练之后,再进行聚类。不断重复这种迭代过程,最后我们发现outliers越来越少,Inlier也是越来越多,Inlier每个ID的noise也是越来越少。
可以看一下Asymmetric Co-teaching的结果,我们主要是在行人重识别这个问题上衡量方法的有效性,也就是ReID。可以看我们这个clustering-based的方法在Market和Duke数据集中有不错的表现,比之前的一些方法也多了五六个点。
总结一下,关于noisy label learning前面主要介绍了六个方法,我把它们归为了Feature independent noise和Feature dependent noise。但是值得注意的是,并不是一个方法去解决Feature independent noise就无法解决Feature dependent noise,只是说一个方法它更适用于解决哪个问题,然后标线框的这两个是我们的工作。
多模型协作,提升网络表达能力
关于协作学习其实学术界没有统一的定义,一般来讲只要是多个模型互相协作,去解决一个或者多个任务,那就可以把这种学习范式叫做协作学习。
按照任务分,协作学习可以分成两个:一个是解决多个任务,有dual learning和cooperative learning;一个是多个模型一起协作解决一个任务。因为dual learning和cooperative learning主要是解决自然语言处理的问题,自然语言处理涉及到比如说中文翻译成英文,英文翻译成中文,这是多个任务。我们这里主要是讲CV方面,所以说我们主要讲解决一个任务,接下来会介绍co-training、deep mutual learning、filter grafting和DGD这几个工作。
关于 Co-training的这篇文章非常古老,是1998年的,但是它的引用量已经好几千,它其实是解决了半监督的问题。
接下来介绍2018年的这篇文章,发表在CVPR,这篇叫做deep mutual learning。它的思想极其简单,我们都知道蒸馏的时候teacher是fixed,然后对于学生进行监督,这篇文章的思想就是在蒸馏的过程中老师并不保持fixed,也进行迭代的训练操作,也就是说老师教学生,学生也教老师。
时间再拉近一点,这是今年腾讯优图中稿CVPR2020年的一篇文章,叫做Filter Grafting。这篇文章的motivation是什么呢?我们知道训练好的神经网络存在很多冗余或者说无效的filter,比如说l1 norm很低,那Pruning就是想把这些filter给移除掉来加速网络的推理能力。那么我们想,如果我们不把这些无效的filter移除掉,而是通过其他网络的帮助来激活这些无效的filter,让它们重新变得有价值起来,那是不是可以进一步提高网络的表达能力?
这篇文章有一个重要的发现是什么呢?我们发现训练的神经网络如果在初始化的时候都采用随机初始化,那么在训练完之后,无效filter的位置是统计无关的。所以我们可以并行训练多个网络,在训练的过程中,每个网络接受上一个网络的部分weight (我们将这种方式叫做grafting),因为每个网络无效filter的位置是统计无关的。所以其他网络有效filter的weight可以填补到自己网络里的无效filter当中。多个网络之间互相进行这种操作,结束训练之后每个神经网络都会有更好的特征表达,而且测试的时候准确率性能也会更好。
可以看一下这个结果,对于在CIFAR-10、CIFAR-100上进行的实验,与mutual learning、传统的distillation、还有RePr相比较,Filter Grafting效果还是不错的,对于一些大网络,特别是对于CIFAR-100有两个点的提升。
Grafting是可以有效提高无效filter,但是可能有效filter的信息量会减少。我们在做grafting加权的时候,比如说M1和M2进行加权,M1的layer1加到M2的layer1上面,虽然填补了M2中无效filter的空虚,但是M2有效filter可能也会受到影响。因为M1它本身也有无效filter,它直接加到M2上,M2的有效filter的信息量可能会减少,
这篇还在审稿中的文章是关于我们的新发现,就是传统的蒸馏可以解决有效filter信息量可能减少这个问题,这是这篇文章的贡献。我们提出了DGD的training framework。
DGD在训练的过程中,并行训练多个teacher和多个student。多个teacher对student进行蒸馏,而student之间进行grafting。最后训练的结果是每一个student的valid filter和invalid filter都会有信息量的提升。
看一下DGD framework的结果。我们对比了传统的filter grafting,还有knowledge distillation,发现比grafting,distillation都有不错的提升,比如在CIFAR-100上,各个网络基本都会比baseline提升两到三个点。
朝下一个难题前进,提升真实业务场景下的准确率
前面讲的是noise label learning和collaborative leaning,那么基于这两个可以做什么呢?
第一个是设计一些feature dependent noise的loss形式。 因为我认为现在对于noisy label learning领域,feature independent noise可能解决得差不多了,准确率都很高了,接下来一个主要的点就是设计一些loss方式来解决feature dependent问题。而且,这个问题是真实的业务场景、真实的数据集上的noise type形式。
第二个是,我们知道grafting的motivation是来自于pruning,那么我们是否可以用grafting的一些思想去指导神经网络来进行更有效的pruning,这是一些未来大家有兴趣可以探索的一个点。
Q&A
Q: 您提到的那些噪声是不是其实都是已知的,假设如果现在有一批数据,标注是否正确其实我们无法知道,那这种情况有什么好的解决办法吗?
A:刚才我讲的这些文章中很多是假设知道noise rate这个prior knowledge,但真实场景其实我们不知道noise rate是多大,我觉得一个好的解决方法是用一些design loss的方式,建议大家可以先用一些像peer loss或者DMI loss先进行一些尝试,因为这些是更贴近实际的。
Q:在grafting的场景里面,如何去判断有效或者无效的filter?
A:我们想解决的是减少无效filter,那么首先要定义什么是无效filter。传统的定义方法是通过L1 Norm进行定义,其实我们觉得通过L1 Norm进行定义并不完美,不是L1 Norm比较小,filter就不好, L1 Norm比较大,filter信息量就很多。比如对于一个神经网络来说,如果一个filter如果都是全1的话,这是没有任何信息量,因为它没有diversity,但是L1 Norm也很大。所以这篇文章其实并不是通过L1 Norm的手段去定义无效filter,我们是通过信息量去定义哪些是无效的filter,哪些是无效的layer。
Q:Grafting和ensemble有什么区别?
A:Ensemble其实训练的是多个模型,测试的时候也是多个模型。但是grafting的优势是我们训练的就是多个模型,但是测试的时候只用一个模型。也就是说训练的时候这些模型进行grafting,训练之后我们随机抽取任何一个网络进行测试都是有比较好的提升的。所以测试的时候只用一个模型,它比ensemble更加高效,inference time更少。