1.深度學習的seq2seq模型
從rnn結構說起
根據輸出和輸入序列不同數量rnn可以有多種不同的結構,不同結構自然就有不同的引用場合。如下圖,
one to one 結構,僅僅只是簡單的給一個輸入得到一個輸出,此處並未體現序列的特征,例如圖像分類場景。
one to many 結構,給一個輸入得到一系列輸出,這種結構可用於生產圖片描述的場景。
many to one 結構,給一系列輸入得到一個輸出,這種結構可用於文本情感分析,對一些列的文本輸入進行分類,看是消極還是積極情感。
many to many 結構,給一些列輸入得到一系列輸出,這種結構可用於翻譯或聊天對話場景,對輸入的文本轉換成另外一些列文本。
同步 many to many 結構,它是經典的rnn結構,前一輸入的狀態會帶到下一個狀態中,而且每個輸入都會對應一個輸出,我們最熟悉的就是用於字符預測了,同樣也可以用於視頻分類,對視頻的幀打標簽。
seq2seq
在 many to many 的兩種模型中,上圖可以看到第四和第五種是有差異的,經典的rnn結構的輸入和輸出序列必須要是等長,它的應用場景也比較有限。而第四種它可以是輸入和輸出序列不等長,這種模型便是seq2seq模型,即Sequence to Sequence。它實現了從一個序列到另外一個序列的轉換,比如google曾用seq2seq模型加attention模型來實現了翻譯功能,類似的還可以實現聊天機器人對話模型。經典的rnn模型固定了輸入序列和輸出序列的大小,而seq2seq模型則突破了該限制。
其實對於seq2seq的decoder,它在訓練階段和預測階段對rnn的輸出的處理可能是不一樣的,比如在訓練階段可能對rnn的輸出不處理,直接用target的序列作為下時刻的輸入,如上圖一。而預測階段會將rnn的輸出當成是下一時刻的輸入,因為此時已經沒有target序列可以作為輸入了,如上圖二。
encoder-decoder結構
seq2seq屬於encoder-decoder結構的一種,這里看看常見的encoder-decoder結構,基本思想就是利用兩個RNN,一個RNN作為encoder,另一個RNN作為decoder。encoder負責將輸入序列壓縮成指定長度的向量,這個向量就可以看成是這個序列的語義,這個過程稱為編碼,如下圖,獲取語義向量最簡單的方式就是直接將最后一個輸入的隱狀態作為語義向量C。也可以對最后一個隱含狀態做一個變換得到語義向量,還可以將輸入序列的所有隱含狀態做一個變換得到語義變量。
而decoder則負責根據語義向量生成指定的序列,這個過程也稱為解碼,如下圖,最簡單的方式是將encoder得到的語義變量作為初始狀態輸入到decoder的rnn中,得到輸出序列。可以看到上一時刻的輸出會作為當前時刻的輸入,而且其中語義向量C只作為初始狀態參與運算,后面的運算都與語義向量C無關。
decoder處理方式還有另外一種,就是語義向量C參與了序列所有時刻的運算,如下圖,上一時刻的輸出仍然作為當前時刻的輸入,但語義向量C會參與所有時刻的運算。
encoder-decoder模型對輸入和輸出序列的長度沒有要求,應用場景也更加廣泛。
原文:https://blog.csdn.net/wangyangzhizhou/article/details/77883152
2. 為什么需要Attention
最基本的seq2seq模型包含一個encoder和一個decoder,通常的做法是將一個輸入的句子編碼成一個固定大小的state,然后作為decoder的初始狀態(當然也可以作為每一時刻的輸入),但這樣的一個狀態對於decoder中的所有時刻都是一樣的。
attention即為注意力,人腦在對於的不同部分的注意力是不同的。需要attention的原因是非常直觀的,比如,我們期末考試的時候,我們需要老師划重點,划重點的目的就是為了盡量將我們的attention放在這部分的內容上,以期用最少的付出獲取盡可能高的分數;再比如我們到一個新的班級,吸引我們attention的是不是顏值比較高的人?普通的模型可以看成所有部分的attention都是一樣的,而這里的attention-based model對於不同的部分,重要的程度則不同。
2.1 Attention-based Model是什么
Attention-based Model其實就是一個相似性的度量,當前的輸入與目標狀態越相似,那么在當前的輸入的權重就會越大,說明當前的輸出越依賴於當前的輸入。嚴格來說,Attention並算不上是一種新的model,而僅僅是在以往的模型中加入attention的思想,所以Attention-based Model或者Attention Mechanism是比較合理的叫法,而非Attention Model。
2.3. Attention
對於機器翻譯來說,比如我們翻譯“機器學習”,在翻譯“machine”的時候,我們希望模型更加關注的是“機器”而不是“學習”。那么,就從這個例子開始說吧(以下圖片均來自上述課程鏈接的slides)
剛才說了,attention其實就是一個當前的輸入與輸出的匹配度。在上圖中,即為h1h1和z0z0的匹配度(h1h1為當前時刻RNN的隱層輸出向量,而不是原始輸入的詞向量,z0z0初始化向量,如rnn中的initial memory),其中的match為計算這兩個向量的匹配度的模塊,出來的α10α01即為由match算出來的相似度。好了,基本上這個就是attention-based model 的attention部分了。那么,match什么呢?
對於“match”, 理論上任何可以計算兩個向量的相似度都可以,比如:
余弦相似度
一個簡單的 神經網絡,輸入為hh和ww,輸出為αα
或者矩陣變換α=hTWzα=hTWz (Multiplicative attention,Luong et al., 2015)
現在我們已經由match模塊算出了當前輸入輸出的匹配度,然后我們需要計算當前的輸出(實際為decoder端的隱狀態)和每一個輸入做一次match計算,分別可以得到當前的輸出和所有輸入的匹配度,由於計算出來並沒有歸一化,所以我們使用softmax,使其輸出時所有權重之和為1。那么和每一個輸入的權重都有了(由於下一個輸出為“machine”,我們希望第一個權重和第二個權權重越大越好),那么我們可以計算出其加權向量和,作為下一次的輸入。
如下圖所示:
那么再算出了c0c0之后,我們就把這個向量作為rnn的輸入(如果我們decoder用的是RNN的話),然后d第一個時間點的輸出的編碼z1z1由c0c0和初始狀態z0z0共同決定。我們計算得到z1z1之后,替換之前的z0z0再和每一個輸入的encoder的vector計算匹配度,然后softmax,計算向量加權,作為第二時刻的輸入……如此循環直至結束。
再看看Grammar as a Foreign Language一文當中的公式:
原文:https://blog.csdn.net/wuzqchom/article/details/75792501