吳恩達《序列模型》課程筆記(3)– Sequence models & Attention mechanism

紅色石頭發表於2018-08-02

《Recurrent Neural Networks》是Andrw Ng深度學習專項課程中的第五門課,也是最後一門課。這門課主要介紹迴圈神經網路(RNN)的基本概念、模型和具體應用。該門課共有3周課時,所以我將分成3次筆記來總結,這是第三節筆記。

1. Basic Models

Sequence to sequence(序列)模型在機器翻譯和語音識別方面都有著廣泛的應用。下面,我們來看一個機器翻譯的簡單例子:

針對該機器翻譯問題,可以使用“編碼網路(encoder network)”+“解碼網路(decoder network)”兩個RNN模型組合的形式來解決。encoder network將輸入語句編碼為一個特徵向量,傳遞給decoder network,完成翻譯。具體模型結構如下圖所示:

其中,encoder vector代表了輸入語句的編碼特徵。encoder network和decoder network都是RNN模型,可使用GRU或LSTM單元。這種“編碼網路(encoder network)”+“解碼網路(decoder network)”的模型,在實際的機器翻譯應用中有著不錯的效果。

這種模型也可以應用到影像捕捉領域。影像捕捉,即捕捉影像中主體動作和行為,描述影像內容。例如下面這個例子,根據影像,捕捉影像內容。

首先,可以將圖片輸入到CNN,例如使用預訓練好的AlexNet,刪去最後的softmax層,保留至最後的全連線層。則該全連線層就構成了一個圖片的特徵向量(編碼向量),表徵了圖片特徵資訊。

然後,將encoder vector輸入至RNN,即decoder network中,進行解碼翻譯。

2. Picking the most likely sentence

Sequence to sequence machine translation模型與我們第一節課介紹的language模型有一些相似,但也存在不同之處。二者模型結構如下所示:

Language model是自動生成一條完整語句,語句是隨機的。而machine translation model是根據輸入語句,進行翻譯,生成另外一條完整語句。上圖中,綠色部分表示encoder network,紫色部分表示decoder network。decoder network與language model是相似的,encoder network可以看成是language model的a^{< 0 >},是模型的一個條件。也就是說,在輸入語句的條件下,生成正確的翻譯語句。因此,machine translation可以看成是有條件的語言模型(conditional language model)。這就是二者之間的區別與聯絡。

所以,machine translation的目標就是根據輸入語句,作為條件,找到最佳翻譯語句,使其機率最大:

max\ P(y^{< 1 >},y^{< 2 >},\cdots,y^{< T_y >}|x^{< 1 >},x^{< 2 >},\cdots,x^{< T_x >})

例如,本節筆記開始介紹的例子,列舉幾個模型可能得到的翻譯:

顯然,第一條翻譯“Jane is visiting Africa in September.”最為準確。那我們的最佳化目標就是要讓這條翻譯對應的P(y^{< 1 >},\cdots,y^{< T_y >}|x)最大化。

實現最佳化目標的方法之一是使用貪婪搜尋(greedy search)。Greedy search根據條件,每次只尋找一個最佳單詞作為翻譯輸出,力求把每個單詞都翻譯準確。例如,首先根據輸入語句,找到第一個翻譯的單詞“Jane”,然後再找第二個單詞“is”,再繼續找第三個單詞“visiting”,以此類推。這也是其“貪婪”名稱的由來。

Greedy search存在一些缺點。首先,因為greedy search每次只搜尋一個單詞,沒有考慮該單詞前後關係,機率選擇上有可能會出錯。例如,上面翻譯語句中,第三個單詞“going”比“visiting”更常見,模型很可能會錯誤地選擇了“going”,而錯失最佳翻譯語句。其次,greedy search大大增加了運算成本,降低運算速度。

因此,greedy search並不是最佳的方法。下一小節,我們將介紹Beam Search,使用近似最優的查詢方式,最大化輸出機率,尋找最佳的翻譯語句。

3. Beam Search

Greedy search每次是找出預測機率最大的單詞,而beam search則是每次找出預測機率最大的B個單詞。其中,引數B表示取機率最大的單詞個數,可調。本例中,令B=3。

按照beam search的搜尋原理,首先,先從詞彙表中找出翻譯的第一個單詞機率最大的B個預測單詞。例如上面的例子中,預測得到的第一個單詞為:in,jane,september。

