深度學習(11):序列模型?

binweber.top
圖標

採用循環神經網路能夠建立各種各樣的序列模型(Sequence Model)。加入一些注意力機制,能夠使這些序列模型更加強大。

Seq2Seq模型

2014年Cho等人在論文[Learning Phrase Representations using RNN Encoder-Decoder for Statistical Machine Translation]中首次提出了Seq2Seq(Sequence-to-Sequence)模型。從機器翻譯到語音識別,這種模型能夠在各種序列到序列的轉換問題中得到應用。

一個Seq2Seq模型中可分成編碼器(Encoder)解碼器(Decoder)兩部分,它們通常是兩個不同的神經網路。如下圖是谷歌機器翻譯團隊的Sutskever等人2014年在論文[Sequence to Sequence Learning with Neural Networks]中提出的機器翻譯模型:

上面法語中的詞依次輸入作為編碼器的RNN的時間步中,這個RNN可以是GRU或LSTM。將編碼器的最後輸出作為解碼器的輸入,解碼器也是一個RNN,訓練解碼器作出正確的翻譯結果。

這種Enconder-Decoder的結構,也可以應用在圖像標註(Image Caption)上。2014年百度研究所的毛俊驊等人在論文[DDeep Captioning with Multimodal Recurrent Neural Networks (m-RNN)]中提出了如下圖中的結構:

上面將圖像輸入了一個作為編碼器的AlexNet結構的CNN中,最後的Softmax換成一個RNN作為解碼器,訓練網路輸出圖像的標註結果。

另外兩篇論文[Show and Tell: A Neural Image Caption Generator]和 [Deep Visual-Semantic Alignments for Generating Image Descriptions]中, 也提到了這種結構。

機器翻譯用到的Seq2Seq模型中,解碼器所做的工作與前面講過的語言模型的採樣過程類似,只不過在機器翻譯中,用編碼器的輸出代替語言模型中的 0 作為解碼器中第一個時間步的輸入,如下圖所示:

換句話說,機器翻譯其實是一個輸入為法語的條件下,希望以對應的英語作為輸出的語言模型,所以機器翻譯的過程也就相當於建立一個條件語言模型(Conditional Language Model)的過程。

採用大量的數據訓練好一個機器翻譯系統後,對於一個相同的句子,由於解碼器進行的是隨機採樣過程,輸出的可能會是多種或好或壞的結果:

所以對訓練好的機器翻譯系統,還需要加入一些演算法,使其總是輸出最好的翻譯結果。

考慮直接使用CS中的貪心搜索(Greedy Search)演算法,讓解碼器中每個時間步都取概率最大的那個詞,得到的翻譯結果還是會不盡人意。

集束搜索

步驟

Seq2Seq模型中,解碼器的輸出結果總是在RNN中採樣後得到,造成模型訓練完畢後,得到測試的結果參差不齊,集束搜索(Beam Search)演算法能很好地解決這個問題。這裡還是以機器翻譯的例子來說明這種演算法。

將集束搜索演算法運用到機器翻譯系統的第一步,是設定一個束長(Bean Width) B ,它代表了解碼器中每個時間步的預選單詞數量。如下圖中 B = 3 ,則將第一個時間步中預測出的概率最大的$3$個詞作為首詞的預選詞,同時保存它們的概率值大小 p(y^{langle 1 
angle} mid x) :

如果第一步得到的三個預選詞分別為「in」、「jane」和「September」,如下圖所示,則第二步中,分別將三個預選詞作為第一個時間步的預測結果 y^{langle 1 
angle} 輸入第二個時間步,得到預測結果 {hat y}^{langle 2 
angle} ,也就是條件概率值 p({hat y}^{langle 2 
angle} mid x, y^{langle 1 
angle}) :

根據條件概率公式,有: \p(y^{langle 1 
angle}, {hat y}^{langle 2 
angle} mid x) = p(y^{langle 1 
angle} mid x) p({hat y}^{langle 2 
angle} mid x, y^{langle 1 
angle})

