模型介绍
像BERT及其变种这样的经过预训练的语言模型,最近在各种自然语言理解任务中取得了令人印象深刻的性能。但是,BERT严重依赖于全局自注意力模块,因此会需要较大的内存占用和计算成本。尽管其所有attention head作用于整个输入序列,以从全局角度生成attention map,但我们观察到有些head只需要学习本地依赖关系,这意味着存在计算冗余。
因此,我们提出了一种新颖的基于跨度的动态卷积,以取代这些self-attention head来直接对局部依赖性进行建模。新颖的卷积头与其余的self-attention头共同构成了一个新的混合注意力块,在全局和局部上下文学习中都更加有效。ConvBERT就是基于这种混合注意力构建的模型。
ConvBERT相比BERT改进的地方有两点:
-
提出了一种新的混合注意力以取代BERT中的self-attention模块,该模块利用了卷积的优势来更好地捕获局部依赖。
-
介绍了一种新颖的基于跨度的动态卷积运算,以利用多个输入token动态生成卷积核。
模型改进
基于跨度的动态卷积,得到了高效的混合注意力块。通过以迭代方式堆叠混合注意力和分组前馈模块,构建了ConvBERT模型。ConvBERT更轻量级且更有效地捕获全局和局部上下文,并且性能更高。
NLP中的卷积
一维卷积被应用于特定的seq2seq学习任务,像机器翻译和摘要。深度可分离卷积被应用于编码器和解码器,以执行翻译任务,并减少参数和计算成本。轻量和动态卷积可以进一步增强了卷积的表达能力。 但是,所有这些模型在捕获长句子的上下文上能力有限。注意在NLP任务中,卷积的channel指的是embedding的每一维。
1、Conventional Convolution
其中 k k k为卷积核的宽度, d i n d_{in} din 代表输入的embedding的维度, d o u t d_{out} dout 代表输出的embedding的维度,如果 d i n = d o u t = d d_{in}=d_{out}=d din=dout=d,则需要的参数量为 d 2 k d^2k d2k。
2、Depthwise Convolution
图中k为卷积核的宽度,d代表embedding的维度。通过使用depthwise convolution,参数量降为dk。
用公式可以表达为:
D W C o n v ( X , W c , : , i , c ) = ∑ j = 1 k W c , j ⋅ X ( i + j − ⌈ k + 1 2 ⌉ ) , c DWConv(X,W_{c,:},i,c)=\sum_{j=1}^{k}W_{c,j} \cdot X_{(i+j-\left \lceil \frac{k+1}{2}\right \rceil),c} DWConv(X,Wc,:,i,c)=∑j=1kWc,j⋅X(i+j−⌈2k+1⌉),c
3、Lightweight Convolution
在上图中,沿X的embedding维度划分为H个区域,这里H=3,卷积核W与X相同颜色的区域进行卷积,X中相同颜色区域参数共享。计算公式为:
L C o n v ( X , W ⌈ c H d ⌉ , : , i , c ) = D W C o n v ( X , s o f t m a x ( W ⌈ c H d ⌉ , : ) , i , c ) = ∑ j = 1 k W c , j ⋅ X ( i + j − ⌈ k + 1 2 ⌉ ) , c \begin{aligned} LConv(X,W_{\left \lceil \frac{cH}{d}\right \rceil,:},i,c)&=DWConv(X,softmax(W_{\left \lceil \frac{cH}{d}\right \rceil,:}),i,c) \\ &=\sum_{j=1}^{k}W_{c,j} \cdot X_{(i+j-\left \lceil \frac{k+1}{2}\right \rceil),c} \end{aligned} LConv(X,W⌈dcH⌉,:,i,c)=DWConv(X,softmax(W⌈dcH⌉,:),i,c)=j=1∑kWc,j⋅X(i+j−⌈2k+1⌉),c
Softmax-normalization对卷积核channel一维进行softmax处理,相当于归一化每个词的每一维的重要性。实验表明,如果不进行softmax就不会收敛。
4、Dynamic Convolution
Dynamic Convolution会为每一个词的embedding动态地生成卷积核,生成卷积核时使用一个kernel generator,这个kernel generator是一个函数
f
:
R
d
→
R
H
×
k
f:R^d \rightarrow R^{H \times k}
f:Rd→RH×k,
f
f
f 是一个线性映射,其中权重
W
Q
∈
R
H
×
k
×
d
W^Q \in R^{H \times k \times d}
WQ∈RH×k×d,动态生成
i
i
i 位置词的卷积核公式为:
f ( X i ) = ∑ c = 1 d W h , j , c Q X i , c f(X_{i})=\sum _{c=1}^{d}W^{Q}_{h,j,c}X_{i,c} f(Xi)=∑c=1dWh,j,cQXi,c
Dynamic Convolution计算输出的公式为:
D C o n v ( X , i , c ) = L C o n v ( X , f ( X i ) h , : , i , c ) DConv(X,i,c)=LConv(X,f(X_{i})_{h,:},i,c) DConv(X,i,c)=LConv(X,f(Xi)h,:,i,c)
5、Span-based Dynamic Convolution
上图展示了span-based dynamic convolution的架构,其中 Q , V , K s ∈ R n × d Q,V,K_s \in R^{n \times d} Q,V,Ks∈Rn×d,也就是self-attention中的query和value。输入的 X X X 首先需要经过一个depthwise convolution来获取每个token局部的一个区间内的信息,然后使用这个depthwise convolution卷积后的结果 K s K_s Ks 于 Q Q Q的Hadamard积来动态地生成卷积核(kernel generator的权重为 W f , W f ∈ R k × d W_f,W_f \in R^{k \times d} Wf,Wf∈Rk×d,也就是说 H = 1 H=1 H=1,然后使用动态生成的卷积核在 V V V 上做卷积。
上述过程的动态生成卷积核公式为:
f ( Q , K s ) = s o f t m a x ( W f ( Q ∘ K s ) ) f(Q,K_{s})=softmax(W_{f}(Q\circ K_{s})) f(Q,Ks)=softmax(Wf(Q∘Ks))
Span-based dynamic convolution的公式为:
S D C o n v ( Q , K s , V ; W f , i ) = L i g h t C o n v ( V , s o f t m a x ( W f ( Q ∘ K s ) ) , i ) SDConv(Q,K_{s},V;W_{f},i)=LightConv(V,softmax(W_{f}(Q\circ K_{s})),i) SDConv(Q,Ks,V;Wf,i)=LightConv(V,softmax(Wf(Q∘Ks)),i)
然后需要经过一个Linear层进行处理。我们总是保持depthwise convolution和span-based dynamic convolution卷积核的size一致。
混合注意力
混合注意力块集成了基于跨度的动态卷积和self-attention,以更好地建模全局和局部依赖,并减少了冗余。
如图所示,它们共享相同的Query,但使用不同的Key分别生成注意力映射和卷积核。我们减少了attention heads的数量,通过将输入直接投影到较小的嵌入空间,形成self-attention和基于跨度的动态卷积的瓶颈结构。
假设用Concat()表示为连接操作,将混合注意力用公式可以表示为:
Mixed-Attn ( K , Q , K s , V ; W f ) = (K,Q,K_s,V;W_f)= (K,Q,Ks,V;Wf)= Concat ( ( (Self-Attn ( Q , K , V ) , (Q,K,V), (Q,K,V),SDConv Q , K s , V ; W f ) ) Q,K_s,V;W_f)) Q,Ks,V;Wf))
self-attention有些头是多余的,因此提议在引入基于跨度的动态卷积模块同时,减少头的数量。输入的嵌入首先被投影到一个较低维的空间,然后通过自注意力模块。具体地,在原始BERT中,尺寸d的嵌入特征被投影到Query,Key和Value,具有原始transformer体系结构中相同维度d。在这里将嵌入特征投影到为d /γ的更小维度,其中γ> 1是缩小比率。这意味着,通过控制γ减少了attention heads的数量。 这极大地节省了self-attention内的计算开销,并迫使注意力头产生更紧凑和有用的注意力信息。
分组前馈模块
transformer模型中的大量参数实际上来自前馈模块。 为了在降低参数和计算开销的同时保持表达能力,提议对前馈模块进行分组线性(GL)运算,定义如下:
M = ∏ i = 0 g [ f d g → m g i ( H [ : , i − 1 : i × d g ] ) ] , M ′ = G e L U ( M ) , H ′ = ∏ i = 0 g [ f m g → d g i ( M [ : , i − 1 : i × m g ] ′ ) ] M=\displaystyle\prod^g_{i=0}[f^i_{\frac d g \rightarrow \frac m g}(H_{[:,i-1:i \times \frac d g]})],M'=GeLU(M),H'=\prod^g_{i=0}[f^i_{\frac m g \rightarrow \frac d g}(M'_{[:,i-1:i\times \frac m g]})] M=i=0∏g[fgd→gmi(H[:,i−1:i×gd])],M′=GeLU(M),H′=i=0∏g[fgm→gdi(M[:,i−1:i×gm]′)]
其中 H , H ′ ∈ R n × d , M , M ′ ∈ R n × m , f d 1 → d 2 ( ⋅ ) H,H'\in R^{n \times d},M,M' \in R^{n \times m},f_{d_1 \rightarrow d_2}(\cdot) H,H′∈Rn×d,M,M′∈Rn×m,fd1→d2(⋅) 表示将维度d1转换为d2的全连接,g为组号, ∏ \prod ∏ 表示拼接。 这与原始的多头注意力机制是一致的,其中输入特征在嵌入维度上分为多个组并独立处理,并且所有处理后的特征再次在嵌入维度上拼接。 这比全连接的层更有效,并且性能下降的开销可以忽略不计。