C語言中文網 目錄
TensorFlow
1 TensorFlow是什么
2 TensorFlow安裝和下載
3 第一個TensorFlow程序
4 TensorFlow程序結構
5 TensorFlow常量、變量和占位符
6 TensorFlow矩陣基本操作
7 TensorFlow TensorBoard數據流圖可視化
8 TensorFlow代碼自動升級為1.0版本
9 TensorFlow XLA
10 TensorFlow指定CPU和GPU設備
11 TensorFlow與深度學習
12 TensorFlow常用Python擴展包
13 回歸算法有哪些
14 TensorFlow損失函數
15 TensorFlow優化器
16 TensorFlow csv文件讀取數據
17 TensorFlow實現簡單線性回歸
18 TensorFlow實現多元線性回歸
19 TensorFlow邏輯回歸處理MNIST數據集
20 感知機與神經網絡
21 TensorFlow常用激活函數(6種)
22 TensorFlow實現單層感知機
23 TensorFlow實現反向傳播算法
24 TensorFlow多層感知機實現MINIST分類
25 TensorFlow多層感知機函數逼近
26 TensorFlow超參數
27 TensorFlow Keras
28 CNN卷積神經網絡
29 三維卷積神經網絡預測MNIST數字
30 卷積神經網絡分類圖片
31 遷移學習
32 DeepDream網絡
33 TensorFlow實現文本情感分析
34 VGG網絡濾波器
35 VGGNet、ResNet、Inception和Xception
36 預建深度學習提取特征及實現
37 TensorFlow實現InceptionV3
38 TensorFlow WaveNet聲音合成
39 TensorFlow視頻分類(6種方法)
40 RNN循環神經網絡
41 神經機器翻譯(seq2seq RNN)
42 注意力機制(基于seq2seq RNN)
43 RNN訓練模型并生成文本
44 RNN循環神經網絡實現預測比特幣價格
45 主成分分析法(PCA)
46 k均值聚類算法
47 SOM自組織映射法
48 受限玻爾茲曼機訓練
49 推薦系統的實現(基于RBM)
50 基于DBN實現情緒檢測
51 自編碼器
52 標準自編碼器
53 稀疏自編碼器
54 去燥自編碼器
55 卷積自編碼器
56 堆疊自編碼器
57 強化學習
58 OpenAI Gym安裝和使用
59 全連接神經網絡實現玩Pac-Man游戲
60 Q learning實現Cart-Pole平衡游戲
61 DQN算法(深度Q網絡)
62 David Silver策略梯度算法
63 深度學習在移動端的應用
64 Android移動端部署TensorFlow mobile
65 iPhone移動端部署TensorFlow mobile
66 移動端優化TensorFlow代碼
67 GAN生成式對抗網絡
68 GAN生成式對抗網絡虛構MNIST圖像
69 DCGAN虛構MNIST圖像
70 DCGAN虛構名人面孔和其他數據集
71 VAE變分自編碼器
72 CapsNet膠囊網絡
73 TensorFlow分布式
74 TensorFlow GPU的安裝和使用
75 TensorFlow分布式
76 TensorFlow分布式訓練MNIST分類器
77 TensorFlow Serving運行Docker容器
78 TensorFlow分布式在谷歌云平臺運行
79 TensorFlow分布式在谷歌CloudML運行
80 TensorFlow分布式在Microsoft Azure上運行
81 TensorFlow分布式在Amazon AWS上運行
首頁 > TensorFlow 閱讀:145

RNN循環神經網絡及原理(詳解版)

循環神經網絡(Recurrent Neural Network,RNN)很多實時情況都能通過時間序列模型來描述。

例如,如果你想寫一個文檔,單詞的順序很重要,當前的單詞肯定取決于以前的單詞。如果把注意力放在文字寫作上...一個單詞中的下一個字符取決于之前的字符(例如,The quick brown f...,下一個字母是 o 的概率很高),如下圖所示。關鍵思想是在給定上下文的情況下產生下一個字符的分布,然后從分布中取樣產生下一個候選字符:
 
