1.6 语言模型和序列生成-深度学习第五课《序列模型》-Stanford吴恩达教授
| 1.5 不同類型的循環神經網絡 | 回到目錄 | 1.7 對新序列采樣 |
語言模型和序列生成 (Language Model and Sequence Generation)
在自然語言處理中,構建語言模型是最基礎的也是最重要的工作之一,并且能用RNN很好地實現。在本視頻中,你將學習用RNN構建一個語言模型,在本周結束的時候,還會有一個很有趣的編程練習,你能在練習中構建一個語言模型,并用它來生成莎士比亞文風的文本或其他類型文本。
所以什么是語言模型呢?比如你在做一個語音識別系統,你聽到一個句子,“the apple and pear(pair) salad was delicious.”,所以我究竟說了什么?我說的是 “the apple and pair salad”,還是“the apple and pear salad”?(pear和pair是近音詞)。你可能覺得我說的應該更像第二種,事實上,這就是一個好的語音識別系統要幫助輸出的東西,即使這兩句話聽起來是如此相似。而讓語音識別系統去選擇第二個句子的方法就是使用一個語言模型,他能計算出這兩句話各自的可能性。
舉個例子,一個語音識別模型可能算出第一句話的概率是 P(Theappleandpairsalad)=3.2?10?13P(The\ apple\ and\ pair\ salad)=3.2*10^{-13}P(The?apple?and?pair?salad)=3.2?10?13 ,而第二句話的概率是 P(Theappleandpearsalad)=5.7?10?10P(The\ apple\ and\ pear\ salad)=5.7*10^{-10}P(The?apple?and?pear?salad)=5.7?10?10 ,比較這兩個概率值,顯然我說的話更像是第二種,因為第二句話的概率比第一句高出1000倍以上,這就是為什么語音識別系統能夠在這兩句話中作出選擇。
所以語言模型所做的就是,它會告訴你某個特定的句子它出現的概率是多少,根據我所說的這個概率,假設你隨機拿起一張報紙,打開任意郵件,或者任意網頁或者聽某人說下一句話,并且這個人是你的朋友,這個你即將從世界上的某個地方得到的句子會是某個特定句子的概率是多少,例如“the apple and pear salad”。它是兩種系統的基本組成部分,一個剛才所說的語音識別系統,還有機器翻譯系統,它要能正確輸出最接近的句子。而語言模型做的最基本工作就是輸入一個句子,準確地說是一個文本序列, y<1>,y<2>y^{<1>},y^{<2>}y<1>,y<2> 一直到 y<Ty>y^{<T_y>}y<Ty?> 。對于語言模型來說,用 yyy 來表示這些序列比用來 xxx 表示要更好,然后語言模型會估計某個句子序列中各個單詞出現的可能性。
那么如何建立一個語言模型呢?為了使用RNN建立出這樣的模型,你首先需要一個訓練集,包含一個很大的英文文本語料庫(corpus)或者其它的語言,你想用于構建模型的語言的語料庫。語料庫是自然語言處理的一個專有名詞,意思就是很長的或者說數量眾多的英文句子組成的文本。
假如說,你在訓練集中得到這么一句話,“Cats average 15 hours of sleep a day.”(貓一天睡15小時),你要做的第一件事就是將這個句子標記化,意思就是像之前視頻中一樣,建立一個字典,然后將每個單詞都轉換成對應的one-hot向量,也就是字典中的索引??赡苓€有一件事就是你要定義句子的結尾,一般的做法就是增加一個額外的標記,叫做EOS(上圖編號1所示),它表示句子的結尾,這樣能夠幫助你搞清楚一個句子什么時候結束,我們之后會詳細討論這個。EOS標記可以被附加到訓練集中每一個句子的結尾,如果你想要你的模型能夠準確識別句子結尾的話。在本周的練習中我們不需要使用這個EOS標記,不過在某些應用中你可能會用到它,不過稍后就能見到它的用處。于是在本例中我們,如果你加了EOS標記,這句話就會有9個輸入,有 y<1>,y<2>y^{<1>},y^{<2>}y<1>,y<2> 一直到 y<9>y^{<9>}y<9> 。在標記化的過程中,你可以自行決定要不要把標點符號看成標記,在本例中,我們忽略了標點符號,所以我們只把day看成標志,不包括后面的句號,如果你想把句號或者其他符號也當作標志,那么你可以將句號也加入你的字典中。
現在還有一個問題如果你的訓練集中有一些詞并不在你的字典里,比如說你的字典有10,000個詞,10,000個最常用的英語單詞?,F在這個句,“The Egyptian Mau is a bread of cat.”其中有一個詞Mau,它可能并不是預先的那10,000個最常用的單詞,在這種情況下,你可以把Mau替換成一個叫做UNK的代表未知詞的標志,我們只針對UNK建立概率模型,而不是針對這個具體的詞Mau。
完成標識化的過程后,這意味著輸入的句子都映射到了各個標志上,或者說字典中的各個詞上。下一步我們要構建一個RNN來構建這些序列的概率模型。在下一張幻燈片中會看到的一件事就是最后你會將 x<t>x^{<t>}x<t> 設為 y<t?1>y^{<t-1>}y<t?1> 。
現在我們來建立RNN模型,我們繼續使用“Cats average 15 hours of sleep a day.”這個句子來作為我們的運行樣例,我將會畫出一個RNN結構。在第0個時間步,你要計算激活項 a<1>a^{<1>}a<1> ,它是以 x<1>x^{<1>}x<1> 作為輸入的函數,而 x<1>x^{<1>}x<1> 會被設為全為0的集合,也就是0向量。在之前的 a<0>a^{<0>}a<0> 按照慣例也設為0向量,于是 a<1>a^{<1>}a<1> 要做的就是它會通過softmax進行一些預測來計算出第一個詞可能會是什么,其結果就是 y^<1>\hat{y}^{<1>}y^?<1> (上圖編號1所示),這一步其實就是通過一個softmax層來預測字典中的任意單詞會是第一個詞的概率,比如說第一個詞 aaa 是的概率有多少,第一個詞是Aaron的概率有多少,第一個詞是cats的概率又有多少,就這樣一直到Zulu是第一個詞的概率是多少,還有第一個詞是UNK(未知詞)的概率有多少,還有第一個詞是句子結尾標志的概率有多少,表示不必閱讀。所以 y^<1>\hat{y}^{<1>}y^?<1> 的輸出是softmax的計算結果,它只是預測第一個詞的概率,而不去管結果是什么。在我們的例子中,最終會得到單詞Cats。所以softmax層輸出10,000種結果,因為你的字典中有10,000個詞,或者會有10,002個結果,因為你可能加上了未知詞,還有句子結尾這兩個額外的標志。
然后RNN進入下個時間步,在下一時間步中,仍然使用激活項 a<1>a^{<1>}a<1> ,在這步要做的是計算出第二個詞會是什么。現在我們依然傳給它正確的第一個詞,我們會告訴它第一個詞就是Cats,也就是 y^<1>\hat{y}^{<1>}y^?<1> ,告訴它第一個詞就是Cats,這就是為什么 y<1>=x<2>y^{<1>}=x^{<2>}y<1>=x<2> (上圖編號2所示)。然后在第二個時間步中,輸出結果同樣經過softmax層進行預測,RNN的職責就是預測這些詞的概率(上圖編號3所示),而不會去管結果是什么,可能是b或者arron,可能是Cats或者Zulu或者UNK(未知詞)或者EOS或者其他詞,它只會考慮之前得到的詞。所以在這種情況下,我猜正確答案會是average,因為句子確實就是Cats average開頭的。
然后再進行RNN的下個時間步,現在要計算 a<3>a^{<3>}a<3> 。為了預測第三個詞,也就是15,我們現在給它之前兩個詞,告訴它Cats average是句子的前兩個詞,所以這是下一個輸入, x<3>=y<2>x^{<3>}=y^{<2>}x<3>=y<2> ,輸入average以后,現在要計算出序列中下一個詞是什么,或者說計算出字典中每一個詞的概率(上圖編號4所示),通過之前得到的Cats和average,在這種情況下,正確結果會是15,以此類推。
一直到最后,沒猜錯的話,你會停在第9個時間步,然后把 x<9>x^{<9>}x<9> 也就是 y<8>y^{<8>}y<8> 傳給它(上圖編號5所示),也就是單詞day,這里是 a<9>a^{<9>}a<9> ,它會輸出 y<9>y^{<9>}y<9> ,最后的得到結果會是EOS標志,在這一步中,通過前面這些得到的單詞,不管它們是什么,我們希望能預測出EOS句子結尾標志的概率會很高(上圖編號6所示)。
所以RNN中的每一步都會考慮前面得到的單詞,比如給它前3個單詞(上圖編號7所示),讓它給出下個詞的分布,這就是RNN如何學習從左往右地每次預測一個詞。
接下來為了訓練這個網絡,我們要定義代價函數。于是,在某個時間步 ttt ,如果真正的詞是 y<t>y^{<t>}y<t> ,而神經網絡的softmax層預測結果值是 y<t>y^{<t>}y<t> ,那么這(上圖編號8所示)就是softmax損失函數, L(y^<t>,y<t>)=?∑iyi<t>log?y^i<t>L(\hat{y}^{<t>},y^{<t>})=-\sum_{i}y_i^{<t>}\log\hat{y}_i^{<t>}L(y^?<t>,y<t>)=?∑i?yi<t>?logy^?i<t>? 。而總體損失函數(上圖編號9所示) L=∑tL<t>(y^<t>,y<t>)L=\sum_tL^{<t>}(\hat{y}^{<t>},y^{<t>})L=∑t?L<t>(y^?<t>,y<t>) ,也就是把所有單個預測的損失函數都相加起來。
如果你用很大的訓練集來訓練這個RNN,你就可以通過開頭一系列單詞像是Cars average 15或者Cars average 15 hours of來預測之后單詞的概率。現在有一個新句子,它是 y<1>,y<2>,y<3>y^{<1>},y^{<2>},y^{<3>}y<1>,y<2>,y<3> ,為了簡單起見,它只包含3個詞(如上圖所示),現在要計算出整個句子中各個單詞的概率,方法就是第一個softmax層會告訴你 y<1>y^{<1>}y<1> 的概率(上圖編號1所示),這也是第一個輸出,然后第二個softmax層會告訴你在考慮 y<1>y^{<1>}y<1> 的情況下 y<2>y^{<2>}y<2> 的概率(上圖編號2所示),然后第三個softmax層告訴你在考慮 y<1>y^{<1>}y<1> 和 y<2>y^{<2>}y<2> 的情況下 y<3>y^{<3>}y<3> 的概率(上圖編號3所示),把這三個概率相乘,最后得到這個含3個詞的整個句子的概率。
這就是用RNN訓練一個語言模型的基礎結構,可能我說的這些東西聽起來有些抽象,不過別擔心,你可以在編程練習中親自實現這些東西。下一節課用語言模型做的一件最有趣的事就是從模型中進行采樣。
課程板書
| 1.5 不同類型的循環神經網絡 | 回到目錄 | 1.7 對新序列采樣 |
總結
以上是生活随笔為你收集整理的1.6 语言模型和序列生成-深度学习第五课《序列模型》-Stanford吴恩达教授的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 1.5 不同类型的循环网络-深度学习第五
- 下一篇: 1.7 对新序列采样-深度学习第五课《序