Transformer中self-attention、RNN、CNN的性能对比

论文原文Attention is all you need:
https://arxiv.org/pdf/1706.03762.pdf

  • 输入序列 ( x 1 , x 2 , . . . , x n ) (x_1,x_2,...,x_n) (x1,x2,...,xn)
  • 输出序列 ( z 1 , z 2 , . . . , z n ) (z_1,z_2,...,z_n) (z1,z2,...,zn)
  • x i , z i ∈ R d x_i,z_i \in R^d xi,ziRd
  • n:序列长度
  • d:表征维度
  • k:卷积大小
  • r:restricted self-attention的邻居范围

原论文why self attention部分从三个角度进行了分析:
每层的计算复杂度,串行操作的最少步数,连接两个元素之间最远路径

Transformer中self-attention、RNN、CNN的性能对比_第1张图片

1 层计算复杂度

大多数任务中, n n n往往小于 d d d,所以在大多数情况下,self-attention的计算复杂度更低,对于句长较大的任务,可以使用restricted self-attention(r-centered)来降低计算复杂度

卷积层的复杂度一般高于RNN,大概是乘以 k k k

2 串行操作最小步数

RNN是在一个序列上的处理是不可以并行的

3 连接两个元素之间的最远路径(长距离依赖的路径长度)

O ( 1 ) O(1) O(1)(self-attention)更好地学习到长距离依赖;

值得注意的是,针对连续卷积,需要 O ( n / k ) O(n/k) O(n/k)层卷积,对于空洞卷积需要 O ( l o g k ( n ) ) O(log_k(n)) O(logk(n))

同理restricted self-attention需要 O ( n / r ) O(n/r) O(n/r)层,降低了计算复杂度的同时,牺牲了长距离依赖的学习

总而言之,对于一般的翻译任务,self-attention的层计算复杂度低,单层内每个操作可并行,并且具有良好的长距离依赖学习能力

你可能感兴趣的:(NLP,算法工程师面试,自然语言处理)