本文提出了一种少样本下的元学习方法,用于文本分类,在多个数据集上取得较好效果。
paper: https://drive.google.com/open?id=19HtiZOH1jKWtEu_pq38wVYtYOwNIvPiP
code: https://github.com/YujiaBao/Distributional-Signatures
source: Work in Progress for ICLR2020
Introduction
近些年,元学习(meta-learning)在处理少数据集的任务上十分流行,所谓元学习,就是让一个算法能够扩展到一个新的标注任务(类)上,这个标注任务(类)有不同于原有任务的标注类别,而且训练集很少。
目前元学习主要在CV上取得了较大成功,对NLP,还未有广泛的成功。元学习不易处理NLP的主要原因还是在CV和NLP的内在区别:CV的低级别模型,如边、颜色、点在不同任务上都是通用的;而NLP的不同任务,即使是同一个句子,其重点都是不同的。比如下图是HuffPost
数据集中共41个类别不同词的相关度:
从图中可以看到,词和类别是高度相关的,但是对不同任务(类)而言,同一个词的重要性又是不同的。比如下图,同样是在数据集HuffPost
中,如果把类别fifty
抹去,之前的网络根本无法找出最重要的词来:
但是本文提出的方法可以很好地找到最重要的词,从而判断正确的类别。本文提出了一个元学习模型用于少样本下的文本分类模型。总的来说,本文贡献如下:
- 不直接考虑词,本文的方法使用词的分布式特征
- 提出了一个少样本下的元学习文本分类模型
- 使用了一个注意力生成器(Attention Generator)和一个岭回归器(Ridge Regressor)
- 在跨类别迁移上模型表现良好
Background
Problem Statement 现在我们有一个类别$y^{train}$集合,对这些类别,我们有足够的标注数据。又有一个类别$y^{test}$集合,但是标注数据很少。我们的目标是通过类别集$y^{train}$的标注数据使得模型能够在类别集$y^{test}$的数据上也有较好的效果。注意$y^{train}$与$y^{test}$是不相交的。
Meta-Learning 我们把元学习分为元学习训练(Meta-Training)和元学习测试(Meta-Testing),对于元学习训练,我们要创造若干个训练段(training episode),同理我们也有若干测试段(testing episode)。为了创造一个训练段,我们首先从$y^{train}$中随机取$N$个类别,再从每个类别中取$K$个训练样本作为训练集和$L$个样本作为测试集,所以就有$NK$个训练样本和$NL$个测试样本。一般来说,我们把这$NK$个训练样本称为支持集(support set),把$NL$个测试样本称为询问集(query set)。这个过程会重复多次以获得多个training episodes,其中每一个都包含N个类别。此任务又被称为 _N-way K-shot classification_。在元学习测试阶段,对每个测试段,我们都先从$y^{test}$中随机取$N$个类,然后再从这$N$个类中取支持集和询问集,然后在所有段的询问集中验证模型效果。
Extension 在上图中还出现了一个source pool,这就是本文的一个扩展。具体地,在元学习训练时,对每个训练段,我们把所有没被选择的类的数据作为source pool;在元学习测试阶段,source pool包括所有类的训练数据。
Method
模型主要分为两个模块:
- 注意力生成器:该模块通过结合source pool的分布式特征和支持集,生成以类为基础的注意力大小,然后生成的注意力被用于岭回归器来修正词重要度的偏差
- 岭回归器:对每个段,该模块接受注意力值并构建词汇表示,然后在询问集上进行预测
注意力生成器
注意力生成器的目标是评估词的重要度,我们使用source pool来得到词的一般重要度,使用支持集得到类相关重要度。
由于出现越频繁的词重要度越低,所以用下式得到一般重要度:
$$
s\left(x_{i}\right)=\frac{\epsilon}{\epsilon+P\left(x_{i}\right)}, \epsilon=10^{-3}
$$
其中$x_{i}$是输入句子$x$的第i个词,$P(x_{i})$ 是source pool中$x_{i}$的unigram的似然概率。然后用下式得到类相关重要度:
$$
t\left(x_{i}\right)=\mathcal{H}\left(P\left(y | x_{i}\right)\right)^{-1}
$$
这里条件似然$P(y|x_{i})$是在支持集中使用正则线性分类器(Regularized Linear Classifier,具体请参考原文附录A.1)得到的,$\mathcal{H}$为求熵。显然,$t(x_{i})$得到的是词$x_{i}$在类别$y$中的不确定度,从而也是重要度。
但是只用这些数据效果不好,原因有二:(1)source pool和支持集包含的是互补的数据,模型无法确定如何结合;(2)这些数据只是词重要度在分类问题上的估计。于是,我们使用BiLSTM结合这些数据:$h=biLSTM([s(x);t(x)])$,然后得到下面的注意力值:
$$
\alpha_{i}=\frac{\exp \left(v^{T} h_{i}\right)}{\sum_{j} \exp \left(v^{T} h_{j}\right)}
$$
其中$v$是一个训练参数。
岭回归器
对于岭回归器,我们首先得到样本的表示:
$$
\phi(x)=\sum_{i} \alpha_{i} \cdot f_{\mathrm{ebd}}\left(x_{i}\right), \quad f_{\mathrm{ebd}}\left(x_{i}\right) \in \mathbb{R}^{E}
$$
$f_{\mathrm{ebd}}\left(x_{i}\right)$ 是词$x_{i}$对应的词向量。
Training from the support set 然后令$\Phi_{S} \in \mathbb{R}^{N K \times E}$是支持集的表示,$Y_{S} \in \mathbb{R}^{N K \times N}$是类别的one-hot表示。然后最小化下面的loss:
$$
\mathcal{L}^{R R}(W)=\left|\Phi_{S} W-Y_{S}\right|_{F}^{2}+\lambda|W|_{F}^{2}, \quad W \in \mathbb{R}^{E \times N}
$$
Inference on the query set 对询问集,令$\Phi(Q)$是其表示,于是我们直接预测其标签:
$$
\hat{Y}_{Q}=a \Phi_{Q} W+b, \quad a \in \mathbb{R}^{+}, b \in \mathbb{R}
$$
最后我们用softmax得到$\hat{P}_{Q}$,用交叉熵进行反向传播即可。
We note that the attention generator is optimized over all training episodes, while the ridge regressor is trained from scratch for each episode.
Experiments
本文在下面的数据集上进行了实验:20 Newsgroups
,RCV1
,Reuters-21578
,Amazon product data
,HuffPost headlines
和FewRel
。
下表是6个数据集在不同表示(Rep.)和不同学习算法(Alg.)上的表现,其中NN是1近邻分类,FT是首先在所有训练样本上进行预训练,然后在支持集微调。
平均来说,本文的模型在$N=5, K=1$时提高6.26%的准确率,在$N=5, K=5$时提高3.84%准确率。下图说明了本文模型可以有效地避免过拟合:
Conclusion
本文提出了一种少样本下的元学习方法,用于文本分类,在多个数据集上取得较好效果。本方法利用词的分布式特征得到注意力值,从而与词重要度建立联系,很好地缓解了过去单纯使用tf-idf或单纯使用词向量的不足。此外,在测试的时候,不需要经过复杂网络,只需用一个线性变换即可进行预测,在效果好的同时也很快,一举两得。