1.7 对新序列采样-深度学习第五课《序列模型》-Stanford吴恩达教授
| 1.6 語言模型和序列生成 | 回到目錄 | 1.8 帶有神經網絡的梯度消失 |
對新序列采樣 (Sampling novel sequences)
在你訓練一個序列模型之后,要想了解到這個模型學到了什么,一種非正式的方法就是進行一次新序列采樣,來看看到底應該怎么做。
記住一個序列模型模擬了任意特定單詞序列的概率,我們要做的就是對這些概率分布進行采樣來生成一個新的單詞序列。下圖編號1所示的網絡已經被上方所展示的結構訓練訓練過了,而為了進行采樣(下圖編號2所示的網絡),你要做一些截然不同的事情。
第一步要做的就是對你想要模型生成的第一個詞進行采樣,于是你輸入 x<1>=0,a<0>=0x^{<1>}=0,a^{<0>}=0x<1>=0,a<0>=0 ,現在你的第一個時間步得到的是所有可能的輸出是經過softmax層后得到的概率,然后根據這個softmax的分布進行隨機采樣。Softmax分布給你的信息就是第一個詞a的概率是多少,第一個詞是aaron的概率是多少,第一個詞是zulu的概率是多少,還有第一個詞是UNK(未知標識)的概率是多少,這個標識可能代表句子的結尾,然后對這個向量使用例如numpy命令,np.random.choice(上圖編號3所示),來根據向量中這些概率的分布進行采樣,這樣就能對第一個詞進行采樣了。
然后繼續下一個時間步,記住第二個時間步需要 y^<1>\hat{y}^{<1>}y^?<1> 作為輸入,而現在要做的是把剛剛采樣得到的 y^<1>\hat{y}^{<1>}y^?<1> 放到 a<2>a^{<2>}a<2> (上圖編號4所示),作為下一個時間步的輸入,所以不管你在第一個時間步得到的是什么詞,都要把它傳遞到下一個位置作為輸入,然后softmax層就會預測 y^<2>\hat{y}^{<2>}y^?<2> 是什么。舉個例子,假如說對第一個詞進行抽樣后,得到的是The,The作為第一個詞的情況很常見,然后把The當成 x<2>x^{<2>}x<2> ,現在 x<2>x^{<2>}x<2> 就是 y^<1>\hat{y}^{<1>}y^?<1> ,現在你要計算出在第一詞是The的情況下,第二個詞應該是什么(上圖編號5所示),然后得到的結果就是 y^<2>\hat{y}^{<2>}y^?<2> ,然后再次用這個采樣函數來對 y^<2>\hat{y}^{<2>}y^?<2> 進行采樣。
然后再到下一個時間步,無論你得到什么樣的用one-hot碼表示的選擇結果,都把它傳遞到下一個時間步,然后對第三個詞進行采樣。不管得到什么都把它傳遞下去,一直這樣直到最后一個時間步。
那么你要怎樣知道一個句子結束了呢?方法之一就是,如果代表句子結尾的標識在你的字典中,你可以一直進行采樣直到得到EOS標識(上圖編號6所示),這代表著已經抵達結尾,可以停止采樣了。另一種情況是,如果你的字典中沒有這個詞,你可以決定從20個或100個或其他個單詞進行采樣,然后一直將采樣進行下去直到達到所設定的時間步。不過這種過程有時候會產生一些未知標識(上圖編號7所示),如果你要確保你的算法不會輸出這種標識,你能做的一件事就是拒絕采樣過程中產生任何未知的標識,一旦出現就繼續在剩下的詞中進行重采樣,直到得到一個不是未知標識的詞。如果你不介意有未知標識產生的話,你也可以完全不管它們。
這就是你如何從你的RNN語言模型中生成一個隨機選擇的句子。直到現在我們所建立的是基于詞匯的RNN模型,意思就是字典中的詞都是英語單詞(下圖編號1所示)。
根據你實際的應用,你還可以構建一個基于字符的RNN結構,在這種情況下,你的字典僅包含從a到z的字母,可能還會有空格符,如果你需要的話,還可以有數字0到9,如果你想區分字母大小寫,你可以再加上大寫的字母,你還可以實際地看一看訓練集中可能會出現的字符,然后用這些字符組成你的字典(上圖編號2所示)。
如果你建立一個基于字符的語言模型,比起基于詞匯的語言模型,你的序列 y^<1>,y^<2>,y^<3>\hat{y}^{<1>},\hat{y}^{<2>},\hat{y}^{<3>}y^?<1>,y^?<2>,y^?<3> 在你的訓練數據中將會是單獨的字符,而不是單獨的詞匯。所以對于前面的例子來說,那個句子(上圖編號3所示),“Cats average 15 hours of sleep a day.”,在該例中C就是 y^<1>\hat{y}^{<1>}y^?<1> ,a就是 y^<2>\hat{y}^{<2>}y^?<2> ,t就是 y^<3>\hat{y}^{<3>}y^?<3> ,空格符就是 y^<4>\hat{y}^{<4>}y^?<4> 等等。
使用基于字符的語言模型有有點也有缺點,優點就是你不必擔心會出現未知的標識,例如基于字符的語言模型會將Mau這樣的序列也視為可能性非零的序列。而對于基于詞匯的語言模型,如果Mau不在字典中,你只能把它當作未知標識UNK。不過基于字符的語言模型一個主要缺點就是你最后會得到太多太長的序列,大多數英語句子只有10到20個的單詞,但卻可能包含很多很多字符。所以基于字符的語言模型在捕捉句子中的依賴關系也就是句子較前部分如何影響較后部分不如基于詞匯的語言模型那樣可以捕捉長范圍的關系,并且基于字符的語言模型訓練起來計算成本比較高昂。所以我見到的自然語言處理的趨勢就是,絕大多數都是使用基于詞匯的語言模型,但隨著計算機性能越來越高,會有更多的應用。在一些特殊情況下,會開始使用基于字符的模型。但是這確實需要更昂貴的計算力來訓練,所以現在并沒有得到廣泛地使用,除了一些比較專門需要處理大量未知的文本或者未知詞匯的應用,還有一些要面對很多專有詞匯的應用。
在現有的方法下,現在你可以構建一個RNN結構,看一看英文文本的語料庫,然后建立一個基于詞匯的或者基于字符的語言模型,然后從訓練的語言模型中進行采樣。
這里有一些樣本,它們是從一個語言模型中采樣得到的,準確來說是基于字符的語言模型,你可以在編程練習中自己實現這樣的模型。如果模型是用新聞文章訓練的,它就會生成左邊這樣的文本,這有點像一篇不太合乎語法的新聞文本,不過聽起來,這句“Concussion epidemic”,to be examined,確實有點像新聞報道。用莎士比亞的文章訓練后生成了右邊這篇東西,聽起來很像是莎士比亞寫的東西:
“The mortal moon hath her eclipse in love.
And subject of this thou art another this fold.
When besser be my love to me see sabl’s.
For whose are ruse of mine eyes heaves.”
這些就是基礎的RNN結構和如何去建立一個語言模型并使用它,對于訓練出的語言模型進行采樣。在之后的視頻中,我想探討在訓練RNN時一些更加深入的挑戰以及如何適應這些挑戰,特別是梯度消失問題來建立更加強大的RNN模型。下節課,我們將談到梯度消失并且會開始談到GRU,也就是門控循環單元和LSTM長期記憶網絡模型。
課程板書
| 1.6 語言模型和序列生成 | 回到目錄 | 1.8 帶有神經網絡的梯度消失 |
總結
以上是生活随笔為你收集整理的1.7 对新序列采样-深度学习第五课《序列模型》-Stanford吴恩达教授的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 1.6 语言模型和序列生成-深度学习第五
- 下一篇: 1.9 GRU 单元-深度学习第五课《序