李宏毅機器學習課程筆記-14.2 Seq2Seq:Attention

輸入和輸出都是sequence的任務都是一種Sequence-to-sequence Learning,簡稱Seq2Seq

Attention其實是一種Dynamic Conditional Generation。在前文描述的Conditional Generation中,我們在每個時間點都將Encoder輸出的vector輸入到Decoder中,其實我們可以進一步使得Decoder在每個時間點接收到的vector都是不一樣的,這就是Attention。Attention有兩個好處,第一是應對Encoder輸出的vector無法充分有效地表示整個setence的情況,第二是使Decoder在不同時間點關注setence的不同部分(假如要把“機器學習”翻譯爲“machine learning”,那麼在翻譯“機器”時就不需要關注“學習”這個暫時無關的word)。

Machine Translation

img

如上圖所示,\(h^1,h^2,h^3,h^4\)是作爲Encoder的RNN中隱藏層的輸出,一種方法是\(z\)爲Decoder的輸出,\(z^0\)即時間點爲0時的一個初始值。

  1. 使用match函數計算\(h^i\)\(z^0\)的匹配程度\(\alpha_0^1,\alpha_0^2,\alpha_0^3,\alpha_0^4\),舉例來講\(\alpha_0^1\)中上標\(1\)表示\(h^1\)、下標\(0\)表示時間點爲0。

    match函數是自定義的,它可以只是一個cosine similarity也可以是一個神經網絡等等,如果match函數中包括參數,那這些參數也是可以通過學習得到的。

  2. \(\alpha_0^1,\alpha_0^2,\alpha_0^3,\alpha_0^4\)輸入到softmax得到\(\hat\alpha_0^1,\hat\alpha_0^2,\hat\alpha_0^3,\hat\alpha_0^4\)

    softmax使得這4個值之和爲1,有人說這一步也可以不做

  3. 計算Encoder的輸出\(c^0=\sum\limits_i\hat\alpha_0^ih^i\)

    \(\hat\alpha_0^1=\hat\alpha_0^2=0.5,\ \hat\alpha_0^3=\hat\alpha_0^4=0\),則代表Encoder只考慮了“機器”二字而沒有考慮“學習”二字,由此實現Attention

  4. \(c^0\)輸入到Decoder得到

    得到\(z^1\)後也就得到了“machine”

按照上述步驟,使用\(h^i\)\(z^1\)計算出\(\alpha_1^1,\alpha_1^2,\alpha_1^3,\alpha_1^4\),再用softmax計算出\(\hat\alpha_1^1,\hat\alpha_1^2,\hat\alpha_1^3,\hat\alpha_1^4\),再計算出\(c^1=\sum\limits_i\hat\alpha_1^ih^i\),再將\(c^1\)輸入到Decoder得到\(z^2\),也就得到了“learning”。

重複上述過程直到生成句子的結束(句號)。

Speech Recognition

Attention也可以應用於語音識別。在語音識別中, 輸入是聲音信號(可以用vector sequence表示),輸出是word sequence。

Attention在Speech Recognition中的應用類似於其在Machine Translation中的應用,算法步驟差不多,谷歌有一篇相關論文:《Listen, Attend and Spell》

Image Caption

Attention在Image Caption中的應用類似於其在Machine Translation中的應用,可以將圖片的每個region視爲Machine Translation任務中的一個character,有一篇相關文章是《Show, Attend and Tell: Neural Image Caption Generation with Visual Attention》。

Attention不只可以做單張Image的Caption,還可以做多張圖片/視頻的Caption,相關論文如《Describing Videos by Exploiting Temporal Structure》。

Memory Network

Memory Network是在Memory上做Attention。Memory Network最開始是被用在Reading Comprehension上, 也就是給機器看一個document,然後問機器一個question並讓它給出answer。

  1. 將document表示爲多個vector

    document由很多個sentence組成,可以用一個vector表示一個sentence,因此一個document可以表示爲\(x^1,x^2,\dots,x^N\)

    這一步可以和後面的DNN一起訓練

  2. 將question表示爲一個vector \(q\)

  3. 計算\(q\)和每個\(x^n\)之間match的分數\(\alpha_1,\alpha_2,\dots,\alpha_N\)

  4. 計算\(e=\sum\limits_{n=1}\limits^N\alpha_nx^n\)得到extracted information

    這一步的作用是提取出和question相關的setence,由此實現Attention

  5. 將extracted information輸入到DNN,輸出對應的answer

Memory Network還有一個更加複雜的版本。可以將document表示爲不同的兩組vector,即使用兩個vector \(h^n\)\(x^n\)表示document中的每個sentence,然後計算\(q\)和每個\(x^n\)之間match的分數\(a_n\),此時extracted information爲\(e=\sum\limits_{n=1}\limits^N\alpha_nh^n\)。將extracted information輸入到DNN得到對應的answer,同時還可以將extracted information和問題\(q\)加起來更新\(q\)(這叫做Hopping)。Hopping可以重複很多次,這就像機器在反覆思考。

相關論文:《End-To-End Memory Networks》

Neural Turing Machine

