rnn彷佛更擅長信息的保存和更新,而cnn彷佛更擅長精確的特徵提取;rnn輸入輸出尺寸靈活,而cnn尺寸相對刻板。git
聊到循環神經網絡RNN,咱們第一反應多是:時間序列 (time sequence)。github
確實,RNN擅長時間相關的應用(天然語言,視頻識別,音頻分析)。但爲何CNN不容易處理時間序列而RNN能夠? 爲何咱們以前說過RNN有必定的記憶能力?網絡
數學上,若是咱們想要預測一個單詞x 的後一個單詞y,咱們須要3個主要元素(輸入單詞x;x的上下文狀態h1;經過x和h1輸出下一個單詞的函數好比softmax):
機器學習
來自:http://suriyadeepan.github.io/2017-01-07-unfolding-rnn/
數學計算以下:
ide
上面是一個很簡單的有向無環圖(DAG),可是,這只是一個時刻t 的單詞預測,這種簡單的預測甚至能夠用cnn或者其餘簡單預測模型替代。函數
然而,cnn對於更新狀態或者保存狀態卻並不擅長,咱們知道,下一個時間點t+1,單詞x的上下文(狀態)就改變了:
學習
所以,RNN的門限結構和CNN卷積結構的不一樣(信息保存方式的不一樣)也必定程度致使RNN擅長處理時間序列的問題。即便咱們不用門限網絡而用其餘模型,咱們也須要相似上圖的循環結構,把上下文狀態在每個時間點進行更新,並保存下來。測試
因此,在時間序列的應用中,更新每一個時間點的狀態是如此重要,咱們須要rnn這樣的網絡:
在每一個時間點,都使用一樣的更新函數f 更新上下文狀態,每一個時間點t的狀態都是基於上一個時間點t-1的狀態和本次信號xt的輸入:
另外,RNN的門限網絡有自然的馬爾科夫化的性質,當前的狀態S3通過屢次循環已經包含了幾個時間點之前的狀態信息(其中分號表明用參數θ編碼前面狀態):
當前的預測只須要根據當前的狀態進行預測。這種巨大的保存狀態信息的能力彷佛正是RNN門限單元擅長的。(cnn彷佛更擅長精確的特徵提取)編碼
傳統的rnn是每一個時刻t,輸入一個單詞,生成另外一個單詞,而實際狀況並不都是這樣簡單。翻譯
最後,咱們看一些變形的RNN結構。
向量到序列(Vector to Sequence)
有一些應用如根據一張圖片,輸出圖片的字幕:
這種問題的RNN,須要輸入圖片的特徵向量x(好比cnn的最後一層隱層),輸出是一句話的字幕,可是這句話y 的單詞是一個一個生成的。
這就要求rnn從單個向量中,一次性生成一個時間序列:
固然,時間序列的生成遵循了按照時間順序循環更新內部狀態的規則。
機器翻譯問題中,好比一句英語句子翻譯成法語句子,不必定對應的單詞數量是相等的。因此傳統的rnn必定須要修改。
常見的作法是用兩個rnn,一個rnn用來編碼句子(encoder),一個rnn用來解碼成想要的語言(decoder):
這裏的C 是上下文的信息,和編碼好的隱層信息一塊兒,送入decoder的輸入,進行翻譯。
傳統的RNN預測一個單詞,只是捕捉這個單詞以前的上下文狀態,而雙向RNN還捕捉了這個單詞後面的單詞環境對該詞的影響:
上圖的雙向RNN其實能夠看作兩個RNN,一個RNN就是咱們以前提到的傳統RNN(只有隱藏狀態h那一層);還有一個RNN是捕捉單詞以後的單詞環境的RNN(隱藏狀態g那一層)。
這樣的RNN把一個單詞向左和向右的上下文環境信息考慮進去,準確率通常會有所提升。
參考:http://suriyadeepan.github.io/2017-01-07-unfolding-rnn/
哈工大SCIR中心推出對話技術平臺-DTP(測試版)
【深度學習實戰】pytorch中如何處理RNN輸入變長序列padding
【機器學習基本理論】詳解最大後驗機率估計(MAP)的理解
歡迎關注公衆號學習交流~