前言
前面看到谷歌發表的運用在機器翻譯上的論文《Attention is all you need》,很是讓人驚訝,這是一種全新的模型,與之前的經典的seq2seq模型改動較大,它完全摒棄了RNN或CNN神經網路,大大簡化了模型的複雜度,而且效果還相當好。當然Attention模型可以單獨使用,但這篇文章我們來看看Attention的機制及怎麼與經典的seq2seq結合。
seq2seq
前面我們有詳細的文章介紹了seq2seq的機制以及如何用TensorFlow來實現seq2seq。可到《深度學習的seq2seq模型》、《TensorFlow實現seq2seq》閱讀。
seq2seq模型結構基本都大同小異,下面用一種常見結構進行說明,我們可以看到decoder將不同時刻的輸入最後用一個狀態C來表示,encoder部分的不同時刻的輸出則為
,且有
,可以看到,不同時刻的輸入被編碼成C,而不同時刻的輸出與上一時刻的輸出、當前時刻的隱含狀態、編碼狀態C都相關,而當前時刻隱含狀態由於上一時刻的隱含狀態、上個時刻輸出、編碼C相關。
seq2seq缺點
seq2seq模型是處理序列問題的大殺器,由它實現的encoder-decoder模型讓其在很多場景都發揮著強大的作用,得到了很不錯的效果。但它也有自己的侷限性,被認為最大限制了seq2seq能力的就在於編碼和解碼之間的唯一聯絡就是一個固定長度的語義向量C。
我們可以看到上面,encoder的不同時刻的輸入都被編碼成狀態C,這個便是語義向量。從這個角度去看,它將整個序列的資訊壓縮到一個固定長度的向量中去了。對於短序列來說,這種做法可能問題不大,但如果是較長較複雜的佇列,則該語義向量可能無法完全表示整個序列的資訊。而且先輸入的序列的資訊會被後輸入的序列資訊稀釋掉。輸入序列越長,這個現象就越嚴重。如果我們得到一個有損的語義編碼,那對後面的解碼也很可能會產生影響。
另外seq2seq模型一般會使用RNN,而RNN因為與上一時刻狀態相關,所以不能並行運算,效率低。但這是所有使用RNN的侷限性,除非不使用它。
Attention模型
為了解決語義損失和資訊稀釋的問題,提出了Attention模型,Attention即注意力,它是模擬了人類的視覺注意機制而來,比如當觀察某個畫面時,注意力聚焦到其中某一部分,其餘部分則變得模糊。
按照圖,我們們往下詳細看Attention模型怎麼與seq2seq結合。對於decoder,輸出為
這裡的C已經與前面說到的seq2seq的語義向量C不同了,已經不再是將所有輸入進行編碼,下面會說到C怎麼計算。再看隱含狀態,
C向量計算公式為,
我們可以將其中的a看成是各個時刻的輸出的不同時刻的輸入對應的權重,其實就可以使用softmax來計算,它的計算公式為,
其中,
通過上面幾個公式就基本描述了seq2seq與Attention的結合,其中每個輸出多了注意力向量參與,注意力的權重由上一時刻隱含狀態與encoder的各個輸入的隱含狀態共同決定。
在seq2seq模型上加上Attention模型,克服了語義損失和資訊稀釋的問題,但是它也引入了額外的成本,對於m個輸入,n個輸出的結構中,Attention引數也達到了m*n的數量級。
以下是廣告和相關閱讀
========廣告時間========
鄙人的新書《Tomcat核心設計剖析》已經在京東銷售了,有需要的朋友可以到 item.jd.com/12185360.ht… 進行預定。感謝各位朋友。
=========================
相關閱讀:
《深度學習的seq2seq模型》
《TensorFlow實現seq2seq》
歡迎關注: