四、循环神经网络
- 1.1 循環神經網絡與應用
 - 1.2 循環神經網絡模型
 - 1.3 BPTT算法
 - 1.4 圖像描述
 - 1.5 LSTM(Long Short Time Memory)
 - 1.6 LSTM為什么不會比RNN更容易出現梯度消失
 - 1.7 LSTM的變體
- 1.7.1 讓門層也接收細胞狀態的輸入
 - 1.7.2 通過使用couple忘記和輸入門
 - 1.7.3 GRU(Gated Recurrent Unit)
 
 
1.1 循環神經網絡與應用
模仿論文
利用標記序列將論文寫成一個序列
模仿linux內核代碼“寫程序”
學習到函數的定義方式,函數語句,括號,判斷方式,寫出的程序可能沒有實際意義,但可以學到格式。
模仿某個詩詞類型寫作
本質上學習的是一個統計的東西
機器翻譯
看圖說話
1.2 循環神經網絡模型
很多任務的輸入和輸出之間是相關的,RNN引入記憶的概念,也就是其輸出依賴于此時的“輸入”和之前的“記憶”。
循環/遞歸:每個元素(cell)都會執行相同的任務,所以每次變更的就是輸入和記憶。
循環神經網絡是將有很多層的網絡疊加起來,按時間展開之后如下:
示例:語言模型
語言模型會學習中文的表達方式,會學習哪些詞在一起出現的概率高,在知道前n個序列之后,推斷出下一個時刻可能出現的序列。
比如:我+是+中國+,判斷后面出現的哪個詞的概率最高
循環神經網絡的結構:
舉例說明:五年級為止,你學習到的知識時由五年級學到的知識和前四年學到的知識的組合
如何將知識做一個組合:
- 傳統的感知器是給每個知識乘以一個權值,得到最終的結果
 - RNN也是一樣,將五年級的知識賦權值U,和前四年的記憶賦權值W,來組合信息
 - f是激活函數,五年級學到的東西更高級,也更重要(比如乘法的計算優于加法),所以激活函數是起到過濾的作用,非線性處理。
 
RNN的過程:
現在已有了前t?1t?1個樣本積累的記憶St?1St?1
tt時刻的輸入為XtXt
計算tt時刻的新的記憶:St=tanh(UXt+WSt?1)St=tanh(UXt+WSt?1)
計算tt時刻的輸出,也就是對tt時刻的新的記憶進行softmax映射Ot=softmax(VSt)Ot=softmax(VSt),判斷出詞典中的哪個詞最可能在下一時刻出現。
RNN的細節:
不同類型的RNN:
1、雙向RNN:
有些情況,當前的輸出不僅僅依賴于之前的序列,還可能依賴于后面的序列,比如完形填空,剔除中間的詞,要補全的話,要利用雙向的信息。
備注:此處的hh即為前面的SS
h→h→:表示從左往右迭代的結果
h←h←:是從右往左左迭代的結果
ytyt:原本是100x1的向量,現在變為了100x2的向量,兩個合并,變為一個矩陣,c為偏置,
2、雙向深層RNN:
由單層變為多層
1.3 BPTT算法
Back propagation through time,依據時間的反向傳播
總的損失函數=t個時刻的損失函數之和:
E(y,y^)=∑tEt(yt,y^t)=?∑ytlogy^tE(y,y^)=∑tEt(yt,y^t)=?∑ytlogy^t
t時刻的損失函數如下:
Et(yt,y^t)=?ytlogy^tEt(yt,y^t)=?ytlogy^t
預測過程,假設詞典有4w個詞 ,利用softmax來預測哪個詞最有可能是當前時刻會出現的詞。
每個時間點的輸出都會計算一個損失函數——Et(yt,y^t)Et(yt,y^t),
標簽yy:[0 0 0 1 0 0 0 0 …0](4000x1的向量)
預測y^y^:[0.2 ,0.0001 , 0.0004,…,](4000x1的向量)
整個時間軸的損失就是所有時刻的損失值的和E(y,y^)E(y,y^)
利用隨機梯度下降法最小化損失函數,對w求偏導,不能直接用BP,要用BPTT
?E?W=∑t?Et?W?E?W=∑t?Et?W
 
 假如求第三個位置的偏導,利用鏈式法則:
?E3?W=?E3?y^3?y^3?s3?s3?W?E3?W=?E3?y^3?y^3?s3?s3?W
又因為:
s3=tanh(Uxt+Ws2)s3=tanh(Uxt+Ws2)根據鏈式法則有:
?E3?W=∑k=03?E3?y^3?y^3?s3?s3?sk?sk?W?E3?W=∑k=03?E3?y^3?y^3?s3?s3?sk?sk?W也就是:
?E3?W=∑k=03?E3?y^3?y^3?s3(∏j=k+13?s3?sj?1)?sk?W?E3?W=∑k=03?E3?y^3?y^3?s3(∏j=k+13?s3?sj?1)?sk?W
沿著時間軸的反向傳播,對當前時刻的記憶求導,當前時刻的記憶和前一時刻的記憶有關,要追溯前面所有的記憶。
但是隨著時間間隔不斷增大,RNN會喪失學習到連接很遠的信息的能力,也就是出現梯度消失,原因如下:
RNN的激活函數tanh可以將所有值映射到-1~1之間,以及在利用梯度下降算法調優時利用鏈式法則,會造成很多小于1的項連乘很快逼近于0,造成梯度消失情況,網絡無法訓練。
因為為了避免梯度爆炸的發生,我們不能利用Relu函數作為激活函數
合適的初始化矩陣W可以適當的減小梯度消失的現象,正則化也能起到作用,更好的方案是采用長短時記憶LSTM或門限遞歸單元(GRU)結構。
1.4 圖像描述
1、利用CNN提取圖像特征
利用AlexNet前饋,得到一個4096x1維的向量,向量中包含了圖像的很有用的信息,也就是利用CNN提取圖像的特征。
2、利用RNN進行文本描述
未加入圖像信息V之前的狀態:
St=tanh(Wxh?Xt+Whh?St?1)St=tanh(Wxh?Xt+Whh?St?1)
加入了圖像信息V之后的狀態:
St=tanh(Wxh?Xt+Whh?St?1+Wih?V)St=tanh(Wxh?Xt+Whh?St?1+Wih?V)
要在考慮當前文本XtXt和之前狀態St?1St?1的情況下,同時考慮圖像的特征信息VV,w都是權重矩陣。
加入圖像的信息只在第一步進行,后面的步驟不再添加圖像信息。
1.5 LSTM(Long Short Time Memory)
如果存儲記憶的矩陣是有限的,那么不能對以前的記憶進行很好的保存,離得越遠,忘得東西越多。
LSTM是RNN的一種,區別如下:LSTM的記憶細胞(cell)被更改了,需要記住的東西會一直往下傳,不需要記住的東西被“gate”截斷。
RNN的記憶細胞:
LSTM的記憶細胞:包括輸入、忘記、輸出門
下圖粗線表示從上一時刻的記憶到這一時刻的記憶的傳遞,有些少量的線性交互。
LSTM如何控制“細胞狀態”:門
門:讓信息選擇性通過,來去除或增加信息到細胞狀態
比如sigmoid函數,讓輸出變為(0~1)的概率,之后利用該概率和信息量的乘積來控制每個部分有多少的量可以通過,“0”表示不允許任何量通過,“1”表示允許任意量通過。
第一步:忘記門:利用sigmoid函數將數據轉換到[0,1]之間,利用概率來選擇留下的部分
利用前一時刻的記憶和當前時刻的輸入的sigmoid映射結果,獲得一個概率,該概率決定了多大程度的信息能夠留下來。
第二步:輸入門:既然過濾掉了一部分信息,則決定放什么新信息到“細胞狀態中”
C~tC~t:當前t時刻的記憶(相當于六年級學的新的知識)
C~t=tanh(WC?[ht?1,xt]+bc)C~t=tanh(WC?[ht?1,xt]+bc)
itit:確定概率p,利用該概率確定應該補充到新記憶中的記憶,新知識加到記憶中的概率。
判斷t時刻學習到的東西對新的記憶起到多大的作用,也就是將t時刻學到的東西加到t-1學到的東西,利用i_t來過濾,確定哪些新東西是要補充到以前的記憶中,獲得新的記憶。 
 
sigmoid層決定什么值需要更新,Tanh層創建一個新的要添加的候選值向量
第三步:更新“細胞狀態”
將舊的記憶Ct?1Ct?1更新為新記憶CtCt
- ftft:舊狀態的通過率
 - itit:新知識的篩選器,確定哪些新知識要添加到記憶中
 
Ct=ft?Ct?1+it?C~tCt=ft?Ct?1+it?C~t
對舊的信息利用概率,保留一部分有用的信息,同時確定新的學習到的知識中用哪些來更新記憶
第四步:基于“細胞狀態”得到輸出,利用tanh得到細胞狀態[-1,1],再和sigmoid輸出相乘,確定需要的輸出值
ht=ot?tanh(Ct)ht=ot?tanh(Ct)
其中, otot為篩選出的真正能解決該問題的知識, htht為最終的結果
ot=σ(Wo[ht?1,xt]+bo)ot=σ(Wo[ht?1,xt]+bo)
sigmoid:當前信息的篩選,sigmoid輸出的0~1的概率確定信息保留率
relu的話信息會全部過去,造成信息爆炸
tanh輸出為[-1,1],不能輸出概率
tanh:當前新信息的保留,保證輸出都在一個范圍內
1.6 LSTM為什么不會比RNN更容易出現梯度消失
RNN的記憶更新會出現連乘的形式,而且激活函數用到tanh,網絡深度越深,會出現梯度消失,網絡無法學習。
St=tanh(W?Xt+U?ST?1)St=tanh(W?Xt+U?ST?1)
LSTM將梯度利用兩路傳遞,將連乘的形式變成的連乘+求和的形式,保證了梯度更好的回傳,即使一項的導數約等于0,另一項的導數也不為0。
1.7 LSTM的變體
1.7.1 讓門層也接收細胞狀態的輸入
1.7.2 通過使用couple忘記和輸入門
LSTM本是分開確定要忘記和添加的信息,這里是一次完成概率的求解,添加的概率為p,忘記概率1-p。
1.7.3 GRU(Gated Recurrent Unit)
將忘記門和輸入門合成了一個單一的更新門。
RNN代碼 
 LSTM代碼
總結