關于“The quick brown fox”句子的預測示例
圖 1 關于“The quick brown fox”句子的預測示例

一個簡單的變體是存儲多個預測值,并創建一個預測擴展樹,如下圖所示:

關于“The quick brown fox”句子的預測樹示例
圖 2 關于“The quick brown fox”句子的預測樹示例

基于序列的模型可以用在很多領域中。在音樂中,一首曲子的下一個音符肯定取決于前面的音符,而在視頻領域,電影中的下一幀肯定與先前的幀有關。此外,在某些情況下,視頻的當前幀、單詞、字符或音符不僅僅取決于過去的信號,而且還取決于未來的信號。

基于時間序列的模型可以用RNN來描述,其中,時刻 i 輸入為 Xi,輸出為 Yi,時刻 [0,i-1] 區間的狀態信息被反饋至網絡。這種反饋過去狀態的思想被循環描述出來,如下圖所示:

反饋的描述
圖 3 反饋的描述

展開(unfolding)網絡可以更清晰地表達循環關系,如下圖所示:

循環單元的展開
圖 4 循環單元的展開

最簡單的 RNN 單元由簡單的 tanh 函數組成,即雙曲正切函數,如下圖所示:
簡單的 tanh 單元
圖 5 簡單的 tanh 單元

梯度消失與梯度爆炸

由于存在兩個穩定性問題,訓練 RNN 是很困難的。由于反饋環路的緣故,梯度可以很快地發散到無窮大,或者迅速變為 0。如下圖所示:

梯度示例
圖 6 梯度示例

在這兩種情況下,網絡將停止學習任何有用的東西。梯度爆炸的問題可以通過一個簡單的策略來解決,就是梯度裁剪。梯度消失的問題則難以解決,它涉及更復雜的 RNN 基本單元(例如長短時記憶(LSTM)網絡或門控循環單元(GRU))的定義。先來討論梯度爆炸和梯度裁剪:

梯度裁剪包括對梯度限定最大值,以使其不能無界增長。如下圖所示,該方法提供了一個解決梯度爆炸問題的簡單方案:

梯度裁剪示例
圖 7 梯度裁剪示例

解決梯度消失需要一個更復雜的記憶模型,它可以有選擇地忘記以前的狀態,只記住真正重要的狀態。如下圖所示,將輸入以概率 p∈[0,1] 寫入記憶塊 M,并乘以輸入的權重。

以類似的方式,以概率 p∈[0,1] 讀取輸出,并乘以輸出的權重。再用一個概率來決定要記住或忘記什么:

記憶單元示例
圖 8 記憶單元示例

長短時記憶網絡(LSTM)

長短時記憶網絡可以控制何時讓輸入進入神經元,何時記住之前時序中學到的東西,以及何時讓輸出傳遞到下一個時間戳。所有這些決策僅僅基于輸入就能自我調整。

乍一看,LSTM 看起來很難理解,但事實并非如此。我們用下圖來解釋它是如何工作的:

一個 LSTM 單元的示例
圖 9 一個 LSTM 單元的示例

首先,需要一個邏輯函數 σ 計算出介于 0 和 1 之間的值,并且控制哪個信息片段流經 LSTM 門。請記住,logisitic 函數是可微的,所以它允許反向傳播。

然后需要一個運算符 ⊗ 對兩個相同維數的矩陣進行點乘產生一個新矩陣,其中新矩陣的第 ij 個元素是兩個原始矩陣第 ij 個元素的乘積。同樣,需要一個運算符 ⊕ 將兩個相同維數的矩陣相加,其中新矩陣的第 ij 個元素是兩個原始矩陣第 ij 個元素的和。在這些基本模塊中,將 i 時刻的輸入 xi 與前一步的輸出 yi 放在一起。

