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