在之前 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 data 不適合用一般堆疊式的架構,如 Feed Forward Network 來處理,原因有下列兩個:
因為 Feed Forward Network 在處理 sequence data 有上列問題,所以對於此類的資料,發展了一個名為 Recurrent Neural Network 的架構,在此後以後都會簡稱為 RNN。 RNN 的基礎架構如下:
在架構的圖解上,可以依是否將 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 的架構,那麼在這個架構下該如何運用反向傳播來學習呢?首先,讓我們先看一下如何在 RNN 的架構中進行正向傳播。在這裡,我們使用的是多對多(many to many)的 RNN 架構,可以看到在初始化初始狀態(a<0>)後,第一個序列位置的兩個輸出(y<1> 和 a<1>)是透過第一個位置的輸入和初始狀態來計算。
而計算反向傳播,則可以由下圖看到,首先對於每一個序列位置的輸出,都可以透過損失函式計算出一個損失。而全部的損失則為每一個序列位置計算出的損失總和。另外,因為所有的權重都是共享的,所以 chain rule 是應用到整個序列。也就是說,從最後一個狀態的輸出開始,開始隨著時間倒轉來更新權重。