分別以三個首詞預選詞作為 y^{langle 1 
angle} 進行計算,將得到 30000p(y^{langle 1 
angle},{hat y}^{langle 2 
angle} mid x) 。之後還是取其中概率值最大的 B = 3 個,作為對應首詞條件下的第二個詞的預選詞。比如第二個詞的預選詞分別是「in」為首詞條件下的「September」,」jane"為首詞條件下的「is」和「visits」,這樣的話首詞的預選詞就只剩下了「in」和「jane」而排除了「September」。後面的過程以此類推,最後將輸出一個最優的翻譯結果。

優化

總的來說,集束搜索演算法所做的工作就是找出符合以下公式的結果: \ arg max prod^{T_y}_{t = 1} p(y^{langle t 
angle} mid x, y^{langle 1 
angle},...,y^{langle t-1 
angle})

然而概率值都是小於 1 的值,多個概率值相乘後的結果的將會是一個極小的浮點值,累積到最後的效果不明顯且在一般的計算機上達不到這樣的計算精度。改進的方法,是取上式的 log 值並進行標準化: \ arg max frac{1}{T^{alpha}_y} sum^{T_y}_{t = 1} log  p(y^{langle t 
angle} mid x, y^{langle 1 
angle},...,y^{langle t-1 
angle})

其中的 alpha 是一個需要根據實際情況進行調節的超參數。

與CS中的精確查找演算法--廣度優先查找(Breadth First Search,BFS)深度優先查找(Depth First Search,DFS)演算法不同,集束搜索演算法運行的速度雖然很快,但是並不保證能夠精確地找到滿足 arg max p(y mid x) 的結果。

關於束長 B 的取值,較大的 B 值意味著同時考慮了更多的可能,最後的結果也可能會更好,但會帶來巨大的計算成本;較小的 B 值減輕了計算成本的同時,也可能會使最後的結果變得糟糕。通常情況下, B 值取一個 10 以下的值較為合適。還是要根據實際的應用場景,適當地選取。要注意的是,當 B = 1 時,這種演算法就和貪心搜索演算法沒什麼兩樣了。

錯誤分析

在前面的結構化機器學習項目課程中,已經了解過錯誤分析。集束搜索是一種啟發式(Heuristic)搜索演算法,它的輸出結果不是總為最優的。結合Seq2Seq模型與集束搜索演算法構建的機器翻譯等系統出錯時,差錯到底是出現在前者的RNN還是後者的演算法中,還是需要通過一些手段,來進行錯誤分析。

例如對圖中的法語,發現機器翻譯的結果 hat y 與專業的人工翻譯的結果 y^{*} 存在較大的差別。要找到錯誤的根源,首先將翻譯沒有差別的一部分「Jane visits Africa」分別作為解碼器中其三個時間步的輸入,得到第四個時間步的輸出為「in」的概率 p(y^{*} mid x) 和「last」的概率 p(hat{y} mid x) ,比較它們的大小並分析:

  • p(y^{*} mid x) gt p(hat{y} mid x) ,說明是集束搜索時出現錯誤,沒有選擇到概率最大的詞;
  • p(y^{*} mid x) le p(hat{y} mid x) ,說明是RNN模型的表現不夠好,預測的第四個詞為「in」的概率小於「last」。

分析過程中,可以建立一個如上所示的表格,提高錯誤查找效率。

機器翻譯評估:BLEU指標

BLEU(Bilingual Evaluation Understudy)是一種用來評估機器翻譯質量的指標,它早在2002年由Papineni等人在論文[BLEU: a Method for Automatic Evaluation of Machine Translation]中提出。BLEU的設計思想與評判機器翻譯好壞的思想是一致的:機器翻譯的結果越接近專業的人工翻譯,則評估的分值越高。

最原始的BLEU演算法很簡單:統計機器翻譯結果中的每個單詞在參考翻譯中出現的次數作為分子,機器翻譯結果的總詞數作為分母。然而這樣得到結果很容易出現錯誤。

如上圖的例子中,機器翻譯得到的結果是 7 個「the」,分母為 7 ,每個「the」都在參考翻譯中有出現,分子為 7 ,得到翻譯精確度為 1.0 ,這顯然是不對的。改進這種演算法,將參考翻譯中「the」出現的最高次數作為分子,機器翻譯結果中「the」的出現次數作為分母,可得精度為 frac{2}{7}

