小样本利器4. 正则化+数据增强 Mixup Family代码实现( 二 )

Pytorch的实现如下
class Mixup(nn.Module):    def __init__(self, label_size, alpha):        super(Mixup, self).__init__()        self.label_size = label_size        self.alpha = alpha    def forward(self, input_x, input_y):        if not self.training:            return input_x, input_y        batch_size = input_x.size()[0]        input_y = F.one_hot(input_y, num_classes=self.label_size)        # get mix ratio        mix = np.random.beta(self.alpha, self.alpha)        mix = np.max([mix, 1 - mix])        # get random shuffle sample        index = torch.randperm(batch_size)        random_x = input_x[index, :]        random_y = input_y[index, :]        xmix = input_x * mix + random_x * (1 - mix)        ymix = input_y * mix + random_y * (1 - mix)        return xmix, ymix迁移到NLP场景

  • paper: Augmenting Data with mixup for Sentence Classification: An Empirical Study
mixup的方案是在CV中提出,那如何迁移到NLP呢?其实还是在哪一层进行差值的问题,在NLP中一般可以在两个位置进行融合,在过Encoder之前对词向量融合,过Encoder之后对句向量进行融合 。
小样本利器4. 正则化+数据增强 Mixup Family代码实现

文章插图
作者在文本分类任务上对比了二者的效果,并尝试了随机词vs预训练词向量 * 允许微调vs冻结词向量,总共4种不同的情况 。整体上不论是wordmixup还是sentmixup都对效果有一定提升,不过二者的差异并不如以上的CV实验中显著 。
小样本利器4. 正则化+数据增强 Mixup Family代码实现

文章插图
在[应用类别识别挑战赛](https://challenge.xfyun.cn/topic/info?type=scene-division)中,我分别尝试了FGM,Temporal半监督 , 文本增强,和mixup来提升文本分类模型的效果 。在我使用的词+字向量的TextCNN模型结构中,mixup的表现最好,单模型在初赛排到13名 。之后等Top3解决方案出来后,我们再来总结这个比赛~
Manifold Mixup
  • paper: Manifold Mixup: Better Representations by Interpolating Hidden States
  • github: https://github.com/vikasverma1077/manifold_mixup
Manifold Mixup是在mixup基础上的改良 , 一言以蔽之就是把上面纠结的mixup在哪一层进行插值的问题,变成了每个step都随机选一层进行插值 。个人很喜欢这篇paper有两个原因 , 其一是因为觉得作者对mixup为何有效比原作解释的更加简单易懂;其二是它对插值位置的选择方案更适合BERT这类多层Encoder的模型 。而反观cv场景,优化点更多集中在cutmix这类对插值信息(对两个像素框内的信息进行融合)的选择上,核心也是因为图像输入的像素的信息量要远小于文本输入的字符所包含的信息量 。
说回Manifold mixup,它的整体实现方案很简单:在个layer中任选一个layer K,这里包括输入层(layer=0), 然后向前传导到k层进行mixup就齐活了 。作者的代码实现也很简单一个randint做层数选择,加上一连串的if layer==i则进行mixup就搞定了~
关键我们来拜读下作者对于Manifold Mixup为何有效的解释,作者从空间表征上给出了3个观点
  1. 得到更平滑,且远离样本覆盖空间的决策边界,这个同mixup
  2. 展平分类的空间表征:啥叫展平这个我最初也木有看懂,不过作者的证明方式更加易懂 , 作者对比了不同的正则方案mixup,dropout , batchnorm和manifold对隐藏层奇异值的影响,发现manifold相较其他正则化可以有效降低隐藏层的整体奇异值 。降低奇异值有啥用嘞?简单说就是一个矩阵越奇异,则越少的奇异值蕴含了更多的矩阵信息,矩阵的信息熵越小 。所以这里作者认为mixup起到了降低预测置信度从而提高泛化的作用 。更详细对奇异值的解释可以去知乎膜拜各路大神的奇异值的物理意义是什么?

    推荐阅读