Tuesday, October 22, 2019

深入淺出 Deep Learning(三):RNN (LSTM)

深入淺出 Deep Learning(三):RNN (LSTM)

2018/02/03

前言:

為了解講 RNN(LSTM),我又重新閱讀相關的參考文獻,意外解決了思考之前 ResNet 結構的疑惑。

-----


Fig. Shortcut(圖片來源:Pixabay)。

-----

Summary:

Recurrent Neural Networks(RNN)與改進的 Long Short-Term Memory(LSTM)[1]-[9] 專門用來處理時間相關的資料 [2]。RNN 本身可以視為「極深」的網路。在 LSTM 上用到的線性結構 [8],後續使圖像處理為主的 CNN [10]-[18],也可以擴增到「極深」。

可以說,這個線性結構,是目前深度學習的「核心」之一。

 -----

Outline

一、RNN
二、LSTM
三、Highway Networks
四、ResNet、DenseNet and GoogLeNet

-----

一、RNN

圖1.1a 是一個 RNN 的部分。由中間我們可以看到運算單元除了接受本次輸入外,還接受上個運算單元的輸出。另外除了一般的輸出外,資料也會傳到下個運算單元作為輸入。

由於它容易造成梯度消失或梯度爆炸,所以後來改進了構造,如圖1.1b 的 LSTM [8]。

RNN 與 LSTM 的構造,本文稍後會仔細解釋。

它們主要用於處理時間相關的資料 [2]。

-----


Fig. 1.1a. RNN, [8].

-----


Fig. 1.1b. LSTM, [8].

-----

LSTM 擅長於任何和時間有關的資訊,包括文字、語音、音訊、視訊,以及機器人學(robotics)。

「由於機器人學基本上只是探討代理個體(agent)根據一連串感測而得的資訊所作出的判斷和動作,這類資料本身就帶有序列性(sequential),即不同時間內所採取的動作,也和之後的感測與判斷有關。」[2]

-----


Fig.  1.1c. RNN(LSTM)的應用 [2]。

-----

圖1.2a 左是一個簡單的前向網路。x 跟 o 分別是輸入層跟輸出層,z 是中間層(或稱為隱藏層)。W 跟 V 代表權重。

圖1.12a 右則是一個簡單的 RNN,展開後如圖1.2b。我們可以看到時間 t 從 1 到 T。也可以視為一個深度為「T」的網路。

-----


Fig. 1.2a. FNN and RNN, p. 4, [4].

-----


Fig. 1.2b. An unrolled RNN, p. 4, [4].

-----

圖1.2c 是 RNN 的公式。

xt 是 輸入,權重為 Y。ht 是上一層未經權重跟偏壓的輸出,作為另一個輸入,其權重為 W。偏壓為 b。

三者相加後為 at,經過 tanh,為一個暫存值 ht,先輸出到下一個單元。

ht 經過權重 V 跟偏壓 c 之後,為輸出 ot。

-----


Fig. 1.2c. RNN formula, p. 4, [4].

-----

二、LSTM

LSTM 是改進後的構造。

圖2.1a 其實不容易理解,後面有更漂亮的圖,但由於這是經典教科書 [5] 裡面用的圖,我們這邊先來看一下。

除了輸入跟輸出之外,多了三個閘(門)。此處從一般的說法,稱為輸入門、忘記門、輸出門。

這三個,會經由 sigmoid 函數變成 0 到 1 的實數,用來控制信號的衰減(或保留)程度。比方說,輸入乘上輸入門的值,才是「真正」的輸入,輸出乘上輸出門的值,才是真正的輸出。

圖2.1b 是更仔細的說明。關於這張圖,先說明到這裡,因為後面有更清楚的圖。

公式可以參考圖2.1c。

-----


Fig. 2.1a. LSTM, p. 409, [5].

-----


Fig. 2.1b. LSTM remark, [7].

-----


Fig. 2.1c. LSTM formula [3].

-----

圖2.2a 很清楚地表達了 LSTM 的構造,我們來仔細看一下。

參考圖2.2b 的公式。

xt 是輸入(ii 應為 it, xi 應為 xt),ht-1 是上一層的輸出,xt 與 ht-1 用來形成三個門的值。W 跟 R 是權重,b 是偏壓。

先產生三個門的值,分別為 it、ft、ot。

c 是 cell,記憶細胞(記憶單元)的縮寫。

c't 這行公式比較複雜,這次的輸入 xt 跟上次輸出的 ht-1 經過權重與偏壓,再壓縮後,是這次暫時「真正」的輸入。

