深度學習| 循環神經網絡RNN與應用

循環神經網絡

CV是和image圖片和視頻打交道;

NLP 自然語言處理是和文本打交道,文本天然的時序數據;

1. 場景與多種應用

  • 模仿論文(生成序列)
  • 模型Linux內核代碼“寫程序” (生成序列)| 按概率分佈去做排布
  • 模仿小四的作品(生成文本序列)
  • 機器翻譯
  • Image to text/ 看圖說話

我們知道神經網絡結構如下:

那循環神經網絡和它是什麼關係呢?

循環神經網絡

爲什麼有BP神經網絡(多層感知器MLP),CNN,還要RNN?

  • 傳統神經網絡(包括CNN),輸入和輸出都是互相獨立的;
    • 圖像上的貓和狗是分隔開的,但有些任務,後序的輸出和之前的內容是相關的;
    • “我是中國人,我的母語是__” 
  • RNN引入“記憶”的概念
    • 循環2字來源於其每個元素都執行相同的任務;
    • 但是輸出依賴於輸入和“記憶”

 

2. 層級結構

簡單來看,把序列按時間展開

語言模型,我是中國__,完形填空,人比菜出來的次數要高些;

每讀一個詞就把這個詞的信息記錄下來,直到把所有信息讀下之後去做一個融合;神經網絡是用什麼去存儲信息的?一個向量或者矩陣 St

 

 

 

 

  •  Xt是時間t處的輸入;
  • St是時間t處的“記憶”,St=f(UXt+WSt-1),f可以是tanh等;
  • Ot是時間t處的輸出,比如是預測下個詞的話,可能是softmax輸出的屬於每個候選詞的概率,Ot=softmax(VSt

結構細節:

  • 可以把隱狀態St視作“記憶體”,捕獲了之前時間點上的信息;
  • 輸出Ot由當前時間及之前所有的“記憶”共同計算得到;
  • 很可惜,實際應用中,St並不能捕獲和保留之前所有信息(記憶有限?)
  • 不同於CNN,這裏的RNN其實整個神經網絡都共享一組參數(U, V, W),極大減小了需要訓練和預估的參數量;
  • 圖中的Ot在有些任務下是不存在的,比如文本情感分析,其實只需要最後的output結果就行;

 

3. 多種RNN

雙向RNN

有些情況下,當前的輸出不只依賴於之前的序列元素,還可能依賴之後的序列元素;

比如從一段話踢掉部分詞,讓你補全;

直觀理解:雙向RNN疊加;

 

深層雙向RNN 

和雙向RNN的區別是每一步/ 每個時間點我們設定多層結構 

 

 

4. BPTT算法

MPL(DNN)與CNN用BP算法求偏導

BPTT和BP是一個思路,只不過既然有step,就和時間t有關係

 

 

 

 

 

 

5. 生成模型與圖像描述

簡單image to text 

 

 

 

圖片描述數據集 

Microsoft COCO數據集: http://mscoco.org 

RNN與圖片描述

部分結果

 

 

LSTM

前面提到的RNN解決了,對之前的信息保存的問題

但是!存在長期依賴的問題。

  • 看電影的時候,某些情節的推斷需要依賴很久以前的一些細節;
  • 很多其他的任務也一樣;
  • 很可惜隨着時間間隔不斷增大時,RNN會喪失學習到連接如此遠的信息的能力;
  • 也就是說,記憶容量有限,一本書從頭到尾一字不漏的去記哦,肯定離得越遠的東西忘得越多。
  • 怎麼辦:LSTM 

LSTM是RNN一種,大體結構幾乎一樣,區別是:

  • 它的“記憶細胞”改造過;
  • 該記的信息會一直傳遞,不該記的會被“門”截斷;

 

1. 長時依賴問題

 RNN的結構

 

 把“記憶細胞”表現的炫酷一點 

 

 LSTM呢

  “記憶細胞”變得稍微複雜了一點點

 

 

 

 

2. “記憶細胞”與狀態

 LSTM關鍵:“細胞狀態” 

細胞狀態類似於傳送帶,直接在整個鏈上運行,只有一些少量的線性交互。信息在上面流傳保持不變會很容易。

 

 

 LSTM怎麼控制“細胞狀態”?

  • 通過“門”讓信息選擇性通過,來去除或者增加信息到細胞狀態;
  • 包含一個sigmoid神經網絡層和一個pointwise乘法操作;
  • sigmoid層輸出0到1之間的概率值,描述每個部分有多少量可以通過。0代表“不允許量通過”,1就指“運行任意量通過” 

 LSTM的幾個關鍵“門”與操作

  • 第一步:決定從“細胞狀態”中丟棄什麼信息 => “忘記門”
  •  比如完形填空中填“他” 或者“她”的問題,細胞狀態可能包含當前主語的類別,當我們看到新的代詞,我們希望忘記舊的代詞。

 

 

 第二步:決定放什麼信息到“細胞狀態”中

  • sigmoid層決定什麼值需要更新;
  • tanh層創建一個新的候選值向量Ct
  • 上述2步是爲狀態更新做準備;

 

 第三步:更新“細胞狀態” 

  • 更新Ct-1爲C
  • 把舊狀態與f相乘,丟棄掉我們確定需要丟棄的信息;
  • 加上it * Ct ,這就是新的候選值,根據我們決定更新每個狀態的程度進行變化。

 

 第四步:基於“細胞狀態”得到輸出

  • 首先運行一個sigmoid層來確定細胞狀態的哪個部分將輸出;
  • 接着用tanh處理細胞狀態(得到一個在-1到1之間的值),再將它和sigmoid門的輸出相乘,輸出我們確定輸出的那部分。
  • 比如我們可能需要單複數信息來確定輸出“他”還是“他們” 

 

3. LSMT的變體

變種1 

  • 增加“peephole connection” 
  • 讓門層也會接受細胞狀態的輸入;

 

 變種2 

通過使用coupled忘記和輸入門;

之前是分開確定需要忘記和添加的信息,這裏是一同做出決定。

 

 

 

4. GRU

 Gated Recurrent Unit (GRU),2014年提出

  • 將忘記門和輸入門合成了一個單一的更新門;
  • 同樣還混合了細胞狀態和隱藏狀態,和其他一些改動;
  • 比標準LSTM簡單;

 生成模式

字符級別的生成模型

純手工擼制代碼請戳 https://gist.github.com/karpathy/d4dee566867f8291f086 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章