方程 fi=σ(Wf·[yi-1,xi]+bf) 是邏輯回歸函數,通過控制激活門 ⊗ 決定前一個單元狀態 Ci-1 中有多少信息應該傳輸給下一個單元狀態 Ci(Wf 是權重矩陣,bf 是偏置)。邏輯輸出 1 意味著完全保留先前單元狀態 Ct-1,輸出 0 代表完全忘記 Ci-1 ,輸出(0,1)中的數值則代表要傳遞的信息量。

接著,方程根據當前輸入產生新信息,方程 si=σ(Wc·[Yi-1,Xi]+bc) 則能控制有多少新信息通過運算符 ⊕ 被加入到單元狀態 Ci 中。利用運算符 ⊗ 和 ⊕,給出公式對單元狀態進行更新。

最后,需要確定當前單元狀態的哪些信息輸出到 Yi。很簡單,再次采用邏輯回歸方程,通過 ⊗ 運算符控制候選值的哪一部分應該輸出。在這里有一點需要注意,單元狀態是通過 tanh 函數壓縮到 [-1,1]。這部分對應的方程是 Yi=ti*tanh(Ci)。

這看起來像很多數學理論,但有兩個好消息。首先,如果你明白想要達到的目標,那么數學部分就不是那么難;其次,你可以使用 LSTM 單元作為標準 RNN 元的黑盒替換,并立即解決梯度消失問題。因此你真的不需要知道所有的數學理論,你只需從庫中取出 TensorFlow LSTM 并使用它。

門控循環單元和窺孔LSTM

近年來已經提出了許多 LSTM 的變種模型,其中有兩個很受歡迎:窺孔(peephole)LSTM 允許門層查看單元狀態,如下圖中虛線所示;而門控循環單元(GRU)將隱藏狀態和單元狀態合并為一個信息通道。

同樣,GRU 和窺孔 LSTM 都可以用作標準 RNN 單元的黑盒插件,而不需要知道底層數學理論。這兩種單元都可以用來解決梯度消失的問題,并用來構建深度神經網絡。

標準LTSM、窺孔LTSM、GRU示例
圖 10 標準LTSM、窺孔LTSM、GRU示例(點此查看高清大圖

處理向量序列

真正使 RNN 強大的是它能夠處理向量序列,其中 RNN 的輸入和輸出可以是序列,下圖很好地說明了這一點,最左邊的例子是一個傳統(非遞歸)網絡,后面跟著一個序列輸出的 RNN,接著跟著一個序列輸入的 RNN,其次跟著序列輸入和序列輸出不同步的 RNN,最后是序列輸入和序列輸出同步的 RNN。

RNN序列示例
圖 11 RNN序列示例

機器翻譯是輸入序列和輸出序列中不同步的一個例子:網絡將輸入文本作為一個序列讀取,讀完全文后輸出目標語言。

視頻分類是輸入序列和輸出序列同步的一個例子:視頻輸入是一系列幀,對于每一幀,在輸出中提供分類標簽。

如果你想知道更多關于 RNN 的有趣應用,則必讀 Andrej Karpathy 的博客 http://karpathy.github.io/2015/05/21/rnn-effectiveness/,他訓練網絡寫莎士比亞風格的散文(用 Karpathy 的話說:能勉強承認是莎士比亞的真實樣品),寫玄幻主題的維基百科文章,寫愚蠢不切實際問題的定理證明(用 Karpathy 的話說:更多幻覺代數幾何),并寫出 Linux 代碼片段(用 Karpathy 的話說:模型首先逐字列舉了 GNU 許可字符,產生一些宏然后隱藏到代碼中)。

精美而實用的網站,提供C語言、C++、STL、Linux、Shell、Java、Go語言等教程,以及socket、GCC、vi、Swing、設計模式、JSP等專題。

Copyright ?2011-2018 biancheng.net, 陜ICP備15000209號

底部Logo