Neural Turing Machine不只是在Memory上做Attention、不只是可以讀取memory,它還可以根據match 函數的結果修改存儲在memory中的內容。

  1. 在Neural Turing Machine中,memory是一個vector sequence

  2. 在初始時,memory表示爲\(m_0^1,m_0^2,\dots,m_0^N\),然後有一組初始的attention weight:\(\hat\alpha_0^1,\hat\alpha_0^2,\dots,\hat\alpha_0^N\),計算\(r^0=\sum\hat\alpha_0^im_0^i\)

  3. \(r^0\)和第一個時間點的輸入\(x^1\)輸入到一個網絡\(f\),得到輸出\(k^1,e^1,a^1\)

    這個網絡\(f\)其實就是一個controller,它可以是一個DNN、LSTM、GRU等等都可以。

    \(k^1\)的作用就是產生attention:\(\alpha^i_1=cos(m_0^i,k^1)\),然後用softmax處理\(\alpha^i_1\)即可得到\(\hat\alpha_1^i\),這裏講的生成attention的方法\(\alpha^i_1=cos(m_0^i,k^1)\)是簡化過的版本,真正的通過\(k^1\)計算得到\(\alpha^i_1\)的方法更爲複雜。

    根據attention weight \(\hat\alpha_1^i\)\(e^1,a^1\)就可以修改memory,\(e^1\)的作用是把memory中的值清空(erase),\(a^1\)的作用是把新的值寫到memory裏。\(m_1^i=m_0^i-\hat\alpha_1^ie^1\odot m_0^i+\hat\alpha_1^ia^1\),通常attention weight \(\hat\alpha\)的分佈會比較sharp,即其中某一維接近1而其它維都接近0,因此可以控制\(e^1,a^1\)清空或寫入memory中的哪個值。

Pointer Network

Pointer Network用來求解凸包(Convex Hull)。

求解凸包問題中,輸入和輸出都是一個point sequence。

假如使用Seq2Seq求解凸包問題,每個point用其x和y座標表示,那輸入就是多個point,輸出則是point的索引,這樣不可行。如果Encoder是RNN則可以處理point數量不確定的輸入,但假如在訓練時輸入中最多隻有50個point,而如果測試時需要輸出100個point,那Decoder就無法輸出51-100,因此這種方法是不可行的。

我們可以使用Attention Model,假設有一個key \(z^0\),使用\(z^0\)爲輸入中的每個point計算attention weight,選擇attention weight最大的那個point,模型輸出即該point的索引,這樣不管輸入了多少個point,都能正確輸出point的索引。使用輸出的point的x和y座標計算得到\(z^1\),然後用\(z^1\)計算輸入中每個point的attention weight,並選擇attention weight最大的那個point,輸出該point的索引。重複以上過程直到輸出END

  • Summarization

    可以將summarization理解爲求解凸包一樣的問題:從一個document中選擇幾個word,詳見《Get To The Point: Summarization with Pointer-Generator Networks》。

  • Machine Translation

    比如在將英語翻譯爲法語時,一些word並不用進行翻譯,通過Pointer Network提取出來直接用就好了。

  • Chat-bot

    比如用戶說“我叫臭鹹魚”,就可以通過Pointer Network將“臭鹹魚”這個word直接提取出來。

Recursive Network

Recursive Network是Recurrent Neural Network的泛化版本,Recurrent Neural Network其實是Recursive Network的subset。

如下圖所示,以Sentiment Analysis爲例,輸入爲一個word sequence,輸出爲sentiment(假設是5級),輸入的word sequence(假設有4個word)經過word embedding可以表示爲vector sequence \(x^1, x^2, x^3, x^4\),輸出是一個5維的vector。

img

如上圖所示,如果用Recurrent Neural Network實現Sentiment Analysis,初始有一個值\(h^0\),我們的RNN是\(f\),將\(h^0,x^1\)輸入到\(f\)得到\(h^1\),再將\(h^1,x^2\)輸入到\(f\)得到\(h^2\),再將\(h^2,x^3\)輸入到\(f\)得到\(h^3\),再將\(h^3,x^4\)輸入到\(f\)中得到\(h^4\),將\(h^4\)輸入到模型\(g\)(可以是幾個層)中得到最終的sentiment。

如上圖所示,如果用Recursive Structure實現Sentiment Analysis,需要先確定word和模型輸出之間的關係,比如\(x^1\)\(x^2\)\(x^3\)\(x^4\)分別是兩組,我們的模型是\(f\),將\(x^1,x^2\)輸入到\(f\)中得到\(h^1\),將\(x^3,x^4\)輸入到\(f\)中得到\(h^2\),將\(h^1,h^2\)輸入到\(f\)中得到\(h^3\),再把\(h^3\)輸入輸入到模型\(g\)(可以是幾個層)中得到最終的sentiment。因爲模型\(f\)的輸入可以是\(x^i\)\(h^i\),所以需要使得\(x^i\)\(h^i\)的維度相同。

與Recursive Network相關的模型有:Recursive Nerual Tensor Network、Matrix-Vector Recursive Network、Tree LSTM。

除了Sentiment Analysis,Recursive Network還可以用來處理其它與sentence相關的任務。


Github(github.com):@chouxianyu

Github Pages(github.io):@臭鹹魚

知乎(zhihu.com):@臭鹹魚

博客園(cnblogs.com):@臭鹹魚

B站(bilibili.com):@絕版臭鹹魚

微信公衆號:@臭鹹魚

轉載請註明出處,歡迎討論和交流!


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章