1、RNN基本結構網絡
普通神經網絡不能處理時間序列的信息,只能割裂的單個處理,同時普通神經網絡若是用來處理文本信息的話,參數數目將是很是龐大,由於若是採用one-hot表示詞的話,維度很是大。dom
RNN能夠解決這兩個問題:函數
1)RNN屬於循環神經網絡,當從左到右讀取文本信息的時候,上一時刻的狀態輸出能夠傳遞到下一時刻,例如上圖的a表示狀態,a(1)向下傳遞,這樣就考慮了前面的信息,若是是雙向RNN的話,上下文都考慮進去了。this
2)RNN參數是共享的。爲方便理解,上述圖示是展開的RNN結構,其實RNN只有一個循環體,一組共享參數。spa
上述圖是一個最基本的RNN結構,a<T>表明不一樣時刻的狀態,a0是一個初始化的零時刻的狀態,能夠設置爲零向量;x<T>表明不一樣時刻的輸入,y<T>表明不一樣時刻的輸出,計算公式以下:翻譯
其中g爲激活函數。設計
2、反向傳播3d
1)計算損失code
以命名實體識別做爲例子,若是是地名就爲1,不是地名就爲0。輸入是一句文本信息X=[he come from NewYork],輸出一組Y=[0,0,0,1],X與Y的長度一致。模型預測的輸出就是該輸入x是地名的機率值,好比0.2,因此其實就是一個二分類問題,損失函數能夠採用標準的邏輯迴歸損失或者說交叉熵損失。blog
第一個是元素級別的損失,也就是單個時刻的損失,第二個是總體序列的損失。
2)反向傳播更新參數
由於RNN是一個循環體,其展開形式就是上述圖所示,由於後面的狀態a與輸出y都依賴於前面的計算獲得的,因此在進行反向傳播的時候,跟普通神經網絡同樣,須要一層層向後利用梯度降低法計算梯度,並更新參數。與普通神經網絡更新參數不一樣的一點就是,RNN由於是共享參數,因此在進行反向傳播的時候,每傳播一層更新的都是同一組參數。
3、其它形式的RNN結構
以前講的例子是屬於many-to-many的形式,且輸入X與輸出Y的長度相等,這種形式適合解決序列標註問題。還有其它形式的RNN結構
1)many-to-one (情感分析問題)
情感分析問題的輸入是一個連續序列,例如對電影的描述「There is nothing to like in this movie」,而輸出y=1/0,表示正面與負面;或者y=1,2,3,4,5表示對電影的評分等級,這種結構設計以下形式:
2)one-to-many(音樂生成)
輸入x爲一個整數,表示你想要的音樂類型或者是你想要的音樂的第一個音符;輸出Y是一段生成的音樂。這種結構輸入是一個x,輸出是多個y。
3)many-to-many(機器翻譯)
文章開頭講的結構也屬於many-to-many形式,可是那種形式X與Y的長度是一致的,適合解決序列標註的問題。此次的many-to-many是輸入X與Y長度不一致的狀況,例如機器翻譯。其結構以下:
前面一部分叫作encoder,分別輸入x和狀態a;後面一部分叫作decoder,Y直到輸出爲EOS結束。
4、用RNN訓練一個語言模型
所謂語言模型,就是輸入一句話,能得出這句話出現的機率。例以下面的這句話:
在訓練的時候會從左到右一個個讀取:
每個輸出y<t>,會經過softmax函數得出長度爲字典長度|v|的向量,表示預測爲每個詞的機率。後面的輸入爲前面的一個詞,例如x<2>的輸入就是cat,表示在前一個詞爲cat,後一個詞輸出爲average的機率是多少,所以每個詞的輸出都考慮了前面詞的信息。
輸出y<t>已經通過softmax層了,因此採用交叉熵計算損失便可,以下:
第一個爲單個元素損失,第二個爲整個序列的損失。
整個模型訓練完畢後,若是要計算p(y<1>,y<2>,y<3>)的機率,只須要把該序列像訓練的時候帶入模型,得出分別預測出來y<1>,y<2>,y<3>的機率,第一個輸入x=0,得出y<1>的機率,第二個輸入y<1>得出y<2>的機率,第三個輸入y<2>得出y<3>的機率,最後連乘便可:
5、採樣新序列
前面第四部分咱們已經訓練生成了一個語言模型,這樣咱們就能夠採樣新序列,或者說是利用語言模型來生成新的語句序列,其結構形式以下:
a<0>和x<1>輸入均可以設置爲零向量,每一層的輸出都是一個softmax在字典|v|每一個詞的機率輸出,能夠利用np.random.choice隨機進行採樣選取一個詞,做爲第一個詞。而後後面節點的輸入就是前面節點的輸出,後面每一層的輸出都進行隨機採樣,直到到達設定的時間步或者輸出爲EOS爲止,這樣就能夠生成新序列了。下面就是利用莎士比亞文章訓練的語言模型生成的採樣序列:
6、RNN的問題
梯度消失:
在反向傳播的過程當中,因爲梯度消失的問題,RNN的輸出很難受到序列靠前的輸入的影響,由於無論輸出是什麼,不管輸出是對仍是錯,這個區域都很難反向傳播到序列的前面部分,所以網絡也很難調整序列前面的計算,因此RNN就不擅長處理長期依賴的問題。
梯度爆炸:
隨着網絡深度的加深,參數呈指數級別增加,甚至出現數值溢出爲Nan的狀況,這就是梯度爆炸。解決辦法就是採用梯度修剪,觀察梯度向量,若是大於某一個閾值時候,就縮放梯度向量,保證不會太大,這種方式處理梯度爆炸魯棒性比較好。
綜合來講,梯度消失更難處理一些。
deeplearning.ai連接:https://mooc.study.163.com/learn/2001280005?tid=2001391038#/learn/content