機率表示為:P(\hat y^{< 1 >} | x)

然後,再分別以in,jane,september為條件,計算每個詞彙表單詞作為預測第二個單詞的機率。從中選擇機率最大的3個作為第二個單詞的預測值,得到:in september,jane is,jane visits。

機率表示為:P(\hat y^{< 2 >}|x,\hat y^{< 1 >})

此時,得到的前兩個單詞的3種情況的機率為:

P(\hat y^{< 1 >},\hat y^{< 2 >}|x)=P(\hat y^{< 1 >} | x)\cdot P(\hat y^{< 2 >}|x,\hat y^{< 1 >})

接著,再預測第三個單詞。方法一樣,分別以in september,jane is,jane visits為條件,計算每個詞彙表單詞作為預測第三個單詞的機率。從中選擇機率最大的3個作為第三個單詞的預測值,得到:in september jane,jane is visiting,jane visits africa。

機率表示為:P(\hat y^{< 3 >}|x,\hat y^{< 1 >},\hat y^{< 2 >})

此時,得到的前三個單詞的3種情況的機率為:

P(\hat y^{< 1 >},\hat y^{< 2 >},\hat y^{< 3 >}|x)=P(\hat y^{< 1 >} | x)\cdot P(\hat y^{< 2 >}|x,\hat y^{< 1 >})\cdot P(\hat y^{< 3 >}|x,\hat y^{< 1 >},\hat y^{< 2 >})

以此類推,每次都取機率最大的三種預測。最後,選擇機率最大的那一組作為最終的翻譯語句。

Jane is visiting Africa in September.

值得注意的是,如果引數B=1,則就等同於greedy search。實際應用中,可以根據不同的需要設定B為不同的值。一般B越大,機器翻譯越準確,但同時也會增加計算複雜度。

4. Refinements to Beam Search

Beam search中,最終機器翻譯的機率是乘積的形式:

arg\ max\prod_{t=1}^{T_y} P(\hat y^{< t >}|x,\hat y^{< 1 >},\cdots,\hat y^{< t-1 >})

多個機率相乘可能會使乘積結果很小,遠小於1,造成數值下溢。為了解決這個問題,可以對上述乘積形式進行取對數log運算,即:

arg\ max\sum_{t=1}^{T_y} P(\hat y^{< t >}|x,\hat y^{< 1 >},\cdots,\hat y^{< t-1 >})

因為取對數運算,將乘積轉化為求和形式,避免了數值下溢,使得資料更加穩定有效。

這種機率表示式還存在一個問題,就是機器翻譯的單詞越多,乘積形式或求和形式得到的機率就越小,這樣會造成模型傾向於選擇單詞數更少的翻譯語句,使機器翻譯受單詞數目的影響,這顯然是不太合適的。因此,一種改進方式是進行長度歸一化,消除語句長度影響。

arg\ max\ \frac{1}{T_y}\sum_{t=1}^{T_y} P(\hat y^{< t >}|x,\hat y^{< 1 >},\cdots,\hat y^{< t-1 >})

實際應用中,通常會引入歸一化因子\alpha

arg\ max\ \frac{1}{T_y^{\alpha}}\sum_{t=1}^{T_y} P(\hat y^{< t >}|x,\hat y^{< 1 >},\cdots,\hat y^{< t-1 >})

\alpha=1,則完全進行長度歸一化;若\alpha=0,則不進行長度歸一化。一般令\alpha=0.7,效果不錯。

值得一提的是,與BFS (Breadth First Search) 、DFS (Depth First Search)演算法不同,beam search運算速度更快,但是並不保證一定能找到正確的翻譯語句。

5. Error analysis in beam search

Beam search是一種近似搜尋演算法。實際應用中,如果機器翻譯效果不好,需要透過錯誤分析,判斷是RNN模型問題還是beam search演算法問題。

一般來說,增加訓練樣本、增大beam search引數B都能提高準確率。但是,這種做法並不能得到我們期待的效能,且並不實際。

首先,為待翻譯語句建立人工翻譯,記為y^*。在RNN模型上使用beam search演算法,得到機器翻譯,記為\hat y。顯然,人工翻譯y^*最為準確。

Jane visite l’Afrique en septembre.

Human: Jane visits Africa in September.\ \ \ \ y^*

Algorithm: Jane visited Africa last September.\ \ \ \ \hat y

