吴恩达老师深度学习视频课笔记:循环神经网络
Why sequence models?:序列數(shù)據(jù)例子,如下圖:(1).語(yǔ)音識(shí)別(speech recognition):給定一個(gè)輸入音頻片段X,并要求輸出片段對(duì)應(yīng)的文字記錄Y,這里輸入和輸出都是序列數(shù)據(jù)(sequence data)。因?yàn)閄是按時(shí)序播放的音頻片段,輸出Y是一系列單詞。(2). 音樂(lè)生成(music generation):只有輸出數(shù)據(jù)Y是序列;輸入數(shù)據(jù)可以是空集,也可以是單一的整數(shù),這個(gè)數(shù)可能指代你想要生成的音樂(lè)風(fēng)格,也可能是你想要生成的那首曲子的頭幾個(gè)音符。無(wú)論怎樣,輸入X可以是空的或者就是某個(gè)數(shù)字,然輸入Y是一個(gè)序列。(3). 情感分類(sentiment classification):輸入數(shù)據(jù)X是序列。(4). DNA序列分析(DNA sequence analysis);(5). 機(jī)器翻譯(machine translation);(6).視頻行為識(shí)別(video activity recognition);(7). 命名實(shí)體識(shí)別(name entity recognition):可能會(huì)給出一個(gè)句子,要求識(shí)別出句中的人名。所有這些問(wèn)題都可以被稱作使用標(biāo)簽數(shù)據(jù)(X,Y)作為訓(xùn)練集的監(jiān)督學(xué)習(xí)。序列問(wèn)題可以有很多不同的類型,有些問(wèn)題里輸入X和輸出數(shù)據(jù)Y都是序列,但是X和Y有時(shí)也會(huì)有不一樣的長(zhǎng)度。在一些問(wèn)題里,只有X或Y是序列。
符號(hào)(Notation):使用x<t>來(lái)索引序列中的位置,t意味著它們是時(shí)序序列;使用Tx來(lái)表示輸入序列的長(zhǎng)度;使用Ty來(lái)表示輸出序列的長(zhǎng)度;Tx和Ty可以有不同的長(zhǎng)度;x(i)<t>來(lái)表示訓(xùn)練樣本i的輸入序列中第t個(gè)元素;Tx(i)來(lái)表示第i個(gè)訓(xùn)練樣本的輸入序列長(zhǎng)度;y(i)<t>來(lái)表示訓(xùn)練樣本i的輸出序列中第t個(gè)元素;Ty(i)來(lái)表示第i個(gè)訓(xùn)練樣本的輸出序列長(zhǎng)度。
自然語(yǔ)言處理(Natural Language Processing, NLP)怎樣表示一個(gè)序列里單獨(dú)的單詞,如下圖:想要表示一個(gè)句子里的單詞,第一件事是做一張?jiān)~表,有時(shí)也稱為詞典(dictionary),意思是列一列你的表示方法中要用到的單詞,如第一個(gè)單詞是a,第二個(gè)單詞是aaron,等等,用了10000個(gè)單詞大小的詞典。一般常見的詞典大小為30000到50000,有的也會(huì)用百萬(wàn)詞典。接下來(lái)你可以用one-hot表示法來(lái)表示詞典里的每個(gè)單詞,x<t>指代句子里的任意詞,它就是個(gè)one-hot向量,是因?yàn)橹挥幸粋€(gè)值是1,其余值都是0。
循環(huán)神經(jīng)網(wǎng)絡(luò)模型:命名實(shí)體識(shí)別不能使用標(biāo)準(zhǔn)神經(jīng)網(wǎng)絡(luò)的原因:(1). 輸入和輸出數(shù)據(jù)在不同例子中可以有不同的長(zhǎng)度;(2). 一個(gè)單純的神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)并不共享從文本的不同位置上學(xué)到的特征。而循環(huán)神經(jīng)網(wǎng)絡(luò)針對(duì)序列數(shù)據(jù)就沒(méi)有以上兩個(gè)缺點(diǎn)。
循環(huán)神經(jīng)網(wǎng)絡(luò),如下圖:假如你從左往右的順序讀句子,第一個(gè)單詞假如是x<1>,將第一個(gè)詞輸入一個(gè)神經(jīng)網(wǎng)絡(luò)層,然后嘗試預(yù)測(cè)輸出y<1>,判斷這是否是人名的一部分。循環(huán)神經(jīng)網(wǎng)絡(luò)做的是,當(dāng)它讀到句中的第二單詞時(shí),假如是x<2>,它不是僅用x<2>就預(yù)測(cè)出y<2>,它也會(huì)輸入一些來(lái)自時(shí)間步(time-step)1的信息。具體而言,時(shí)間步1的激活值就會(huì)傳遞到時(shí)間步2。然后,在下一個(gè)時(shí)間步,循環(huán)神經(jīng)網(wǎng)絡(luò)輸入單詞x<3>,然后它嘗試輸出預(yù)測(cè)結(jié)果y<3>,等等。一直到最后一個(gè)時(shí)間步,輸入x<Tx>,然后輸出y<Ty>.在這個(gè)例子中Tx=Ty,如果Tx!=Ty那么這個(gè)網(wǎng)絡(luò)結(jié)構(gòu)需要作出一些改變。在每一個(gè)時(shí)間步中,循環(huán)神經(jīng)網(wǎng)絡(luò)傳遞一個(gè)激活值到下一個(gè)時(shí)間步中用于計(jì)算。要開始整個(gè)流程,我們?cè)诹銜r(shí)刻,需要編造一個(gè)激活值,這通常是零向量。也有些研究員會(huì)隨機(jī)用其它方法初始化a<0>,不過(guò)使用零向量作為零時(shí)刻的偽激活值是最常見的選擇。循環(huán)神經(jīng)網(wǎng)絡(luò)的畫法一般有兩種,一種是分步畫法,一種是圖表畫法。循環(huán)神經(jīng)網(wǎng)絡(luò)是從左向右掃描數(shù)據(jù),同時(shí)每個(gè)時(shí)間步的參數(shù)也是共享的。我們用wax來(lái)表示從x<1>到隱藏層的連接,每個(gè)時(shí)間步使用的都是相同的參數(shù)Wax,而激活值也就是水平連接是由參數(shù)waa決定的,同時(shí)每一個(gè)時(shí)間步都使用相同的參數(shù)waa,同樣的,輸出結(jié)果由wya決定。在這個(gè)循環(huán)神經(jīng)網(wǎng)絡(luò)中,它的意思是在預(yù)測(cè)y<3>時(shí),不就要使用x<3>的信息,還要使用來(lái)自x<1>和x<2>的信息。因?yàn)閬?lái)自x<1>的信息可以通過(guò)這樣的路徑來(lái)幫助預(yù)測(cè)y<3>。這個(gè)循環(huán)神經(jīng)網(wǎng)絡(luò)的一個(gè)缺點(diǎn)就是,它只使用了這個(gè)序列中之前的信息來(lái)做出預(yù)測(cè),尤其,當(dāng)預(yù)測(cè)y<3>時(shí)它沒(méi)有用到x<4>,x<5>,x<6>等等的信息,所以這就有一個(gè)問(wèn)題。所以這個(gè)特定的神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)的一個(gè)限制是它在某一個(gè)時(shí)刻的預(yù)測(cè)僅使用了從序列中之前的輸入信息并沒(méi)有使用序列中后部分的信息。雙向循環(huán)神經(jīng)網(wǎng)絡(luò)(BRNN)可以處理這個(gè)問(wèn)題。
循環(huán)神經(jīng)網(wǎng)絡(luò)前向傳播(forward propagation):一般開始先輸入a<0>,它是一個(gè)零向量,接著,這就是前向傳播過(guò)程,循環(huán)神經(jīng)網(wǎng)絡(luò)經(jīng)常選用tanh作為激活函數(shù),有時(shí)也會(huì)用ReLu等,選用哪個(gè)激活函數(shù)是取決于你的輸出y。它的公式如下:
下圖是RNN前向傳播的簡(jiǎn)單公式:
Backpropagation through time:如下圖,反向傳播的計(jì)算方向與前向傳播基本上是相反的。前向傳播計(jì)算:假入一個(gè)輸入序列,x<1>,x<2>,x<3>,…,x<Tx>,然后用x<1>和a<0>計(jì)算出時(shí)間步(time step)的激活項(xiàng)a<1>,再用x<2>和a<1>計(jì)算出a<2>,然后再計(jì)算出a<3>,一直到a<Tx>。為了真正計(jì)算出a<1>,還需要一些參數(shù),wa和ba。這些參數(shù)在之后的每個(gè)時(shí)間步都會(huì)被用到,于是繼續(xù)用這些參數(shù)計(jì)算出a<2>,a<3>等等。所有的這些激活項(xiàng)最后都要取決于參數(shù)wa和ba.有了a<1>神經(jīng)網(wǎng)絡(luò)就可以計(jì)算第一個(gè)預(yù)測(cè)輸出y<1>,接著到下一個(gè)時(shí)間步繼續(xù)計(jì)算出y<2>,y<3>等等一直到y(tǒng)<Ty>。為了計(jì)算y,你需要參數(shù)wy和by,它們被用于y的所有節(jié)點(diǎn)。然后為了計(jì)算反向傳播,還需要一個(gè)損失函數(shù),如標(biāo)準(zhǔn)logistic回歸損失函數(shù),也叫交叉熵(cross entropy)損失函數(shù)。通過(guò)y<1>可以計(jì)算對(duì)應(yīng)的損失函數(shù),即第一個(gè)時(shí)間步的損失函數(shù)L<1>,第二個(gè)時(shí)間步的損失函數(shù)L<2>,一直到最后一個(gè)時(shí)間步的損失函數(shù)L<Ty>。最后為了計(jì)算出總體的損失函數(shù)要把它們都加起來(lái)。然后通過(guò)公式計(jì)算出最后的L。反向傳播算法需要在相反的方向上進(jìn)行計(jì)算和傳遞。在這之后你就可以計(jì)算出所有合適的量,然后就可以通過(guò)導(dǎo)數(shù)相關(guān)的參數(shù)用梯度下降法來(lái)更新參數(shù)。
???????? 不同類型的循環(huán)神經(jīng)網(wǎng)絡(luò):如下圖,(1). 多對(duì)多結(jié)構(gòu)(many-to-many architecture):因?yàn)檩斎胄蛄杏泻芏嗟妮斎攵敵鲂蛄幸灿泻芏噍敵觥?2). 多對(duì)一結(jié)構(gòu)(many-to-one architecture):因?yàn)樗泻芏嗟妮斎?#xff0c;然后輸出一個(gè)數(shù)字。(3). 一對(duì)一結(jié)構(gòu)(one-to-one architecture):類似于一個(gè)小型的標(biāo)準(zhǔn)的神經(jīng)網(wǎng)絡(luò),輸入x然后得到輸出y。(4). 一對(duì)多結(jié)構(gòu):如音樂(lè)生成。多對(duì)多結(jié)構(gòu)可以是輸入和輸出長(zhǎng)度是不同的,如機(jī)器翻譯。
?Language model and sequence generation: 用RNN構(gòu)建一個(gè)語(yǔ)言模型。什么是語(yǔ)言模型,如下圖,一個(gè)好的語(yǔ)音識(shí)別系統(tǒng)能夠識(shí)別出非常相似的兩句話。語(yǔ)言識(shí)別系統(tǒng)使用一個(gè)語(yǔ)言模型計(jì)算出相似的兩句話各自的可能性,比如概率值,某個(gè)特定的句子出現(xiàn)的概率是多少。語(yǔ)言模型所做的基本工作就是:輸入一個(gè)句子,準(zhǔn)確地說(shuō)是一個(gè)文本序列,y<1>,y<2>,一直到y(tǒng)<Ty>,然后語(yǔ)言模型會(huì)估計(jì)某個(gè)句子序列中各個(gè)單詞出現(xiàn)的可能性。
???????? 如何建立一個(gè)語(yǔ)言模型:如下圖,為了使用RNN建立出這樣的模型,首先需要一個(gè)訓(xùn)練集,包含一個(gè)很大的英文文本語(yǔ)料庫(kù),或者其它的你想用于構(gòu)建模型的語(yǔ)言的語(yǔ)料庫(kù),語(yǔ)料庫(kù)(word corpus)是自然語(yǔ)言處理(NLP)的一個(gè)專有名詞,意思就是很長(zhǎng)的或者說(shuō)數(shù)量眾多的英文句子組成的文本。比如你在訓(xùn)練集中得到這么一句話,Cats average 15 hours of sleep a day,你要做的第一件事就是將這個(gè)句子標(biāo)記化,意思就是建立一個(gè)字典,然后將每個(gè)單詞都轉(zhuǎn)換成對(duì)應(yīng)的one-hot向量,也就是字典中的索引,可能還有一件事就是你要定義句子的結(jié)尾,一般的做法就是增加一個(gè)額外的標(biāo)記叫做EOS,它表示句子的結(jié)尾。這樣能夠幫你搞清楚一個(gè)句子什么時(shí)候結(jié)束。EOS標(biāo)記可以被附加到訓(xùn)練集中每一個(gè)句子的結(jié)尾,這樣你可以使你的模型能夠準(zhǔn)確識(shí)別句子的結(jié)尾。在標(biāo)記化的過(guò)程中,你可以自己決定要不要把標(biāo)點(diǎn)符號(hào)看成是標(biāo)記。下圖中忽略標(biāo)點(diǎn)符號(hào)。如果你的訓(xùn)練集中有一些詞并不在你的字典中,此時(shí)可以把不在字典中的詞替換成一個(gè)叫做UNK的代表未知詞的標(biāo)志。我們只針對(duì)UNK建立概率模型而不針對(duì)這個(gè)具體的詞。完成標(biāo)志化的過(guò)程后,這意味著將輸入的句子都映射到了各個(gè)標(biāo)志上或者說(shuō)字典中的各個(gè)詞上。
下一步,我們要建立一個(gè)RNN來(lái)構(gòu)建這些序列的概率模型。如下圖,在第0個(gè)時(shí)間步,你要計(jì)算激活項(xiàng)a<1>,它是以x<1>作為輸入的函數(shù),而x<1>會(huì)被設(shè)為全為0的集合,也就是0向量,在之前的a<0>按照慣例也設(shè)為0向量,于是a<1>要做的就是通過(guò)softmax進(jìn)行一些預(yù)測(cè)來(lái)計(jì)算出第一個(gè)詞可能會(huì)是什么,其結(jié)果就是y<1>,這一步其實(shí)就是通過(guò)softmax層來(lái)預(yù)測(cè)字典中的任意單詞,會(huì)是第一個(gè)詞的概率,所以y<1>的輸出是softmax的計(jì)算結(jié)果,它只是預(yù)測(cè)第一個(gè)詞的概率,而不去管結(jié)果是什么。如果字典大小是10000,那么softmax層可能輸出10000種結(jié)果,也有可能是10002種結(jié)果,因?yàn)槟氵€可能加上了未知詞和句子結(jié)尾這兩個(gè)額外的標(biāo)志。然后RNN進(jìn)入下一個(gè)時(shí)間步,在下一個(gè)時(shí)間步中,使用激活項(xiàng)a<2>,在這步要做的是計(jì)算出第二詞會(huì)是什么,現(xiàn)在依然傳給它正確的第一個(gè)詞,我們會(huì)告訴它第一個(gè)詞就是Cats,也就是y<1>,這就是為什么x<2>=y<1>,然后在第二個(gè)時(shí)間步中,輸出結(jié)果同樣經(jīng)過(guò)softmax層進(jìn)行預(yù)測(cè)。然后再進(jìn)行RNN的下一個(gè)時(shí)間步,現(xiàn)在要計(jì)算a<3>,為了預(yù)測(cè)第3個(gè)詞,我們現(xiàn)在給它前兩個(gè)詞,告訴它Cats average是句子的前兩個(gè)詞,所以這個(gè)輸入x<3>=y<2>,現(xiàn)在要計(jì)算序列中下一個(gè)詞是什么。以此類推,一直到最后第9個(gè)時(shí)間步,然后把x<9>=y<8>,它會(huì)輸出y<9>,最后得到的結(jié)果會(huì)是EOS標(biāo)志。所以RNN中的每一步都會(huì)考慮前面得到的單詞,比如給它前3個(gè)單詞,讓它給出下個(gè)詞的分布,這就是RNN如何學(xué)習(xí),從左到右每次預(yù)測(cè)一個(gè)詞。接下來(lái),為了訓(xùn)練這個(gè)網(wǎng)絡(luò),我們要定義代價(jià)函數(shù)(cost function)。
Sampling novel sequences(對(duì)新序列采樣):在你訓(xùn)練一個(gè)序列模型之后,要想了解這個(gè)模型學(xué)到了什么,一種非正式的方法就是進(jìn)行一次新序列采樣。如下圖,一個(gè)序列模型模擬了任意特定單詞序列的概率。我們所要做的就是對(duì)這個(gè)概率分布進(jìn)行采樣來(lái)生成一個(gè)新的單詞序列。為了進(jìn)行采樣,第一步要做的就是對(duì)你想要模型生成的第一個(gè)詞進(jìn)行采樣。于是你輸入x<1>=0,a<0>=0,現(xiàn)在你的第一個(gè)時(shí)間步得到的是所有可能的輸出,是經(jīng)過(guò)softmax層后得到的概率,然后根據(jù)這個(gè)softmax的分布進(jìn)行隨機(jī)采樣。softmax分布給你的信息就是第一個(gè)詞是a的概率是多少,第一個(gè)詞是aaron的概率是多少,等等,還有第一個(gè)詞是未知標(biāo)志的概率是多少。根據(jù)向量中這些概率的分布進(jìn)行采樣,這樣就能對(duì)第一個(gè)詞進(jìn)行采樣得到y(tǒng)’<1>。然后繼續(xù)下一個(gè)時(shí)間步,第二個(gè)時(shí)間步需要y<1>作為輸入,而現(xiàn)在要做的是把剛剛采樣得到的y’<1>作為第二個(gè)時(shí)間步的輸入,然后sotfmax層就會(huì)預(yù)測(cè)y’<2>是什么。然后再到下一個(gè)時(shí)間步,無(wú)論你得到什么樣的選擇結(jié)果都把它傳遞到下一個(gè)時(shí)間步,一直這樣直到最后一個(gè)時(shí)間步。這就是你如何從你的RNN語(yǔ)言模型中生成一個(gè)隨機(jī)選擇的句子。以上是基于詞匯的RNN模型,意思就是字典中的詞都是英語(yǔ)單詞。
???????? 根據(jù)你實(shí)際的需要,你還可以構(gòu)建一個(gè)基于字符的RNN模型。在這種情況下,你的字典僅包含從a到z的字母,可能還會(huì)有空格符,還可以有數(shù)字0到9,如果想?yún)^(qū)分大小寫字母,還可以再加上大寫的字母,還可以看看實(shí)際訓(xùn)練集中可能會(huì)出現(xiàn)的字符,然后用這些字符組成你的字典。如果你建立一個(gè)基于字符的語(yǔ)言模型比起基于詞匯的語(yǔ)言模型,你的序列y<1>,y<2>,y<3>等在訓(xùn)練數(shù)據(jù)中都將是單獨(dú)的字符而不是單獨(dú)的詞匯。自然語(yǔ)言處理的趨勢(shì)都是基于詞匯的語(yǔ)言模型。
???????? Vanishing gradients(梯度消失) with RNNs:基本的RNN算法會(huì)存在梯度消失的問(wèn)題。以語(yǔ)言模型為例,如下圖,基本的RNN不擅長(zhǎng)處理長(zhǎng)期依賴(long-term dependencies)的問(wèn)題。如果出現(xiàn)梯度爆炸的問(wèn)題(導(dǎo)數(shù)值很大或出現(xiàn)了NaN)一個(gè)解決方法就是用梯度修剪(gradient clipping)。梯度修剪的意思就是觀察你的梯度向量,如果它大于某個(gè)閾值就縮放梯度向量,保證它不會(huì)太大。
???????? Gated Recurrent Unit(GRU,門控循環(huán)單元):GRU改變了RNN的隱藏層,使其可以更好地捕捉深層連接并改善了梯度消失問(wèn)題,如下圖:
???????? LSTM(long short term memory) unit:LSTM有時(shí)比GRU更有效。LSTM比GRU出現(xiàn)的早。GRU的優(yōu)點(diǎn)是模型更加簡(jiǎn)單,更容易創(chuàng)建一個(gè)更大的網(wǎng)絡(luò),它只有兩個(gè)門,在計(jì)算性上,也運(yùn)行的更快,它可以擴(kuò)大模型的規(guī)模。但是LSTM更加強(qiáng)大和靈活,它有三個(gè)門而不是兩個(gè)。GRU和LSTM的主要公式如下圖:
???????? Bidirectional(雙向) RNN:這個(gè)模型可以讓你序列的某點(diǎn)處不僅可以獲取之前的信息還可以獲取未來(lái)的信息。如下圖,給定一個(gè)輸入序列x<1>到x<4>,這個(gè)序列首先計(jì)算前向的a<1>,然后計(jì)算前向的a<2>,接著a<3>,a<4>。而反向序列,從a<4>開始,反向進(jìn)行,計(jì)算反向的a<3>,計(jì)算完了反向的a<3>后可以用這些激活值計(jì)算反向的a<2>,?然后是反向的a<1>.把所有的這些激活值都計(jì)算完了,就可以預(yù)測(cè)計(jì)算結(jié)果了。比如時(shí)間步3的預(yù)測(cè)結(jié)果,信息從x<1>過(guò)來(lái),流經(jīng)前向的a<1>到前向的a<2>,到前向的a<3>,再到y(tǒng)<3>,所以從x<1>,x<2>,x<3>來(lái)的信息都會(huì)考慮在內(nèi)。而從x<4>來(lái)的信息,會(huì)流過(guò)反向的a<4>,到反向的a<3>再到y(tǒng)<3>,這樣使得時(shí)間步3的預(yù)測(cè)結(jié)果不僅輸入了過(guò)去的信息還有現(xiàn)在的信息。這一步涉及了前向和反向的傳播信息以及未來(lái)的信息。這就是雙向循環(huán)神經(jīng)網(wǎng)絡(luò),并且這些基本單元不僅僅是標(biāo)準(zhǔn)的RNN單元也可以是GRU單元或LSTM單元。這個(gè)雙向RNN網(wǎng)絡(luò)模型的缺點(diǎn)是你需要完整的數(shù)據(jù)的序列你才能預(yù)測(cè)任意位置。比如說(shuō),你要構(gòu)建一個(gè)語(yǔ)音識(shí)別系統(tǒng),那么雙向RNN模型需要你考慮整個(gè)語(yǔ)音表達(dá),但是如果直接用這個(gè)去實(shí)現(xiàn)的話,你需要等待這個(gè)人說(shuō)完,然后獲取整個(gè)語(yǔ)音表達(dá)才能處理這段語(yǔ)音并進(jìn)一步做語(yǔ)音識(shí)別。
???????? Deep RNNs:深層神經(jīng)網(wǎng)絡(luò),如下圖,用a[l]<t>來(lái)表示第t個(gè)時(shí)間點(diǎn)第l層的激活值:
?
GitHub:?https://github.com/fengbingchun/NN_Test
總結(jié)
以上是生活随笔為你收集整理的吴恩达老师深度学习视频课笔记:循环神经网络的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: SSHDroid及sshpass简介
- 下一篇: 吴恩达老师深度学习视频课笔记:自然语言处