- 作者:韓信子@ShowMeAI
- 教程地址:http://www.showmeai.tech/tutorials/35
- 本文地址:http://www.showmeai.tech/article-detail/227
- 宣告:版權所有,轉載請聯絡平臺與作者並註明出處
收藏ShowMeAI檢視更多精彩內容
本系列為吳恩達老師《深度學習專業課程》學習與總結整理所得,對應的課程視訊可以在這裡檢視。
引言
在ShowMeAI前一篇文章 自然語言處理與詞嵌入 中我們對以下內容進行了介紹:
- 詞嵌入與遷移學習/類比推理
- 詞嵌入學習方法
- 神經概率語言模型
- word2vec(skip-gram與CBOW)
- GloVe
- 情感分析
- 詞嵌入消除偏見
本篇介紹自然語言處理中關於序列模型的高階知識,包括Sequence to sequence序列到序列模型和注意力機制。
1.Seq2Seq 模型
1.1 Seq2Seq結構
Seq2Seq(Sequence-to-Sequence)模型能夠應用於機器翻譯、語音識別等各種序列到序列的轉換問題。一個 Seq2Seq 模型包含編碼器(Encoder)和解碼器(Decoder)兩部分,它們通常是兩個不同的 RNN。
如圖,為Seq2Seq模型典型的機器翻譯應用,這個Seq2Seq網路中,包含編碼網路(encoder network)和解碼網路(decoder network)兩個RNN模型子結構,其中encoder編碼網路將輸入語句編碼為一個特徵向量,傳遞給decoder解碼網路,完成翻譯輸出。
提出 Seq2Seq 模型的相關論文:
Sutskever et al., 2014. Sequence to sequence learning with neural networks
1.2 Seq2Seq類似結構應用
這種編碼器-解碼器的結構也可以用於影像描述(Image captioning)任務。這個任務要根據給定的影像,「翻譯」出對應的內容描述。
要完成上述任務,可以這麼做:
① 第1步:將圖片輸入到CNN(例如預訓練好的AlexNet/VGG/Inception),去掉最後的Bleu層,則倒數第2層這個全連線層的輸出,就相當於圖片的特徵向量(編碼向量),表徵了圖片特徵資訊。
② 第2步:將上述過程得到的影像資訊表徵向量輸入至RNN,即decoder解碼網路中,進行解碼翻譯輸出。
影像描述的相關論文:
Mao et. al., 2014. Deep captioning with multimodal recurrent neural networks
Vinyals et. al., 2014. Show and tell: Neural image caption generator
Karpathy and Fei Fei, 2015. Deep visual-semantic alignments for generating image descriptions
2.貪心搜尋解碼
2.1 機器翻譯解碼過程
上面提到的簡單機器翻譯模型與ShowMeAI前面文章 序列模型與RNN網路 提到的語言模型類似,只是用編碼器的輸出作為解碼器第一個時間步的輸入(而非0向量)。因此機器翻譯的過程其實相當於建立一個條件語言模型。
對應上圖,是一個典型的機器翻譯編碼解碼過程。解碼器進行預測輸出詞的過程,結果可能有好有壞。我們希望找到能使條件概率最大化的翻譯,即
\(arg \ max_{y^{\left \langle 1 \right \rangle}, \dots , y^{\left \langle T_y \right \rangle}}P(y^{\left \langle 1 \right \rangle}, \dots , y^{\left \langle T_y \right \rangle} \mid x)\)
2.2 貪心搜尋
如下為吳恩達老師課程中的一個例子,翻譯成英文有多個翻譯候選:
Jane visite I'Afrique en septembre.
→ Jane is visiting Africa in September.
→ Jane is going to be visiting Africa in September.
→ In September, Jane will visit Africa.
→ Her African friend welcomed Jane in September.
最直接能想到的解決方法是貪婪搜尋(greedy search):貪心搜尋根據條件,解碼器的每個時間步都選擇概率最高的單詞作為翻譯輸出。
例如,首先根據輸入語句,找到第一個翻譯的單詞「Jane」,然後再找第二個單詞「is」,再繼續找第三個單詞「visiting」,以此類推。
2.3 貪心搜尋缺點
但上述貪心搜尋方法存在一些缺點。
① 因為貪心搜尋每次只選擇概率最大的一個詞,沒有考慮該單詞前後關係,概率選擇上有可能會出錯。
- 例如,上面翻譯語句中,第三個單詞「going」比「visiting」更常見,模型很可能會錯誤地選擇了「going」,而錯失最佳翻譯語句。
② 貪心搜尋總體運算成本也比較高,運算效率不高。
優化貪心搜尋最常使用的演算法是集束搜尋(Beam Search)。
3.集束搜尋解碼
3.1 集束搜尋方法
相比於貪心搜尋每次都選擇預測概率最大的詞,集束搜尋(Beam Search)會每次保留預測概率最大的\(B\)個單詞(\(B\)表示取概率最大的詞個數,為可調超引數)。
3.2 集束搜尋示例
下面針對前一節的機器翻譯例子,取\(B=3\)做一個展開講解:
① 根據集束搜尋,首先從詞彙表中找出翻譯的第1個單詞概率最大的B個預測單詞。對應到上例中是:in,jane,september。
概率表示為:\(P(\hat {y}^{\left \langle 1 \right \rangle} \mid x)\)
② 再分別以in,jane,september為條件,計算每個詞彙表單詞作為預測第二個單詞的概率。從中選擇概率最大的3個作為第二個單詞的預測值,得到:in september,jane is,jane visits。
概率表示為:\(P(\hat {y}^{\left \langle 2 \right \rangle} \mid x,\hat {y}^{\left \langle 1 \right \rangle})\)。
到這時,得到的前兩個單詞的3種情況的概率為:
③ 用同樣的方法預測第三個單詞。
分別以in september,jane is,jane visits為條件,計算每個詞彙表單詞作為預測第三個單詞的概率。從中選擇概率最大的3個作為第三個單詞的預測值,得到:in september jane,jane is visiting,jane visits africa。
概率表示為:\(P(\hat {y}^{\left \langle 3 \right \rangle} \mid x,\hat {y}^{\left \langle 1 \right \rangle},\hat {y}^{\left \langle 2 \right \rangle})\)。
到這時,得到的前三個單詞的3種情況的概率為:
④ 按照同樣的方法以此類推,每次都取概率最大的三種預測。最後,選擇概率最大的那一組作為最終的翻譯語句。
Jane is visiting Africa in September.
特別的,如果引數\(B=1\),就等同於貪心搜尋。實際應用中,根據效率要求、計算資源和準確度要求來設定\(B\)的取值。一般\(B\)越大,機器翻譯越準確,但計算複雜度也會越高。
3.3 優化:長度標準化
長度標準化(Length Normalization)是對集束搜尋演算法的優化方式。我們觀察公式
當很多個小於1的概率值相乘後,會造成數值下溢(Numerical Underflow),即得到的結果將會是一個電腦不能精確表示的極小浮點數。一種處理方法是取\(log\)值,並進行標準化:
公式中,\(T_y\)代表翻譯結果的單詞數量,\(\alpha\)是超引數歸一化因子可調整(若\(\alpha=1\),則完全進行長度歸一化;若\(\alpha=0\),則不進行長度歸一化。一般令\(\alpha=0.7\))。標準化用於減少對輸出長的結果的懲罰(因為翻譯結果一般沒有長度限制)。
前面也討論到了:集束寬\(B\)的取值影響結果:
- 較大的\(B\)值意味著可能更好的結果和巨大的計算成本。
- 較小的\(B\)值代表較小的計算成本和可能表現較差的結果。
通常來說,\(B\)可以根據實際需求選取一個10以下的值。
與廣度優先搜尋和深度優先搜尋等精確的查詢演算法相比,集束搜尋演算法執行速度更快,但是不能保證一定找到最準確的翻譯結果。
3.4 誤差分析
集束搜尋是一種啟發式搜尋演算法,有可能找不到最優的翻譯結果。當Seq2Seq模型+集束搜尋構建機器翻譯等應用沒有輸出最佳結果時,我們可以通過誤差分析來判斷問題出現在RNN模型還是集束搜尋演算法中。
例如,對於下述兩個由人工和演算法得到的翻譯結果:
\((y^\ast)\) Human:\ Jane\ visits\ Africa\ in\ September.\
\((\hat{y})\) Algorithm:\ Jane\ visited\ Africa\ last\ September.\
這個例子中,我們發現翻譯結果的前三個單詞差異不大,以其作為解碼器前三個時間步的輸入,得到第四個時間步的條件概率\(P(y^\ast \mid x)\)和\(P(\hat{y} \mid x)\),比較其大小,我們有如下的結論:
- 如果\(P(y^\ast \mid x) > P(\hat {y} \mid x)\),說明是集束搜尋演算法出現錯誤,沒有選擇到概率最大的詞;
- 如果\(P(y^\ast \mid x) \le P(\hat {y} \mid x)\),說明是RNN模型的效果不佳,預測的第四個詞為「in」的概率小於「last」。
我們可以構建表格對錯誤的case進行彙總分析,綜合判斷錯誤出現在RNN模型還是集束搜尋演算法中。
如果錯誤出現在集束搜尋演算法中,可以考慮增大集束寬\(B\);否則,需要進一步分析,看是需要正則化、更多資料或是嘗試一個不同的網路結構。
4.Bleu 得分
4.1 Bleu計算方式
上述我們一直以機器翻譯為例給大家做講解,下面我們介紹一下機器翻譯的評估方法,我們會用Bleu(Bilingual Evaluation Understudy)得分評估機器翻譯的質量,核心思想是「機器翻譯的結果越接近於人工翻譯,則評分越高」。
原始的Bleu計算方法將機器翻譯結果中每個單詞在人工翻譯中出現的次數作為分子,機器翻譯結果總詞數作為分母,計算得到,但這種簡單粗暴的方式容易出現錯誤。例如,機器翻譯結果全部選定高頻出現,又恰好在人工翻譯結果中的詞(比如上圖的the),則按照上述方法得到的Bleu為1,顯然有誤。
改進的計算方法是將每個單詞在人工翻譯結果中出現的次數作為分子,在機器翻譯結果中出現的次數作為分母。
4.2 從unigram到n-gram
上述統計,以單個詞為單位的集合稱為unigram(一元組)。我們可以以兩兩連續的詞為單位統計,叫做bigram(二元組):對每個二元組,可以統計其在機器翻譯結果(\(count\))和人工翻譯結果(\(count_{clip}\))出現的次數,計算Bleu得分。
同樣的方式,還可以統計以\(n\)個單詞為單位的集合,稱為n-gram(多元組),基於n-gram的Blue得分計算公式為:
對$ N \(個\)p_n$進行幾何加權平均得到:
4.3 長度懲罰
Bleu存在的1個問題是:當機器翻譯結果比較短時,比較容易能得到更大的精確度分值(容易理解,因為輸出的大部分詞可能都出現在人工翻譯結果中)。
對長度問題的改進方法之一,是設定一個最佳匹配長度(Best Match Length),若機器翻譯的結果短於該最佳匹配長度,則需要接受簡短懲罰(Brevity Penalty,BP):
優化調整過後的Bleu得分為:
相關論文:Papineni et. al., 2002. A method for automatic evaluation of machine translation
5.注意力模型
5.1 注意力機制
回到機器翻譯問題,有時候翻譯的句子很長,如果對整個語句輸入RNN的編碼網路和解碼網路進行翻譯,效果會不佳。具體表現是Bleu score會隨著單詞數目增加而逐漸降低,如下圖所示。
一種處理長句的方法是將長語句分段,每次只對其一部分進行翻譯。人工翻譯也是採用這樣的方法,高效準確。
這種「區域性聚焦」的思想,對應到深度學習中非常重要的注意力機制(attention mechanism)。對應的模型叫做注意力模型(attention model)。
5.2 注意力模型(Attention Model)
下圖為注意力模型的一個示例。模型的底層是一個雙向迴圈神經網路(BRNN),「雙向」是指的每個時間步的啟用都包含前向傳播和反向傳播產生的啟用結果:
\(a^{\langle t\prime \rangle} = ({\overrightarrow a}^{\langle t\prime \rangle}, {\overleftarrow a}^{\langle t\prime \rangle})\)
模型的頂層是一個「多對多」結構的迴圈神經網路,我們以第\(t\)個時間步為例,它的輸入包含:
① 同級網路前一個時間步的啟用\(s^{\left \langle t-1 \right \rangle}\)、輸出\(y^{\left \langle t-1 \right \rangle}\)
② 底層BRNN網路多個時間步的啟用 \(c\),其中\(c\)計算方式如下(注意分辨\(\alpha\)和\(a\)):\(c^{\left \langle t \right \rangle} = \sum_{\left \langle t \prime \right \rangle}\alpha^{ \left \langle t,t\prime \right \rangle }a^{\left \langle t \prime \right \rangle}\)
我們對上面的公式展開講解:
① 引數\(\alpha^{\left \langle t,t\prime \right \rangle}\)代表著\(y^{\left \langle t \right \rangle}\)對\(a^{\left \langle t \prime \right \rangle}\)的「注意力」,總和為\(1\)(體現分配到不同部分的注意力比重):
- \(\alpha^{\left \langle t,t\prime \right \rangle}\)的計算是使用Bleu得到的,即:\(\alpha^{\left \langle t,t\prime \right \rangle} = \frac{exp(e^{\left \langle t,t\prime \right \rangle})}{\sum^{T_x}_{\left \langle t \prime =1 \right \rangle}exp(e^{\left \langle t,t\prime \right \rangle})}\),所以也一定能保證總和為1。
② 上式中的\(e^{\left \langle t,t\prime \right \rangle}\)是通過神經網路學習得到的。假設輸入為\(s^{\left \langle t-1 \right \rangle}\)和\(a^{\left \langle t,t\prime \right \rangle}\),則可以通過下圖這樣一個簡單的神經網路計算得到:
注意力模型在其他領域,例如影像捕捉方面也有應用。它的一個缺點是時間複雜度較高。
Attention model能有效處理很多機器翻譯問題,例如下面的時間格式歸一化:
July 20th 1969 → 1969-07-20
23 April, 1564 → 1564-04-23
下圖將注意力權重視覺化:
上圖中,顏色越白表示注意力權重越大,顏色越深表示權重越小。可見,輸出語句單詞與其輸入語句單詞對應位置的注意力權重較大,即對角線附近。
相關論文:
Bahdanau et. al., 2014. Neural machine translation by jointly learning to align and translate
Xu et. al., 2015. Show, Attend and Tell: Neural Image Caption Generation with Visual Attention:將注意力模型應用到影像標註中
6.語音識別
語音識別是另外一個非常典型的NLP序列問題,在語音識別任務中,輸入是一段音訊片段,輸出是文字。我們有時會把訊號轉化為頻域訊號,也就是聲譜圖(spectrogram),再借助於RNN模型進行識別。
以前的語音識別系統通過語言學家人工設計的音素(Phonemes)來構建,音素指的是一種語言中能區別兩個詞的最小語音單位。現在的端到端系統中,用深度學習就可以實現輸入音訊,直接輸出文字。
要使用深度學習訓練可靠的語音識別系統,要依賴海量的資料。在語音識別的學術研究中,要用到長度超過3000小時的音訊資料;如果是商用系統,那麼超過一萬小時是最基本的要求。
語音識別系統可以用注意力模型來構建,一個簡單的圖例如下:
假如上例中,語音識別的輸入為10s語音訊號序列,取樣率為100Hz,則語音長度為1000。而翻譯的語句通常很短,例如「the quick brown fox」,包含19個字元。我們會發現\(T_x\)與\(T_y\)差別很大。為了讓\(T_x=T_y\),可以對輸出做一些處理,比如對相應字元重複,比如加入一些空白(blank),如下:
上式中,下劃線 _ 表示空白,\(\sqcup\) 表示兩個單詞之間的空字元。這種寫法的一個基本準則是沒有被空白符 _ 分割的重複字元將被摺疊到一起,即表示一個字元。
通過加入了重複字元和空白符、空字元,可以讓輸出長度也達到1000,即\(T_x=T_y\)。這種模型被稱為CTC(Connectionist temporal classification):
7.觸發詞檢測
觸發詞檢測(Trigger Word Detection)常用於各種智慧裝置,通過約定的觸發詞可以語音喚醒裝置。例如Amazon Echo的觸發詞是「Alexa」,小米音響的觸發詞是「小愛同學」,百度DuerOS的觸發詞是「小度你好」,Apple Siri的觸發詞是「Hey Siri」。
我們可以使用RNN模型來構建觸發詞檢測系統。如下圖的輸入語音中包含一些觸發詞。RNN檢測到觸發字後輸出1,非觸發字輸出0。這樣訓練的RNN模型就能實現觸發字檢測。
上述模型的缺點是,訓練樣本語音大部分片段都是非觸發詞,只有少數的觸發詞部分,即正負樣本分佈不均。
一種解決辦法如下圖所示,對觸發詞附近的資料處理,將附近的RNN輸出都調整為1。這樣簡單粗暴處理後,相當於增加了正樣本。
參考資料
- Sutskever et al., 2014. Sequence to sequence learning with neural networks
- Cho et al., 2014. Learning phrase representaions using RNN encoder-decoder for statistical machine translation
- Mao et. al., 2014. Deep captioning with multimodal recurrent neural networks
- Vinyals et. al., 2014. Show and tell: Neural image caption generator
- Karpathy and Fei Fei, 2015. Deep visual-semantic alignments for generating image descriptions
- Papineni et. al., 2002. A method for automatic evaluation of machine translation
- Bahdanau et. al., 2014. Neural machine translation by jointly learning to align and translate
- Xu et. al., 2015. Show, Attend and Tell: Neural Image Caption Generation with Visual Attention
- Graves et al., 2006. Connectionist Temporal Classification: Labeling unsegmented sequence data with recurrent neural networks
ShowMeAI系列教程推薦
- 圖解Python程式設計:從入門到精通系列教程
- 圖解資料分析:從入門到精通系列教程
- 圖解AI數學基礎:從入門到精通系列教程
- 圖解大資料技術:從入門到精通系列教程
- 圖解機器學習演算法:從入門到精通系列教程
- 機器學習實戰:手把手教你玩轉機器學習系列
- 深度學習教程 | 吳恩達專項課程 · 全套筆記解讀
推薦文章
- 深度學習教程 | 深度學習概論
- 深度學習教程 | 神經網路基礎
- 深度學習教程 | 淺層神經網路
- 深度學習教程 | 深層神經網路
- 深度學習教程 | 深度學習的實用層面
- 深度學習教程 | 神經網路優化演算法
- 深度學習教程 | 網路優化:超引數調優、正則化、批歸一化和程式框架
- 深度學習教程 | AI應用實踐策略(上)
- 深度學習教程 | AI應用實踐策略(下)
- 深度學習教程 | 卷積神經網路解讀
- 深度學習教程 | 經典CNN網路例項詳解
- 深度學習教程 | CNN應用:目標檢測
- 深度學習教程 | CNN應用:人臉識別和神經風格轉換
- 深度學習教程 | 序列模型與RNN網路
- 深度學習教程 | 自然語言處理與詞嵌入
- 深度學習教程 | Seq2seq序列模型和注意力機制