注意力的動畫解析(以機器翻譯爲例)

本文爲 AI 研習社編譯的技術博客,原標題 :

Attn: Illustrated Attention

作者 |* Raimi Karim*

翻譯 | yata 校對 | 鄧普斯•傑弗

審覈 | 醬番梨 整理 | Pita

原文鏈接:

https://towardsdatascience.com/attn-illustrated-attention-5ec4ad276ee3

近十年以來,直到神經機器翻譯系統的誕生之前,統計機器翻譯一直在機器翻譯領域佔據着主要地位。神經機器翻譯模型作爲一種新興的機器翻譯方法,其致力於構建並訓練出一個可以輸入文本並返回翻譯文本的大型神經網絡。

Kalchbrenner and Blunsom (2013), Sutskever et. al (2014) 和Cho. et. al (2014b)等人,作爲先驅首先提出了神經機器翻譯框架,之後由Sutskever 等人提出了更廣爲人知的序列到序列模型。我們這篇文章將基於序列到序列的框架,以及如何在此框架上構建attention機制,來展開講解。

在序列到序列模型中,其主要的思想在於使用兩個循環神經網絡構建一個編碼器-解碼器的結構:首先以其中一個RNN爲構成的編碼器,按時間順序一個一個讀入輸入的文字,之後便可以得到一個固定維度的向量;在這些輸入的基礎上,由另一個RNN構成的解碼器按照時間順序再進行一個一個的解碼,從而得到最後的翻譯。我們的解釋借鑑了[5]。

序列到序列模型的主要問題在於,編碼器的最後一個隱層狀態(見Fig.0.1中的兩個紅色節點),作爲唯一的信息輸入到解碼器中來。而這最後一個隱層狀態向量就好像是全部輸入的一個數值彙總。所以當輸入的文字很長時(Fig.0.2),僅僅利用一個彙總向量(期望他可以充分的總結輸入序列的所有信息),便希望可以輸出一個合理的翻譯文本,便顯得有些不合理,因爲彙總向量的表達能力的受限,這必然會導致對輸入文本災難性的“遺忘”。這就好比給你一個由一百多個單詞組成的段落,然後希望你可以在閱讀完最後一個詞之後,立馬給出這個段落的翻譯,你可以做到嗎?

如果我們都做不到,我們也不應該奢求解碼器能夠做到。那麼我們爲何不考慮讓解碼器使用編碼器部分每一個時刻的隱層狀態,而不是單單只是使用編碼器部分最後一個隱層狀態,這樣子我們應該會得到更好的翻譯文本。這就要引入attention機制了。

注意力作爲編碼器和解碼器之間的接口,負責將編碼器部分每一個時刻的隱狀態提供給解碼器(其中不包括在Fig.0.3中的標紅的隱狀態)。在這樣的設定下,模型纔有能力去聚焦在輸入序列中有用的部分,並且從中學到輸入文本與輸出翻譯文本之間的對齊(alignment)。這對於模型有效的處理長輸入句子十分有效。

定義:對齊

對齊的意思是將原始輸入文本中的片段與他們對應輸出的翻譯文本片段,進行匹配。

在[2]中的介紹我們可以直到,這裏有種形式的attention.一種是,使用編碼器的所有隱層狀態,我們稱其爲全局attention。相對的,只使用編碼器隱層狀態的子集來計算attention,我們將其稱爲局部attention。在這篇文章中,我們討論的是全局attention。其中提到attention時大家就默認爲全局attention.

在這篇文章中,我們使用動畫的形式進行對attention的工作原理進行總結,所以大家再也不用對着論文或者資料裏的各種數學表達式發愁了。同時作爲例證,我將介紹在過去五年裏發表的四種神經機器翻譯的框架。並且我將在文章中爲對其中的一些概念理論進行直觀推斷式的講解,所以大家要注意這些講解哦。

目錄

1.Attention:綜述

2.Attention:例子

3.總結

附錄:attention分數計算方法

1.Attention:綜述

在我們討論attention如何使用之前,首先允許我使用直觀理解的方式,解釋如何將序列到序列模型運用到翻譯任務上。

直觀理解:序列到序列模型

一名翻譯員從頭到尾的讀一段德語文本,一旦他讀完這段文本,便開始將其逐詞的翻譯爲英文。當這段文本很長時,他極有可能在翻譯過程中已經忘記了這段文本之前的段落。

