天天看點

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

2018-03-09

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

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⟨1⟩∣x):

如果第一步得到的三個預選詞分别為“in”、“jane”和“September”,如下圖所示,則第二步中,分别将三個預選詞作為第一個時間步的預測結果y⟨1⟩輸入第二個時間步,得到預測結果ˆy⟨2⟩,也就是條件機率值p(ˆy⟨2⟩∣x,y⟨1⟩):

根據條件機率公式,有:p(y⟨1⟩,ˆy⟨2⟩∣x)=p(y⟨1⟩∣x)p(ˆy⟨2⟩∣x,y⟨1⟩)

分别以三個首詞預選詞作為y⟨1⟩進行計算,将得到30000個p(y⟨1⟩,ˆy⟨2⟩∣x)。之後還是取其中機率值最大的B=3個,作為對應首詞條件下的第二個詞的預選詞。比如第二個詞的預選詞分别是“in”為首詞條件下的“September”,”jane”為首詞條件下的“is”和“visits”,這樣的話首詞的預選詞就隻剩下了“in”和“jane”而排除了“September”。後面的過程以此類推,最後将輸出一個最優的翻譯結果。

總的來說,集束搜尋算法所做的工作就是找出符合以下公式的結果:arg max Ty∏t=1p(y⟨t⟩∣x,y⟨1⟩,…,y⟨t−1⟩)

然而機率值都是小于1的值,多個機率值相乘後的結果的将會是一個極小的浮點值,累積到最後的效果不明顯且在一般的計算機上達不到這樣的計算精度。改進的方法,是取上式的log值并進行标準化:arg max 1TαyTy∑t=1log p(y⟨t⟩∣x,y⟨1⟩,…,y⟨t−1⟩)

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

與CS中的精确查找算法–廣度優先查找(Breadth First Search,BFS)、深度優先查找(Depth First Search,DFS)算法不同,集束搜尋算法運作的速度雖然很快,但是并不保證能夠精确地找到滿足arg max p(y∣x)的結果。

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

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

例如對圖中的法語,發現機器翻譯的結果ˆy與專業的人工翻譯的結果y∗存在較大的差别。要找到錯誤的根源,首先将翻譯沒有差别的一部分“Jane visits Africa”分别作為譯碼器中其三個時間步的輸入,得到第四個時間步的輸出為“in”的機率p(y∗∣x)和“last”的機率p(ˆy∣x),比較它們的大小并分析:

若p(y∗∣x)>p(ˆy∣x),說明是集束搜尋時出現錯誤,沒有選擇到機率最大的詞;

若p(y∗∣x)≤p(ˆy∣x),說明是RNN模型的表現不夠好,預測的第四個詞為“in”的機率小于“last”。

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

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”的出現次數作為分母,可得精度為27。

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

兩個單詞為機關的集合則稱為bi-gram(二進制組),例如對以上機器翻譯結果(count)及參考翻譯(countclip)以二進制組統計有:

bi-gram

count

countclip

the cat

2

1

cat the

cat on

on the

the mat

Count

6

4

根據上表,可得到機器翻譯精度為46。

以此類推,以n個單詞為機關的集合為n-gram(多元組),采用n-gram統計的翻譯精度pn的計算公式為:pn=∑n-gram∈ˆycountclip(n-gram)∑n-gram∈ˆycount(n-gram)

以n-gram統計得到的pn展現了翻譯的流暢度。将uni-gram下的p1到n-gram下的pn組合起來,對這N個值進行幾何權重平均得到:pave=exp(1NN∑i=1logpn)

此外,注意到采用n-gram時,機器翻譯的結果在比參考翻譯短的情況下,很容易得到較大的精度值。改進的方法是設定一個最佳比對長度(Best Match Length),機器翻譯的結果未達到該最佳比對長度時,則需要接受簡短懲罰(Brevity Penalty,BP):BP={1,(MT_length ≥ BM_length)exp(1−MT_lengthBM_length),(MT_length < BM_length)

最後得到BLEU名額為:BLEU=BP×exp(1NN∑i=1logpn)

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

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

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

底層是一個雙向循環神經網絡,需要處理的序列作為它的輸入。該網絡中每一個時間步的激活a⟨t′⟩中,都包含前向傳播産生的和反向傳播産生的激活:a⟨t′⟩=(→a⟨t′⟩,←a⟨t′⟩)

頂層是一個“多對多”結構的循環神經網絡,第t個時間步以該網絡中前一個時間步的激活s⟨t−1⟩、輸出y⟨t−1⟩以及底層的BRNN中多個時間步的激活c作為輸入。對第t個時間步的輸入c有:c=∑t′α⟨t,t′⟩a⟨t′⟩

其中的參數α⟨t,t′⟩意味着頂層RNN中,第t個時間步輸出的y⟨t⟩中,把多少“注意力”放在了底層BRNN的第t′個時間步的激活a⟨t′⟩上。它總有:∑t′α⟨t,t′⟩=1

為確定參數α⟨t,t′⟩滿足上式,常用Softmax單元來計算頂層RNN的第t個時間步對底層BRNN的第t′個時間步的激活的“注意力”:α⟨t,t′⟩=exp(e⟨t,t′⟩)∑Txt′=1exp(e⟨t,t′⟩)

其中的e⟨t,t′⟩由頂層RNN的激活s⟨t−1⟩和底層BRNN的激活a⟨t′⟩一起輸入一個隐藏層中得到的,因為e⟨t,t′⟩也就是α⟨t,t′⟩的值明顯與s⟨t⟩、a⟨t′⟩有關,由于s⟨t⟩此時還是未知量,則取上一層的激活s⟨t−1⟩。在無法獲知s⟨t−1⟩、a⟨t′⟩與e⟨t,t′⟩之間的關系下,那就用一個神經網絡來進行學習,如下圖所示:

要注意的是,該模型的運算成本将達到N2。此外,在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上能夠設定微軟小娜用指令“你好,小娜”進行喚醒,安卓手機上的Google Assistant則可以通過“OK,Google”喚醒。

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

在以訓練的語音資料中輸入RNN中,将觸發詞結束後的一小段序列的标簽設定為“1”,以此訓練模型對觸發詞的檢測。

吳恩達-序列模型-網易雲課堂

Andrew Ng-Sequence Model-Coursera

deeplearning.ai

sequence to sequence model小記-知乎專欄

seq2seq中的beam search算法過程-知乎專欄

機器翻譯自動評估-BLEU算法詳解

深度學習方法:自然語言進行中的Attention Model注意力模型-csdn

白話CTC算法講解-csdn

課程代碼與資料-GitHub

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

上一篇: