前言:
神經網路模型,有處理圖片這類以「空間關係」數據為主的卷積神經網路 (CNN),也有處理以「時間或順序關係 (i.e. 序列數據/Sequential Data)」數據為主的「循環神經網路(Recurrent Neural Network/ RNN。
這次要一口氣介紹三個都是處理「序列」和「關係」的神經網路:RNN/ LSTM/ Transformer。
Transformer與前兩者有點不同,不過由於今天主要是要了解它們在自然語言上(理解文本與對話)的功用,所以擺在一起。實際上,Transformer在處理「關係」上的優秀,不止在「時間/序列關係」上,同時也包含「空間關係」;這便是Transformer與RNN/ LSTM的不同之處。
內容會有以下:
一、循環神經網路 (Recurrent Neural Network/ RNN)
二、長短期記憶 (Long Short-Term Memory/ LSTM)
三、轉換器 (Transformer)
四、RNN/ LSTM/ Transformer 的小結&發展應用
那麼,就讓我們從 RNN 開始吧。
--
一、循環神經網路(Recurrent Neural Network/ RNN)
▷ RNN 概念**
RNN 的核心是「記憶」+「循環」。這意思是說,透過不斷地循環,持續地將上一個時間點的「上下文資訊」傳遞到下一個時間點,透過「一而再、再而三地加入下一個時間點的數據」,從而「記住」整個序列的上下文意義。
(**註:因為這次的焦點就是聚焦在自然語言的神經網路模型,所以本篇中所提及的 RNN,都將以NLP 自然語言處理的情境為主。)
▷ RNN 核心運作流程
0.分詞 (Tokenization)**
在一個句子輸入到 RNN 前,必須先進行「分詞 (Tokenization)」的步驟,也就是將句子中最基本的意義單位找出來。
-「英文」分詞:英文以空格來分隔單字,所以分詞相對簡單,例如:you are great. 直接可分為三個單字依序輸入 RNN。
-「中文」分詞:因為中文語句中,文字是連貫的,句子中沒有空格,所以相對複雜。因此,這裡的分詞動作,需先辨識出哪些字屬於同一個詞彙,然後將其視作一個完整的「詞元(Token)」處理。例如:指鹿為馬,經辨識後通常會被視為單一一體的詞語,而非 4個獨立的字。 →將語言處理為有意義的「詞元(Token)」序列,接著便要將這個序列依序輸入到 RNN 中。
(**註:分詞非必要步驟,取決於任務,NLP任務才會需要。)
1. RNN 的「記憶」:隱藏狀態
以一段對話**為例:
▪︎「A 聽 B 說話」:RNN 接收輸入。
▪︎「B 說的話在 A 腦中消化」:進入RNN 的「隱藏狀態」,開始進行更新和處理資訊。這個消化過程會總結B剛說過的內容,並將結果儲存起來。
▪︎「然後 A 做出回答」:RNN 根據這個「消化」後的資訊,做出輸出。
→透過這個過程,使得 RNN 能夠擁有了「上下文的連貫性」,於是進到下一個環節。
(**註:此處為了便於理解,以對話為例,不過隱藏狀態實質上是「數學向量」,而非語意文字記憶。)
2. RNN 進入「循環」結構,實現「上下文連貫著的」資訊的持續傳遞。
▪︎ 循環結構:上一個「隱藏狀態」 + 當前輸入 → 運算 → 產生「新的隱藏狀態」+輸出
3. 總結1+2的運作流程,拆解成以下步驟:
[上一個隱藏狀態] + [當前輸入]
↓
運算
↓
新的隱藏狀態
↓
(傳遞給下一個時間點) 輸出
→→透過將「新的隱藏狀態」作為下一個時間點的「上一個隱藏狀態」,再次進入運算、再次循環。整個過程不斷重複,直到序列結束。這種重複的運算,讓 RNN 能夠處理長度可變的序列,而不會因為句子的長短而受限。
▷ RNN 的困難「梯度消失 (Vanishing Gradient Problem)」
1. 什麼是「梯度」?
梯度是一個數值,在神經網路模型中,是用來幫助神經網路學習的「動態」學習訊號。它告訴神經網路每個參數應該調整多少,才能讓預測更準確。這個訊號是在模型進行訓練時,在「反向傳播」過程中反饋錯誤時,透過一連串的數學運算產生的。
2. 為什麼梯度會「消失」?
在「反向傳播」的過程中,梯度需要不斷地與每一個神經元中的權重 (Weights) 相乘。連續地乘以多個小於 1 的小數時,結果會變得越來越小。在 RNN 中,每處理一個單字,這個梯度訊號就要「傳遞」一次,經歷一次乘法。當句子非常長時,這個訊號在到達最前面(例如句子的開頭) 時,就已經變得太小,無法有效地調整那些神經元的權重了。
3. 梯度消失**的問題是?
假設一個很長的語句,在經過冗長的計算後,最初開頭的詞元的梯度已經過小,變得消失,這便會導致 RNN 無法記住長句子開頭資訊,所以「梯度衰退」也就導致早期輸入的資訊,幾乎無法影響最終的參數更新,呈現出「記憶力衰退」。不過,這只會在 RNN的訓練(學習)階段才會發生。
(**註:可以想見的是,有「梯度消失」,相對地就會有「梯度爆炸」,也就是一對動態數值的兩端。梯度消失是訊號越傳越小,導致前期資訊的消失,而梯度爆炸則是朝向另一個極端,權重更新過大,導致訓練不穩定。)
4. 解決方案
針對 RNN「梯度消失」的問題,最直覺的方向就是想辦法不讓記憶衰退**。於是有了LSTM的誕生:從架構上改善,也就是接下來要進入的部分:「長短期記憶 (Long Short-Term Memory/ LSTM)」。這是一個頗具成效的解法,在下一段中,透過了解LSTM,便可知道它是如何做到記憶力「不」衰退。
(**註:關於「梯度爆炸」的解法,大致包含3個方向:限定梯度大小範圍Gradient Clipping;正則化與初始化技巧一開始就避開權重太大的可能 Xavier/He 初始化;而「梯度消失」的從架構改善以控制訊號流動LSTM/GRU 也是一種方式。不過這裡我們將聚焦針對「梯度消失」與LSTM,而不在「梯度爆炸」的部分多作著墨。)