上面的方法是一個詞一個詞進行統計,這種以一個單詞為單位的集合統稱為uni-gram(一元組)。以uni-gram統計得到的精度 p_1 體現了翻譯的充分性,也就是逐字逐句地翻譯能力。

兩個單詞為單位的集合則稱為bi-gram(二元組),例如對以上機器翻譯結果( count )及參考翻譯( count_{clip} )以二元組統計有:

根據上表,可得到機器翻譯精度為 frac{4}{6}

以此類推,以 n 個單詞為單位的集合為n-gram(多元組),採用n-gram統計的翻譯精度 p_n 的計算公式為: \p_n = frac{sum_{	ext{n-gram} in hat{y}} count_{clip}(	ext{n-gram})}{sum_{	ext{n-gram} in hat{y}} count(	ext{n-gram})}

以n-gram統計得到的 p_n 體現了翻譯的流暢度。將uni-gram下的 p_1 到n-gram下的 p_n 組合起來,對這 N 個值進行幾何加權平均得到: \p_{average}=exp(frac{1}{N}sum_{i=1}^{N}log^{p_{n}})

此外,注意到採用n-gram時,機器翻譯的結果在比參考翻譯短的情況下,很容易得到較大的精度值。改進的方法是設置一個最佳匹配長度(Best Match Length),機器翻譯的結果未達到該最佳匹配長度時,則需要接受簡短懲罰(Brevity Penalty,BP)\BP = egin{cases} 1, & 	ext{(MT_length $ge$ BM_length)} \ exp(1 - frac{	ext{MT_length}}{	ext{BM_length}}), & 	ext{(MT_length $lt$ BM_length)} end{cases}

最後得到BLEU指標為: \ BLEU = BP 	imes exp(frac{1}{N}sum_{i=1}^{N}log^{p_{n}})

注意力模型

人工翻譯一大段文字時,一般都是閱讀其中的一小部分後翻譯出這一部分,在一小段時間裡注意力只能集中在一小段文字上,而很難做到把整段讀完後一口氣翻譯出來。用Seq2Seq模型構建的機器翻譯系統中,輸出結果的BLEU評分會隨著輸入序列長度的增加而下降,其中的道理就和這個差不多。

2014年Bahdanau等人在論文[Neural Machine Translation by Jointly Learning to Align and Translate]中提出了注意力模型(Attention Model)。最初只是用這種模型對機器翻譯作出改進,之後其思想也在其他領域也得到了廣泛應用,並成為深度學習領域最有影響力的思想之一。

注意力模型中,網路的示例結構如下所示:

底層是一個雙向循環神經網路,需要處理的序列作為它的輸入。該網路中每一個時間步的激活 a^{langle t 
angle} 中,都包含前向傳播產生的和反向傳播產生的激活: \a^{langle t 
angle} = ({overrightarrow a}^{langle t 
angle}, {overleftarrow a}^{langle t 
angle})

頂層是一個「多對多」結構的循環神經網路,第 t 個時間步以該網路中前一個時間步的激活 s^{langle t-1 
angle} 、輸出 y^{langle t-1 
angle} 以及底層的BRNN中多個時間步的輸出組合成的激活 c 作為輸入。對第 t 個時間步的輸入 c 有: \c = sum_{t} {alpha}^{langle t,t 
angle}a^{langle t 
angle}

其中的參數 {alpha}^{langle t,t 
angle} 意味著頂層RNN中,第 t 個時間步輸出的 y^{langle t 
angle} 中,把多少「注意力」放在了底層BRNN的第 t 個時間步的激活 a^{langle t 
angle} 上。它總有:$ \sum_{t} {alpha}^{langle t,t 
angle} = 1

為確保參數 {alpha}^{langle t,t 
angle} 滿足上式,常用Softmax單元來計算頂層RNN的第 t 個時間步對底層BRNN的第 t 個時間步的激活的「注意力」: \{alpha}^{langle t,t 
angle} = frac{exp(e^{langle t,t 
angle})}{sum_{t=1}^{T_x} exp(e^{langle t,t 
angle})}