當然,上面我們說的只是一個簡單的序列到序列模型。下面我將帶大家釐清在序列到序列+attention模型中attention層中計算的具體步驟。在這之前,讓我們首先對模型有一個直觀理解。

直觀理解:序列到序列+attention

一名翻譯員從頭到尾去讀一段德語文本,只是在讀的過程中,會記下來文本中涉及到的關鍵詞。這樣在之後翻譯工作時,他可以在翻譯每個德語單詞時借鑑他在之前已經記下的關鍵詞。

attention通過向不同的單詞賦予不同的分數來表徵 不同的關注程度。之後,將這些得到的分數經過softmax層(從而拿到歸一化的權重),這樣我們就可以將編碼器階段所有的隱層狀態經過加權和得到一個上下文向量。attention層具體的實現可以分解爲如下四個步驟。

Step 0:準備隱層狀態

我們要首先準備好decoder的(當前)隱層狀態(紅色)和所有可以拿到的編碼器隱層狀態(綠色)。在我們的例子中,我們有4個編碼器隱層狀態和一個當前解碼器隱層狀態。

Step 1: 獲得對每個編碼器隱層狀態的分數

分數(標量)可以通過分數函數(或者叫做對齊分數函數[2]或者對齊模型)得到。在這個例子中,我們使用解碼器和編碼器隱層狀態之間的點積作爲我們的分數計算函數。

附錄A中給了不同的分數計算函數。

decoder_hidden = [10, 5, 10]

encoder_hidden  score
---------------------
    [0, 1, 1]     15 (= 10×0 + 5×1 + 10×1, the dot product)
    [5, 0, 1]     60
    [1, 1, 0]     15
    [0, 5, 1]     35

在上面這個例子中,我們在編碼器隱層狀態[5, 0, 1]中得到了較高的分數,這意味着下一個要翻譯的單詞將較大的收到這個隱層狀態的影響。

Step 2 : 將所有的分數值通過一個softmax層

我們將這些分數通過一個softmax層,這樣我們可以得到對應的加起來爲1的值。這些經過了softmax層的分數代表了[3,10]的注意力分佈。

encoder_hidden  score  score^
-----------------------------
    [0, 1, 1]     15       0
    [5, 0, 1]     60       1
    [1, 1, 0]     15       0
    [0, 5, 1]     35       0

我們可以看到,在經過了softmax的分數score^,attention按我們的預期只分布在[5, 0, 1]上。實際上,這些數應該是0到1之間的浮點數而不是0和1的二值數。

Step 3: 將每個編碼器隱狀態乘以softmax層之後的分數值

通過將每個編碼器的隱層狀態乘上對應的softmax之後的分數值,我們就可以得到對齊向量[2]或者叫做標註向量[1]。這就是對齊的機制。

encoder_hidden  score  score^  alignment
----------------------------------------
    [0, 1, 1]     15       0  [0, 0, 0]
    [5, 0, 1]     60       1  [5, 0, 1]
    [1, 1, 0]     15       0  [0, 0, 0]
    [0, 5, 1]     35       0  [0, 0, 0]

這裏我們可以看到除了[5, 0, 1]之外的其他隱層狀態都因爲其分數小的原因降至0。這意味着我們可以認爲第一個被翻譯出的單詞應該匹配着輸入單詞中的[5,0,1]編碼向量。

Step 4: 將所有的對齊向量相加

將所有的對齊向量相加即可得到最終的上下文向量[1,2]。一個上下文向量相當於是之前所有步驟中的對齊向量的聚合信息。

encoder_hidden  score  score^  alignment
----------------------------------------
    [0, 1, 1]     15       0  [0, 0, 0]
    [5, 0, 1]     60       1  [5, 0, 1]
    [1, 1, 0]     15       0  [0, 0, 0]
    [0, 5, 1]     35       0  [0, 0, 0]

context = [0+5+0+0, 0+0+0+0, 0+1+0+0] = [5, 0, 1]

Step 5: 將上下文向量輸入解碼器部分

(輸入解碼器的)方式由我們的框架設計所決定。之後我們將在Section 2a,2b,和2c中通過例子介紹這些框架如何在解碼器部分使用上下文向量信息。

下面是整個動態的過程。

直觀理解:attention到底是如何有效的

答案:反向傳播,驚喜嗎?反向傳播會盡其可能的去讓輸出接近真實答案。它需要去不斷的調整RNN網絡中的權值以及對應的函數方程中的權值,如果有需要的話。這些權重會去影響編碼器的隱層狀態和解碼器的隱層狀態,從而間接的去影響attention的分數。

2. Attention:例子

我們在之前的章節中已經瞭解了序列到序列和序列到序列+attention兩種框架。在下一小節中,我們將詳細的去了解3個在序列到序列基礎上運用attention機制的神經機器翻譯模型。爲了讓大家更爲完整的瞭解(他們的具體性能),我將附上他們的雙語評估分數(BLEU)——一種在真實序列基礎上評價合成序列的指標。

2a. Bahdanau 等(2015)[1]

這種attention的計算實現是基礎attention計算的來源之一。作者在論文題目"Neural Machine Translation by Learning to Jointly Align and Translate"中用了"align"(對齊)這和詞,以此來表示在訓練模型時去調整跟分數直接相關的權重。下面是對此框架的一些要點總結:

1.編碼器是由雙向(前向+反向)的門限循環單元(BiGRU)。解碼器是由一個單向的GRU組成,它的初始化狀態是由編碼器的反向GRU的最後一個隱層狀態變換而來。(這一點沒有在下面的圖中體現)

2.attention層分數的計算方式是 加/串聯

3.機器碼器下一個時刻的輸入是由上一步解碼器的輸出(粉色)和當前時刻的上下文向量(深綠)串聯。

作者在WMT14英-法數據集上BLEU值達到了26.75。

直觀理解:由雙向編碼器組成的序列到序列模型+attention機制

譯者A像之前我們說的那樣邊讀邊寫下關鍵詞。譯者B(他屬於高級譯者,有可以從後往前讀文章並可以進行翻譯的能力)從最後一個詞開始從後往前閱讀,並且也做關鍵詞的記錄。這樣兩個人會不斷的討論他們閱讀到的內容,一旦閱讀完整段德語文本,譯者B被要求依據他們之前討論的內容以及他們共同整理的關鍵詞,將德文逐詞的翻譯爲英文。

譯者A是前向RNN,譯者B是反向RNN。

2b. Luong等(2015)[2]

Effective Approaches to Attention-based Neural Machine Translation的作者將Bahdanau等的框架進行了泛化,並且進行了簡化。下面我們看下它的主要結構:

1.編碼器是一個兩層的長短時記憶網絡(LSTM)。解碼器也有着相同的網絡框架,同時它的隱狀態的初始化來自編碼器的最後一個隱層狀態。

2.他們在實驗過的分數方程有(i)加/串聯,(ii)點乘,(iii)基於位置的 和(iv)一般化的。

3.當前時刻解碼器的最終輸出(粉色),由當前時刻解碼器部分的輸出(譯者注:解碼器部分LSTM的輸出或隱層狀態)和當前時刻計算得到的上下文向量進行串聯,之後經過一層全連接網絡得到。

此模型在WMT15 英語-法語數據集上BLEU分數達到了25.9.

直觀理解:帶有兩層(LSTM)堆疊編碼器的序列到序列模型 + attention

譯者A從前至後閱讀德語文本,並寫下遇到的關鍵詞。同樣的,譯者B(比譯者A的級別要高)同樣閱讀這段德語文本,並且記下關鍵詞。注意在這個過程中,譯者A每讀一個詞就向譯者A進行彙報。當文本閱讀結束後。兩位譯者會基於他們之前共同得到的關鍵詞進行逐詞的翻譯。

2c. 谷歌的神經機器翻譯模型(GNMT)[9]

我們中的大多數應該都曾經以各種形式使用過谷歌翻譯,所以我覺得十分有必要來討論2016年實現的谷歌神經機器翻譯系統。GNMT是我們看到的前兩個例子的結合(深受第一個例子[1]的啓發)。

1.編碼器部分由八層LSTM堆疊而成,其中第一層是雙向的(雙向的輸出進行串聯),並且從第三層開始會進行連續的殘差連接。解碼器部分由8層單向的LSTM堆疊而組成。

2.分數計算函數使用的 加/串聯,和文獻[1]一樣。

3.同樣的,和文獻[1]相同,解碼器當前時刻的輸入由上一個時刻解碼器的輸出(粉色)和當前時刻的上下文向量(深綠)串聯而得。

該模型在WMT14英-法數據庫上BLEU分數達到了38.95,在WMT14英-德數據庫上BLEU的值達到了24.17.

直觀理解:GNMT——有八層LSTM堆疊而成編碼器的序列到序列模型(+雙向+殘差連接)+attention

八個譯者依次坐好,順序是從A到B直到H。每個譯者都讀着相同的德語文本。在每個詞上,譯者A向譯者B分享他的發現,譯者B會改善得到的信息並將它分享給譯者C,重複這樣的過程直到告訴譯者H。同樣的,譯者H會在讀這段德文文本時,基於它獲得的信息寫下相關的關鍵詞。

一旦每個人都讀完了這段德文文本,譯者A會被告知去翻譯第一個詞。首先他開始回想,然後他將他的答案分享給B,B改進答案後分享給C,重複這個過程直到傳遞給了H。然後譯者H會基於他得到的答案和之前記錄下的關鍵詞,寫下第一個翻譯出來的單詞。他會重複這個過程直到整個翻譯內容結束。

3. 總結

這裏我們對你在這篇文章裏見過的所有架構做一個快速的總結。

  • 序列到序列模型

  • 序列到序列模型 + attention

  • 有雙向編碼器的序列到序列模型 + attention

  • 有兩層(lstm)堆疊編碼器的序列到序列模型 + attention

  • GNMT-有八層堆疊編碼器的序列到序列模型(+ 雙向 + 殘差)+attention。

以上就是所有的內容。在下一篇博客中,我將爲你講述什麼是self-attention,並且講述它是怎樣應用到谷歌的Transformer和self-Attention對抗神經網絡模型上的。請密切關注我的空間!

附錄:分數函數

下面是Lilian Weng編輯的分數函數中的一部分。加/串聯 和 點乘在這篇文章中已經被提及。其中包含了點乘操作(點乘,餘弦距離等)的分數函數,其主旨是爲了度量兩個向量之間的相似性。對於使用前饋神經網絡的分數函數,其主旨是對翻譯譯文的對齊權重進行建模。

References

[1] Neural Machine Translation by Jointly Learning to Align and Translate (Bahdanau et. al, 2015)

[2] Effective Approaches to Attention-based Neural Machine Translation (Luong et. al, 2015)

[3] Attention Is All You Need (Vaswani et. al, 2017)

[4] Self-Attention GAN (Zhang et. al, 2018)

[5] Sequence to Sequence Learning with Neural Networks (Sutskever et. al, 2014)

[6] TensorFlow’s seq2seq Tutorial with Attention (Tutorial on seq2seq+attention)

[7] Lilian Weng’s Blog on Attention (Great start to attention)

[8] Jay Alammar’s Blog on Seq2Seq with Attention (Great illustrations and worked example on seq2seq+attention)

[9] Google’s Neural Machine Translation System: Bridging the Gap between Human and Machine Translation (Wu et. al, 2016)

Related Articles on Deep Learning

Animated RNN, LSTM and GRU

Line-by-Line Word2Vec Implementation (on word embeddings)

Step-by-Step Tutorial on Linear Regression with Stochastic Gradient Descent

10 Gradient Descent Optimisation Algorithms + Cheat Sheet

Counting No. of Parameters in Deep Learning Models

想要繼續查看本篇文章相關鏈接和參考文獻?

長按鏈接點擊打開或點擊注意力的動畫解析(以機器翻譯爲例)

https://ai.yanxishe.com/page/TextTranslation/1460

AI研習社每日更新精彩內容,觀看更多精彩內容:

CVPR 2018 最牛逼的十篇論文

深度學習目標檢測算法綜述

迷你自動駕駛汽車深度學習特徵映射的可視化

在2018年用“笨辦法”學數據科學體會分享

等你來譯:

如何在神經NLP處理中引用語義結構

(Python)用Mask R-CNN檢測空閒車位

高級DQNs:利用深度強化學習玩吃豆人遊戲

深度強化學習新趨勢:谷歌如何把好奇心引入強化學習智能體

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