从SamplePairing到mixup:神奇的正则项

原文链接 | 2018-07-07 | 苏剑林

SamplePairing和mixup是两种一脉相承的图像数据扩增手段,它们看起来很不合理,而操作则非常简单,但结果却非常漂亮:在多个图像分类任务中都表明它们能提高最终分类模型的精度。

某些读者会困惑于一个问题:为什么如此不合理的数据扩增手段,能得到如此好的效果?而本文则要表明,它们看起来是一种数据扩增方法,事实上它们是对模型的一种正则化方案。正如周星驰的电影《国产凌凌漆》的一句经典台词:

表面上看这是一个吹风机,其实它是一个刮胡刀。

数据扩增#

让我们从数据扩增说起。数据扩增是指我们在对原始数据做一些简单的变换后,它们对应的类别往往不会变化,所以我们可以在原来数据的基础上,“造”出更多的数据来。比如一幅小狗的照片,将它水平翻转、轻微的旋转、裁剪、平移等操作后,我们认为它的类别没有变化,它还是原来的那只狗。这样一来,从一个样本我们可以衍生出好几个样本,从而增加了训练样本量。

狗

旋转的狗

数据扩增源于我们的先验知识——比如我们事先知道了普通照片具有水平翻转不变性,从而我们用水平翻转来扩增数据,通过扩增数据来告诉模型它应该具有水平翻转不变性。数据扩增并非绝对通用的,比如普通的照片可以水平翻转不变,但是对于文字图片就不行了,这进一步体现了数据扩增是将我们的先验知识融入到模型中的一种方案。

SamplePairing#

现在我们来谈SamplePairing。SamplePairing是作为一种数据扩增的手段而提出,但它却非常反直觉:

样本\(x_a\)的标签是\(y_a\),那么训练集随机选一个样本\(x_b\),让\((x_a+x_b)/2\)的标签仍然是\(y_a\)。

没错,你没有看错,我也没有写错,就这么简单,也就这么反直觉。在paperweekly上读者陈泰红曾评论:

这是我见到 CNN 领域最简单的一篇论文。

看到这个方案后,读者脑海里可能冒出一系列的问题,这一系列的问题就是SamplePairing的反直觉所在。比如,为什么\((x_a+x_b)/2\)是\(y_a\)而不是\(y_b\)?还有,按照我们对数据扩增的理解,\((x_a+x_b)/2\)都已经不是一幅合理的图像了,这样的“扩增”还能用?

猫

狗

猫狗平均

首先,关于不对称的问题,其实可以留意到,当前样本是\(x_a\)时,随机选到\(x_b\),而我们让\((x_a+x_b)/2\)的标签仍然是\(y_a\);而轮到\(x_b\)时,随机选的时候也可能选到\(x_a\),这时候\((x_a+x_b)/2\)的标签就是\(x_b\)。所以,看上去不对称,实际上SamplePairing是对称的,SamplePairing可以重新表述为:

随机选两个样本\(x_a\)和\(x_b\),它们对应的标签为\(y_a,y_b\),从中随机选一个标签,假设结果为\(y\),那么让\((x_a+x_b)/2\)的标签为\(y\)。

mixup#

从重新表述后的SamplePairing中不难看出,如果训练充分的话,理论上模型对于\((x_a+x_b)/2\)的输出应该是\(y_a,y_b\)各占一半,也就是说,如果\(y_a,y_b\)分别代表类别的one hot向量,那么\((x_a+x_b)/2\)的输出就是\((y_a+y_b)/2\)。

既然如此,我们何不用更随机的方式混合呢?假设\(U(\varepsilon)\)是某个\([0,1]\)上的随机分布,那么每次我们都随机采样\(\varepsilon\sim U(\varepsilon)\),然后让\(\varepsilon x_a + (1-\varepsilon) x_b\)对应的输出为\(\varepsilon y_a + (1-\varepsilon) y_b\)。其中原论文中将\(U(\varepsilon)\)取为\(\beta\)分布,我觉得这反而引入了更多的超参数,倒不如干脆让它等于均匀分布。

相比SamplePairing,mixup的做法更加“柔和”一些,也更让人信服。因为SamplePairing总给人“一刀切”的感觉,而mixup相对来说符合直觉一些:既然输入是按\(\varepsilon: 1-\varepsilon\)叠加的,那么输出也按照这个方式叠加,应该是比较自然的。

正则项诠释#

尽管mixup给人更合理一些的感觉,但它们都没有回答一个很重要的问题:两幅图像相加后,结果已经不是一幅合理的图像了,这跟我们通常说的数据扩增完全不是一回事,为什么效果还会好?

让我们更数学化地描述这个问题,对于训练集对\((x_1,y_1),(x_2,y_2),\dots,(x_n,y_n)\),我们希望找到一个模型\(f\),使得\(y=f(x)\)。对于图像分类等任务,鉴于问题本身具有较强的非线性,所以我们一般会用非常深的网络来拟合。然而,网络越深也意味着更加容易对训练集过拟合。

假设模型已经有能力预测\(y_a = f(x_a), y_b = f(x_b)\)了,那么对于mixup,它说这样还不够,模型还要同时对\(\varepsilon x_a + (1-\varepsilon) x_b\)输出\(\varepsilon y_a + (1-\varepsilon) y_b\)才行,也就是

\[\varepsilon y_a + (1-\varepsilon) y_b = f\big(\varepsilon x_a + (1-\varepsilon) x_b\big)\]

将\(y_a,y_b\)用\(f(x_a),f(x_b)\)代替,那么得到

\[\varepsilon f(x_a) + (1-\varepsilon) f(x_b) = f\big(\varepsilon x_a + (1-\varepsilon) x_b\big)\]

这其实是一个函数方程,假如\(\varepsilon,x_a,x_b\)都是任意的,那么上述函数方程的解就是“线性函数”,也就是说,只有线性函数才能使得上式恒成立,换句话说,mixup希望模型\(f\)是一个线性函数****。

我们知道,线性函数相当于没有加激活函数的单层神经网络,可以说是最简单的模型了,而我们实际建模时的模型则是深层的、具有大量参数的、具有强非线性能力的网络,而参数越多,越容易过拟合。这样一来,mixup的含义就很明显了:

mixup相当于一个正则项,它希望模型尽可能往线性函数靠近,也就是说,既保证模型预测尽可能准确,又让模型尽可能简单。

所以,mixup就是一个很强悍的模型过滤器:

在所有效果都差不多的模型中,选择最接近线性函数的那一个。

写在最后#

现在我们就回答了原来的那个问题:诸如SamplePairing、mixup这样的数据扩增手段,它们只不过是有着数据扩增的外貌,实际上是通过数据扩增的形式来给模型增加正则项,或者说对模型进行剪枝。

因此,我们就不需要纠结“相加后的图像都已经不是一幅合理的“图像”了,数据扩增为啥还会有效”的问题了,因为它不是数据扩增。

最后,胡乱篡改唐伯虎的一首诗终结本文:

别人笑我乱扩增,我笑他人看不穿。 不见合理图像出,无声无息滤模型。