Efficient Transformers:A Survey筆記
本篇論文主要介紹Transformer的各種變體,以及他的優缺點
What is Transformer?
- Transformer採用了Self-attention技術,並屏棄了以往對於序列資料所採用的RNN
- 序列資料得以考慮全局性,不再像RNN那樣是序列依賴性
- Transformer可以看作是CNN,只是每一個vector考慮的依賴性是整張圖片(把一個sequence鋪成平面,每一個vector視為一個pixel,vector維數=channel)
Transformer的問題
- 目前的計算複雜度過高,是$O(n^2)$,使得transformer難以在輕模型下使用
- 目前為了解決transformer過度肥大的問題,出現了許多的變種
Dense Transformer
- transformer的起源
- 待補
Sparse Attaention
- 這裡開始是為了降低複雜度而延伸的變種
- 限制self-attention的參考範圍,使全面參考變成部分參考
Fixed patterns(FP)
- 參考範圍作為hyper-parameter存在,是訓練前先決定好的固定值
- 常見方法有
- Blockwise pattern : 把輸入序列切成block(batch),複雜度降為$O(B^2)$,變成$(\frac{N}{B}*B^2)$
- 導致序列不連貫,效果”可能”有限
- Strided pattern : 變得真的非常像CNN,採用滑動kernel的的方式,每個vector只attention自己的那塊kernel
- 建立在假設NLP在多數情況下都是具備局部相關的前提下,免去過度參考太遠的vector所浪費的計算
- Compressed pattern : 超級無敵像CNN(欸),用把vector壓成平面的角度會更好思考,其實就是pooling,把幾個token池化,變成一個vector後才做attention,個人認為複雜度會降為$O(\frac{N^2}{kernel_size})$
- Blockwise pattern : 把輸入序列切成block(batch),複雜度降為$O(B^2)$,變成$(\frac{N}{B}*B^2)$
Learnable patterns(LP)
- 相對於FP,LP是把參考範圍也作為weight給機器去學習
- 比如routing transformer是對token向量進行k-means來將整體序列切成多個子序列
Memory
這裡看不太懂,先貼原文
memory乍一听好像有点让人摸不着头脑,其实想法也很简单。最开始是在19年的set transformer上使用。一般来说做multihead self-attention时,Q=K=V=X(X为输入序列,长度为n),而在set transformer中,作者先单独设置了m个向量(m是超参数),然后这m个向量与X做multihead attention,得到m个临时向量(这些个临时变量我们就称作“temporary memory”),接着把X与这m个临时向量再做一次multihead attention得到输出。这个过程其实就是利用这m个向量将输入序列X的信息先通过attention进行压缩,再通过attention还原,达到抽取输入序列的特征的目的。但是在压缩编码解码的过程中肯定会有信息损失,所以后来的改进方法是引入全局记忆,即设置一些token,它们可以与所有的token进行注意力交互,比如bert的[CLS],由于这些token的数目远小于序列长度,因此也不会给计算带来负担,而且往往携带了整个输入序列的信息,这就是我们可以在bert上用[CLS]作文本分类任务的原因。
Low rank methods
- Attention matrix在經過softmax轉化以後會是不滿秩的(存在linear dependent,rank != N),所以我們可以把矩陣降維
- k,v向量可以因此映射到kxd維,因為k為hyper-parameter,複雜度可降至 $O(nk)$
- 範例:linformer
- 相關論文