iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 18
1
AI & Data

30 天學會深度學習和 Tensorflow系列 第 18

17. 深度學習甜點系列:有完沒完的循環網路(RNN)

  • 分享至 

  • xImage
  •  

在之前 Convolution neural network 的系列中,我們處理的都是影像資料。若是灰階影像,則轉換成矩陣,其維度為 2D,若是 RGB 影像,則轉換成矩陣後,則為 3D (第三個維度包含了 RGB Channels)。

在此節中,我們關心的則是 sequence data。什麼是 sequence data,此類的資料,若用矩陣來表示,則為 1D 的向量。這類的資料,雖然是 1D,但其複雜度並不亞於影像資料。

首先,這些 sequence data,在序列的前後位置間有相依性。依照相依的程度,可以分為最簡單的相依關係,也就是符合一階馬可夫特性,只與前一序列元素相依的關係。複雜的,則有 n 階的長距離相依關係,也就是序列中 n+1 的元素和前 n 個元素都有相依關係。

其次,相較於影像的大小,可以藉由 crop 或是 scaling 的方法來達成所有訓練輸入影像都為同一尺寸。這些 sequence data 通常都沒有固定的長度,雖然可以設定一個最大長度,並利用 padding 的方式來達成同一最大長度,但此類做法,會讓類神經網路權重分佈變得稀疏,且難以訓練。

最後,這些 sequence data 也和影像資料一般,具有小而短的模式(pattern)是和位置不相依的。如人名可以出現在句子的任何位置,而 DNA 序列,因為要與某些蛋白質結合,而執行某些生化功能,這些可與蛋白質結合的部分 DNA 序列,被稱為 binding site,通常具有某些獨特的序列模式。

相關的例子可見下面投影片截圖:

sequence examples

Sequence data 不適合用一般堆疊式的架構,如 Feed Forward Network 來處理,原因有下列兩個:

  1. 如前所述, sequence data 的訓練資料長度不一致,即使用 padding 的方式,仍會造成網路階層間的連接權重稀疏,而不易訓練。
  2. 其次,若以全 sequence 的方式來訓練,則會使某些重複出現模式與位置相依,而未能達成如 convolution network 利用較小的 filter 對整張輸入影像做 convolution operation,而萃取出偏移不變的特徵(translation invariance)。

因為 Feed Forward Network 在處理 sequence data 有上列問題,所以對於此類的資料,發展了一個名為 Recurrent Neural Network 的架構,在此後以後都會簡稱為 RNN。 RNN 的基礎架構如下:
RNN architecture

在架構的圖解上,可以依是否將 loop 畫進單一序列的位置中,而分為 “Unroll” (上圖左)和 “compact” 的版本(上圖右)。 RNN 的架構中,除了第一個位置,在每一個位置,上標為 t,都包含了 sequence 輸入,x,一個 output label 輸出, y,以及一個狀態輸出,a。

為了捕捉序列間的相依性,除了第一個位置,每一個位置都依賴序列位置前的狀態,和該位置的輸入。而第一個位置,則須提供一個初始狀態,通常會將其初始化為都為零的向量。在理想狀況下,每一個位置多少都會捕捉到在此位置之前,序列中每一位置的狀態,然而在往後的文章中,我們會發現,尤其對於較長的序列,在訓練中是很困難的事。

關於權重的部分,除了相似於 Feed forward network 中對於輸入 x 和 y 都有相對的線性轉換以及非線性的 activation function。RNN 還多了一個如 transition matrix 的權重參數,用來捕捉每一個位置之間的相依關係,要注意的是, RNN 的權重在每一個位置上都是相同的,所以其參數的個數並不會隨著序列的長度而變更。

除了最基礎的 RNN 架構,RNN 也因為其應用的不同而有許不同的架構,其架構的粗略分類可以見下圖:

RNN types

  1. 一對多:這類型的應用多半是 sequence generation,如利用 RNN 來創造音樂或文章。
  2. 多對一:這類型的應用則如情緒分析,給予一個句子,在序列的最後狀態輸出是否帶有正面或負面的情緒。
  3. 多對多(輸出與輸入長度相符):這也是最基礎的 RNN 架構,每一個輸入都有對應的輸出,如一個二元的分類輸出,表示該位置的單詞是否為人名。
  4. 多對多(輸出與輸入長度不同):如機械翻譯的應用中,兩個語言通常不具有相同的長度。同時,也會在輸入和輸出中使用 encoder 和 decoder 的架構。

談完了 RNN 的架構,那麼在這個架構下該如何運用反向傳播來學習呢?首先,讓我們先看一下如何在 RNN 的架構中進行正向傳播。在這裡,我們使用的是多對多(many to many)的 RNN 架構,可以看到在初始化初始狀態(a<0>)後,第一個序列位置的兩個輸出(y<1> 和 a<1>)是透過第一個位置的輸入和初始狀態來計算。

Forward pass in RNN

而計算反向傳播,則可以由下圖看到,首先對於每一個序列位置的輸出,都可以透過損失函式計算出一個損失。而全部的損失則為每一個序列位置計算出的損失總和。另外,因為所有的權重都是共享的,所以 chain rule 是應用到整個序列。也就是說,從最後一個狀態的輸出開始,開始隨著時間倒轉來更新權重。

Backward pass in RNN


上一篇
16. 深度學習甜點系列:卷積網路總結
下一篇
18. 深度學習甜點系列:RNN 的秘密武器 - 記憶單元
系列文
30 天學會深度學習和 Tensorflow30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言