目录
一、模型背景
这篇论文发现标准的语言模型内部注意力机制并没有生成一个有效的token表征,很多时候我们会用BERT最后一层的CLS位置的向量作为句向量,但问题是CLS在中间层的时候虽然会self-attention其他token的信息,但并不对其他token作贡献,直到最后一层才进行全局的attention(这个还得再看看源码)
二、模型架构
原理很简单,将12层BERT分为两部分,各6层,也就是上图的early(前6层),late(后6层),然后用第12层的CLS位置向量与第6层除CLS位置的其他隐藏向量拼接成原长度的输出向量,最后接一个2层训练以达到优化CLS位置的目的。
第一眼这种操作,反应是这么做完全很难解释,处理方式有点是两个层各取部分位置的token拼接,然后增加模型复杂度来达到微小提升的目的,但从论文提到的几点妄自揣测这么做的动机:
1、作者提到CLS位置在中间层并不参与其他位置的self-attention,因此它可以看作相对独立,因此与谁拼接影响不大;
2、从第7层到第12层的网络学习仅仅使用了第12层的CLS向量,会强迫网络将信息往CLS位置汇合,达到学习更好句子表征的目的。
三、实验结果
四、Funnel-Transformer和U-Net介绍
作者认为他的思路来源于Funnel-Transfomer(漏斗型),而Funnel-Transfomer来源于U-net。
Funnel-Transformer:出发点是解决transformer性能瓶颈,因为它在每一层的每一个token都得做self-attention,随着句子长度的增加,计算量呈现平方级的增长,这就制约了它对长句句子表征的学习表达。
之前的解决方案主要分为模型后处理和非后处理:
模型后处理:蒸馏、剪枝、量化等
非后处理:修改注意力机制、采用CNN等
对第一个Block,我们还是像普通Transformer那样计算,但是到第二个Block的时候,就可以先把第一层得到的特征向量池化一下:
这样子,新的特征矩阵的形状就是T'*D,这里T'< T。然后在池化后的特征上进行自注意力:
特别注意这里的Q和KV的差别。Q是新得到的特征,KV还是池化前的特征。这是因为对原来的特征进行自注意力有利于减少池化带来的信息损失。
U-Net: 采用了四次下采样和四次上采样,如下图,像一个U型,模型名由此而来