# Recurrent Neural Network (RNN) ###### tags: `python` `Deep Learning` --- > >* **本文內容為“Tibame提升AI實作能力必備,深度學習TensorFlow基礎與應用”為主,版權為陳少君所有,本文僅做筆記用途,非商業用途** > >* **本篇圖片部分出自“Tibame提升AI實作能力必備,深度學習TensorFlow基礎與應用”課程內容講義** > --- # :memo: Introduction ## What is the difference between DNN and RNN? Data sequence(數據數列):有時間關係之數據 Ex:天氣、航班乘客、股票價格、音樂、演說... RNN透過隱藏層的回饋,可以學習過去發過的事,比起DNN,它不是 一個單純的feedforward network,因為它有迴圈 為記憶更長久前的事件或系列,RNN有LSTM、GRU 等變形 CNN之前,我們用DNN做影像分類,由於”all data is the same”, RNN需要NxTxD 輸入:N(樣本數),T(時間步驟數),D(樣本特徵數) DNN若為數據序列,let T=D, D=1 ==> NxTxD=NxD RNN優點:權數的節省 同樣為T = 100, D = 10, M = 15 (M = 隱藏神經元數, 是超參數) For DNN: 輸入層的權數:TXD = 100 x 10 = 1000 隱藏層的權數:TxM = 100 x 15 = 1500 K = 1 (Binary Classification) 輸出層的權數= TxMxK = 100 x 15 x 1 = 1500 Input 1000 x 1500 = 1.5 million Total = 1.5 M + 1500 ≈ 1.5 M For RNN: Wxh = D x M = 150 Whh = M x M = 225 Wo= M x 1 = 15 Total = 150+ 225 +15= 390 節省比例:1501500 / 390 = 3850 倍 ## Fundamental 原理:輸入矩陣形狀是:N x T x D 其中, N為樣本數 T為時間序列單一樣本中的時間步驟數 D為單一步驟的特徵數 Ex:如果要蒐集100天股票A的收市價D=1(只有一個特徵),且一次需要十天T=10(單一樣本需要十天的data),那麼你將有N=100–10+1=91個樣本,從(1,2,..10)到(91,92,….100) 註:跟CNN走訪有點類似 **公式** $$ h_t=\sigma(w_{xh}^T*x_t+w_{hh}^T*h_{t-1}+b_h) $$ $$ Y_t=\sigma(w_o^T*h_t+b_o) $$ 其中, $x_t$ = input $h$ = hidden $o$ = output xh = input to hidden hh = hidden to hidden # Vanilla RNN ![](https://i.imgur.com/k9fssIW.png) ## BPTT BPTT(Back Propagation Thru Time)是RNN特有的經由時間的反向傳播 它和一般的DNN反向傳播不同,RNN需要考慮到要將狀態時間T的損失函數誤差回傳到狀態T-1,而一般的DNN(MLP)不需要 ![](https://i.imgur.com/oOcrtsh.png) ## 缺點 **缺點1.** 有梯度消失(Vanishing Gradient)的問題,因此才有後續的LSTM和GRU ![](https://i.imgur.com/qJBaml3.png) **缺點2.** 訓練RNN通常一次執行一步,因此RNN無法利用現代硬體的完全並行(分工同時運行)其體系結構,也是常被詬病的問題 ![](https://i.imgur.com/D3UbdQj.png) Demo:[SimpleRNN Sine.ipynb] # LSTM & GRU ![](https://i.imgur.com/CRBdNqI.png =400x) 左圖為GRU,右圖為LSTM ![](https://i.imgur.com/yCl627Z.png =600x) ## LSTM LSTM(Long Short Term Memory) ## GRU GRU(Gated Recurrent Unit)為LSTM的近代簡化版 實作1:MNIST [DEMO16_RNN MNIST.ipynb] 實作2:垃圾郵件 [DEMO19_SPAM DETECTION RNN.ipynb] # RNN之應用 ## 機器翻譯 傳統的統計方式作翻譯是用機率去猜測所對應的每個字,無論是用出現次數,還是上下文的機率,但是常會碰到為語言模型不同而根本找不到一對一相對字的問題 ## 圖像生成 圖像描述(Image Caption)本質上是圖像信息到文本信息的翻譯,通俗來講,就是"看圖說話" ![](https://i.imgur.com/34g3TzN.png) ## 語音辨識 如果影像描述可以當成語言翻譯來想,語音辨識當然也可以當作語言翻譯來做 Encoder部分應該都是從feature vector出發,產生某種語言的文句 2015年,百度公開發佈的採用神經網路的LSTM+CTC模型大幅度降低了語音辨識的錯誤率 採用這種技術在安靜環境下的標準國語的辨識率接近97% CTC(Connectionist Temporal Classification) 參考論文:「Connectionist Temporal Classification: Labelling Unsegmented Sequence Data with Recurrent Neural Networks」 CTC的計算實際上是計算損失值的過程,就像其他損失函數一樣,它的計算結果也是評估網路的輸出值和真實差多少 # Dimension Reduction 降維與資料視覺化具有相關性,降維有兩個目的: 1. 一個是降遞參數量與系統複雜度,以降低運算成本,加速運算 2. 一個是將維度降至二至三維之後,容易繪製在二維紙面或三維模型,因為人類的眼睛只能看到至多三維 ## PCA PCA(Primary Component Analysis) ## t-SNE t-SNE(t-Distributed Stochastic Neighbor Embedding) 實作: [t-SNE.ipynb] ## Autoencoder Autoencoder(AE)是一種非監督式學習有效率編碼的人工智慧神經網路 它的目標是經由忽略雜訊,而學習一種降維的編碼,在降維之後,一個資料重建的解碼過程也在學習。 Autoencoder 的原始目的就是讓解碼的結果和原始資料完全一樣,這也是Autoencoder命名的由來。 **Sparse autoencoder** 產生疏散分布的解碼結果,使解碼後的數據做未來的分類訓練更為準確 **Denoise autoencoder** 將原始資料除去雜訊,而保留主要的結構 **VAE** Variational Autoencoder(VAE)是由Encoder 和Decoder 所組成,它的原始架構AE 是利用學習的方式將原始資料降維再還原,所以是一個很好的降維和資料壓縮器 實作: [Denoise autoencoder.ipynb](https://www.tensorflow.org/tutorials/generative/autoencoder#first_example_basic_autoencoder)