然後上次記得的 ct-1 經過忘記門,與 c't 經過輸入門,相加,就是這次的記憶 ct。

壓縮再經過輸出門,為 ht。

重點在於三個 sigmoid 產生控制訊號。以及兩個 tanh 用來壓縮資料。

-----


Fig. 2.2a. LSTM, [6].

-----


Fig. 2.2b. LSTM formula, [6].

-----

圖2.3a 也蠻清楚的,符號的說明放在圖 2.3b。從圖2.4,我們可以看到一個一般的 RNN 如何變成一個 LSTM。

LSTM 的構造,就先介紹到這裡。

-----


Fig. 2.3a. LSTM, [7].

-----


Fig. 2.3b. LSTM symbols, [7].

-----


Fig. 2.4a. RNN, [8].

-----


Fig. 2.4b. LSTM, [8].

-----

三、Highway Networks

c 是 cell state 的縮寫,表示一個儲存細胞、儲存單元、或記憶體。

由於 RNN 本身是一個極深的網路,LSTM 增加了記憶單元這條線性的途徑後,極深的網路變為可行,這個構造作者後來將其應用在 CNN 上,在 Highway Netwoks 取得很大的成功。其他作者則分別在 ResNet 與 DenseNet 持續改進。但以捷徑幫忙傳遞梯度的概念,其實早在 GoogLeNet 已經用上了。

-----


Fig. 3.1. The cell state runs straight down the entire chain, with only some minor linear interactions [8], [9].

-----

「2015年由 Rupesh Kumar Srivastava 等人受到 LSTM 門機制的啟發提出的網絡結構(Highway Networks)很好的解決了訓練深層神經網絡的難題,Highway Networks 允許信息高速無阻礙的通過深層神經網絡的各層,這樣有效的減緩了梯度的問題,使深層神經網絡不再僅僅具有淺層神經網絡的效果。」[10]。

-----


Fig. 3.2. Highway networks [11].

-----

四、ResNet、DenseNet and GoogLeNet

◎ ResNet

「模型的深度加深,學習能力增強,因此更深的模型不應當產生比它更淺的模型更高的錯誤率。而這個“退化”問題產生的原因歸結於優化難題,當模型變複雜時,SGD 的優化變得更加困難,導致了模型達不到好的學習效果。」[12]。

「增加一個恆等映射,將原始所需要學的函數 H(x)轉換成 F(x)+ x,而作者認為這兩種表達的效果相同,但是優化的難度卻並不相同, 作者假設 F(x)的優化會比 H(x)簡單的多。這一想法也是源於圖像處理中的殘差向量編碼,通過一個重構,將一個問題分解成多個尺度直接的殘差問題,能夠很好的起到優化訓練的效果。」[12]。

-----


Fig. 4.1a. ResNet block [12], [13].

-----



Fig. 4.1b. VGGNet and ResNet [12], [13].

-----

「ResNet 通過增加跨層的連接來解決梯度逐層回傳時變小的問題。雖然這個想法之前就提出過了,但 ResNet 真正的把效果做好了。

下圖演示了一個跨層的連接。」[14]。

-----


Fig. 4.1c. ResNet block [14].

-----

「最底下那層的輸入不僅僅是輸出給了中間層,而且其與中間層結果相加進入最上層。這樣在梯度反傳時,最上層梯度可以直接跳過中間層傳到最下層,從而避免最下層梯度過小情況。

為什麼叫做殘差網絡呢?我們可以將上面示意圖裡的結構拆成兩個網絡的和,一個一層,一個兩層,最下面層是共享的。」[14]。

-----


Fig. 4.1d. Separation of ResNet block [14].

-----

「在訓練過程中,左邊的網絡因為更簡單所以更容易訓練。這個小網絡沒有擬合到的部分,或者說殘差,則被右邊的網絡抓取住。所以直觀上來說,即使加深網絡,跨層連接仍然可以使得底層網絡可以充分的訓練,從而不會讓訓練更難。」[14]。

-----

◎ DenseNet

DenseNet 的想法很大程度上源於隨機深度網絡(Deep networks with stochastic depth)。當時作者們提出了一種類似於 Dropout 的方法來改進 ResNet。作者們發現在訓練過程中的每一步都隨機地「扔掉」(drop)一些層,可以顯著的提高 ResNet 的泛化性能 [15]。

「DenseNet 讓網絡中的每一層都直接與其前面層相連,實現特徵的重複利用;同時把網絡的每一層設計得特別「窄」,即只學習非常少的特徵圖(最極端情況就是每一層只學習一個特徵圖),達到降低冗餘性的目的。」[15]。

