ACL2022有一篇名为《\mathcal{Y}-Tuning: An Efficient Tuning Paradigm for Large-Scale Pre-Trained Models via Label Representation Learning》的投稿,从标题上就吸引了我的注意,不同于Fine-Tuning、Adapter-Tuning、Prompt-Tuning,这篇文章的创新之处在于,不调整输入文本特征与大规模预训练模型的参数,仅通过学习标签的特征,以往很少见到论文去学习标签的特征。虽然最终效果可能仍无法与微调相比,但它在节省计算成本方面有很大的优势,并有可能通过后续研究进一步提高性能
对于NLP任务来说,通常都含有输入文本x\in \mathcal{X}以及标签y\in \mathcal{Y},其中\mathcal{X}的特征空间是离散的(例如One-hot)。以情感分析(Sentiment Analysis, SA)任务为例,输入句子
标签集\mathcal{Y}=\{\text{postive}, \text{negative}\}中的标签y=\text{postive}为真实标签
定义\phi : \mathcal{X}\to \mathcal{Z}为输入句子到高维稠密向量空间的映射,f: \mathcal{Z}\to \mathcal{Y}为改向量空间到标签空间的映射。给定训练集\mathcal{D},我们可以定义损失函数为\ell: \mathcal{Y}\times \mathcal{Y}\to \mathbb{R}^+,并且可以通过以下方法找到最佳的f和\phi:
通常来说,即便分类器f很简单,但只要有一个好的特征提取器\phi(x),下游任务中的表现就不会差
上面的内容删减自原论文,论文中的描述有些抽象,说白了实际上\phi可以看作是BERT,f就是为了满足不同的下游任务,而接在BERT后面的一些层,例如文本分类后面接的就是一个Linear层
我们定义(x,y)是一个有标签的训练样本,\phi^{\star}是在大规模语料上训练好的预训练模型,并且在接下来始终固定\phi^{\star}的参数不更新。传统做法是微调特征提取器\phi^{\star}的参数,使其接近真实标签。\mathcal{Y}-Tuning的做法是固定\phi^{\star}的参数,转而微调标签提取器\psi的参数,并且我们使用Cross Attention将\phi^{\star}(x)与\psi(\mathcal{Y})的特征进行融合,如下图所示
PTMs代表φ
损失函数为Triplet Loss,形式如下:
$$ \begin{aligned} \mathcal{L}_{\psi,f}(x,y) = &\sum_{y' \in \mathcal{Y}\atop y'\neq y}[f(\phi^{\star}(x), \psi(y^{\prime}))\\ &-f(\phi^{\star}(x), \psi(y)) + \alpha]_{+} \end{aligned}\tag{2} $$
其中,[x]_+=\max (x, 0),\alpha是一个边界超参数,用于控制正负样本间的距离。在训练过程中,给定训练集\mathcal{D},我们可以通过如下方式找到最佳的模型参数
在推理阶段,我们可以使用如下方式获得预测值:
论文图中的模型架构主要由三个部分组成:
给定一个标签集\mathcal{Y},我们首先将标签y\in \mathcal{Y}映射为一个或多个连续的向量。当然,除了标签外,我们还需要将任务相关的信息映射为向量,例如情感分析任务,我们会在最前面添加一个SA标志
这其实有点像mBART,在做机器翻译的时候将该语言对应的标志(例如ZH、JP、EN等)添加到句子前面
因此,初始的标签特征为
其中,e_T表示任务相关的embedding,e^{(c)}表示第c个类别的embedding,N和D分别表示样本数量以及标签的表征的维度。实际上每个标签都可以用多个向量来表示,作者也做了一个对比实验,研究每个标签用多个向量来表示会对结果产生什么影响
有很多方法将标签y映射为一个向量,例如从Vocabulary、均匀分布、token embedding中采样等
我们首先使用self-attenion加强不同标签间的信息交互
其中,\mathbf{Q}\in \mathbb{R}^{N\times D_k}, \mathbf{K}\in \mathbb{R}^{M\times D_k}, \mathbf{V}\in \mathbb{R}^{M\times D_v},如果在self-attention中,N=M;如果在cross-attention中,N代表输入句子的长度,M代表标签输入的长度
在cross-attention中
$$ \mathbf{Q}=\mathbf{Y}\mathbf{W}_q\in \mathbb{R}^{N\times D}\\ \mathbf{K}=\mathbf{X}\mathbf{W}_k\in \mathbb{R}^{M\times D}\\ \mathbf{V}=\mathbf{X}\mathbf{W}_v\in \mathbb{R}^{M\times D} $$
其中,\mathbf{X}是输入句子通过PTMs后的高维向量
所有计算完成之后,我们会得到输出向量
其中,\mathbf{h}_T是任务相关的描述特征,\mathbf{h}_c是类别为c的标签特征。Triplet Loss的定义如下:
其中,c^{\star}代表正确标签对应的索引
假设我们有一个L层的预训练模型,它的复杂度为\mathcal{O}(LM^2),其中M是输入句子长度;一个有着长度为P的连续型Prompt,它的复杂度为\mathcal{O}(L(M+P)^2);对于\mathcal{Y}-tuning来说,self-attention与cross-attention的复杂度分别为\mathcal{O}(N^2)以及\mathcal{O}(MN),其中N为标签集的大小。因为在\mathcal{Y}-tuning中我们是固定预训练模型参数不训练的,因此预训练模型的部分不会占用计算资源(尤其是反向传播过程)
从实验结果上来看,效果算是「很有竞争力」,我们当然不能拿它与传统的FineTune相比,毕竟可训练的参数少了那么多,训练所需的算力也不是一个数量级的
本文提出的\mathcal{Y}-Tuning思路非常有意思,传统思路是对输入句子进行学习,使其输出向量靠近标签的分布;而这篇文章正好相反,对标签进行学习。让我有些意外的点是,损失函数并不是传统的CrossEntropyLoss,因为在我看来就直接将输出向量转换维度之后与真实标签进行对比就好了。但是论文使用的损失函数是Triplet Loss,不知道为什么作者为什么要这样做