使用遞歸神經網絡(RNN)序列建模業務已有很長時間了。可是RNN很慢由於他們一次處理一個令牌沒法並行化處理。此外,循環體系結構增長了完整序列的固定長度編碼向量的限制。爲了克服這些問題,諸如CNN-LSTM,Transformer,QRNNs之類的架構蓬勃發展。微信
在本文中,咱們將討論論文「擬遞歸神經網絡」(https://arxiv.org/abs/1611.01576)中提出的QRNN模型。從本質上講,這是一種將卷積添加到遞歸和將遞歸添加到卷積的方法。網絡
LSTM
LSTM是RNN最著名的變體。紅色塊是線性函數或矩陣乘法,藍色塊是無參數元素級塊。LSTM單元應用門控功能(輸入,遺忘,輸出)以得到輸出和稱爲隱藏狀態的存儲元素。此隱藏狀態包含整個序列的上下文信息。因爲單個向量編碼完整序列,所以LSTM沒法記住長期依賴性。並且,每一個時間步長的計算取決於前一個時間步長的隱藏狀態,即LSTM一次計算一個時間步長。所以,計算不能並行進行。
架構
CNN
CNN能夠捕獲空間特徵(主要用於圖像)。紅色塊是卷積運算,藍色塊是無參數池化運算。CNN使用內核(或過濾器)經過滑動窗口捕獲要素之間的對應關係。這克服了固定長度的隱藏表示形式(以及由此帶來的長期依賴問題)以及RNN缺少並行性限制的問題。可是,CNN不顯示序列的時間性質,即時間不變性。池化層只是在不考慮序列順序信息的狀況降低低了通道的維數。
ide
Quasi-Recurrent Neural Networks (QRNN)
QRNN解決了兩種標準架構的缺點。它容許並行處理並捕獲長期依賴性,例如CNN,還容許輸出依賴序列中令牌的順序,例如RNN。
函數
所以,首先,QRNN體系結構具備2個組件,分別對應於CNN中的卷積(紅色)和池化(藍色)組件。性能
卷積份量測試
卷積組件的操做以下:編碼
形狀的輸入序列:(batch_size,sequence_length,embed_dim)url
每一個「 bank」的形狀爲「 hidden_dim」的內核:(batch_size,kernel_size,embed_dim)。spa
輸出是一個形狀序列:(batch_size,sequence_length,hidden_dim)。這些是序列的隱藏狀態。
卷積運算在序列以及小批量上並行應用。
爲了保留模型的因果關係(即,只有過去的標記才能夠預測將來),使用了一種稱爲遮罩卷積(masked-convolutions)的概念。也就是說,輸入序列的左邊是「 kernel_size-1」零。所以,只有'sequence_length-kernel_size + 1'過去的標記能夠預測給定的標記。爲了更好理解,請參考下圖:
接下來,咱們基於池化功能(將在下一節中討論)使用額外的內核庫,以獲取相似於LSTM的門控向量:
這裏,*是卷積運算;Z是上面討論的輸出(稱爲「輸入門」輸出);F是使用額外的內核庫W_f得到的「忘記門」輸出;O是使用額外的內核庫W_o得到的「輸出門」輸出。
如上所述,這些卷積僅應用於過去的「 sequence_length-kernel_size + 1」令牌。所以,若是咱們使用kernel_size = 2,咱們將獲得相似LSTM的方程式:
池化組件
一般,合併是一種無參數的函數,可捕獲卷積特徵中的重要特徵。對於圖像,一般使用最大池化和平均池化。可是,在序列的狀況下,咱們不能簡單地獲取特徵之間的平均值或最大值,它須要有一些循環。所以,QRNN論文提出了受傳統LSTM單元中元素級門控體系結構啓發的池化功能。本質上,它是一個無參數函數,它將跨時間步混合隱藏狀態。
最簡單的選項是「動態平均池化」,它僅使用了「忘記門」(所以稱爲f-pooling):
⊙是逐元素矩陣乘法。它以忘記門爲參數,幾乎等於輸出的「移動平均值」。
另外一種選擇是使用忘記門以及輸出門(因此被稱做,fo-pooling):
除此之外,池化可能另外具備專用的輸入門(ifo-pooling):
正則化
在檢查了各類遞歸退出方案以後,QRNN使用了一種擴展方案,稱爲「區域退出」(‘zone out),它本質上是在每一個時間步選擇一個隨機子集來退出,對於這些通道,它只是將當前通道值複製到下一次 步驟,無需任何修改。
這等效於將QRNN的「忘記門」通道的子集隨機設置爲1,或在1-F上進行dropout -- QRNN Paper
來自DenseNet的想法
DenseNet體系結構建議在每一層與其前面的每一層之間都具備跳過鏈接,這與在後續層上具備跳過鏈接的慣例相反。所以,對於具備L個層的網絡,將存在L(L-1)個跳過鏈接。這有助於梯度流動和收斂,但要考慮二次空間。
使用QRNN構建seq2seq
在基於RNN的常規seq2seq模型中,咱們只需使用編碼器的最後一個隱藏狀態初始化解碼器,而後針對解碼器序列對其進行進一步修改。咱們沒法對循環池層執行此操做,由於在這裏,編碼器狀態沒法爲解碼器的隱藏狀態作出很大貢獻。所以,做者提出了一種改進的解碼器架構。
將編碼器的最後一個隱藏狀態(最後一個令牌的隱藏狀態)線性投影(線性層),並在應用任何激活以前,將其添加到解碼器層每一個時間步長的卷積輸出中(廣播,由於編碼器矢量較小):
V是應用於最後一個編碼器隱藏狀態的線性權重。
注意力機制
注意力僅應用於解碼器的最後隱藏狀態。
其中s是編碼器的序列長度,t是解碼器的序列長度,L表示最後一層。
首先,將解碼器的未選通的最後一層隱藏狀態的點積與最後一層編碼器隱藏狀態相乘。這將致使形狀矩陣(t,s)。將Softmax替代s,並使用該分數得到形狀(t,hidden_dim)的注意總和k_t。而後,將k_t與c_t一塊兒使用,以獲取解碼器的門控最後一層隱藏狀態。
性能測試
與LSTM架構相比,QRNN能夠達到至關的準確度,在某些狀況下甚至比LSTM架構略勝一籌,而且運算速度提升了17倍。
最近,基於QRNN的模型pQRNN在序列分類上僅用1.3M參數就取得了與BERT至關的結果(與440M參數的BERT相對):
結論
咱們深刻討論了新穎的QRNN架構。咱們看到了它如何在基於卷積的模型中增長遞歸,從而加快了序列建模的速度。QRNN的速度和性能也許真的能夠替代Transformer。
做者:Rohan Jagtap
deephub翻譯組
本文分享自微信公衆號 - DeepHub IMBA(deephub-imba)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。