使用transformer而导致的时间长,可能会由于self-attention计算Query和key的值才导致的时间长,也可能会因为feed forward中的计算导致时间长。这里我们只针对第一种情况下进行优化。
第一种情况:有些问题,我们可能不需要看整个句子,只看位置上左右的邻居,就可以得到正确的答案。所以我们可以把其他值直接设置为0。
上一种,每次只看相邻的马,可能不足得到答案。我们也可以跳两格,去看更远地方的信息。右图为,每次跳一格。
另外一种global attention,我们在句子中选择几个作为special token 或者在句子中添加几个special token。 special token可以观察到全局的信息。其他的token只计算与special token的值就可以了。我们可以通过special token来传递token之间的信息。
这一种方法就是将Query和Key进行分类,将相关性比较大的分到一类中。我们可以采取快速但是相对没有那么准确的方法,来进行分类。
然后计算相应分类中的值,其他的直接设为0。
还有一种就是,input seq上的每一个位置在经过网络学习后,会产生一段向量。将向量拼接起来后,就是Query,Key矩阵。其中生成的向量中的每个值,可能是float,我们通过一些变换,将其转变为0或者1。
我们还可以挑选一些具有特点的key和value作为代表,来与query进行计算。其中query的数量,不宜进行减少,因为query减少了,那么对应的输出就会减少。假设后面是一个分类问题,就会造成错误。
第一种选择的方法,就是将输入的向量放入cnn中,将cnn的结果看作是有代表性的key。第二种,就是乘以一个N*K的矩阵,将结果作为有代表性的key。