2018年10月28日 星期日

筆記:RNN及眾多應用





Recurrent Neural Networks 循環神經網路,在時間上傳遞的神經網絡,它的深度是時間的長度,也就是加入記憶的因素。RNN特別適用於處理聲音、時間序列或自然語言等序列資料。RNN與DNN的區別在於有一個反饋循環,將第n-1步的輸出反饋給NN,對第n步的輸出產生影響,之後的每一步也都以此類推。

RNN和DNN都能通過對讀取的數據建模來記住有關於現實世界的某些信息。但這兩種網絡的記憶模式完全不同。在定型之後,DNN會生成已學習數據的靜態模型,然後這個模型就可以接受新的樣例,進行準確的分類或聚類。相比之下,RNN則會生成動態模型,亦即會隨時間推移而變化的模型,這種變化可以讓模型依據輸入樣例的上下文來進行準確的分類。更精確的說法是,循環模型包含了決定同個序列中的前一次分類結果的隱藏狀態。在之後的每一步中,這一隱藏狀態會與新一步的輸入數據相加,生成一個新的隱藏狀態,再得出一個新的分類結果。每個隱藏狀態都會被循環利用,生成經過調整的後續隱藏狀態。

真的很抽象,就用個JAVA範例來說明。

RNN具有預測能力。它們可以隨著時間推移動態地把握數據結構,可以用於預測一個數據序列中的下一個元素。這樣的元素有可能是一個單詞中接下來的字母,或者一句話中接下來的單詞(自然語言生成);也可以是傳感器、經濟統計表格、股票價格動態等數據中的下一個數字。

大多數入門範例是MNIST,雖然圖像看似不是序列數據,但它們也可以被解讀為序列,然後輸入循環網絡中。MNIST也可以用基本RNN來處理,如test17.py,參考說明

其他範例
Google的塗鴉專案
音樂範例這裡。使用一般RNN技巧,但多了MIDI界面,就變得有趣。
Music-Generation-master
python main.py -d EDEN-midi
generate generated    output.mp3

LSTM RNN


RNN在處理長期依賴時(就是時間序列比較遠時)會遇到很大困難,因為計算距離較遠的節點之間的關聯會涉及矩陣多次相乘,這會帶來梯度消失或是梯度膨脹(大多是消失)的問題,解決的辦法就是使用Gated RNN,透過權重係數,允許RNN累積遠距離節點間的長期關係,而且在不同時刻改變這個係數,並且允許網路網際當前已經累積的信息。

LSTM結構如下,透過三個threshold,使得自循環的權重是變化的,這樣一來,在模型參數固定的狀態下,不同時刻的積分尺度可以動態改變,避免梯度消失或膨脹的問題。


每個LSTM的計算公式如圖,Ft遺忘threshold,It表示輸入threshold, ̃Ct表示前一時刻cell狀態,Ct表示cell狀態(loop循環),Ot表示輸出threshold,Ht表示當前單元的輸出,Ht-1表示前一時刻單元的輸出。

有些記憶會是最近形成的,而另一些則可能是在形成後經過許多個時間步才需要使用。能夠將時間間隔較遠的記憶與輸入有效聯繫起來的循環網絡稱作長短期記憶(LSTM)網絡。主要作法是不同的短期記憶應當在不同的時候調出,以便為當前的輸入指定正確的意義。


不過,實在還是不懂為什麼能夠記憶長期資料。


大多數RNN的應用都發現LSTM較RNN為佳。以RNN的MNIST正確率95%,改為LSTM(cell改成lstm),程式test15.py,正確率近百分之百。

其他範例test16.py,它讓nn自動追上一個sin的圖形,從範例中可以發現它越來越靠近。


另外的應用如,文字自動生成,先下載這個能處理中文版本的範例,它可運作,也會是後續更多應用的基礎。
Char-RNN-TensorFlow-master
訓練指令
python train.py \
  --use_embedding \
  --input_file data/poetry.txt \
  --name poetry \
  --learning_rate 0.005 \
  --num_steps 26 \
  --num_seqs 32 \
  --max_steps 10000
測試指令(必須把code中ipython拿掉)
python sample.py \
  --use_embedding \
  --converter_path model/poetry/converter.pkl \
  --checkpoint_path model/poetry/ \
  --max_length 300
自動接續故事專業版sequence2sequence介紹

沒有留言:

張貼留言