其中的 e^{langle t,t 
angle} 由頂層RNN的激活 s^{langle t - 1 
angle} 和底層BRNN的激活 a^{langle t 
angle} 一起輸入一個隱藏層中得到的,因為 e^{langle t,t 
angle} 也就是 {alpha}^{langle t,t 
angle} 的值明顯與 s^{langle t 
angle}、a^{langle t 
angle} 有關,由於 s^{langle t 
angle} 此時還是未知量,則取上一層的激活 s^{langle t - 1 
angle} 。在無法獲知 s^{langle t-1 
angle}a^{langle t 
angle}e^{langle t,t 
angle} 之間的關係下,那就用一個神經網路來進行學習,如下圖所示:

要注意的是,該模型的運算成本將達到 N^2 。此外,在2015年Xu等人發表的論文[Show, Attend and Tell: Neural Image Caption Generation with Visual Attention]中,這種模型也被應用到了圖像標註中。

應用

語音識別

在語音識別中,要做的是將輸入的一段語音 x 轉換為一段文字副本作為輸出。

曾經的語音識別系統都是採用人工設計出的音素(Phonemes)識別單元來構建,音素指的是一種語言中能區別兩個詞的最小語音單位。現在有了端對端深度學習,已經完美沒有必要採用這種識別音素的方法實現語音識別。

採用深度學習方法訓練語音識別系統的前提條件是擁有足夠龐大的訓練數據集。在學術界的研究中,3000小時的長度被認為是訓練一個語音識別系統時,需要的較為合理的音頻數據大小。而訓練商用級別的語音識別系統,需要超過一萬小時甚至十萬小時以上的音頻數據。

語音識別系統可以採用注意力模型來構建:

2006年Graves等人在論文[Connectionist Temporal Classification: Labeling unsegmented sequence data with recurrent neural networks]中提出了一種名為CTC(Connectionist Temporal Classification)損失函數計算方法,給語音識別系統的訓練過程帶來很大幫助。

由於輸入的是音頻數據,採用RNN建立的語音識別系統中將包含多個時間步,且整個網路中輸出的數量往往是小於輸入的數量的,也就是說不是每一個時間步都有對於的輸出。而CTC的主要優點,是可對沒有對齊的數據進行自動對齊。

如上圖中,以一句意為圖中下面的句子,長度為10s頻率為100Hz的語音作為輸入,則這段語音序列可分為1000個部分,分別輸入RNN的時間步中,而RNN可能不會將1000個作為輸出。

CTC損失計算方法允許RNN輸出一個如圖中所示的結果,允許以「空白(Blank)」作為輸出的同時,也會識別出詞之間存在的「空格(Space)」標記,CTC還將把未被「空白」分隔的重複字元摺疊起來。

關於CTC的更多細節詳見論文內容。

觸發詞檢測

觸發詞檢測(Trigger Word Detection)現在已經被應用在各種語音助手以及智能音箱上。例如在Windows 10上能夠設置微軟小娜用指令「你好,小娜」進行喚醒,Android上的Google Assistant則可以通過指令「OK,Google」喚醒。

想要訓練一個觸發詞檢測系統,同樣需要有大量的標記好的訓練數據。使用RNN訓練語音識別系統實現觸發詞詞檢測的功能時,可以進行如下圖所示的工作:

在以訓練的語音數據中輸入RNN中,將觸發詞結束後的一小段序列的標籤設置為「 1 」,以此訓練模型對觸發詞的檢測。


參考資料

  1. 吳恩達-序列模型-網易雲課堂
  2. Andrew Ng-Sequence Model-Coursera
  3. deeplearning.ai
  4. sequence to sequence model小記-知乎專欄
  5. seq2seq中的beam search演算法過程-知乎專欄
  6. 機器翻譯自動評估-BLEU演算法詳解
  7. 深度學習方法:自然語言處理中的Attention Model注意力模型-csdn
  8. 白話CTC演算法講解-csdn
  9. 課程代碼與資料-GitHub

註:本文涉及的圖片及資料均整理翻譯自Andrew Ng的Deep Learning系列課程,版權歸其所有。翻譯整理水平有限,如有不妥的地方歡迎指出。

推薦閱讀:

相关文章