论文:Time-aware Large Kernel Convolutions
链接:arxiv.org/pdf/2002.03184v1.pdf
偶尔看到一篇比较有意思的论文,其提出的方法设计得很巧妙,在提高运算速度、减少计算开销的同时保持了性能。
这篇论文提出了一种对Transformer的改进。提出使用时间自适应卷积(Time-aware Large Kernel Convolutions)替代Transformer种的self attention以提高计算的效率。
Transformer在计算self attention时,复杂度为 O ( n ² ) O(n²) O(n²) ,要计算每个token和所有token之间的相关性,计算耗时大。在这篇论文之前,已经有提出过动态卷积,可以用于此处使用卷积网络来对语义建模,从而降低计算的时间复杂度,将其从 O ( n ² ) O(n²) O(n²)降低到 O ( k n ) O(kn) O(kn),此处 k k k为卷积核的大小。而本文提出的方法,进一步的降低了时间复杂度,将其降低为 O ( n ) O(n) O(n)。
方法:时间自适应卷积
假定输入为长度为 n n n的文本序列 X = { x 1 , x 2 , . . . , x n } X=\lbrace x_1,x_2,...,x_n \rbrace X={x1,x2,...,xn},其中 x i x_i xi均为维度为 d d d的向量, i i i表示第 i i i次卷积操作。
每次卷积的计算公式为: o i = ∑ i = a i l a i r x j o_i=\sum_{i=a_i^l}^{a_i^r}{x_j} oi=∑i=ailairxj, 1 ≤ a i l ≤ i ≤ a i r ≤ n 1≤a_i^l≤i≤a_i^r≤n 1≤ail≤i≤air≤n
上式中, a i l a_i^l ail 和 a i r a_i^r air分别表示窗口的左右两端,从左加到右既完成卷积,这意味着卷积核的系数均为1,卷积过程中只需累加,无需进行乘法计算。
每次卷积都按顺序累加效率不高,存在很多重复的工作,因此作者使用累加和: S i = S i − 1 + x i , S 0 = 0 S_i=S_{i-1}+x_i, S_0=0 Si=Si−1+xi,S0=0
S i S_i Si表示输入序列 X X X的前 i i i项的累加,故卷积结果 o i o_i oi可以用累加和表示: o i = S a i r − S a i l − 1 o_i=S_{a_i^r}-S_{a_i^l-1} oi=Sair−Sail−1
每次卷积时,窗口的长度是不定的,需要根据
x
i
x_i
xi的值来确定。所以在此首先计算窗口长度的相对值:
a
i
l
=
i
−
a
~
i
l
⋅
l
m
a
x
a_i^l=i-\widetilde{a}_i^l·l_{max}
ail=i−a
il⋅lmax
a
i
r
=
i
+
a
~
i
r
⋅
r
m
a
x
a_i^r=i+\widetilde{a}_i^r·r_{max}
air=i+a
ir⋅rmax
其中,
l
m
a
x
l_{max}
lmax和
r
m
a
x
r_{max}
rmax分别为左右窗口允许的最大长度;
a
~
i
l
\widetilde{a}_i^l
a
il和
a
~
i
r
\widetilde{a}_i^r
a
ir为窗口左右长度的相对大小,其定义为
a
~
i
=
s
i
g
m
o
i
d
(
f
i
(
x
i
)
)
\widetilde{a}_i=sigmoid(f_i(x_i))
a
i=sigmoid(fi(xi)),定义中的
f
i
f_i
fi函数并未给明确的定义,只需要其为具有降为能力即可,将维度为
d
d
d的向量转化为一个实数。
在获得了左右窗口的实际长度后,需要用其计算
o
i
o_i
oi,此时面临一个问题,
o
i
o_i
oi的计算公式中,
S
S
S的下标均为整数,而算得的实际窗长为小数,此处作者认为两点之间为线性关系,对其进行采样。
S
a
i
l
−
1
=
γ
l
⋅
S
⌊
a
i
l
⌋
−
1
+
(
1
−
γ
l
)
⋅
S
⌈
a
i
l
⌉
−
1
S_{a_i^l-1}=\gamma^l·S_{\lfloor{a_i^l}\rfloor-1}+(1-\gamma^l)·S_{\lceil{a_i^l}\rceil-1}
Sail−1=γl⋅S⌊ail⌋−1+(1−γl)⋅S⌈ail⌉−1
S
a
i
r
=
(
1
−
γ
r
)
⋅
S
⌊
a
i
r
⌋
+
γ
r
⋅
S
⌈
a
i
r
⌉
S_{a_i^r}=(1-\gamma^r)·S_{\lfloor{a_i^r}\rfloor}+\gamma^r·S_{\lceil{a_i^r}\rceil}
Sair=(1−γr)⋅S⌊air⌋+γr⋅S⌈air⌉
其中
⌊
∗
⌋
\lfloor{*}\rfloor
⌊∗⌋和
⌈
∗
⌉
\lceil{*}\rceil
⌈∗⌉分别表示向下和向上取整,
γ
l
=
⌈
a
i
l
⌉
−
a
i
l
\gamma^l=\lceil{a_i^l}\rceil-a_i^l
γl=⌈ail⌉−ail,
γ
r
=
a
i
r
−
⌊
a
i
r
⌋
\gamma^r=a_i^r-\lfloor{a_i^r}\rfloor
γr=air−⌊air⌋。
至此,论文中提出的方法基本概括完毕,更多细节可以在论文里查看。
图解:
- 模型输入
X
=
{
x
1
,
x
2
,
.
.
.
,
x
n
}
X=\lbrace x_1,x_2,...,x_n \rbrace
X={x1,x2,...,xn}:
- 卷积
o
i
=
∑
i
=
a
i
l
a
i
r
x
j
o_i=\sum_{i=a_i^l}^{a_i^r}{x_j}
oi=∑i=ailairxj,
1
≤
a
i
l
≤
i
≤
a
i
r
≤
n
1≤a_i^l≤i≤a_i^r≤n
1≤ail≤i≤air≤n:
以 i = 4 , a i l = 2 , a i r = 3 i=4,a_i^l=2,a_i^r=3 i=4,ail=2,air=3为例。
-
累加和 S i S_i Si:
-
用 S S S表示 o o o:
-
计算相对窗长:
f f f为任意一个 d d d维至1维的映射函数,再通过sigmoid()将其值限制在0到1之间。在乘以窗长最大值获得实际窗长。 -
当 S i S_i Si中的 i i i为自然数
将论文中的公式稍加变形,更容易看出规律
S
a
i
l
−
1
=
γ
l
⋅
S
⌊
a
i
l
⌋
−
1
+
(
1
−
γ
l
)
⋅
S
⌈
a
i
l
⌉
−
1
=
S
⌈
a
i
l
⌉
−
1
−
γ
l
⋅
(
S
⌈
a
i
l
⌉
−
1
−
S
⌊
a
i
l
⌋
−
1
)
S_{a_i^l-1}=\gamma^l·S_{\lfloor{a_i^l}\rfloor-1}+(1-\gamma^l)·S_{\lceil{a_i^l}\rceil-1}=S_{\lceil{a_i^l}\rceil-1}-\gamma^l·(S_{\lceil{a_i^l}\rceil-1}-S_{\lfloor{a_i^l}\rfloor-1})
Sail−1=γl⋅S⌊ail⌋−1+(1−γl)⋅S⌈ail⌉−1=S⌈ail⌉−1−γl⋅(S⌈ail⌉−1−S⌊ail⌋−1)
S
a
i
r
=
(
1
−
γ
r
)
⋅
S
⌊
a
i
r
⌋
+
γ
r
⋅
S
⌈
a
i
r
⌉
=
S
⌊
a
i
r
⌋
+
γ
r
⋅
(
S
⌈
a
i
r
⌉
−
S
⌊
a
i
r
⌋
)
S_{a_i^r}=(1-\gamma^r)·S_{\lfloor{a_i^r}\rfloor}+\gamma^r·S_{\lceil{a_i^r}\rceil}=S_{\lfloor{a_i^r}\rfloor}+\gamma^r·(S_{\lceil{a_i^r}\rceil}-S_{\lfloor{a_i^r}\rfloor})
Sair=(1−γr)⋅S⌊air⌋+γr⋅S⌈air⌉=S⌊air⌋+γr⋅(S⌈air⌉−S⌊air⌋)
不妨假定
i
=
3
i=3
i=3,
l
m
a
x
=
2
l_{max}=2
lmax=2,
l
m
a
x
=
2
l_{max}=2
lmax=2,
a
~
3
l
=
0.3
\widetilde{a}_3^l=0.3
a
3l=0.3,
a
~
3
r
=
0.7
\widetilde{a}_3^r=0.7
a
3r=0.7,那么有
a
3
l
=
2.4
,
⌈
a
3
l
⌉
=
3
,
⌊
a
3
l
⌋
=
2
,
γ
l
=
0.6
a_3^l=2.4,\lceil{a_3^l}\rceil=3,\lfloor{a_3^l}\rfloor=2,\gamma^l=0.6
a3l=2.4,⌈a3l⌉=3,⌊a3l⌋=2,γl=0.6
a
3
r
=
4.4
,
⌈
a
3
r
⌉
=
5
,
⌊
a
3
r
⌋
=
4
,
γ
r
=
0.4
a_3^r=4.4,\lceil{a_3^r}\rceil=5,\lfloor{a_3^r}\rfloor=4,\gamma^r=0.4
a3r=4.4,⌈a3r⌉=5,⌊a3r⌋=4,γr=0.4
此时,可计算
o
3
=
S
4.4
−
S
1.4
o_3=S_{4.4}-S_{1.4}
o3=S4.4−S1.4
总结
这篇论文所提出的时间自适应卷积在很大程度上降低了Transformer的计算复杂度,在论文里的数据中有所展示,在此只做方法解析。
以上均为个人理解,如果错误欢迎指出。如需转载请标记出处。