最近在看End-to-end Relation Extraction using LSTMs on Sequences and Tree Structures這篇文章時,看到此文在Entity detection中用到了greedy search與beam search。內容轉自:https://github.com/fengdu78/deeplearning_ai_books (黃海廣爲Andrew Ng的深度學習課程所編寫的筆記)git
在這一週,你將會學習seq2seq(sequence to sequence)模型,從機器翻譯到語音識別,它們都能起到很大的做用,從最基本的模型開始。以後你還會學習集束搜索(Beam search)和注意力模型(Attention Model),一直到最後的音頻模型,好比語音。github
如今就開始吧,好比你想經過輸入一個法語句子,好比這句 「Jane visite I'Afrique en septembre.」,將它翻譯成一個英語句子,「Jane is visiting Africa in September.」。和以前同樣,咱們用\(x^{<1>}\) 一直到\(x^{< 5>}\)來表示輸入的句子的單詞,而後咱們用\(y^{<1>}\)到\(y^{<6>}\)來表示輸出的句子的單詞,那麼,如何訓練出一個新的網絡來輸入序列\(x\)和輸出序列\(y\)呢?算法
這裏有一些方法,這些方法主要都來自於兩篇論文,做者是Sutskever,Oriol Vinyals 和 Quoc Le,另外一篇的做者是Kyunghyun Cho,Bart van Merrienboer,Caglar Gulcehre,Dzmitry Bahdanau,Fethi Bougares,Holger Schwen 和 Yoshua Bengio。編程
首先,咱們先創建一個網絡,這個網絡叫作編碼網絡(encoder network)(上圖編號1所示),它是一個RNN的結構, RNN的單元能夠是GRU 也能夠是LSTM。每次只向該網絡中輸入一個法語單詞,將輸入序列接收完畢後,這個RNN網絡會輸出一個向量來表明這個輸入序列。以後你能夠創建一個解碼網絡,我把它畫出來(上圖編號2所示),它以編碼網絡的輸出做爲輸入,編碼網絡是左邊的黑色部分(上圖編號1所示),以後它能夠被訓練爲每次輸出一個翻譯後的單詞,一直到它輸出序列的結尾或者句子結尾標記,這個解碼網絡的工做就結束了。和往常同樣咱們把每次生成的標記都傳遞到下一個單元中來進行預測,就像以前用語言模型合成文本時同樣。api
深度學習在近期最卓越的成果之一就是這個模型確實有效,在給出足夠的法語和英語文本的狀況下,若是你訓練這個模型,經過輸入一個法語句子來輸出對應的英語翻譯,這個模型將會很是有效。這個模型簡單地用一個編碼網絡來對輸入的法語句子進行編碼,而後用一個解碼網絡來生成對應的英語翻譯。網絡
還有一個與此相似的結構被用來作圖像描述,給出一張圖片,好比這張貓的圖片(上圖編號1所示),它能自動地輸出該圖片的描述,一隻貓坐在椅子上,那麼你如何訓練出這樣的網絡?經過輸入圖像來輸出描述,像這個句子同樣。app
方法以下,在以前的卷積網絡課程中,你已經知道了如何將圖片輸入到卷積神經網絡中,好比一個預訓練的AlexNet結構(上圖編號2方框所示),而後讓其學習圖片的編碼,或者學習圖片的一系列特徵。如今幻燈片所展現的就是AlexNet結構,咱們去掉最後的softmax單元(上圖編號3所示),這個預訓練的AlexNet結構會給你一個4096維的特徵向量,向量表示的就是這隻貓的圖片,因此這個預訓練網絡能夠是圖像的編碼網絡。如今你獲得了一個4096維的向量來表示這張圖片,接着你能夠把這個向量輸入到RNN中(上圖編號4方框所示),RNN要作的就是生成圖像的描述,每次生成一個單詞,這和咱們在以前將法語譯爲英語的機器翻譯中看到的結構很像,如今你輸入一個描述輸入的特徵向量,而後讓網絡生成一個輸出序列,或者說一個一個地輸出單詞序列。ide
事實證實在圖像描述領域,這種方法至關有效,特別是當你想生成的描述不是特別長時。據我所知,這種模型首先是由Junhua Mao,Wei Xu,Yi Yang,Jiang Wang,Zhiheng Huang和Alan Yuille提出的,儘管有幾個團隊都幾乎在同一時間構造出了很是類似的模型,由於還有另外兩個團隊也在同一時間得出了類似的結論。我以爲有可能Mao的團隊和Oriol Vinyals,Alexander Toshev,Samy Bengio和Dumitru Erhan,還有Andrej Karpathy和Fei-Fei Yi是同一個團隊。函數
如今你知道了基本的seq2seq模型是怎樣運做的,以及image to sequence模型或者說圖像描述模型是怎樣運做的。不過這兩個模型運做方式有一些不一樣,主要體如今如何用語言模型合成新的文本,並生成對應序列的方面。一個主要的區別就是你大概不會想獲得一個隨機選取的翻譯,你想要的是最準確的翻譯,或者說你可能不想要一個隨機選取的描述,你想要的是最好的最貼切的描述,咱們將在下節視頻中介紹如何生成這些序列。工具
在seq2seq機器翻譯模型和咱們在第一週課程所用的語言模型之間有不少類似的地方,可是它們之間也有許多重要的區別,讓咱們來一探究竟。
你能夠把機器翻譯想成是創建一個條件語言模型,在語言模型中上方是一個咱們在第一週所創建的模型,這個模型可讓你可以估計句子的可能性,這就是語言模型所作的事情。你也能夠將它用於生成一個新的句子,若是你在圖上的該處(下圖編號1所示),有\(x^{<1>}\)和\(x^{<2>}\),那麼在該例中\(x^{<2>} = y^{<1>}\),可是\(x^{<1>}\)、\(x^{<2>}\)等在這裏並不重要。爲了讓圖片看起來更簡潔,我把它們先抹去,能夠理解爲\(x^{<1>}\)是一個全爲0的向量,而後\(x^{<2>}\)、\(x^{<3>}\)等都等於以前所生成的輸出,這就是所說的語言模型。
而機器翻譯模型是下面這樣的,我這裏用兩種不一樣的顏色來表示,即綠色和紫色,用綠色(上圖編號2所示)表示encoder網絡,用紫色(上圖編號3所示)表示decoder網絡。你會發現decoder網絡看起來和剛纔所畫的語言模型幾乎如出一轍,機器翻譯模型其實和語言模型很是類似,不一樣在於語言模型老是以零向量(上圖編號4所示)開始,而encoder網絡會計算出一系列向量(上圖編號2所示)來表示輸入的句子。有了這個輸入句子,decoder網絡就能夠以這個句子開始,而不是以零向量開始,因此我把它叫作條件語言模型(conditional language model)。相比語言模型,輸出任意句子的機率,翻譯模型會輸出句子的英文翻譯(上圖編號5所示),這取決於輸入的法語句子(上圖編號6所示)。換句話說,你將估計一個英文翻譯的機率,好比估計這句英語翻譯的機率,"Jane is visiting Africa in September.",這句翻譯是取決於法語句子,"Jane visite I'Afrique en septembre.",這就是英語句子相對於輸入的法語句子的可能性,因此它是一個條件語言模型。
如今,假如你想真正地經過模型將法語翻譯成英文,經過輸入的法語句子模型將會告訴你各類英文翻譯所對應的可能性。\(x\)在這裏是法語句子"Jane visite l'Afrique en septembre.",而它將告訴你不一樣的英語翻譯所對應的機率。顯然你不想讓它隨機地進行輸出,若是你從這個分佈中進行取樣獲得\(P(y|x)\),可能取樣一次就能獲得很好的翻譯,"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."。因此當你使用這個模型來進行機器翻譯時,你並非從獲得的分佈中進行隨機取樣,而是你要找到一個英語句子\(y\)(上圖編號1所示),使得條件機率最大化。因此在開發機器翻譯系統時,你須要作的一件事就是想出一個算法,用來找出合適的\(y\)值,使得該項最大化,而解決這種問題最通用的算法就是束搜索(Beam Search),你將會在下節課見到它。
不過在瞭解束搜索以前,你可能會問一個問題,爲何不用貪心搜索(Greedy Search)呢?貪心搜索是一種來自計算機科學的算法,生成第一個詞的分佈之後,它將會根據你的條件語言模型挑選出最有可能的第一個詞進入你的機器翻譯模型中,在挑選出第一個詞以後它將會繼續挑選出最有可能的第二個詞,而後繼續挑選第三個最有可能的詞,這種算法就叫作貪心搜索,可是你真正須要的是一次性挑選出整個單詞序列,從\(y^{<1>}\)、\(y^{<2>}\)到\(y^{<T_{y}>}\)來使得總體的機率最大化。因此這種貪心算法先挑出最好的第一個詞,在這以後再挑最好的第二詞,而後再挑第三個,這種方法其實並無論用,爲了證實這個觀點,咱們來考慮下面兩種翻譯。
第一串(上圖編號1所示)翻譯明顯比第二個(上圖編號2所示)好,因此咱們但願機器翻譯模型會說第一個句子的\(P(y|x)\)比第二個句子要高,第一個句子對於法語原文來講更好更簡潔,雖然第二個也不錯,可是有些囉嗦,裏面有不少不重要的詞。但若是貪心算法挑選出了"Jane is"做爲前兩個詞,由於在英語中going更加常見,因而對於法語句子來講"Jane is going"相比"Jane is visiting"會有更高的機率做爲法語的翻譯,因此頗有可能若是你僅僅根據前兩個詞來估計第三個詞的可能性,獲得的就是going,最終你會獲得一個欠佳的句子,在\(P(y|x)\)模型中這不是一個最好的選擇。
我知道這種說法可能比較粗略,可是它確實是一種普遍的現象,當你想獲得單詞序列\(y^{<1>}\)、\(y^{<2>}\)一直到最後一個詞整體的機率時,一次僅僅挑選一個詞並非最佳的選擇。固然,在英語中各類詞彙的組合數量還有不少不少,若是你的字典中有10,000個單詞,而且你的翻譯可能有10個詞那麼長,那麼可能的組合就有10,000的10次方這麼多,這僅僅是10個單詞的句子,從這樣大一個字典中來挑選單詞,因此可能的句子數量很是巨大,不可能去計算每一種組合的可能性。因此這時最經常使用的辦法就是用一個近似的搜索算法,這個近似的搜索算法作的就是它會盡力地,儘管不必定總會成功,但它將挑選出句子\(y\)使得條件機率最大化,儘管它不能保證找到的\(y\)值必定可使機率最大化,但這已經足夠了。
最後總結一下,在本視頻中,你看到了機器翻譯是如何用來解決條件語言模型問題的,這個模型和以前的語言模型一個主要的區別就是,相比以前的模型隨機地生成句子,在該模型中你要找到最有可能的英語句子,最可能的英語翻譯,可是可能的句子組合數量過於巨大,沒法一一列舉,因此咱們須要一種合適的搜索算法,讓咱們在下節課中學習集束搜索。
這節視頻中你會學到集束搜索(beam search)算法,上節視頻中咱們講了對於機器翻譯來講,給定輸入,好比法語句子,你不會想要輸出一個隨機的英語翻譯結果,你想要一個最好的,最可能的英語翻譯結果。對於語音識別也同樣,給定一個輸入的語音片斷,你不會想要一個隨機的文本翻譯結果,你想要最好的,最接近原意的翻譯結果,集束搜索就是解決這個最經常使用的算法。這節視頻裏,你會明白怎麼把集束搜索算法應用到你本身的工做中,就用咱們的法語句子的例子來試一下集束搜索吧。
「Jane visite l'Afrique en Septembre.」(法語句子),咱們但願翻譯成英語,"Jane is visiting Africa in September".(英語句子),集束搜索算法首先作的就是挑選要輸出的英語翻譯中的第一個單詞。這裏我列出了10,000個詞的詞彙表(下圖編號1所示),爲了簡化問題,咱們忽略大小寫,全部的單詞都以小寫列出來。在集束搜索的第一步中我用這個網絡部分,綠色是編碼部分(下圖編號2所示),紫色是解碼部分(下圖編號3所示),來評估第一個單詞的機率值,給定輸入序列\(x\),即法語做爲輸入,第一個輸出\(y\)的機率值是多少。
貪婪算法只會挑出最可能的那一個單詞,而後繼續。而集束搜索則會考慮多個選擇,集束搜索算法會有一個參數B,叫作集束寬(beam width)。在這個例子中我把這個集束寬設成3,這樣就意味着集束搜索不會只考慮一個可能結果,而是一次會考慮3個,好比對第一個單詞有不一樣選擇的可能性,最後找到in、jane、september,是英語輸出的第一個單詞的最可能的三個選項,而後集束搜索算法會把結果存到計算機內存裏以便後面嘗試用這三個詞。若是集束寬設的不同,若是集束寬這個參數是10的話,那麼咱們跟蹤的不只僅3個,而是10個第一個單詞的最可能的選擇。因此要明白,爲了執行集束搜索的第一步,你須要輸入法語句子到編碼網絡,而後會解碼這個網絡,這個softmax層(上圖編號3所示)會輸出10,000個機率值,獲得這10,000個輸出的機率值,取前三個存起來。
讓咱們看看集束搜索算法的第二步,已經選出了in、jane、september做爲第一個單詞三個最可能的選擇,集束算法接下來會針對每一個第一個單詞考慮第二個單詞是什麼,單詞in後面的第二個單詞多是a或者是aaron,我就是從詞彙表裏把這些詞列了出來,或者是列表裏某個位置,september,多是列表裏的 visit,一直到字母z,最後一個單詞是zulu(下圖編號1所示)。
爲了評估第二個詞的機率值,咱們用這個神經網絡的部分,綠色是編碼部分(上圖編號2所示),而對於解碼部分,當決定單詞in後面是什麼,別忘了解碼器的第一個輸出\(y^{<1>}\),我把\(y^{<1>}\)設爲單詞in(上圖編號3所示),而後把它喂回來,這裏就是單詞in(上圖編號4所示),由於它的目的是努力找出第一個單詞是in的狀況下,第二個單詞是什麼。這個輸出就是\(y^{<2>}\)(上圖編號5所示),有了這個鏈接(上圖編號6所示),就是這裏的第一個單詞in(上圖編號4所示)做爲輸入,這樣這個網絡就能夠用來評估第二個單詞的機率了,在給定法語句子和翻譯結果的第一個單詞in的狀況下。
注意,在第二步裏咱們更關心的是要找到最可能的第一個和第二個單詞對,因此不只僅是第二個單詞有最大的機率,而是第一個、第二個單詞對有最大的機率(上圖編號7所示)。按照條件機率的準則,這個能夠表示成第一個單詞的機率(上圖編號8所示)乘以第二個單詞的機率(上圖編號9所示),這個能夠從這個網絡部分裏獲得(上圖編號10所示),對於已經選擇的in、jane、september這三個單詞,你能夠先保存這個機率值(上圖編號8所示),而後再乘以第二個機率值(上圖編號9所示)就獲得了第一個和第二個單詞對的機率(上圖編號7所示)。
如今你已經知道在第一個單詞是in的狀況下如何評估第二個單詞的機率,如今第一個單詞是jane,道理同樣,句子多是"jane a"、"jane aaron",等等到"jane is"、"jane visits"等等(上圖編號1所示)。你會用這個新的網絡部分(上圖編號2所示),我在這裏畫一條線,表明從\(y^{<1>}\),即jane,\(y^{< 1 >}\)鏈接jane(上圖編號3所示),那麼這個網絡部分就能夠告訴你給定輸入\(x\)和第一個詞是jane下,第二個單詞的機率了(上圖編號4所示),和上面同樣,你能夠乘以\(P(y^{<1>}|x)\)獲得\(P(y^{<1>},y^{<2>}|x)\)。
針對第二個單詞全部10,000個不一樣的選擇,最後對於單詞september也同樣,從單詞a到單詞zulu,用這個網絡部分,我把它畫在這裏。來看看若是第一個單詞是september,第二個單詞最多是什麼。因此對於集束搜索的第二步,因爲咱們一直用的集束寬爲3,而且詞彙表裏有10,000個單詞,那麼最終咱們會有3乘以10,000也就是30,000個可能的結果,由於這裏(上圖編號1所示)是10,000,這裏(上圖編號2所示)是10,000,這裏(上圖編號3所示)是10,000,就是集束寬乘以詞彙表大小,你要作的就是評估這30,000個選擇。按照第一個詞和第二個詞的機率,而後選出前三個,這樣又減小了這30,000個可能性,又變成了3個,減小到集束寬的大小。假如這30,000個選擇裏最可能的是「in September」(上圖編號4所示)和「jane is」(上圖編號5所示),以及「jane visits」(上圖編號6所示),畫的有點亂,但這就是這30,000個選擇裏最可能的三個結果,集束搜索算法會保存這些結果,而後用於下一次集束搜索。
注意一件事情,若是集束搜索找到了第一個和第二個單詞對最可能的三個選擇是「in September」或者「jane is」或者「jane visits」,這就意味着咱們去掉了september做爲英語翻譯結果的第一個單詞的選擇,因此咱們的第一個單詞如今減小到了兩個可能結果,可是咱們的集束寬是3,因此仍是有\(y^{<1>}\),\(y^{<2>}\)對的三個選擇。
在咱們進入集束搜索的第三步以前,我還想提醒一下由於咱們的集束寬等於3,每一步咱們都複製3個,一樣的這種網絡來評估部分句子和最後的結果,因爲集束寬等於3,咱們有三個網絡副本(上圖編號7所示),每一個網絡的第一個單詞不一樣,而這三個網絡能夠高效地評估第二個單詞全部的30,000個選擇。因此不須要初始化30,000個網絡副本,只須要使用3個網絡的副本就能夠快速的評估softmax的輸出,即\(y^{<2>}\)的10,000個結果。
讓咱們快速解釋一下集束搜索的下一步,前面說過前兩個單詞最可能的選擇是「in September」和「jane is」以及「jane visits」,對於每一對單詞咱們應該保存起來,給定輸入\(x\),即法語句子做爲\(x\)的狀況下,\(y^{<1>}\)和\(y^{<2>}\)的機率值和前面同樣,如今咱們考慮第三個單詞是什麼,能夠是「in September a」,能夠是「in September aaron」,一直到「in September zulu」。爲了評估第三個單詞可能的選擇,咱們用這個網絡部分,第一單詞是in(上圖編號1所示),第二個單詞是september(上圖編號2所示),因此這個網絡部分能夠用來評估第三個單詞的機率,在給定輸入的法語句子\(x\)和給定的英語輸出的前兩個單詞「in September」狀況下(上圖編號3所示)。對於第二個片斷來講也同樣,就像這樣同樣(上圖編號4所示),對於「jane visits」也同樣,而後集束搜索仍是會挑選出針對前三個詞的三個最可能的選擇,多是「in september jane」(上圖編號5所示),「Jane is visiting」也頗有可能(上圖編號6所示),也極可能是「Jane visits Africa」(上圖編號7所示)。
而後繼續,接着進行集束搜索的第四步,再加一個單詞繼續,最終這個過程的輸出一次增長一個單詞,集束搜索最終會找到「Jane visits africa in september」這個句子,終止在句尾符號(上圖編號8所示),用這種符號的系統很是常見,它們會發現這是最有可能輸出的一個英語句子。在本週的練習中,你會看到更多的執行細節,同時,你會運用到這個集束算法,在集束寬爲3時,集束搜索一次只考慮3個可能結果。注意若是集束寬等於1,只考慮1種可能結果,這實際上就變成了貪婪搜索算法,上個視頻裏咱們已經討論過了。可是若是同時考慮多個,可能的結果好比3個,10個或者其餘的個數,集束搜索一般會找到比貪婪搜索更好的輸出結果。
你已經瞭解集束搜索是如何工做的了,事實上還有一些額外的提示和技巧的改進可以使集束算法更高效,咱們在下個視頻中一探究竟。
上個視頻中, 你已經學到了基本的束搜索算法(the basic beam search algorithm),這個視頻裏,咱們會學到一些技巧, 可以使算法運行的更好。長度歸一化(Length normalization)就是對束搜索算法稍做調整的一種方式,幫助你獲得更好的結果,下面介紹一下它。
前面講到束搜索就是最大化這個機率,這個乘積就是\(P(y^{< 1 >}\ldots y^{< T_{y}}|X)\),能夠表示成:\(P(y^{<1>}|X)\) \(P(y^{< 2 >}|X,y^{< 1 >})\) \(P(y^{< 3 >}|X,y^{< 1 >},y^{< 2>})\)…\(P(y^{< T_{y} >}|X,y^{<1 >},y^{<2 >}\ldots y^{< T_{y} - 1 >})\)
這些符號看起來可能比實際上嚇人,但這就是咱們以前見到的乘積機率(the product probabilities)。若是計算這些,其實這些機率值都是小於1的,一般遠小於1。不少小於1的數乘起來,會獲得很小很小的數字,會形成數值下溢(numerical underflow)。數值下溢就是數值過小了,致使電腦的浮點表示不能精確地儲存,所以在實踐中,咱們不會最大化這個乘積,而是取\(log\)值。若是在這加上一個\(log\),最大化這個\(log\)求和的機率值,在選擇最可能的句子\(y\)時,你會獲得一樣的結果。因此經過取\(log\),咱們會獲得一個數值上更穩定的算法,不容易出現四捨五入的偏差,數值的舍入偏差(rounding errors)或者說數值下溢(numerical underflow)。由於\(log\)函數它是嚴格單調遞增的函數,最大化\(P(y)\),由於對數函數,這就是\(log\)函數,是嚴格單調遞增的函數,因此最大化\(logP(y|x)\)和最大化\(P(y|x)\)結果同樣。若是一個\(y\)值可以使前者最大,就確定能使後者也取最大。因此實際工做中,咱們老是記錄機率的對數和(the sum of logs of the probabilities),而不是機率的乘積(the production of probabilities)。
對於目標函數(this objective function),還能夠作一些改變,可使得機器翻譯表現的更好。若是參照原來的目標函數(this original objective),若是有一個很長的句子,那麼這個句子的機率會很低,由於乘了不少項小於1的數字來估計句子的機率。因此若是乘起來不少小於1的數字,那麼就會獲得一個更小的機率值,因此這個目標函數有一個缺點,它可能不天然地傾向於簡短的翻譯結果,它更偏向短的輸出,由於短句子的機率是由更少數量的小於1的數字乘積獲得的,因此這個乘積不會那麼小。順便說一下,這裏也有一樣的問題,機率的\(log\)值一般小於等於1,實際上在\(log\)的這個範圍內,因此加起來的項越多,獲得的結果越負,因此對這個算法另外一個改變也可使它表現的更好,也就是咱們再也不最大化這個目標函數了,咱們能夠把它歸一化,經過除以翻譯結果的單詞數量(normalize this by the number of words in your translation)。這樣就是取每一個單詞的機率對數值的平均了,這樣很明顯地減小了對輸出長的結果的懲罰(this significantly reduces the penalty for outputting longer translations.)。
在實踐中,有個探索性的方法,相比於直接除\(T_{y}\),也就是輸出句子的單詞總數,咱們有時會用一個更柔和的方法(a softer approach),在\(T_{y}\)上加上指數\(a\),\(a\)能夠等於0.7。若是\(a\)等於1,就至關於徹底用長度來歸一化,若是\(a\)等於0,\(T_{y}\)的0次冪就是1,就至關於徹底沒有歸一化,這就是在徹底歸一化和沒有歸一化之間。\(a\)就是算法另外一個超參數(hyper parameter),須要調整大小來獲得最好的結果。不得不認可,這樣用\(a\)其實是試探性的,它並無理論驗證。可是你們都發現效果很好,你們都發現實踐中效果不錯,因此不少人都會這麼作。你能夠嘗試不一樣的\(a\)值,看看哪個可以獲得最好的結果。
總結一下如何運行束搜索算法。當你運行束搜索時,你會看到不少長度等於1的句子,不少長度等於2的句子,不少長度等於3的句子,等等。可能運行束搜索30步,考慮輸出的句子可能達到,好比長度30。由於束寬爲3,你會記錄全部這些可能的句子長度,長度爲一、二、 三、 4 等等一直到30的三個最可能的選擇。而後針對這些全部的可能的輸出句子,用這個式子(上圖編號1所示)給它們打分,取機率最大的幾個句子,而後對這些束搜索獲得的句子,計算這個目標函數。最後從通過評估的這些句子中,挑選出在歸一化的\(log\) 機率目標函數上得分最高的一個(you pick the one that achieves the highest value on this normalized log probability objective.),有時這個也叫做歸一化的對數似然目標函數(a normalized log likelihood objective)。這就是最終輸出的翻譯結果,這就是如何實現束搜索。這周的練習中你會本身實現這個算法。
最後還有一些實現的細節,如何選擇束寬B。B越大,你考慮的選擇越多,你找到的句子可能越好,可是B越大,你的算法的計算代價越大,由於你要把不少的可能選擇保存起來。最後咱們總結一下關於如何選擇束寬B的一些想法。接下來是針對或大或小的B各自的優缺點。若是束寬很大,你會考慮不少的可能,你會獲得一個更好的結果,由於你要考慮不少的選擇,可是算法會運行的慢一些,內存佔用也會增大,計算起來會慢一點。而若是你用小的束寬,結果會沒那麼好,由於你在算法運行中,保存的選擇更少,可是你的算法運行的更快,內存佔用也小。在前面視頻裏,咱們例子中用了束寬爲3,因此會保存3個可能選擇,在實踐中這個值有點偏小。在產品中,常常能夠看到把束寬設到10,我認爲束寬爲100對於產品系統來講有點大了,這也取決於不一樣應用。可是對科研而言,人們想壓榨出所有性能,這樣有個最好的結果用來發論文,也常常看到你們用束寬爲1000或者3000,這也是取決於特定的應用和特定的領域。在你實現你的應用時,嘗試不一樣的束寬的值,當B很大的時候,性能提升會愈來愈少。對於不少應用來講,從束寬1,也就是貪心算法,到束寬爲三、到10,你會看到一個很大的改善。可是當束寬從1000增長到3000時,效果就沒那麼明顯了。對於以前上過計算機科學課程的同窗來講,若是你熟悉計算機科學裏的搜索算法(computer science search algorithms), 好比廣度優先搜索(BFS, Breadth First Search algorithms),或者深度優先搜索(DFS, Depth First Search),你能夠這樣想束搜索,不像其餘你在計算機科學算法課程中學到的算法同樣。若是你沒據說過這些算法也沒關係,可是若是你據說過廣度優先搜索和深度優先搜索,不一樣於這些算法,這些都是精確的搜索算法(exact search algorithms),束搜索運行的更快,可是不能保證必定能找到argmax的準確的最大值。若是你沒據說過廣度優先搜索和深度優先搜索,也不用擔憂,這些對於咱們的目標也不重要,若是你據說過,這就是束搜索和其餘算法的關係。
好,這就是束搜索。這個算法普遍應用在多產品系統或者許多商業系統上,在深度學習系列課程中的第三門課中,咱們討論了不少關於偏差分析(error analysis)的問題。事實上在束搜索上作偏差分析是我發現的最有用的工具之一。有時你想知道是否應該增大束寬,個人束寬是否足夠好,你能夠計算一些簡單的東西來指導你須要作什麼,來改進你的搜索算法。咱們在下個視頻裏進一步討論。
在這五門課中的第三門課裏,你瞭解了偏差分析是如何可以幫助你集中時間作你的項目中最有用的工做,束搜索算法是一種近似搜索算法(an approximate search algorithm),也被稱做啓發式搜索算法(a heuristic search algorithm),它不老是輸出可能性最大的句子,它僅記錄着B爲前3或者10或是100種可能。那麼若是束搜索算法出現錯誤會怎樣呢?
本節視頻中,你將會學習到偏差分析和束搜索算法是如何相互起做用的,以及你怎樣才能發現是束搜索算法出現了問題,須要花時間解決,仍是你的RNN模型出了問題,要花時間解決。咱們先來看看如何對束搜索算法進行偏差分析。
咱們來用這個例子說明: 「Jane visite l'Afrique en septembre」。假如說,在你的機器翻譯的dev集中,也就是開發集(development set),人工是這樣翻譯的: Jane visits Africa in September,我會將這個標記爲\(y^*\)。這是一個十分不錯的人工翻譯結果,不過假如說,當你在已經完成學習的RNN模型,也就是已完成學習的翻譯模型中運行束搜索算法時,它輸出了這個翻譯結果:Jane visited Africa last September,咱們將它標記爲\(\hat y\)。這是一個十分糟糕的翻譯,它實際上改變了句子的原意,所以這不是個好翻譯。
你的模型有兩個主要部分,一個是神經網絡模型,或說是序列到序列模型(sequence to sequence model),咱們將這個稱做是RNN模型,它其實是個編碼器和解碼器( an encoder and a decoder)。另外一部分是束搜索算法,以某個集束寬度B運行。若是你可以找出形成這個錯誤,這個不太好的翻譯的緣由,是兩個部分中的哪個,不是很好嗎? RNN (循環神經網絡)是更多是出錯的緣由呢,仍是束搜索算法更多是出錯的緣由呢?你在第三門課中瞭解到了你們很容易想到去收集更多的訓練數據,這總歸沒什麼壞處。因此一樣的,你們也會以爲不行就增大束寬,也是不會錯的,或者說是很大多是沒有危害的。可是就像單純獲取更多訓練數據,可能並不能獲得預期的表現結果。相同的,單純增大束寬也可能得不到你想要的結果,不過你怎樣才能知道是否是值得花時間去改進搜索算法呢?
下面咱們來分解這個問題弄清楚什麼狀況下該用什麼解決辦法。
RNN (循環神經網絡)其實是個編碼器和解碼器(the encoder and the decoder),它會計算\(P(y|x)\)。因此舉個例子,對於這個句子:Jane visits Africa in September,你將Jane visits Africa填入這裏(上圖編號1所示),一樣,我如今忽略了字母的大小寫,後面也是同樣,而後這個就會計算。\(P(y|x)\)結果代表,你此時能作的最有效的事就是用這個模型來計算\(P(y^*|x)\),同時也用你的RNN模型來計算\(P(\hat y|x)\),而後比較一下這兩個值哪一個更大。有多是左邊大於右邊,也有多是\(P(y^*)\)小於\(P(\hat y)\),其實應該是小於或等於,對吧。取決於實際是哪一種狀況,你就可以更清楚地將這個特定的錯誤歸咎於RNN或是束搜索算法,或說是哪一個負有更大的責任。咱們來探究一下其中的邏輯。
這是以前幻燈片裏的兩個句子。記住,咱們是要計算\(P(y^*|x)\)和\(P(\hat y|x)\),而後比較這兩個哪一個更大,因此就會有兩種狀況。
第一種狀況,RNN模型的輸出結果\(P(y^*|x)\) 大於\(P(\hat y|x)\),這意味着什麼呢?
束搜索算法選擇了\(\hat y\) ,對吧?
你獲得\(\hat y\)的方式是,你用一個RNN模型來計算\(P(y|x)\),而後束搜索算法作的就是嘗試尋找使\(P(y|x)\)最大的\(y\),不過在這種狀況下,相比於\(\hat y\),\(y^*\)的值更\(P(y|x)\)大,所以你可以得出束搜索算法實際上不可以給你一個能使\(P(y|x)\)最大化的\(y\)值,由於束搜索算法的任務就是尋找一個\(y\)的值來使這項更大,可是它卻選擇了\(\hat y\),而\(y^*\)實際上能獲得更大的值。所以這種狀況下你可以得出是束搜索算法出錯了。那另外一種狀況是怎樣的呢?
第二種狀況是\(P(y^*|x)\)小於或等於\(P(\hat y|x)\)對吧?這二者之中總有一個是真的。狀況1或是狀況2總有一個爲真。狀況2你可以總結出什麼呢?
在咱們的例子中,\(y^*\) 是比 \(\hat y\)更好的翻譯結果,不過根據RNN模型的結果,\(P(y^*)\) 是小於\(P(\hat y)\)的,也就是說,相比於\(\hat y\),\(y^*\)成爲輸出的可能更小。所以在這種狀況下,看來是RNN模型出了問題。同時可能值得在RNN模型上花更多時間。這裏我少講了一些有關長度歸一化(length normalizations)的細節。這裏我略過了有關長度歸一化的細節,若是你用了某種長度歸一化,那麼你要作的就不是比較這兩種可能性大小,而是比較長度歸一化後的最優化目標函數值。不過如今先忽略這種複雜的狀況。第二種狀況代表雖然\(y^*\)是一個更好的翻譯結果,RNN模型卻賦予它更低的可能性,是RNN模型出現了問題。
因此偏差分析過程看起來就像下面這樣。你先遍歷開發集,而後在其中找出算法產生的錯誤,這個例子中,假如說\(P(y^*|x)\)的值爲2 x 10-10,而\(P(\hat y|x)\)的值爲 1 x10-10,根據上頁幻燈片中的邏輯關係,這種狀況下咱們得知束搜索算法實際上選擇了比\(y^*\)可能性更低的\(\hat y\),所以我會說束搜索算法出錯了。我將它縮寫爲B。接着你繼續遍歷第二個錯誤,再來看這些可能性。也許對於第二個例子來講,你認爲是RNN模型出現了問題,我會用縮寫R來表明RNN。再接着你遍歷了更多的例子,有時是束搜索算法出現了問題,有時是模型出現了問題,等等。經過這個過程,你就可以執行偏差分析,得出束搜索算法和RNN模型出錯的比例是多少。有了這樣的偏差分析過程,你就能夠對開發集中每個錯誤例子,即算法輸出了比人工翻譯更差的結果的狀況,嘗試肯定這些錯誤,是搜索算法出了問題,仍是生成目標函數(束搜索算法使之最大化)的RNN模型出了問題。而且經過這個過程,你可以發現這兩個部分中哪一個是產生更多錯誤的緣由,而且只有當你發現是束搜索算法形成了大部分錯誤時,才值得花費努力增大集束寬度。相反地,若是你發現是RNN模型出了更多錯,那麼你能夠進行更深層次的分析,來決定是須要增長正則化仍是獲取更多的訓練數據,抑或是嘗試一個不一樣的網絡結構,或是其餘方案。你在第三門課中,瞭解到各類技巧都可以應用在這裏。
這就是束搜索算法中的偏差分析,我認爲這個特定的偏差分析過程是十分有用的,它能夠用於分析近似最佳算法(如束搜索算法),這些算法被用來優化學習算法(例如序列到序列模型/RNN)輸出的目標函數。也就是咱們這些課中一直討論的。學會了這個方法,我但願你可以在你的應用裏更有效地運用好這些類型的模型。
機器翻譯(machine translation)的一大難題是一個法語句子能夠有多種英文翻譯並且都一樣好,因此當有多個一樣好的答案時,怎樣評估一個機器翻譯系統呢?不像圖像識別(image recognition),只有一個正確答案,就只要測量準確性就能夠了。若是有多個不錯的答案,要怎樣衡量準確性呢?
常見的解決辦法是,經過一個叫作BLEU得分(the BLEU score)的東西來解決。因此,在這個選修視頻中,我想與你分享,我想讓你瞭解BLEU得分是怎樣工做的。
假如給你一個法語句子:Le chat est sur le tapis,而後給你一個這個句子的人工翻譯做參考:The cat is on the mat。不過有多種至關不錯的翻譯。因此一個不一樣的人,也許會將其翻譯爲:There is a cat on the mat,同時,實際上這兩個都是很好的,都準確地翻譯了這個法語句子。BLEU得分作的就是,給定一個機器生成的翻譯,它可以自動地計算一個分數來衡量機器翻譯的好壞。直覺告訴咱們,只要這個機器生成的翻譯與任何一我的工翻譯的結果足夠接近,那麼它就會獲得一個高的BLEU分數。順便提一下BLEU表明bilingual evaluation understudy (雙語評估替補)。在戲劇界,侯補演員(understudy)學習資深的演員的角色,這樣在必要的時候,他們就可以接替這些資深演員。而BLEU的初衷是相對於請評估員(ask human evaluators),人工評估機器翻譯系統(the machine translation system),BLEU得分就至關於一個侯補者,它能夠代替人類來評估機器翻譯的每個輸出結果。BLEU得分是由Kishore Papineni, Salim Roukos,Todd Ward和Wei-Jing Zhu發表的這篇論文十分有影響力而且實際上也是一篇很好讀的文章。因此若是有時間的話,我推薦你讀一下。BLEU得分背後的理念是觀察機器生成的翻譯,而後看生成的詞是否出如今少一我的工翻譯參考之中。所以這些人工翻譯的參考會包含在開發集或是測試集中。
(參考論文:Papineni, Kishore& Roukos, Salim & Ward, Todd & Zhu, Wei-jing. (2002). BLEU: a Method for Automatic Evaluation of Machine Translation.10.3115/1073083.1073135.)
如今,咱們來看一個極端的例子。咱們假設機器翻譯系統縮寫爲MT。機器翻譯 (MT)的輸出是:the the the the the the the。這顯然是一個十分糟糕的翻譯。衡量機器翻譯輸出質量的方法之一是觀察輸出結果的每個詞看其是否出如今參考中,這被稱作是機器翻譯的精確度(a precision of the machine translation output)。這個狀況下,機器翻譯輸出了七個單詞而且這七個詞中的每個都出如今了參考1或是參考2。單詞the在兩個參考中都出現了,因此看上去每一個詞都是很合理的。所以這個輸出的精確度就是7/7,看起來是一個極好的精確度。這就是爲何把出如今參考中的詞在MT輸出的全部詞中所佔的比例做爲精確度評估標準並非頗有用的緣由。由於它彷佛意味着,例子中MT輸出的翻譯有很高的精確度,所以取而代之的是咱們要用的這個改良後的精確度評估方法,咱們把每個單詞的記分上限定爲它在參考句子中出現的最屢次數。在參考1中,單詞the出現了兩次,在參考2中,單詞the只出現了一次。而2比1大,因此咱們會說,單詞the的得分上限爲2。有了這個改良後的精確度,咱們就說,這個輸出句子的得分爲2/7,由於在7個詞中,咱們最多隻能給它2分。因此這裏分母就是7個詞中單詞the總共出現的次數,而分子就是單詞the出現的計數。咱們在達到上限時截斷計數,這就是改良後的精確度評估(the modified precision measure)。
到目前爲止,咱們都只是關注單獨的單詞,在BLEU得分中,你不想僅僅考慮單個的單詞,你也許也想考慮成對的單詞,咱們定義一下二元詞組(bigrams)的BLEU得分。bigram的意思就是相鄰的兩個單詞。如今咱們來看看怎樣用二元詞組來定義BLEU得分,而且這僅僅只是最終的BLEU得分的一部分。咱們會考慮一元詞組(unigrams)也就是單個單詞以及二元詞組(bigrams),即成對的詞,同時也許會有更長的單詞序列,好比說三元詞組(trigrams)。意思是三個挨在一塊兒的詞。咱們繼續剛纔的例子,仍是前面出現過的參考1和2,不過如今咱們假定機器翻譯輸出了稍微好一點的翻譯:The cat the cat on the mat,仍然不是一個好的翻譯,不過也許比上一個好一些。這裏,可能的二元詞組有the cat ,忽略大小寫,接着是cat the, 這是另外一個二元詞組,而後又是the cat。不過我已經有了,因此咱們跳過它,而後下一個是cat on,而後是on the,再而後是the mat。因此這些就是機器翻譯中的二元詞組。好,咱們來數一數每一個二元詞組出現了多少次。the cat出現了兩次 ,cat the出現了一次,剩下的都只出現了一次。最後 ,咱們來定義一下截取計數(the clipped count)。也就是Count_clip。爲了定義它,咱們以這列的值爲基礎,可是給算法設置得分上限,上限值爲二元詞組出如今參考1或2中的最大次數。the cat在兩個參考中最多出現一次,因此我將截取它的計數爲1。cat the它並無出如今參考1和參考2中,因此我將它截取爲0。cat on ,好,它出現了一次,咱們就記1分。on the出現一次就記1分,the mat出現了一次,因此這些就是截取完的計數(the clipped counts)。咱們把全部的這些計數都截取了一遍,實際上就是將它們下降使之不大於二元詞組出如今參考中的次數。最後,修改後的二元詞組的精確度就是count_clip之和。所以那就是4除以二元詞組的總個數,也就是6。所以是4/6也就是2/3爲二元詞組改良後的精確度。
如今咱們將它公式化。基於咱們在一元詞組中學到的內容,咱們將改良後的一元詞組精確度定義爲\(P_1\),\(P\)表明的是精確度。這裏的下標1的意思是一元詞組。不過它定義爲一元詞組之和,也就是對機器翻譯結果中全部單詞求和,MT 輸出就是\(\hat y\),Countclip(unigram)。除以機器翻譯輸出中的一元詞組出現次數之和。所以這個就是最終結果應該是兩頁幻燈片前獲得的2/7。這裏的1指代的是一元詞組,意思是咱們在考慮單獨的詞,你也能夠定義\(P_n\)爲\(n\)元詞組精確度,用n-gram替代掉一元詞組。因此這就是機器翻譯輸出中的\(n\)元詞組的countclip之和除以\(n\)元詞組的出現次數之和。所以這些精確度或說是這些改良後的精確度得分評估的是一元詞組或是二元詞組。就是咱們前頁幻燈片中作的,或者是三元詞組,也就是由三個詞組成的,甚至是\(n\)取更大數值的\(n\)元詞組。這個方法都可以讓你衡量機器翻譯輸出中與參考類似重複的程度。另外,你可以確信若是機器翻譯輸出與參考1或是參考2徹底一致的話,那麼全部的這些\(P_1\)、\(P_2\)等等的值,都會等於1.0。爲了獲得改良後的1.0的精確度,只要你的輸出與參考之一徹底相同就能知足,不過有時即便輸出結果並不徹底與參考相同,這也是有可能實現的。你能夠將它們以另外一種方式組合,希望仍能獲得不錯的翻譯結果。
最後,咱們將這些組合一下來構成最終的BLEU得分。\(P_n\)就是\(n\)元詞組這一項的BLEU得分,也是計算出的\(n\)元詞組改良後的精確度,按照慣例,爲了用一個值來表示你須要計算\(P_1\),\(P_2\), \(P_3\),\(P_4\)。而後將它們用這個公式組合在一塊兒,就是取平均值。按照慣例BLEU得分被定義爲,\(exp (\frac{1}{4}\sum\limits_{n=1}^{4}{{{P}_{n}}})\),對這個線性運算進行乘方運算,乘方是嚴格單調遞增的運算,咱們實際上會用額外的一個叫作BP 的懲罰因子(the BP penalty)來調整這項。BP的意思是「簡短懲罰」( brevity penalty)。這些細節也許並非十分重要,可是你能夠大體瞭解一下。
事實代表,若是你輸出了一個很是短的翻譯,那麼它會更容易獲得一個高精確度。由於輸出的大部分詞可能都出如今參考之中,不過咱們並不想要特別短的翻譯結果。所以簡短懲罰(BP)就是一個調整因子,它可以懲罰輸出了過短翻譯結果的翻譯系統。BP的公式如上圖所示。若是你的機器翻譯系統實際上輸出了比人工翻譯結果更長的翻譯,那麼它就等於1,其餘狀況下就是像這樣的公式,懲罰全部更短的翻譯,細節部分你可以在這篇論文中找到。
再說一句,在以前的視頻中,你瞭解了擁有單一實數評估指標(a single real number evaluation metric)的重要性,由於它可以讓你嘗試兩種想法,而後看一下哪一個得分更高,儘可能選擇得分更高的那個,BLEU得分對於機器翻譯來講,具備革命性的緣由是由於它有一個至關不錯的雖然不是完美的可是很是好的單一實數評估指標,所以它加快了整個機器翻譯領域的進程,我但願這節視頻可以讓你瞭解BLEU得分是如何操做的。實踐中,不多人會從零實現一個BLEU得分(implement a BLEU score from scratch),有不少開源的實現結果,你能夠下載下來而後直接用來評估你的系統。不過今天,BLEU得分被用來評估許多生成文本的系統(systems that generate text),好比說機器翻譯系統(machine translation systems),也有我以前簡單提到的圖像描述系統(image captioning systems)。也就是說你會用神經網絡來生成圖像描述,而後使用BLEU得分來看一下,結果在多大程度上與參考描述或是多我的工完成的參考描述內容相符。BLEU得分是一個有用的單一實數評估指標,用於評估生成文本的算法,判斷輸出的結果是否與人工寫出的參考文本的含義類似。不過它並無用於語音識別(speech recognition)。由於在語音識別當中,一般只有一個答案,你能夠用其餘的評估方法,來看一下你的語音識別結果,是否十分相近或是字字正確(pretty much, exactly word for word correct)。不過在圖像描述應用中,對於同一圖片的不一樣描述,多是一樣好的。或者對於機器翻譯來講,有多個同樣好的翻譯結果,BLEU得分就給了你一個可以自動評估的方法,幫助加快算法開發進程。說了這麼多,但願你明白了BLEU得分是怎麼運行的。
在本週大部分時間中,你都在使用這個編碼解碼的構架(a Encoder-Decoder architecture)來完成機器翻譯。當你使用RNN讀一個句子,因而另外一個會輸出一個句子。咱們要對其作一些改變,稱爲注意力模型(the Attention Model),而且這會使它工做得更好。注意力模型或者說注意力這種思想(The attention algorithm, the attention idea)已是深度學習中最重要的思想之一,咱們看看它是怎麼運做的。
像這樣給定一個很長的法語句子,在你的神經網絡中,這個綠色的編碼器要作的就是讀整個句子,而後記憶整個句子,再在感知機中傳遞(to read in the whole sentence and then memorize the whole sentences and store it in the activations conveyed her)。而對於這個紫色的神經網絡,即解碼網絡(the decoder network)將生成英文翻譯,Jane去年九月去了非洲,很是享受非洲文化,遇到了不少奇妙的人,她回來就嚷嚷道,她經歷了一個多棒的旅行,並邀請我也一塊兒去。人工翻譯並不會經過讀整個法語句子,再記憶裏面的東西,而後從零開始,機械式地翻譯成一個英語句子。而人工翻譯,首先會作的多是先翻譯出句子的部分,再看下一部分,並翻譯這一部分。看一部分,翻譯一部分,一直這樣下去。你會經過句子,一點一點地翻譯,由於記憶整個的像這樣的的句子是很是困難的。你在下面這個編碼解碼結構中,會看到它對於短句子效果很是好,因而它會有一個相對高的Bleu分(Bleu score),可是對於長句子而言,好比說大於30或者40詞的句子,它的表現就會變差。Bleu評分看起來就會像是這樣,隨着單詞數量變化,短的句子會難以翻譯,由於很可貴到全部詞。對於長的句子,效果也很差,由於在神經網絡中,記憶很是長句子是很是困難的。在這個和下個視頻中,你會見識到注意力模型,它翻譯得很像人類,一次翻譯句子的一部分。並且有了注意力模型,機器翻譯系統的表現會像這個同樣,由於翻譯只會翻譯句子的一部分,你不會看到這個有一個巨大的下傾(huge dip),這個下傾實際上衡量了神經網絡記憶一個長句子的能力,這是咱們不但願神經網絡去作的事情。在這個視頻中,我想要給大家注意力機制運行的一些直觀的東西。而後在下個視頻中,完善細節。
注意力模型源於Dimitri, Bahdanau, Camcrun Cho, Yoshe Bengio。(Bahdanau D, Cho K, Bengio Y. Neural Machine Translation by Jointly Learning to Align and Translate[J]. Computer Science,2014.)雖然這個模型源於機器翻譯,但它也推廣到了其餘應用領域。我認爲在深度學習領域,這個是個很是有影響力的,很是具備開創性的論文。
讓咱們用一個短句舉例說明一下,即便這些思想多是應用於更長的句子。可是用短句來舉例說明,講解這些思想會更簡單。咱們有一個很日常的句子:(法語)Jane visite l'Afrique en Septembre。假定咱們使用RNN,在這個狀況中,咱們將使用一個雙向的RNN(a bidirectional RNN),爲了計算每一個輸入單詞的的特徵集(set of features),你必需要理解輸出\(\hat y^{<1>}\)到\(\hat y^{<3>}\)一直到\(\hat y^{<5>}\)的雙向RNN。可是咱們並非只翻譯一個單詞,讓咱們先去掉上面的\(Y\),就用雙向的RNN。咱們要對單詞作的就是,對於句子裏的每五個單詞,計算一個句子中單詞的特徵集,也有多是周圍的詞,讓咱們試試,生成英文翻譯。咱們將使用另外一個RNN生成英文翻譯,這是我平時用的RNN記號。我不用\(A\)來表示感知機(the activation),這是爲了不和這裏的感知機(the activations)混淆。我會用另外一個不一樣的記號,我會用\(S\)來表示RNN的隱藏狀態(the hidden state in this RNN),不用\(A^{<1>}\),而是用\(S^{<1>}\)。咱們但願在這個模型裏第一個生成的單詞將會是Jane,爲了生成Jane visits Africa in September。因而等式就是,當你嘗試生成第一個詞,即輸出,那麼咱們應該看輸入的法語句子的哪一個部分?彷佛你應該先看第一個單詞,或者它附近的詞。可是你別看太遠了,好比說看到句尾去了。因此注意力模型就會計算注意力權重(a set of attention weights),咱們將用\(a^{<1,1>}\)來表示當你生成第一個詞時你應該放多少注意力在這個第一塊信息處。而後咱們算第二個,這個叫注意力權重,\(a^{<1,2>}\)它告訴咱們當你嘗試去計算第一個詞Jane時,咱們應該花多少注意力在輸入的第二個詞上面。同理這裏是\(a^{<1,3>}\),接下去也同理。這些將會告訴咱們,咱們應該花多少注意力在記號爲\(C\)的內容上。這就是RNN的一個單元,如未嘗試生成第一個詞的,這是RNN的其中一步,咱們將會在下個視頻中講解細節。對於RNN的第二步,咱們將有一個新的隱藏狀態\(S^{<2>}\),咱們也會用一個新的注意力權值集(a new set of the attention weights),咱們將用\(a^{<2,1>}\)來告訴咱們何時生成第二個詞, 那麼visits就會是第二個標籤了(the ground trip label)。咱們應該花多少注意力在輸入的第一個法語詞上。而後同理\(a^{<2,2>}\),接下去也同理,咱們應該花多少注意力在visite詞上,咱們應該花多少注意在詞l'Afique上面。固然咱們第一個生成的詞Jane也會輸入到這裏,因而咱們就有了須要花注意力的上下文。第二步,這也是個輸入,而後會一塊兒生成第二個詞,這會讓咱們來到第三步\(S^{<3>}\),這是輸入,咱們再有上下文C,它取決於在不一樣的時間集(time sets),上面的\(a^{<3>}\)。這個告訴了咱們咱們要花注意力在不一樣的法語的輸入詞上面。
而後同理。有些事情我還沒說清楚,可是在下個視頻中,我會講解一些細節,好比如何準肯定義上下文,還有第三個詞的上下文,是否真的須要去注意句子中的周圍的詞。這裏要用到的公式以及如何計算這些注意力權重(these attention weights),將會在下個視頻中講解到。在下個視頻中你會看到\(a^{<3,t>}\),即當你嘗試去生成第三個詞,應該是l'Afique,就獲得了右邊這個輸出,這個RNN步驟應該要花注意力在\(t\)時的法語詞上,這取決於在\(t\)時的雙向RNN的激活值。那麼它應該是取決於第四個激活值,它會取決於上一步的狀態,它會取決於\(S^{<2>}\)。而後這些一塊兒影響你應該花多少注意在輸入的法語句子的某個詞上面。咱們會在下個視頻中講解這些細節。可是直觀來想就是RNN向前進一次生成一個詞,在每一步直到最終生成多是<EOS>。這些是注意力權重,即\(a^{<t,t>}\)告訴你,當你嘗試生成第\(t\)個英文詞,它應該花多少注意力在第\(t\)個法語詞上面。當生成一個特定的英文詞時,這容許它在每一個時間步去看周圍詞距內的法語詞要花多少注意力。
我但願這個視頻傳遞了關於注意力模型的一些直觀的東西。咱們如今可能對算法的運行有了大概的感受,讓咱們進入到下個視頻中,看看具體的細節。
在上個視頻中你已經見到了,注意力模型如何讓一個神經網絡只注意到一部分的輸入句子。當它在生成句子的時候,更像人類翻譯。讓咱們把這些想法轉化成確切的式子,來實現注意力模型。
跟上個視頻同樣,咱們先假定有一個輸入句子,並使用雙向的RNN,或者雙向的GRU或者雙向的LSTM,去計算每一個詞的特徵。實際上GRU和LSTM常常應用於這個,可能LSTM更常常一點。對於前向傳播(the forward occurrence),你有第一個時間步的前向傳播的激活值(a forward occurrence first time step),第一個時間步後向傳播的激活值,後向的激活值,以此類推。他們一共向前了五個時間步,也向後了五個時間步,技術上咱們把這裏設置爲0。咱們也能夠後向傳播6次,設一個都是0的因子,實際上就是個都是0的因子。爲了簡化每一個時間步的記號,即便你在雙向RNN已經計算了前向的特徵值和後向的特徵值,我就用\(a^{<t>}\)來一塊兒表示這些聯繫。因此\(a^{<t>}\)就是時間步\(t\)上的特徵向量。可是爲了保持記號的一致性,咱們用第二個,也就是\(t'\),實際上我將用\(t'\)來索引法語句子裏面的詞。接下來咱們只進行前向計算,就是說這是個單向的RNN,用狀態\(S\)表示生成翻譯。因此第一個時間步,它應該生成\(y^{<1>}\),當你輸入上下文\(C\)的時候就會這樣,若是你想用時間來索引它,你能夠寫\(C^{<1>}\),但有時候我就寫個\(C\),就是沒有上標的\(C\),這個會取決於注意力參數,即\(a^{<1,1>}\),\(a^{<1,2>}\)以此類推,告訴咱們應該花多少注意力。一樣的,這個\(a\)參數告訴咱們上下文有多少取決於咱們獲得的特徵,或者咱們從不一樣時間步中獲得的激活值。因此咱們定義上下文的方式實際上來源於被注意力權重加權的不一樣時間步中的特徵值。因而更公式化的注意力權重將會知足非負的條件,因此這就是個0或正數,它們加起來等於1。咱們等會會見到咱們如何確保這個成立,咱們將會有上下文,或者說在\(t=1\)時的上下文,我會常常省略上標,這就會變成對\(t'\)的求和。這個權重的全部的\(t'\)值,加上這些激活值。因此這裏的這項(上圖編號1所示)就是注意力權重,這裏的這項(上圖編號2)來自於這裏(上圖編號3),因而\(a^{<t,t'>}\)就是\(y^{<t>}\)應該在\(t'\)時花在\(a\)上注意力的數量。換句話來講,當你在\(t\)處生成輸出詞,你應該花多少注意力在第\(t'\)個輸入詞上面,這是生成輸出的其中一步。而後下一個時間步,你會生成第二個輸出。因而類似的,你如今有了一個新的注意力權重集,再找到一個新的方式將它們相加,這就產生了一個新的上下文,這個也是輸入,且容許你生成第二個詞。只有如今才用這種方式相加,它會變成第二個時間步的上下文。即對\(t'\)的\(a^{<2,t'>}\)進行求和,因而使用這些上下文向量,\(C^{<1>}\)寫到這裏,\(C^{<2>}\)也同理。這裏的神經網絡看起來很像至關標準的RNN序列,這裏有着上下文向量做爲輸出,咱們能夠一次一個詞地生成翻譯,咱們也定義瞭如何經過這些注意力權重和輸入句子的特徵值來計算上下文向量。剩下惟一要作的事情就是定義如何計算這些注意力權重。讓咱們下張幻燈片看看。
回憶一下\(a^{<t,t'>}\),是你應該花費在\(a^{<t'>}\)上的注意力的數量,當你嘗試去生成第\(t\)個輸出的翻譯詞,讓咱們先把式子寫下來,再討論它是怎麼來的。這個式子你能夠用來計算\(a^{<t,t'>}\),在此以前咱們要先計算\(e^{<t,t'>}\),關鍵要用softmax,來確保這些權重加起來等於1。若是你對\(t'\)求和,好比每個固定的\(t\)值,這些加起來等於1。若是你對\(t'\)求和,而後優先使用softmax,確保這些值加起來等於1。
如今咱們如何計算這些\(e\)項,一種咱們能夠用的方式是用下面這樣的小的神經網絡,因而\(s^{<t-1>}\)就是神經網絡在上個時間步的狀態,因而這裏咱們有一個神經網絡,若是你想要生成\(y^{<t>}\),那麼\(s^{<t-1>}\)就是上一時間步的隱藏狀態,即\(s^{<t>}\)。這是給小神經網絡的其中一個輸入,也就是在神經網絡中的一個隱藏層,由於你須要常常計算它們,而後\(a^{<t'>}\),即上個時間步的的特徵是另外一個輸入。直觀來想就是,若是你想要決定要花多少注意力在\(t'\)的激活值上。因而,彷佛它會很大程度上取決於你上一個時間步的的隱藏狀態的激活值。你尚未當前狀態的激活值,由於上下文會輸入到這裏,因此你還沒計算出來,可是看看你生成上一個翻譯的RNN的隱藏狀態,而後對於每個位置,每個詞都看向他們的特徵值,這看起來很天然,即\(a^{<t,t'>}\)和\(e^{<t,t'>}\)應該取決於這兩個量。可是咱們不知道具體函數是什麼,因此咱們能夠作的事情就是訓練一個很小的神經網絡,去學習這個函數究竟是什麼。相信反向傳播算法,相信梯度降低算法學到一個正確的函數。這表示,若是你應用這整個的模型,而後用梯度降低來訓練它,這是可行的。這個小型的神經網絡作了一件至關棒的事情,告訴你\(y^{<t>}\)應該花多少注意力在\(a^{<t>}\)上面,而後這個式子確保注意力權重加起來等於1,因而當你持續地一次生成一個詞,這個神經網絡實際上會花注意力在右邊的這個輸入句子上,它會徹底自動的經過梯度降低來學習。
這個算法的一個缺點就是它要花費三次方的時間,就是說這個算法的複雜是\(O(n3)\)的,若是你有\(T_x\)個輸入單詞和\(T_y\)個輸出單詞,因而注意力參數的總數就會是\(T_x\times T_y\),因此這個算法有着三次方的消耗。可是在機器翻譯的應用上,輸入和輸出的句子通常不會太長,可能三次方的消耗是能夠接受,但也有不少研究工做,嘗試去減小這樣的消耗。那麼講解注意想法在機器翻譯中的應用,就到此爲止了。雖然沒有講到太多的細節,但這個想法也被應用到了其餘的不少問題中去了,好比圖片加標題(image captioning),圖片加標題就是看一張圖,寫下這張圖的標題。底下的這篇論文來源於Kevin Chu,Jimmy Barr, Ryan Kiros, Kelvin Shaw, Aaron Korver, Russell Zarkutnov, Virta Zemo, 和 Andrew Benjo。他們也顯示了你能夠有一個很類似的結構看圖片,而後,當你在寫圖片標題的時候,一次只花注意力在一部分的圖片上面。若是你感興趣,那麼我鼓勵你,也去看看這篇論文,作一些編程練習。
由於機器翻譯是一個很是複雜的問題,在以前的練習中,你應用了注意力,在日期標準化的問題(the date normalization problem)上面,問題輸入了像這樣的一個日期,這個日期其實是阿波羅登月的日期,把它標準化成標準的形式,或者這樣的日期。用一個序列的神經網絡,即序列模型去標準化到這樣的形式,這個日期其實是威廉·莎士比亞的生日。通常認爲是這個日期正如你以前聯繫中見到的,你能夠訓練一個神經網絡,輸入任何形式的日期,生成標準化的日期形式。其餘能夠作的有意思的事情是看看可視化的注意力權重(the visualizations of the attention weights)。這個一個機器翻譯的例子,這裏被畫上了不一樣的顏色,不一樣注意力權重的大小,我不想在這上面花太多時間,可是你能夠發現,對應的輸入輸出詞,你會發現注意力權重,會變高,所以這顯示了當它生成特定的輸出詞時一般會花注意力在輸入的正確的詞上面,包括學習花注意在哪。
在注意力模型中,使用反向傳播時, 何時學習完成。
這就是注意力模型,在深度學習中真的是個很是強大的想法。在本週的編程練習中,我但願你能夠享受本身應用它的過程。
現今,最使人振奮的發展之一,就是seq2seq模型(sequence-to-sequence models)在語音識別方面準確性有了很大的提高。這門課程已經接近尾聲,如今我想經過剩下幾節視頻,來告訴大家,seq2seq模型是如何應用於音頻數據的(audio data),好比語音(the speech)。
什麼是語音視頻問題呢?如今你有一個音頻片斷\(x\)(an audio clip,x),你的任務是自動地生成文本\(y\)。如今有一個音頻片斷,畫出來是這樣,該圖的橫軸是時間。一個麥克風的做用是測量出微小的氣壓變化,如今你之因此能聽到個人聲音,是由於你的耳朵可以探測到這些微小的氣壓變化,它多是由你的揚聲器或者耳機產生的,也就是像圖上這樣的音頻片斷,氣壓隨着時間而變化。假如這個我說的音頻片斷的內容是:"the quick brown fox"(敏捷的棕色狐狸),這時咱們但願一個語音識別算法(a speech recognition algorithm),經過輸入這段音頻,而後輸出音頻的文本內容。考慮到人的耳朵並不會處理聲音的原始波形,而是經過一種特殊的物理結構來測量這些,不一樣頻率和強度的聲波。音頻數據的常見預處理步驟,就是運行這個原始的音頻片斷,而後生成一個聲譜圖(a spectrogram),就像這樣。一樣地,橫軸是時間,縱軸是聲音的頻率(frequencies),而圖中不一樣的顏色,顯示了聲波能量的大小(the amount of energy),也就是在不一樣的時間和頻率上這些聲音有多大。經過這樣的聲譜圖,或者你可能還聽過人們談到過僞空白輸出(the false blank outputs),也常常應用於預處理步驟,也就是在音頻被輸入到學習算法以前,而人耳所作的計算和這個預處理過程很是類似。語音識別方面,最使人振奮的趨勢之一就是曾經有一段時間,語音識別系統是用音位(phonemes)來構建的,也就是人工設計的基本單元(hand-engineered basic units of cells),若是用音位來表示"the quick brown fox",我這裏稍微簡化一些,"the"含有"th"和"e"的音,而"quick"有"k" "w" "i" "k"的音,語音學家過去把這些音做爲聲音的基本單元寫下來,把這些語音分解成這些基本的聲音單元,而"brown"不是一個很正式的音位,由於它的音寫起來比較複雜,不過語音學家(linguists)們認爲用這些基本的音位單元(basic units of sound called phonemes)來表示音頻(audio),是作語音識別最好的辦法。不過在end-to-end模型中,咱們發現這種音位表示法(phonemes representations)已經再也不必要了,而是能夠構建一個系統,經過向系統中輸入音頻片斷(audio clip),而後直接輸出音頻的文本(a transcript),而不須要使用這種人工設計的表示方法。使這種方法成爲可能的一件事就是用一個很大的數據集,因此語音識別的研究數據集可能長達300個小時,在學術界,甚至3000小時的文本音頻數據集,都被認爲是合理的大小。大量的研究,大量的論文所使用的數據集中,有幾千種不一樣的聲音,並且,最好的商業系統如今已經訓練了超過1萬個小時的數據,甚至10萬個小時,而且它還會繼續變得更大。在文本音頻數據集中(Transcribe audio data sets)同時包含\(x\)和\(y\),經過深度學習算法大大推動了語音識別的進程。那麼,如何創建一個語音識別系統呢?
在上一節視頻中,咱們談到了注意力模型,因此,一件你能作的事就是在橫軸上,也就是在輸入音頻的不一樣時間幀上,你能夠用一個注意力模型,來輸出文本描述,如"the quick brown fox",或者其餘語音內容。
還有一種效果也不錯的方法,就是用CTC損失函數(CTC cost)來作語音識別。CTC就是Connectionist Temporal Classification,它是由Alex Graves、Santiago Fernandes, Faustino Gomez、和Jürgen Schmidhuber提出的。(Graves A, Gomez F. Connectionist temporal classification:labelling unsegmented sequence data with recurrent neural networks[C]// International Conference on Machine Learning. ACM, 2006:369-376.)
算法思想以下:
假設語音片斷內容是某人說:"the quick brown fox",這時咱們使用一個新的網絡,結構像這個樣子,這裏輸入\(x\)和輸出\(y\)的數量都是同樣的,由於我在這裏畫的,只是一個簡單的單向RNN結構。然而在實際中,它有多是雙向的LSTM結構,或者雙向的GIU結構,而且一般是很深的模型。但注意一下這裏時間步的數量,它很是地大。在語音識別中,一般輸入的時間步數量(the number of input time steps)要比輸出的時間步的數量(the number of output time steps)多出不少。舉個例子,好比你有一段10秒的音頻,而且特徵(features)是100赫茲的,即每秒有100個樣本,因而這段10秒的音頻片斷就會有1000個輸入,就是簡單地用100赫茲乘上10秒。因此有1000個輸入,但可能你的輸出就沒有1000個字母了,或者說沒有1000個字符。這時要怎麼辦呢?CTC損失函數容許RNN生成這樣的輸出:ttt,這是一個特殊的字符,叫作空白符,咱們這裏用下劃線表示,這句話開頭的音可表示爲h_eee_ _ _,而後這裏可能有個空格,咱們用這個來表示空格,以後是_ _ _qqq__,這樣的輸出也被看作是正確的輸出。下面這段輸出對應的是"the q"。CTC損失函數的一個基本規則是將空白符之間的重複的字符摺疊起來,再說清楚一些,我這裏用下劃線來表示這個特殊的空白符(a special blank character),它和空格(the space character)是不同的。因此the和quick之間有一個空格符,因此我要輸出一個空格,經過把用空白符所分割的重複的字符摺疊起來,而後咱們就能夠把這段序列摺疊成"the q"。這樣一來你的神經網絡由於有不少這種重複的字符,和不少插入在其中的空白符(blank characters),因此最後咱們獲得的文本會短上不少。因而這句"the quick brown fox"包括空格一共有19個字符,在這樣的狀況下,經過容許神經網絡有重複的字符和插入空白符使得它能強制輸出1000個字符,甚至你能夠輸出1000個\(y\)值來表示這段19個字符長的輸出。這篇論文來自於Alex Grace以及剛纔提到的那些人。我所參與的深度語音識別系統項目就使用這種思想來構建有效的語音識別系統。
但願這能給你一個粗略的理解,理解語音識別模型是如何工做的:注意力模型是如何工做的,以及CTC模型是如何工做的,以及這兩種不一樣的構建這些系統的方法。現今,在生產技術中,構建一個有效語音識別系統,是一項至關重要的工做,而且它須要很大的數據集,下節視頻我想作的是告訴你如何構建一個觸發字檢測系統(a rigger word detection system),其中的關鍵字檢測系統(keyword detection system)將會更加簡單,它能夠經過一個更簡潔的數量更合理的數據來完成。因此咱們下節課再見。
如今你已經學習了不少關於深度學習和序列模型的內容,因而咱們能夠真正去簡便地描繪出一個觸發字系統(a trigger word system),就像上節視頻中你看到的那樣。隨着語音識別的發展,愈來愈多的設備能夠經過你的聲音來喚醒,這有時被叫作觸發字檢測系統(rigger word detection systems)。咱們來看一看如何創建一個觸發字系統。
觸發字系統的例子包括Amazon echo,它經過單詞Alexa喚醒;還有百度DuerOS設備,經過"小度你好"來喚醒;蘋果的Siri用Hey Siri來喚醒;Google Home使用Okay Google來喚醒,這就是觸發字檢測系統。假如你在臥室中,有一臺Amazon echo,你能夠在臥室中簡單說一句: Alexa, 如今幾點了?就能喚醒這個設備。它將會被單詞"Alexa"喚醒,並回答你的詢問。若是你能創建一個觸發字檢測系統,也許你就能讓你的電腦經過你的聲音來執行某些事,我有個朋友也在作一種用觸發字來打開的特殊的燈,這是個頗有趣的項目。但我想教會你的,是如何構建一個觸發字檢測系統。
有關於觸發字檢測系統的文獻,還處於發展階段。對於觸發字檢測,最好的算法是什麼,目前尚未一個普遍的定論。我這裏就簡單向你介紹一個你可以使用的算法好了。如今有一個這樣的RNN結構,咱們要作的就是把一個音頻片斷(an audio clip)計算出它的聲譜圖特徵(spectrogram features)獲得特徵向量\(x^{<1>}\), \(x^{<2>}\), \(x^{<3>}\)..,而後把它放到RNN中,最後要作的,就是定義咱們的目標標籤\(y\)。假如音頻片斷中的這一點是某人剛剛說完一個觸發字,好比"Alexa",或者"小度你好" 或者"Okay Google",那麼在這一點以前,你就能夠在訓練集中把目標標籤都設爲0,而後在這個點以後把目標標籤設爲1。假如在一段時間以後,觸發字又被說了一次,好比是在這個點說的,那麼就能夠再次在這個點以後把目標標籤設爲1。這樣的標籤方案對於RNN來講是可行的,而且確實運行得很是不錯。不過該算法一個明顯的缺點就是它構建了一個很不平衡的訓練集(a very imbalanced training set),0的數量比1多太多了。
這裏還有一個解決方法,雖然聽起來有點簡單粗暴,但確實能使其變得更容易訓練。比起只在一個時間步上去輸出1,其實你能夠在輸出變回0以前,屢次輸出1,或說在固定的一段時間內輸出多個1。這樣的話,就稍微提升了1與0的比例,這確實有些簡單粗暴。在音頻片斷中,觸發字剛被說完以後,就把多個目標標籤設爲1,這裏觸發字又被說了一次。說完之後,又讓RNN去輸出1。在以後的編程練習中,你能夠進行更多這樣的操做,我想你應該會對本身學會了這麼多東西而感到自豪。咱們僅僅用了一張幻燈片來描述這種複雜的觸發字檢測系統。在這個基礎上,但願你可以實現一個能有效地讓你可以檢測出觸發字的算法,不過在編程練習中你能夠看到更多的學習內容。這就是觸發字檢測,但願你能對本身感到自豪。由於你已經學了這麼多深度學習的內容,如今你能夠只用幾分鐘時間,就能用一張幻燈片來描述觸發字可以實現它,並讓它發揮做用。你甚至可能在你的家裏用觸發字系統作一些有趣的事情,好比打開或關閉電器,或者能夠改造你的電腦,使得你或者其餘人能夠用觸發字來操做它。