這樣,整個模型包含兩部分:RNN和beam search演算法。

然後,將輸入語句輸入到RNN模型中,分別計算輸出是y^*的機率P(y^*|x)\hat y的機率P(\hat y|x)

接下來就是比較P(y^*|x)P(\hat y|x)的大小。

  • P(y^*|x)>P(\hat y|x):Beam search演算法有誤
  • P(y^*|x)< P(\hat y|x):RNN模型有誤

如果beam search演算法表現不佳,可以除錯引數B;若RNN模型不好,則可以增加網路層數,使用正則化,增加訓練樣本數目等方法來最佳化。更多錯誤分析方法,可以參照之前的筆記:吳恩達《構建機器學習專案》課程筆記(2)– 機器學習策略(下)

6. Bleu Score(optional)

使用bleu score,對機器翻譯進行打分。

首先,對原語句建立人工翻譯參考,一般有多個人工翻譯(利用驗證集火測試集)。例如下面這個例子:

French: Le chat est sur le tapis.

Reference 1: The cat is on the mat.

Reference 2: There is a cat on the mat.

上述兩個人工翻譯都是正確的,作為參考。相應的機器翻譯如下所示:

French: Le chat est sur le tapis.

Reference 1: The cat is on the mat.

Reference 2: There is a cat on the mat.

MT output: the the the the the the the.

如上所示,機器翻譯為“the the the the the the the.”,效果很差。Bleu Score的宗旨是機器翻譯越接近參考的人工翻譯,其得分越高,方法原理就是看機器翻譯的各個單詞是否出現在參考翻譯中。

最簡單的準確度評價方法是看機器翻譯的每個單詞是否出現在參考翻譯中。顯然,上述機器翻譯的每個單詞都出現在參考翻譯裡,準確率為\frac77=1,其中,分母為機器翻譯單詞數目,分子為相應單詞是否出現在參考翻譯中。但是,這種方法很不科學,並不可取。

另外一種評價方法是看機器翻譯單詞出現在參考翻譯單個語句中的次數,取最大次數。上述例子對應的準確率為\frac27,其中,分母為機器翻譯單詞數目,分子為相應單詞出現在參考翻譯中的次數(分子為2是因為“the”在參考1中出現了兩次)。這種評價方法較為準確。

上述兩種方法都是對單個單詞進行評價。按照beam search的思想,另外一種更科學的打分方法是bleu score on bigrams,即同時對兩個連續單詞進行打分。仍然是上面那個翻譯例子:

French: Le chat est sur le tapis.

Reference 1: The cat is on the mat.

Reference 2: There is a cat on the mat.

MT output: The cat the cat on the mat.

對MIT output進行分解,得到的bigrams及其出現在MIT output中的次數count為:

the cat: 2

cat the: 1

cat on: 1

on the: 1

the mat: 1

然後,統計上述bigrams出現在參考翻譯單個語句中的次數(取最大次數)count_{clip}為:

the cat: 1

cat the: 0

cat on: 1

on the: 1

the mat: 1

相應的bigrams precision為:

\frac{count_{clip}}{count}=\frac{1+0+1+1+1}{2+1+1+1+1}=\frac46=\frac23

如果只看單個單詞,相應的unigrams precision為:

如果是n個連續單詞,相應的n-grams precision為:

總結一下,可以同時計算p_1,\cdots,p_n,再對其求平均:

p=\frac1n\sum_{i=1}^np_i

通常,對上式進行指數處理,並引入引數因子brevity penalty,記為BP。顧名思義,BP是為了“懲罰”機器翻譯語句過短而造成的得分“虛高”的情況。

p=BP\cdot exp(\frac1n\sum_{i=1}^np_i)

其中,BP值由機器翻譯長度和參考翻譯長度共同決定。

7. Attention Model Intuition

如果原語句很長,要對整個語句輸入RNN的編碼網路和解碼網路進行翻譯,則效果不佳。相應的bleu score會隨著單詞數目增加而逐漸降低。

對待長語句,正確的翻譯方法是將長語句分段,每次只對長語句的一部分進行翻譯。人工翻譯也是採用這樣的方法,高效準確。也就是說,每次翻譯只注重一部分割槽域,這種方法使得bleu score不太受語句長度的影響。

根據這種“區域性聚焦”的思想,建立相應的注意力模型(attention model)。

