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