内容本身来自于《Attention Is All You Need》原论文
以下翻译转载自https://www.cnblogs.com/nxf-rabbit75/p/11945195.html
一、问题限定及结论:
假设输入序列长度为n,每个元素的维度为𝑑:{𝑥1,…,𝑥𝑛},输出序列长度也为n,每个元素的维度也是d:{𝑦1,…,𝑦𝑛},从每层的计算复杂度、并行的操作数量、学习距离长度三个方面比较Transformer、CNN、RNN三个特征提取器:
二、分析
1.每层的计算复杂度:
考虑到n个key和n个query两两点乘,因此self-attention每层计算复杂度为𝑂(𝑛2∗𝑑)
考虑到矩阵(维度为𝑛∗𝑛)和输入向量相乘,因此RNN每层计算复杂度为𝑂(𝑛∗𝑑2)
对于k个卷积核经过n次一维卷积,因此CNN每层计算复杂度为𝑂(𝑘∗𝑛∗𝑑2),如果考虑深度可分离卷积,则计算复杂度下降为𝑂(𝑘∗𝑛∗𝑑+𝑛∗𝑑2)
因此:
当𝑛<𝑑时,self attention要比RNN和CNN快;
当𝑛>𝑑时,可以使用受限self attention,即:计算attention时仅考虑每个输出位置附近窗口的r个输入。这将带来两个效果:每层计算复杂度降为𝑂(𝑟∗𝑛∗𝑑)
最长学习距离降低为r,因此需要执行𝑂(𝑛/𝑟)次才能覆盖到所有输入。
2.并行操作数量:
可以通过必须串行的操作数量来描述:
对于self-attention,CNN,其串行操作数量为O(1),并行度最大;
对于RNN,其串行操作数量为O(n),较难并行化。
3.最长计算路径:
覆盖所有输入的操作的数量
对于self-attention,最长计算路径为O(1);对于self-attention stricted,最长计算路径为O(n/r);
对于常规卷积,则需要O(n/k)个卷积才能覆盖所有的输入;对于空洞卷积,则需要𝑂(𝑙𝑜𝑔𝑘𝑛)才能覆盖所有的输入;
对于RNN,最长计算路径为O(n)
4.作为额外收益,self-attention可以产生可解释性的模型:
通过检查模型中的注意力分布,可以展示与句子语法和语义结构相关的信息。