-----


Fig. 4.2. DenseNet [15].

-----

◎ GoogLeNet

「網絡中間的層次生成的特徵會非常有區分性,給這些層增加一些輔助分類器,這些分類器以小卷積網絡的形式放在 Inception(4a) 和 Inception(4b) 的輸出上,在訓練過程中,損失會根據折扣後的權重(折扣權重為0.3)疊加到總損失中。」[16]。

-----



Fig. 4.3. GoogLeNet [17].

-----


Fig. 4.4. Evolution of CNNs [18].

-----

結論:

圖4.4 簡單介紹了 CNN 的演進。我們可以看到,CNN 的發展到 VGGNet 達到瓶頸,而 RNN 改進的 LSTM,經由 Highway Networks,巧妙地讓 CNN 的深度可以到「極深」,因而達到極佳的辨識能力。

可以說,圖3.1 的 cell state,是 CNN 與 RNN 的共同核心。Deep Learning 的妙處,盡在此線。

-----

後記:

結束三次的深度學習講座後,遠望附近的聯發科(圖5),依然燈火通明。

教,其實是學,最好的方式。我在這三次的演講深切的體會到!


Fig. 5. 聯發科(左)。

-----

出版說明:

2019/10/22

第一次的 LSTM 文章只能算是蒐集資料與資料整理,後來有機會到某科技公司進行三次的教育訓練,所以我又重寫了一次,精簡過文章,並補充 ResNet 與其不同的形式。每次重寫就會進步一些,目前正準備進行第三次的 LSTM 文章撰寫!

-----

References

[1] RNN(LSTM)
Hochreiter, Sepp, and Jürgen Schmidhuber. "Long short-term memory." Neural computation 9.8 (1997): 1735-1780.
http://www.bioinf.jku.at/publications/older/2604.pdf

[2] 遞歸神經網路和長短期記憶模型 RNN & LSTM · 資料科學・機器・人
https://brohrer.mcknote.com/zh-Hant/how_machine_learning_works/how_rnns_lstm_work.html

[3] AI從頭學(一九):Recurrent Neural Network
http://hemingwang.blogspot.tw/2017/03/airecurrent-neural-network.html

[4] Wang, Hao, and Dit-Yan Yeung. "Towards bayesian deep learning: A survey." arXiv preprint arXiv:1604.01662 (2016).
https://arxiv.org/pdf/1604.01662.pdf

[5] 100_rnn
http://www.deeplearningbook.org/contents/rnn.html

[6] Optimizing Recurrent Neural Networks in cuDNN 5
https://devblogs.nvidia.com/parallelforall/optimizing-recurrent-neural-networks-cudnn-5/

[7] All of Recurrent Neural Networks – Medium_m4c8pmg3d
https://medium.com/@jianqiangma/all-about-recurrent-neural-networks-9e5ae2936f6e

[8] Understanding LSTM Networks -- colah's blog
http://colah.github.io/posts/2015-08-Understanding-LSTMs/

[9] 『cs231n』RNN之理解LSTM網絡 - 掃文資訊
https://hk.saowen.com/a/a4162fcc05e9206b66731e6cf4bcdfcfae6be20ca66d09dcb2130b48794b7af7

[10] Highway Networks - bamtercelboo - 博客园
http://www.cnblogs.com/bamtercelboo/p/7606197.html

[11] 基於pytorch實現HighWay Networks之Highway Networks詳解 - 掃文資訊
https://hk.saowen.com/a/6347f3cb3e82b2aa98431589bbc775fec1499406deb65dc90cf21f6f2331ff8a

[12] ResNet论文笔记 - CSDN博客
http://blog.csdn.net/wspba/article/details/56019373

[13] 残差网络ResNet笔记 - 简书
https://www.jianshu.com/p/e58437f39f65

[14] ResNet:深度残差网络 — 动手学深度学习 0.6 documentation
https://zh.gluon.ai/chapter_convolutional-neural-networks/resnet-gluon.html 

[15] CVPR 2017最佳論文作者解讀:DenseNet 的「what」、「why」和「how」|CVPR 2017 _ 香港矽谷
https://www.hksilicon.com/articles/1392714 

[16] GoogLeNet学习心得 - 静悟生慧 - 博客园
https://www.cnblogs.com/Allen-rg/p/5833919.html

[17] googlenet in keras
http://joelouismarino.github.io/blog_posts/blog_googlenet_keras.html

[18] 深度學習之四大經典CNN技術淺析 硬創公開課 香港矽谷
https://www.hksilicon.com/articles/1280725

No comments: