3.5 集束搜索的误差分析-深度学习第五课《序列模型》-Stanford吴恩达教授
集束搜索的誤差分析 (Error analysis in beam search)
在這五門課中的第三門課里,你了解了誤差分析是如何能夠幫助你集中時間做你的項目中最有用的工作,束搜索算法是一種近似搜索算法(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?y*y? 。這是一個十分不錯的人工翻譯結果,不過假如說,當你在已經完成學習的RNN模型,也就是已完成學習的翻譯模型中運行束搜索算法時,它輸出了這個翻譯結果:Jane visited Africa last September,我們將它標記為 y^\hat{y}y^? 。這是一個十分糟糕的翻譯,它實際上改變了句子的原意,因此這不是個好翻譯。
你的模型有兩個主要部分,一個是神經網絡模型,或說是序列到序列模型(sequence to sequence model),我們將這個稱作是RNN模型,它實際上是個編碼器和解碼器( an encoder and a decoder)。另一部分是束搜索算法,以某個集束寬度B運行。如果你能夠找出造成這個錯誤,這個不太好的翻譯的原因,是兩個部分中的哪一個,不是很好嗎? RNN (循環神經網絡)是更可能是出錯的原因呢,還是束搜索算法更可能是出錯的原因呢?你在第三門課中了解到了大家很容易想到去收集更多的訓練數據,這總歸沒什么壞處。所以同樣的,大家也會覺得不行就增大束寬,也是不會錯的,或者說是很大可能是沒有危害的。但是就像單純獲取更多訓練數據,可能并不能得到預期的表現結果。相同的,單純增大束寬也可能得不到你想要的結果,不過你怎樣才能知道是不是值得花時間去改進搜索算法呢? 下面我們來分解這個問題弄清楚什么情況下該用什么解決辦法。
RNN (循環神經網絡)實際上是個編碼器和解碼器(the encoder and the decoder),它會計算 P(y∣x)P(y|x)P(y∣x) 。所以舉個例子,對于這個句子:Jane visits Africa in September,你將Jane visits Africa填入這里(上圖編號1所示),同樣,我現在忽略了字母的大小寫,后面也是一樣,然后這個就會計算。 P(y∣x)P(y|x)P(y∣x) 結果表明,你此時能做的最有效的事就是用這個模型來計算 P(y?∣x)P(y*|x)P(y?∣x) ,同時也用你的RNN模型來計算 P(y^∣x)P(\hat{y}|x)P(y^?∣x) ,然后比較一下這兩個值哪個更大。有可能是左邊大于右邊,也有可能是 P(y?)P(y*)P(y?) 小于 P(y^)P(\hat{y})P(y^?) ,其實應該是小于或等于,對吧。取決于實際是哪種情況,你就能夠更清楚地將這個特定的錯誤歸咎于RNN或是束搜索算法,或說是哪個負有更大的責任。我們來探究一下其中的邏輯。
這是之前幻燈片里的兩個句子。記住,我們是要計算 P(y?∣x)P(y*|x)P(y?∣x) 和 P(y^∣x)P(\hat{y}|x)P(y^?∣x) ,然后比較這兩個哪個更大,所以就會有兩種情況。
第一種情況,RNN模型的輸出結果 P(y?∣x)P(y*|x)P(y?∣x) 大于 P(y^∣x)P(\hat{y}|x)P(y^?∣x) ,這意味著什么呢? 束搜索算法選擇了 y^\hat{y}y^? ,對吧? 你得到 y^\hat{y}y^? 的方式是,你用一個RNN模型來計算 P(y∣x)P(y|x)P(y∣x) ,然后束搜索算法做的就是嘗試尋找使 P(y∣x)P(y|x)P(y∣x) 最大的 yyy ,不過在這種情況下,相比于 y^\hat{y}y^? , y?y*y? 的值 P(y∣x)P(y|x)P(y∣x) 更大,因此你能夠得出束搜索算法實際上不能夠給你一個能使 P(y∣x)P(y|x)P(y∣x) 最大化的 yyy 值,因為束搜索算法的任務就是尋找一個 yyy 的值來使這項更大,但是它卻選擇了 y^\hat{y}y^? ,而 y?y*y? 實際上能得到更大的值。因此這種情況下你能夠得出是束搜索算法出錯了。那另一種情況是怎樣的呢?
第二種情況是 P(y?∣x)P(y*|x)P(y?∣x) 小于或等于 P(y^∣x)P(\hat{y}|x)P(y^?∣x) 對吧?這兩者之中總有一個是真的。情況1或是情況2總有一個為真。情況2你能夠總結出什么呢? 在我們的例子中, y?y*y? 是比 y^\hat{y}y^? 更好的翻譯結果,不過根據RNN模型的結果, P(y?)P(y*)P(y?) 是小于 P(y^)P(\hat{y})P(y^?) 的,也就是說,相比于 y^\hat{y}y^? , y?y*y? 成為輸出的可能更小。因此在這種情況下,看來是RNN模型出了問題。同時可能值得在RNN模型上花更多時間。這里我少講了一些有關長度歸一化(length normalizations)的細節。這里我略過了有關長度歸一化的細節,如果你用了某種長度歸一化,那么你要做的就不是比較這兩種可能性大小,而是比較長度歸一化后的最優化目標函數值。不過現在先忽略這種復雜的情況。第二種情況表明雖然 y?y*y? 是一個更好的翻譯結果,RNN模型卻賦予它更低的可能性,是RNN模型出現了問題。
所以誤差分析過程看起來就像下面這樣。你先遍歷開發集,然后在其中找出算法產生的錯誤,這個例子中,假如說 P(y?∣x)P(y*|x)P(y?∣x) 的值為2 x 10-10,而 P(y^∣x)P(\hat{y}|x)P(y^?∣x) 的值為 1 x10-10,根據上頁幻燈片中的邏輯關系,這種情況下我們得知束搜索算法實際上選擇了比 y?y*y? 可能性更低的 y^\hat{y}y^? ,因此我會說束搜索算法出錯了。我將它縮寫為B。接著你繼續遍歷第二個錯誤,再來看這些可能性。也許對于第二個例子來說,你認為是RNN模型出現了問題,我會用縮寫R來代表RNN。再接著你遍歷了更多的例子,有時是束搜索算法出現了問題,有時是模型出現了問題,等等。通過這個過程,你就能夠執行誤差分析,得出束搜索算法和RNN模型出錯的比例是多少。有了這樣的誤差分析過程,你就可以對開發集中每一個錯誤例子,即算法輸出了比人工翻譯更差的結果的情況,嘗試確定這些錯誤,是搜索算法出了問題,還是生成目標函數(束搜索算法使之最大化)的RNN模型出了問題。并且通過這個過程,你能夠發現這兩個部分中哪個是產生更多錯誤的原因,并且只有當你發現是束搜索算法造成了大部分錯誤時,才值得花費努力增大集束寬度。相反地,如果你發現是RNN模型出了更多錯,那么你可以進行更深層次的分析,來決定是需要增加正則化還是獲取更多的訓練數據,抑或是嘗試一個不同的網絡結構,或是其他方案。你在第三門課中,了解到各種技巧都能夠應用在這里。
這就是束搜索算法中的誤差分析,我認為這個特定的誤差分析過程是十分有用的,它可以用于分析近似最佳算法(如束搜索算法),這些算法被用來優化學習算法(例如序列到序列模型/RNN)輸出的目標函數。也就是我們這些課中一直討論的。學會了這個方法,我希望你能夠在你的應用里更有效地運用好這些類型的模型。
總結
以上是生活随笔為你收集整理的3.5 集束搜索的误差分析-深度学习第五课《序列模型》-Stanford吴恩达教授的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 3.4 改进集束搜索-深度学习第五课《序
- 下一篇: 3.7 注意力模型直观理解-深度学习第五