如上圖所示,attention model仍由類似的編碼網路(下)和解碼網路(上)構成。其中,$$S^{

8. Attention Models

Attention model中選擇雙向RNN,可以使用GRU單元或者LSTM。由於是雙向RNN,每個a^{}表示:

a^{}=(a^{\rightarrow },a^{\leftarrow })

RNN編碼生成特徵,注意力權重用\alpha表示,C是各個RNN神經元經過注意力權重得到的引數值。例如,\alpha^{<1,t'>}表示機器翻譯的第一個單詞“jane”對應的第t’個RNN神經元,C^{< 1 >}表示機器翻譯第一個單詞“jane”對應的解碼網路輸入引數。滿足:

\sum_{t’}\alpha^{<1,t'>}=1

C^{< 1 >}=\sum_{t’}\alpha^{<1,t'>}\cdot a^{}

也就是說,\alpha^{}表示輸出\hat y^{< t >}對RNN單元a^{}的注意力權重因子。

為了讓\alpha^{}之和為1,利用softamx思想,引入引數e^{},使得:

\alpha^{}=\frac{e^{}}{\sum_{t’}^{Tx}e^{}}

這樣,只要求出e^{},就能得到\alpha^{}

如何求出e^{}呢?方法是建立一個簡單的神經網路,如下圖所示。輸入是S^{< t-1 >}a^{},輸出是e^{}

然後,利用梯度下降演算法迭代最佳化,計算得到e^{}\alpha^{}

Attention model的一個缺點是其計算量較大,若輸入句子長度為T_x,輸出句子長度為T_y,則計算時間約為T_x*T_y。但是,其效能提升很多,計算量大一些也是可以接受的。

有趣的是,Attention model在影像捕捉方面也有應用。

Attention model能有效處理很多機器翻譯問題,例如下面的時間格式歸一化:

下圖將注意力權重視覺化:

上圖中,顏色越白表示注意力權重越大,顏色越深表示權重越小。可見,輸出語句單詞與其輸入語句單詞對應位置的注意力權重較大,即對角線附近。

9. Speech recognition

深度學習中,語音識別的輸入是聲音,量化成時間序列。更一般地,可以把訊號轉化為頻域訊號,即聲譜圖(spectrogram),再進入RNN模型進行語音識別。

之前,語言學家們會將語音中每個單詞分解成多個音素(phoneme),構建更精準的傳統識別演算法。但在end-to-end深度神經網路模型中,一般不需要這麼做也能得到很好的識別效果。通常訓練樣本很大,需要上千上萬個小時的語音素材。

語音識別的注意力模型(attention model)如下圖所示:

一般來說,語音識別的輸入時間序列都比較長,例如是10s語音訊號,取樣率為100Hz,則語音長度為1000。而翻譯的語句通常很短,例如“the quick brown fox”,包含19個字元。這時候,T_xT_y差別很大。為了讓T_x=T_y,可以把輸出相應字元重複並加入空白(blank),形如:

其中,下劃線”_“表示空白,”\sqcup“表示兩個單詞之間的空字元。這種寫法的一個基本準則是沒有被空白符”_“分割的重複字元將被摺疊到一起,即表示一個字元。

這樣,加入了重複字元和空白符、空字元,可以讓輸出長度也達到1000,即T_x=T_y。這種模型被稱為CTC(Connectionist temporal classification)。

10. Trigger Word Detection

觸發字檢測(Trigger Word Detection)在很多產品中都有應用,操作方法就是說出觸發字透過語音來啟動相應的裝置。例如Amazon Echo的觸發字是”Alexa“,百度DuerOS的觸發字是”小度你好“,Apple Siri的觸發字是”Hey Siri“,Google Home的觸發字是”Okay Google“。

觸發字檢測系統可以使用RNN模型來建立。如下圖所示,輸入語音中包含一些觸發字,其餘都是非觸發字。RNN檢測到觸發字後輸出1,非觸發字輸出0。這樣訓練的RNN模型就能實現觸發字檢測。

但是這種模型有一個缺點,就是通常訓練樣本語音中的觸發字較非觸發字數目少得多,即正負樣本分佈不均。一種解決辦法是在出現一個觸發字時,將其附近的RNN都輸出1。這樣就簡單粗暴地增加了正樣本。

至此,Ng深度學習專項課程全部總結完畢!

更多AI資源請關注公眾號:AI有道(ID:redstonewill)

相關文章