【個人上課筆記】2026 TAICA 自然語言處理 - 第五周

Hello Guys I’m LukeTseng. 本篇筆記主要紀錄跟統整上課內容,性質屬於個人學習用途,敬請斟酌參考,謝謝。

清大 MOOCS 2026 TAICA 自然語言處理課程網址:https://mooc.nthu.edu.tw/course/info/470

上下文化詞嵌入

1. 從固定視窗改成較長的上下文

傳統的詞向量方法,通常會觀察一個字附近固定範圍內的詞,也就是用一個較小的上下文視窗(Context Window)。

上下文化詞嵌入的基本精神為:

  • 不只觀察附近幾個字。
  • 盡可能參考較長的句子或文章。
  • 根據目前的上下文,動態產生詞的表示。

老師將其概括成「把句子放長、看的東西更多,並且讓詞向量可以動態學習」,相較於傳統上直接統計大量條件機率,現在主要會利用神經網路預測各種可能的輸出。

2. 語句機率的分解

P(w1,,wn)=P(w1)P(w2w1)P(w3w1:2)P(wnw1:n1)P(w_1, \dots, w_n) = P(w_1)P(w_2 \mid w_1)P(w_3 \mid w_{1:2}) \cdots P(w_n \mid w_{1:n-1})

也可寫成:

P(w1,,wn)=k=1nP(wkw1:k1)P(w_1, \dots, w_n) = \prod_{k=1}^{n} P(w_k \mid w_{1:k-1})

  • wkw_k:第 kk 個詞。
  • w1:k1w_{1:k-1}:從第一個詞到第 k1k-1 個詞。
  • P(wkw1:k1)P(w_k\mid w_{1:k-1}):已知前面所有詞時,第 kk 個詞出現的機率。

假設這句「我今天去學校」,模型會拆成:$$P(\text{我今天去學校}) = P(\text{我})P(\text{今天} \mid \text{我})P(\text{去} \mid \text{我今天})P(\text{學校} \mid \text{我今天去})$$

也就是模型每次根據前面已經出現的詞,預測下一個詞。

此為語言模型的核心概念:一句話的機率,可以由每個位置的條件機率相乘得到。

Embedding 是模型的一部分

6cdfd70e-870b-493b-9255-9ab29041a4e7

Image Source:TAICA MOOCs | 自然語言處理 | 高宏宇老師 | 5-1 投影片

輸入文字先轉換成嵌入向量,再送入後面的語言模型層(Language Model Layers)。

Embedding 的作用是將原本離散的詞或符號,例如 one-hot vector 轉換成較密集的向量表示,也就是稠密向量(Dense Vector)。

例如一個詞原本可能表示為:[0,0,0,1,0,0,…],而經過 Embedding 後,可能轉換成:[0.21,−0.43,0.76,…],後面的神經網路便可以利用這些數值特徵進行運算。

1. Frozen:凍結 Embedding

Frozen 表示在訓練下游任務時,不更新 Embedding 的參數。

訓練流程變成:

  1. Embedding 只負責把詞轉成向量。
  2. Embedding 的數值保持不變。
  3. 只訓練後面的神經網路模型。

例如使用一組已經訓練好的 Word2Vec 詞向量:詞 \rightarrow 固定 Word2Vec 向量 \rightarrow 分類模型

即使分類模型持續訓練,Word2Vec 的向量也不會改變,這種方法的優點是:

  1. 訓練成本較低。
  2. 訓練速度較快。
  3. 不容易破壞原本已經學好的詞向量。

若通用 Embedding 已經足以解決問題,就不一定要繼續更新它。

2. Train Together:一起訓練

Train Together 表示在訓練下游任務時,同時更新 Embedding 與後面的模型。

例如原始 Embedding 是從維基百科或一般語料訓練而來,但若現在要處理醫療領域的文字,原本的 Embedding 可能沒有看過某些醫療專有名詞,這些詞的向量可能不夠準確。

此時可以使用醫病對話、醫療分類資料等監督式資料,同時更新 Embedding 跟後面的分類或語言模型。

這樣 Embedding 就能逐漸適應醫療領域的使用方式。

3. 是否一起訓練的取捨

一起更新 Embedding 不一定永遠比較好,主要代價包括:

  • 訓練成本增加。
  • 需要調整學習率(Learning Rate)。
  • 下游資料可能具有偏差。
  • 更新過度可能破壞原本已經學好的表示。

老師建議的實務原則是:先從成本最低的方法開始嘗試。

如果凍結 Embedding 就能達到足夠的效果,便不一定需要增加訓練成本;反之,如果通用 Embedding 無法處理特定領域的詞彙,再考慮一起更新。

神經語言模型

Embedding 只負責把詞轉換成向量,但向量中隱藏的特徵仍然需要模型進一步處理。

神經語言模型會利用神經網路學習語言中的複雜模式,例如:

  • 詞語之間的關係。
  • 詞語的前後順序。
  • 前文與後文的依賴關係。
  • 不同上下文中的語意變化等等。

在課程中主要介紹兩種基本架構:

  • 前饋神經網路(Feedforward Neural Network, FFN)
  • 循環神經網路(Recurrent Neural Network, RNN)

FFN 主要作為對照,而 RNN 則用來處理序列資料(Sequential Data)。

從文字任務的角度理解訓練流程

(前面神經網路基礎就跳過了,主要還是聚焦在 NLP 上)

雖然整體訓練流程相同,但文字任務的輸入與輸出形式差異很大,而常見的文字任務有:

  • 文字生成。
  • 情緒正負分類。
  • 命名實體辨識,例如判斷詞語是人名、地點或時間等等。

這些任務最主要的差異,在於輸入資料如何表示,以及輸出資料的形式、損失函數如何設計等等。

文字長度不固定

影像通常可以先調整成固定大小,例如固定的高度與寬度,但文字可能是幾個字的短句、幾百字的段落或幾千字的文章等,因此文字模型通常會設定一個最大輸入長度。

處理方式包括:

  • 文字過長:截斷(Truncation)。
  • 文字不足:補上 Padding。

例如最大長度設為 10,而原句只有 6 個 Token,則後面會補 4 個 Padding Token。或原句有 15 個 Token,則只保留其中 10 個 Token,其餘截斷。

這是一種直接而常見的處理方式。

文字任務的 Loss 不一定只是分類 Loss

標準答案可能是:

  • 一個類別。
  • Yes or No。
  • 一整個句子。
  • 每個詞各自對應一個標籤。

因此損失函數必須配合輸出形式設計。

例如:

  • 多類別分類可以使用 Cross-Entropy。
  • 語言模型可以根據每個詞的預測機率進行計算。
  • Perplexity 可用來衡量語言模型的預測表現。

前饋神經網路(Feedforward Neural Network)

8a505196-30d0-4414-8965-f3aa12c5f75f

Image Source:TAICA MOOCs | 自然語言處理 | 高宏宇老師 | 5-1 投影片

前饋神經網路(FFN)的特點是:資訊只從輸入層向前傳到隱藏層,再傳到輸出層,網路中沒有循環,公式為:$$\begin{aligned} h &= \sigma(Wx + b) \ z &= Uh \ y &= \text{softmax}(z) \end{aligned}$$

  • xx:輸入向量。
  • WW:輸入層到隱藏層的權重。
  • bb:偏差。
  • σ\sigma:啟動函數。
  • hh:隱藏層表示。
  • UU:隱藏層到輸出層的權重。
  • zz:輸出分數。
  • yy:經過 Softmax 後的機率分布。

例如輸入是一個固定的 2020 維特徵向量,FFN 可以輸出一個 Yes/No 的分類結果。

FFN 特性:

  • Input size 固定。
  • Output size 固定。
  • 層與層之間通常是 Fully Connected。
  • 適合處理欄位數固定的一般機器學習資料。

FFN 處理文字的限制

1. 缺乏序列建模能力

文字的順序非常重要。

例如:

  • 狗咬人。
  • 人咬狗。

兩句話包含相同的詞,但順序不同,意思完全不同。

傳統 FFN 只接收一個固定向量,沒有「前一個時間點的狀態」傳到下一個時間點的機制,因此不容易直接表達詞語之間的序列關係。

FFN 的基本架構不會特別保留序列資料的性質。

2. 輸入大小固定

假設 FFN 設計成接收 10001000 維輸入,它就只能接收這個固定維度。

但句子長度可能不同:

  • 句子 A:10 個詞。
  • 句子 B:50 個詞。
  • 文章 C:2000 個詞。

若直接切割文章,句子或段落的語意可能被截斷。

3. 上下文資訊有限

許多文字任務需要理解相隔很遠的詞語關係。

例如一句話前面出現主詞,後面很遠才出現與它對應的動詞,純粹的 FFN 沒有持續保存前文狀態的設計,因此較難處理長距離依賴。

這些限制使得 FFN 不適合作為早期序列文字模型的主要架構。

循環神經網路(Recurrent Neural Network)

f4a17de7-3ee6-4e08-ba11-a6dad3e76778

Image Source:TAICA MOOCs | 自然語言處理 | 高宏宇老師 | 5-1 投影片

循環神經網路(RNN)是專門用來處理序列資料的神經網路,核心概念:目前時間點的計算,除了使用目前輸入,也會使用前一個時間點留下來的狀態。

公式:$$\begin{aligned} h_t &= f(Ux_t + Wh_{t-1}) \ y_t &= g(Vh_t) \end{aligned}$$

  • xtx_t:第 tt 個時間點的輸入。
  • ht1h_{t-1}:前一時間點的隱藏狀態。
  • hth_t:目前時間點的新隱藏狀態。
  • yty_t:目前時間點的輸出。
  • UU:輸入到隱藏狀態的權重。
  • WW:前一隱藏狀態到目前隱藏狀態的權重。
  • VV:隱藏狀態到輸出的權重。

RNN 的展開

看到上圖,左邊是一個具有循環箭頭的 RNN 單元,右邊則是將它沿著時間軸展開:

h0ht1htht+1h_0 \rightarrow h_{t-1} \rightarrow h_t \rightarrow h_{t+1}

每一個時間點都會接收:

  • 當前輸入 xtx_t
  • 前一個狀態 ht1h_{t-1}

接著產生:

  • 新狀態 hth_t
  • 當前輸出 yty_t

用「一個字一個字餵進去」來描述這個過程,當模型讀取第二個字時,除了第二個字本身,也會接收讀取第一個字後留下的狀態。

隱藏狀態代表模型的記憶

隱藏狀態 hth_t 可以理解成模型讀到目前位置時所保留的資訊。

例如輸入「我/今天/去/學校」

處理過程可以想成:

  • 讀到「我」:h1h_1 記錄目前看過「我」。
  • 讀到「今天」:h2h_2 結合「我」與「今天」。
  • 讀到「去」:h3h_3 保留「我今天去」的部分資訊。
  • 讀到「學校」:h4h_4 根據前文理解「學校」。

前面的上下文可以透過隱藏狀態逐步傳遞到後面。

中間狀態可比喻成人的腦袋:它理論上應該記住前面看過哪些詞,以及這些詞的意義。

更新目前的隱藏狀態

ht=f(Uxt+Wht1)h_t = f(Ux_t + Wh_{t-1})

  • xtx_t:時間點 tt 的目前輸入。
  • ht1h_{t-1}:前一個時間點留下來的隱藏狀態。
  • hth_t:目前時間點更新後的隱藏狀態。
  • UU:處理目前輸入 xtx_t 的權重矩陣。
  • WW:處理前一個隱藏狀態 ht1h_{t-1} 的權重矩陣。
  • ff:隱藏層使用的活化函數(Activation Function)。

因此,hth_t 並不是只根據目前輸入 xtx_t 計算,而是同時考慮現在看到的內容以及前面已經讀過的內容。

可以將 hth_t 理解成模型讀到第 tt 個位置時,所保留下來的「目前理解」或「內部記憶」。

例如模型依序讀取:I → have → flight → to → New → York

當模型讀到「York」時,除了接收目前的輸入「York」,也會接收前面讀到「New」之後形成的隱藏狀態,所以模型有機會理解「New York」是一個完整的地名,而不是兩個互不相關的單字。

RNN 的輸出會回饋至下一個時間點,使後面的處理能讀取前面累積下來的資訊。

根據隱藏狀態產生輸出

yt=g(Vht)y_t = g(Vh_t)

  • hth_t:目前隱藏狀態。
  • VV:將隱藏狀態轉換為輸出的權重矩陣。
  • gg:輸出層的活化函數。
  • yty_t:時間點 tt 的輸出。

也就是說,RNN 會先把「目前輸入」和「前面資訊」整合成 hth_t,再由 hth_t 產生目前的輸出 yty_t

整體流程可以寫成:xt+ht1htytx_t + h_{t-1} → h_t → y_t,其中並不是直接相加,而是分別經過 UUWW 的線性轉換,再經過活化函數 ff

所有時間點共享參數

RNN 的一個重要特徵是:不同時間點使用相同的一組 weight 與 bias,也就是圖中的 UUWWVV 會在每個位置重複使用。

這代表無論句子有多少個詞,RNN 都可以重複使用同一個神經網路單元依序處理,而不需要為每個位置建立不同模型。

RNN 仍然有記憶限制

理論上,隱藏狀態會保存前面所有詞的資訊,但實際上句子越長,較早以前的資訊越可能逐漸消失。

以人類記憶作比喻:如果要記住一百個字,讀到第二十個字時,可能已經忘記第一個字的內容。

RNN 也有類似情況:

  • 最近讀到的內容通常比較容易保留。
  • 距離很遠的資訊較容易遺失。
  • 長句中的中間資訊也可能無法完整保存。

RNN 雖然比 FFN 更適合處理序列,但並不代表它能完全記住所有長距離上下文。

RNN 為什麼能處理序列?

假設句子包含三個字 x1,x2,x3x_1, x_2, x_3 ,RNN 的處理順序是:$$\begin{aligned} h_1 &= f(Ux_1 + Wh_0) \ h_2 &= f(Ux_2 + Wh_1) \ h_3 &= f(Ux_3 + Wh_2) \end{aligned}$$

可以看出,h2h_2 必須使用 h1h_1,而 h3h_3 必須使用 h2h_2,所以第三個位置的隱藏狀態 h3h_3,間接包含了:

  • 第一個輸入 x1x_1 的資訊。
  • 第二個輸入 x2x_2 的資訊。
  • 第三個輸入 x3x_3 的資訊。

這就是 RNN 能夠保留前文脈絡(Context)的主要原因。

不過,這種脈絡主要是「往前累積的脈絡」,目前位置能讀取前面位置留下的資訊,但在這個基本 RNN 架構中,不能直接看到後面的字。

RNN 的四項性質

序列處理(Sequential Processing)

RNN 會按照資料原本的順序逐步處理(x1x2x3x_1 → x_2 → x_3 →\dots),這使它適合處理文字、語音或其他具有時間先後關係的資料。

以這句為例:「他不是一個壞人」,如果忽略順序,只知道句子包含「他、不是、一個、壞人」,可能無法正確理解整句話,「不是」出現在「壞人」前面,會改變句子的語意,因此順序不能被丟棄。

RNN 的優點為可以依照序列處理資料,並捕捉前面文字與目前文字之間的關係。

循環連接(Recurrent Connections)

RNN 的隱藏狀態會從前一個時間點傳到下一個時間點(ht1hth_{t-1} → h_t),這種連接就像模型具有一個持續更新的筆記本,每讀到一個新字,就將新資訊寫入筆記本,再把更新後的筆記本交給下一個時間點。

不過,這個「記憶」不是人為規定要記住哪些內容,而是模型在訓練過程中,透過參數自行學習,我們通常無法直接知道隱藏狀態究竟記住了什麼,只知道它會被訓練成有助於完成任務的表示。

參數共享(Parameter Sharing)

RNN 在不同時間點會重複使用相同的權重矩陣:

  • 每個時間點都使用同一個 UU
  • 每個時間點都使用同一個 WW
  • 每個時間點都使用同一個 VV

例如:$$\begin{aligned} h_1 &= f(Ux_1 + Wh_0) \ h_2 &= f(Ux_2 + Wh_1)\end{aligned}$$

雖然輸入 x1x_1x2x_2 不同,但使用的 UUWW 是相同的。

這代表模型不需要為句子的第一個字、第二個字和第三個字各自訓練一套不同參數,而是使用同一組規則處理所有位置。

像閱讀一本書時,我們不會為每一頁建立一套完全不同的閱讀方法,而是使用相同的語言理解能力,逐頁處理不同內容。

不管哪一個字進入 RNN,模型都持續使用並更新同一組矩陣參數。

梯度消失問題(Vanishing Gradient Problem)

雖然 RNN 理論上可以讓資訊持續往後傳遞,但序列太長時,前面的資訊可能逐漸變弱或模糊。

例如一篇文章前面先稱讚某件事,後面又提出許多負面分析,當所有資訊不斷累積在固定長度的隱藏狀態中時,模型可能無法清楚保留文章一開始的內容。

以人的記憶作為類比:當我們閱讀很長的內容時,前面看過的細節也可能逐漸模糊,RNN 在計算梯度時,也會出現類似的現象,使較早時間點的資訊難以有效影響後面的學習。

RNN 具有傳遞長期資訊的結構,但傳統 RNN 在實際訓練時,可能因梯度消失而難以真正學好很長距離的依賴關係。

RNN 無法平行化的問題

RNN 的計算具有明確依賴 h1h2h3h_1 → h_2 → h_3,因為 h2h_2 必須等待 h1h_1 算完,h3h_3 又必須等待 h2h_2 算完,所以無法同時把所有位置完全獨立地計算。

例如這三個字 I / have / flight 不能在一開始就同時計算三個完整的隱藏狀態,因為:

  • 計算「have」時,需要「I」處理後的狀態。
  • 計算「flight」時,需要「have」處理後的狀態。

這正是 RNN 主要的限制之一,也與後來 Transformer 要解決的平行化問題有關。不過在這周的課程中,重點是去理解 RNN 必須一個字接著一個字處理。

應用範例:命名實體辨識(Name Entity Recognition, NER)

NER 的目標是從句子中找出具有特定意義的實體,例如:

  • 地名。
  • 組織名稱。
  • 人名。
  • 時間等等。

像這邊有一句是 I have flight to New York at 5pm.,模型需要辨識:

  • New York:地名。
  • 5pm:時間。

這個任務稱為「命名單元的識別」,重點在於模型不只要判斷類別,也要找出實體的開始與結束範圍。

為什麼這是序列問題?

"New York" 由兩個連續單字組成:New + York

模型不能只單獨看到 "New" 就立刻做出完整判斷,而需要結合後面的 "York",理解這兩個字共同形成一個地名。

同樣地,時間可能有不同寫法:

  • 5pm
  • 5:00
  • 5:00 PM

老師強調,即使時間的格式不同,模型仍需要找出它的邊界,並判斷整個片段代表時間。

RNN 如何處理 NER?

RNN 會逐字讀取句子:$$\begin{aligned} x_1 &= \text{I} \ x_2 &= \text{have} \ x_3 &= \text{flight} \end{aligned}$$

依序更新隱藏狀態,並在每一個位置產生輸出:$$x_t \rightarrow h_t \rightarrow y_t$$

這裡的 yty_t 可以表示目前這個字所屬的類別。

輸入詞模型判斷
I非命名實體
have非命名實體
flight非命名實體
to非命名實體
New地名的一部分
York地名的一部分
at非命名實體
5pm時間

RNN 的隱藏狀態能保留前面文字的資訊,因此模型在判斷 "York" 時,也能利用前面 "New" 所提供的脈絡。

NER 不只是找出實體,還要標出實體邊界

NER 通常會被轉換成「每個 Token 都要分類」的問題,以這句為例:“I have flight to New York at 5pm.”,模型不只要知道 New York 是地名,還要知道 New 是這個地名的開始、York 位於同一個地名內部,而其他字不屬於這個地名。

所以,NER 需要判斷實體的邊界(Boundary),可以將每一個字分成「實體的開始」「實體內部」或「不屬於實體」等類別。

在上課投影片中的標籤例子為:

  • O:Outside,不屬於任何命名實體。
  • B-GPE:Begin-GPE,地理政治實體(Geopolitical Entity)的開始。
  • I-GPE:Inside-GPE,位於同一個地理政治實體內部。

因此 New York 可以標成:

Token標籤
NewB-GPE
YorkI-GPE

這種做法能把 NER 轉換成多類別的 Token 分類問題。

RNNs for NER:每個位置都要輸出分類結果

【個人上課筆記】2026 TAICA 自然語言處理 - 第五周 - RNNs for NER:每個位置都要輸出分類結果

Image Source:TAICA MOOCs | 自然語言處理 | 高宏宇老師 | 5-3 投影片

NER 屬於 Token Classification,也就是輸入序列中每一個 Token 都需要對應一個輸出。

投影片中的流程可整理成:$$x_t \rightarrow \text{RNN} \rightarrow y_t \rightarrow \text{FFN} \rightarrow o_t$$

  • xtx_t:第 tt 個字或 Token 的輸入表示。
  • yty_t:RNN 在第 tt 個位置產生的表示。
  • oto_t:目前位置對各種標籤的預測結果。

xtx_t:輸入的 Word Embedding

輸入通常不直接用文字,而是先將每個字轉換成詞嵌入(Word Embedding)。理論上也可以使用 One-hot Vector,但實際上會用已經預訓練好的 Word Embedding,效果通常較好。

yty_t:具有上下文的表示

RNN 會將目前的 Word Embedding,與前面字詞留下的資訊結合,產生 yty_t,因此即使同一個字出現在不同句子中,其 yty_t 也可能不同。

例如 I live in New York.This is a new book.,雖然都出現 new,但由於前後文不同,經過 RNN 後產生的表示也會不同。

這種會隨句子位置與前文改變的向量,稱為上下文化詞嵌入(Contextualized Embedding),與 Word2Vec 產生的固定詞嵌入不同,會受到前面字詞影響。可以將兩者的差異簡化為:

表示方式同一個字在不同句子中的向量
傳統 Word Embedding相同
RNN 產生的 Contextualized Embedding可能不同

FFN:把表示轉換成標籤分數

RNN 的輸出 yty_t 是一個向量,但 NER 最後需要的是明確的類別,例如:

  • O
  • B-GPE
  • I-GPE
  • B-TIME
  • I-TIME

所以會在每一個 RNN 輸出後面加上一個 FFN,將 yty_t 轉換成各類別的分數。這個部分可以是一個很簡單的全連接層(Fully Connected Layer),用來完成多類別分類。

Softmax:轉換成各類別的機率

投影片中的輸出為:$$[p_O, p_{B-GPE}, p_{I-GPE}, p_{B-GPE}, p_{I-GPE}, \dots]$$

這代表模型對每一種標籤給出一個機率。例如,對 New 的輸出可能是 [0.03,0.85,0.10,0.02][0.03,0.85,0.10,0.02],分別代表:

標籤機率
O0.03
B-GPE0.85
I-GPE0.10
其他0.02

模型會選擇機率最大的類別 Predt=arg max(ot)\text{Pred}_t = \text{arg} \ \text{max}(o_t),最後這個位置會被預測為 B-GPE。

另外在投影片提到輸出會對應到 One-hot Vector,意思是正確答案可以表示成 [0,1,0,0][0,1,0,0],其中只有正確類別的位置為 11

NER 如何進行監督式學習

要訓練這個模型,需要事先標註好的資料,如:

Token正確標籤
IO
haveO
flightO
toO
NewB-GPE
YorkI-GPE
atO
5pmB-TIME

模型會將預測結果與正確標籤比較,再更新:

  • RNN 的參數。
  • FFN 的參數。
  • 視設定而定,也可能更新 Embedding。

只要有 NER 的監督式資料(Supervised Data),便能利用 RNN 訓練模型,使其辨識地名、時間或其他預先定義的類別。

醫療資料去識別化的例子

例如在醫療資料中,病人可能會說:「我去某家餐廳吃飯後開始不舒服」,如果餐廳名稱涉及個人活動資訊,就需要先辨識出來,再將其移除或替換。這個流程可以簡化成這樣:$$\text{病歷文字} → \text{NER 找出敏感實體} → \text{替換或遮蔽}$$

這就是自動去識別化(De-identification)的一種應用。

Token Classification 與 Sequence Classification 的差異

兩者最主要的差別在於輸出數量:

任務輸出方式例子
Token Classification每個 Token 都輸出一個標籤NER、詞性標記
Sequence Classification整段文字只輸出一個類別情緒分類、文章分類

RNNs for Sequence Classification

Img2

Image Source:TAICA MOOCs | 自然語言處理 | 高宏宇老師 | 5-3 投影片

序列分類不是判斷每一個字屬於什麼類別,而是判斷整段文字屬於哪一類。例如:「這部電影非常精彩,我很喜歡。」整個句子的分類結果可能是 Positive,而不是對每一個字分別輸出 PositiveNegative

依序處理完整序列

RNN 會依序讀取 x1,x2,x3,,xnx_1, x_2, x_3, \dots, x_n,並持續更新隱藏狀態 h1,h2,h3,,hnh_1, h_2, h_3, \dots, h_n,最後一個隱藏狀態 hnh_n 是模型讀完整段文字後所產生的表示。

使用最後一個隱藏狀態

Take the hidden layer for the last token of the text.

也就是取最後一個 Token 對應的隱藏狀態 hnh_n,再將它輸入進 FFN:hnFNNSoftmaxh_n \rightarrow \text{FNN} \rightarrow \text{Softmax},最終輸出整段文字的類別。

以句子情緒分類為例,說明可以在最後一個 Hidden State 後接一個分類層,再依照監督式資料更新 RNN 參數。

為什麼用 hnh_n

因為 RNN 是依序累積資訊的(h1h2hnh_1 \rightarrow h_2 \rightarrow \dots \rightarrow h_n),理論上,hnh_n 已經整合了前面所有 Token 的資訊,因此可用來表示整段序列。

可以想成閱讀文章後的「總結筆記」:

  • 讀第一個字後,筆記內容很少。
  • 繼續閱讀時,不斷更新筆記。
  • 讀完最後一個字時,最後版本的筆記就是 hnh_n

Stacked RNN:將多層 RNN 疊在一起

【個人上課筆記】2026 TAICA 自然語言處理 - 第五周 - Stacked RNN:將多層 RNN 疊在一起

Image Source:https://web.stanford.edu/~jurafsky/slp3/

單層 RNN 只有一層序列處理(xthtx_t \rightarrow h_t),而堆疊式 RNN(Stacked RNN)則將多層 RNN 垂直疊加。

可以看到這有三層:

  • RNN1
  • RNN2
  • RNN3

第一層的輸出會成為第二層的輸入,第二層的輸出再成為第三層的輸入,可寫成:$$\begin{aligned} h_t^{(1)} &= RNN_1(x_t, h_{t-1}^{(1)}) \ h_t^{(2)} &= RNN_2(h_t^{(1)}, h_{t-1}^{(2)}) \ h_t^{(3)} &= RNN_3(h_t^{(2)}, h_{t-1}^{(3)}) \end{aligned}$$

其中上標表示第幾層。

圖中的兩種資訊流動

理解這張圖時,要分清楚兩個方向:

  • 水平方向是時間順序:x1x2x3x_1 \rightarrow x_2 \rightarrow x_3 \rightarrow \dots
  • 垂直方向是網路層數:RNN1RNN2RNN3\text{RNN1} \rightarrow \text{RNN2} \rightarrow \text{RNN3}

每個位置的資料會先由底層處理,再逐層向上傳遞。

當一層 RNN 不足時,可以再疊加第二層、第三層,但每增加一層,都必須對整段序列進行更多計算。

不同 RNN 層可能學習不同抽象程度

多層 RNN 通常能學習不同層次的表示。

  • 較底層可能處理較基礎的資訊,例如:
    • 字詞形式。
    • 局部搭配。
    • 語法關係。
  • 較高層則可能形成較抽象的資訊,例如:
    • 句子語意。
    • 整體內容。
    • 任務需要的高階特徵。

可將上述簡化表示成:$$\text{Word Embedding} → \text{較基礎的表示} → \text{較抽象的語意表示}$$

接近 Word Embedding 的底層可能偏向處理語法,而較高層可能更適合語意任務,但這並不代表我們能直接打開某一個 Hidden State,明確看到「這一維是語法、那一維是語意」等等。

這些向量本身就難以直接解釋,只能透過不同任務的實驗結果,觀察高層表示是否在語意任務上表現較好。

Stacked RNN 的優點與成本

優點

多層結構可以對輸入進行多階段轉換(原始詞向量→第一層表示→第二層表示→第三層表示),因此,相較於單層網路會具有更強的表示能力。

成本

層數增加後,訓練成本也會快速上升。

原因是 RNN 本來就必須依序處理時間位置;堆疊多層後,每個位置還需要進行多層運算。

例如三層 RNN 就要 xtRNN1RNN2RNN3x_t \rightarrow \text{RNN1} \rightarrow \text{RNN2} \rightarrow \text{RNN3},每個 Token 都要經過三層,且整段序列仍需依序計算。

因此增加層數就會導致:

  • 計算量增加。
  • 訓練時間增加。
  • 需要更多運算資源。

疊得越多層,成本就越高。

Bidirectional RNN:同時利用前文與後文

Img3

Image Source:TAICA MOOCs | 自然語言處理 | 高宏宇老師 | 5-3 上課投影片

一般單向 RNN 只能從左到右處理(x1x2xnx_1 \rightarrow x_2 \rightarrow \dots x_n),所以在第 tt 個位置產生表示時,主要只能使用 x1,x2,,xtx_1, x_2, \dots, x_t,也就是目前位置以前的資訊。

但在文字理解中,一個字的意思有時也需要依靠後面的內容才能判斷。字詞不一定只受到前面文字影響,也可能受到後面字詞影響,因此文字處理常使用雙向結構。

正向 RNN

正向 RNN 從句首讀到句尾(x1x2xnx_1 \rightarrow x_2 \rightarrow \dots x_n),在位置 tt 產生正向狀態 ht\overrightarrow{h_t},主要包含左側前文資訊。

反向 RNN

反向 RNN 從句尾讀回句首(xnxn1x1x_n \rightarrow x_{n-1} \rightarrow \dots \rightarrow x_1),在位置 tt 產生反向狀態 ht\overleftarrow{h_t},主要包含右側後文資訊。

合併兩個方向

最後將正向與反向的表示結合,得到 ht=[ht;ht]h_t = [\overrightarrow{h_t}; \overleftarrow{h_t}],這裡可以把中括號理解成將兩個向量合併。

每一個位置都同時具有:

  • 前面字詞提供的資訊。
  • 後面字詞提供的資訊。

在上課投影片中的 RNN1 是由左向右處理,RNN2 則由右向左處理;兩個方向的結果共同用來產生每個位置的輸出。

雙向 RNN 的運作細節

前面已說明雙向循環神經網路(Bidirectional RNN)會同時從左到右、從右到左處理序列。這裡進一步說明補充說明:兩個方向在同一個位置得到的 Hidden State 並不相同。

假設輸入序列為 x1,x2,,xnx_1, x_2, \dots, x_n

正向 RNN

正向 RNN 依序處理 x1x2xnx_1 \rightarrow x_2 \rightarrow \dots \rightarrow x_n,當正向 RNN 處理到 xnx_n 時,其 Hidden State 已經接收了前面 x1x_1xn1x_{n-1} 所傳遞過來的資訊。

因此 ht\overrightarrow{h_t} 可以視為「從句首一路讀到句尾」後的表示。

反向 RNN

反向 RNN 則按照相反順序處理,但要注意,反向 RNN 剛開始讀取 xnx_n 時,尚未讀到其他字,所以此時的反向 Hidden State 並沒有包含完整序列資訊。

真正累積了後文資訊的,是反向 RNN 繼續向前處理後得到的狀態。例如在位置 x1x_1,反向 RNN 已經由 xnx_n 一路處理回來,因此包含了右側字詞傳遞而來的資訊。

雖然正向與反向 RNN 處理的是同一批文字,但由於資訊傳遞方向不同,同一個位置得到的兩個 Hidden State 具有不同含義。

圖中的每一個輸出 yty_t 如何產生

投影片中每個位置都有兩個 RNN 狀態:

下方橘色:正向 RNN 的狀態。
上方灰色:反向 RNN 的狀態。

以位置 tt 為例:ht\overrightarrow{h_t} 包含從 x1x_1xtx_t 的資訊,而 ht\overleftarrow{h_t} 包含從 xnx_n 倒著處理到 xtx_t 的資訊。

最後,兩個方向的表示被結合,用來形成位置 tt 的輸出表示:$$y = \text{Combine}(\overrightarrow{h_t}, \overleftarrow{h_t})$$

yty_t 能同時參考:

  • xtx_t 前面的內容。
  • xtx_t 後面的內容。
  • 目前的輸入 xtx_t

這就是為什麼每個 y1,y2,y3,,yny_1,y_2,y_3,\ldots,y_n 都同時連接到上下兩個 RNN 狀態的原因。

正向與反向表示的結合方法

兩個方向的 Hidden State 可以用不同方式合併。

1. 串接(Concatenation)

最直接、也較常見的方法,是把兩個向量接在一起:ht=[ht;ht]h_t = [\overrightarrow{h_t}; \overleftarrow{h_t}]

假設兩個方向的 Hidden State 都是 dd 維:$$\begin{aligned} \overrightarrow{h_t} &\in \mathbb{R}^d \ \overleftarrow{h_t} &\in \mathbb{R}^d \end{aligned}$$

串接後就會變成:htR2dh_t \in \mathbb{R}^{2d}

這種方式的優點是保留兩個方向的全部資訊,缺點則是向量維度加倍,後續分類層的參數量與計算量也會增加。

串接是較一般化的做法,因為它不會預先將兩個方向的資訊壓縮或混合,而是完整保留下來。

2. 相加(Addition)

也可以直接把兩個向量對應位置相加:ht=ht+hth_t = \overrightarrow{h_t} + \overleftarrow{h_t},相加後,維度仍是 dd,不會變成 2d2d

但這種方式會把正向與反向資訊混合,模型無法再直接區分某個數值究竟主要來自哪一個方向。

3. 平均(Average)

另一種做法是取平均:ht=ht+ht2h_t = \frac{\overrightarrow{h_t} + \overleftarrow{h_t}}{2},同樣可以維持原本維度,但也會產生資訊混合。

這些合併方法具有相當程度的啟發式(Heuristic)性質,也就是通常透過實驗比較效果,而不是只有唯一固定的正確選擇。

Stacked RNN 與 Bidirectional RNN 的不同之處

結構增加的方向目的
Stacked RNN垂直增加層數學習不同抽象層次的表示
Bidirectional RNN增加反向序列處理同時利用前文與後文

Stacked RNN 是 RNN1RNN2RNN3\text{RNN1} \rightarrow \text{RNN2} \rightarrow \text{RNN3}

而 Bidirectional RNN 是左到右 RNN + 右到左 RNN。

兩者解決的問題不同:

  • Stacked RNN 著重於表示能力與抽象層次。
  • Bidirectional RNN 著重於上下文方向是否完整。

雙向 RNN 用於序列分類

fe2dae7d-29a2-451f-abef-3c1123d3bc43

Image Source:TAICA MOOCs | 自然語言處理 | 高宏宇老師 | 5-4 上課投影片

前面單向 RNN 的序列分類,是取最後一個 Hidden State,雙向 RNN 的序列分類則需要分別取得兩個方向代表整段序列的狀態。

正向 RNN 的最終狀態

正向 RNN 從 x1x_1 讀到 xnx_n,因此使用 hn\overrightarrow{h_n},它包含由句首累積到句尾的資訊。

反向 RNN 的最終狀態

反向 RNN 從 xnx_n 讀回 x1x_1,因此使用 h1\overleftarrow{h_1},它包含由句尾反向累積到句首的資訊。

這裡很容易誤解,所謂「反向 RNN 的最終狀態」,不是位置 nn 的反向狀態,而是反向處理完整段序列後,位於 x1x_1 的狀態。

合併成整段序列的表示

接著將兩個方向的最終狀態結合:hsequence=[hn;h1]h_\text{sequence} = [\overrightarrow{h_n};\overleftarrow{h_1}],這個向量被視為整段文字的表示,再交給 FFN 與 Softmax:$$h_\text{sequence} \rightarrow \text{FFN} \rightarrow \text{Softmax} \rightarrow \text{Sequence Class}$$

投影片中的兩條彎曲線,就是分別將正向與反向的最終 Hidden State 傳入分類器。

雙向 RNN 並沒有改變分類器的基本結構,只是讓分類前所學到的表示更加複雜,也同時包含兩個方向的資訊。

雙向 Token Classification 與雙向 Sequence Classification

這兩種任務使用雙向 RNN 的方式不同。

Token Classification

例如 NER,需要在每一個位置輸出標籤:$$x_t \rightarrow [\overrightarrow{h}_t; \overleftarrow{h}_t] \rightarrow y_t$$

每一個 Token 都同時取得前文與後文資訊,再進行分類。

Sequence Classification

例如情緒分類,整段文字只輸出一個結果:

[hn;h1]FFNSoftmax[\overrightarrow{h}_n; \overleftarrow{h}_1] \rightarrow \text{FFN} \rightarrow \text{Softmax}

兩者的差別可以整理如下:

任務使用哪些雙向狀態輸出數量
Token Classification每個位置的 ht\overrightarrow{h_t}ht\overleftarrow{h_t}每個 Token 一個輸出
Sequence Classificationhn\overrightarrow{h_n}h1\overleftarrow{h_1}整段序列一個輸出

為什麼雙向 RNN 通常比單向 RNN 好

單向 RNN 在位置 tt 只能使用 x1,,xtx_1, \dots, x_t,雙向 RNN 則可以同時使用 x1,,xt,,xnx_1, \dots, x_t, \dots, x_n,因此,在需要完整句子才能判斷語意的任務中,雙向 RNN 往往能建立更完整的上下文化表示。

例如:「他說這部電影一開始很無聊,但最後非常精彩。」

如果模型只從左到右處理,在讀到「很無聊」時,還不知道後面出現「但最後非常精彩」,雙向 RNN 在處理完整句子後,可以讓前面的字詞也取得後文資訊。

在許多應用上,雙向模型通常比單向模型表現更好,但最終效果仍會受到正反向表示如何合併影響。

總整理

上下文化詞嵌入

傳統詞嵌入通常只觀察固定大小的上下文視窗,且同一個詞在不同句子中會得到相同向量,而上下文化詞嵌入(Contextualized Embedding)則會:

  • 參考較長的句子或文章。
  • 根據詞語所在的上下文,動態產生向量。
  • 讓同一個詞在不同語境中具有不同表示。

例如:

  • I live in New York. 中的 New 與地名有關。
  • This is a new book. 中的 new 表示「新的」。

兩者雖然字面相同,但上下文不同,因此模型產生的表示也不同。

語句機率分解

語言模型會根據前面已經出現的詞,預測下一個詞:

P(w1,,wn)=k=1nP(wkw1:k1)P(w_1,\dots,w_n)=\prod_{k=1}^{n}P(w_k\mid w_{1:k-1})

例如:

P(我今天去學校)=P()P(今天)P(我今天)P(學校我今天去)P(\text{我今天去學校})=P(\text{我}) P(\text{今天}\mid\text{我}) P(\text{去}\mid\text{我今天}) P(\text{學校}\mid\text{我今天去})

因此,一句話的機率可視為每個位置條件機率的乘積。

Embedding 在模型中的角色

Embedding 負責將離散的詞或符號轉換為稠密向量(Dense Vector):

One-hot VectorEmbedding神經網路模型\text{One-hot Vector} \rightarrow \text{Embedding} \rightarrow \text{神經網路模型}

例如:

1
2
3
[0, 0, 0, 1, 0, ...]

[0.21, -0.43, 0.76, ...]

稠密向量能以較少維度表示詞語的語意特徵,方便後續神經網路運算。

凍結 Embedding

凍結(Frozen)表示下游任務訓練時,不更新 Embedding:

  • Embedding 只負責產生固定向量。
  • 僅訓練後方的分類器或語言模型。
  • 訓練速度較快、成本較低。
  • 不容易破壞原本已學好的詞向量。

適合通用詞向量已足以處理任務的情況。

Embedding 與模型共同訓練

共同訓練(Train Together)表示同時更新:

  • Embedding 參數。
  • 後方神經網路參數。

適合醫療、法律等特殊領域,因為通用語料訓練出的詞向量可能無法正確表示專業詞彙。

缺點包括:

  • 訓練成本增加。
  • 需要調整學習率。
  • 資料偏差可能影響原有表示。
  • 過度更新可能破壞預訓練資訊。

實務上通常先嘗試凍結 Embedding,效果不足時再共同訓練。

文字任務的訓練特性

文字長度不固定

文字可能是短句、段落或長篇文章,因此通常設定最大輸入長度:

  • 過長:截斷(Truncation)。
  • 過短:補齊(Padding)。

例如最大長度為 10:

  • 6 個 Token:補上 4 個 Padding Token。
  • 15 個 Token:只保留指定的 10 個 Token。

輸出形式與損失函數

文字任務的輸出可能是:

  • 一個類別,例如情緒分類。
  • 每個 Token 的標籤,例如命名實體辨識。
  • 一整段文字,例如文字生成。

因此損失函數需配合任務設計:

  • 多類別分類:Cross-Entropy。
  • 語言模型:根據每個位置的預測機率計算。
  • 模型評估:可使用困惑度(Perplexity)。

前饋神經網路

前饋神經網路(Feedforward Neural Network, FFN)的資訊只會向前傳遞:

h=σ(Wx+b)z=Uhy=softmax(z)\begin{aligned} h &= \sigma(Wx + b) \\ z &= Uh \\ y &= \text{softmax}(z) \end{aligned}

主要特性:

  • 輸入大小固定。
  • 輸出大小固定。
  • 層與層之間通常為全連接。
  • 適合處理固定維度資料。

FFN 處理文字的限制

缺乏序列能力

文字順序會影響語意:

  • 狗咬人。
  • 人咬狗。

兩句包含相同詞語,但順序不同,意思完全不同,傳統 FFN 沒有保存前一位置狀態的機制,因此較難表示詞序。

輸入維度固定

句子長度可能從數個詞到數千個詞不等,但 FFN 要求固定維度,必須截斷或填補,可能造成語意遺失。

難以處理長距離依賴

FFN 沒有持續保存前文資訊的機制,因此較難處理相隔很遠的主詞、動詞或其他語意關係。

循環神經網路

循環神經網路(Recurrent Neural Network, RNN)專門處理序列資料。每個時間點的計算會同時使用:

  • 目前輸入 xtx_t
  • 前一時間點的隱藏狀態 ht1h_{t-1}

公式為:

ht=f(Uxt+Wht1)yt=g(Vht)\begin{aligned} h_t &= f(Ux_t + Wh_{t-1}) \\ y_t &= g(Vh_t) \end{aligned}

其中:

  • hth_t:目前隱藏狀態。
  • UU:輸入到隱藏層的權重。
  • WW:前一隱藏狀態到目前狀態的權重。
  • VV:隱藏狀態到輸出的權重。

RNN 的核心流程可整理為:

xt+ht1htytx_t+h_{t-1} \rightarrow h_t \rightarrow y_t

實際上並非直接相加,而是分別進行線性轉換後,再通過活化函數。

隱藏狀態

隱藏狀態(Hidden State)可理解為模型目前保留的「內部記憶」。

以「我/今天/去/學校」為例:

  • h1h_1:記錄「我」。
  • h2h_2:整合「我今天」。
  • h3h_3:保留「我今天去」的部分資訊。
  • h4h_4:根據前文理解「學校」。

前文資訊會透過隱藏狀態逐步傳遞到後面。

時間展開

同一個 RNN 單元沿時間軸展開後,可表示為:

h0h1h2hnh_0\rightarrow h_1\rightarrow h_2\rightarrow\cdots\rightarrow h_n

每個位置使用相同的權重矩陣 UUWWVV,稱為參數共享(Parameter Sharing)。

因此,句子無論包含多少個 Token,都可重複使用同一套 RNN 規則處理。

RNN 的四項重要性質

序列處理

RNN 按照原始順序逐步處理:

x1x2x3x_1\rightarrow x_2\rightarrow x_3\rightarrow\cdots

因此能保留詞語的先後關係,適合文字、語音與時間序列。

循環連接

前一個隱藏狀態會傳到下一個位置:

ht1hth_{t-1}\rightarrow h_t

可將其想成一個持續更新的筆記本:每讀到一個詞,就更新目前理解,再傳給下一個位置。

參數共享

所有時間點使用相同的權重:

  • 相同的 UU
  • 相同的 WW
  • 相同的 VV

這能降低參數量,並讓模型使用相同規則處理不同位置。

梯度消失

序列過長時,較早位置的資訊可能逐漸變弱,導致模型難以學習長距離依賴。

因此傳統 RNN:

  • 較容易保留近期資訊。
  • 較容易遺失很早以前的內容。
  • 不一定能完整保存長句或長文章資訊。

RNN 的主要限制

長期記憶能力有限

雖然理論上 hth_t 可包含先前所有資訊,但隱藏狀態容量有限,前面的資訊可能隨序列變長而逐漸消失。

難以平行化

RNN 的計算具有前後依賴:

h1h2h3h_1\rightarrow h_2\rightarrow h_3

計算 h2h_2 前必須先得到 h1h_1,計算 h3h_3 前又必須先得到 h2h_2,因此無法同時完成所有位置的計算,訓練速度受到限制。

RNN 用於命名實體辨識

命名實體辨識(Named Entity Recognition, NER)用來找出文字中的:

  • 人名。
  • 地名。
  • 組織名稱。
  • 時間。
  • 其他特定實體。

例如:

1
I have flight to New York at 5pm.

模型需辨識:

  • New York:地名。
  • 5pm:時間。

BIO 標籤

NER 不只要判斷實體類別,也要找出實體邊界:

  • O:不屬於任何實體。
  • B-GPE:地理政治實體的開始。
  • I-GPE:同一地理政治實體的內部。

例如:

Token標籤
NewB-GPE
YorkI-GPE

因此 NER 可轉換為每個 Token 的多類別分類問題。

RNN 的 NER 流程

xtRNNytFFNotx_t \rightarrow \text{RNN} \rightarrow y_t \rightarrow \text{FFN} \rightarrow o_t

  • xtx_t:Token 的 Word Embedding。
  • yty_t:包含上下文資訊的表示。
  • FFN:將表示轉換成各標籤分數。
  • Softmax:轉換為各類別機率。

模型會比較預測結果與正確標籤,更新:

  • RNN 參數。
  • FFN 參數。
  • 視設定決定是否更新 Embedding。

醫療資料去識別化

NER 可先找出病歷中的敏感資訊,再進行遮蔽或替換:

病歷文字NER 辨識敏感實體替換或遮蔽\text{病歷文字} \rightarrow \text{NER 辨識敏感實體} \rightarrow \text{替換或遮蔽}

這類應用稱為去識別化(De-identification)。

Token Classification 與 Sequence Classification

任務輸出方式例子
Token Classification每個 Token 一個標籤NER、詞性標記
Sequence Classification整段文字一個類別情緒分類、文章分類

RNN 序列分類

在序列分類中,RNN 依序處理所有輸入,最後使用最後一個隱藏狀態 hnh_n 表示整段文字:

hnFFNSoftmax類別h_n \rightarrow \text{FFN} \rightarrow \text{Softmax} \rightarrow \text{類別}

例如情緒分類:

1
2
這部電影非常精彩,我很喜歡。
→ Positive

hnh_n 可理解為模型讀完整段文字後形成的「總結筆記」。

Stacked RNN

堆疊式 RNN(Stacked RNN)會將多層 RNN 垂直疊加:

\begin{aligned} h_t^{(1)} &= RNN_1(x_t,h_{t-1}^{(1)})\ h_t^{(2)} &= RNN_2(h_t^{(1)},h_{t-1}^{(2)})\ h_t^{(3)} &= RNN_3(h_t^{(2)},h_{t-1}^{(3)}) \end{aligned}

資訊流動包含兩個方向:

  • 水平方向:時間順序。
  • 垂直方向:網路層數。

不同層的功能

較底層可能學習:

  • 字詞形式。
  • 局部搭配。
  • 基礎語法。

較高層可能學習:

  • 句子語意。
  • 整體內容。
  • 任務所需的高階特徵。

優點與成本

優點:

  • 表示能力較強。
  • 可進行多階段特徵轉換。
  • 能學習不同抽象層次。

成本:

  • 計算量增加。
  • 訓練時間增加。
  • 需要更多運算資源。
  • 每個 Token 都必須依序通過多層 RNN。

Bidirectional RNN

雙向 RNN(Bidirectional RNN)同時使用兩個方向處理序列:

正向 RNN

x1x2xnx_1\rightarrow x_2\rightarrow\cdots\rightarrow x_n

得到正向狀態:

ht\overrightarrow{h_t}

主要包含目前位置以前的資訊。

反向 RNN

xnxn1x1x_n\rightarrow x_{n-1}\rightarrow\cdots\rightarrow x_1

得到反向狀態:

ht\overleftarrow{h_t}

主要包含目前位置以後的資訊。

合併雙向表示

最常使用串接:

ht=[ht;ht]h_t= [\overrightarrow{h_t};\overleftarrow{h_t}]

若正向與反向狀態皆為 dd 維,串接後會變成 2d2d 維。

其他方法包括:

ht=ht+hth_t=\overrightarrow{h_t}+\overleftarrow{h_t}

或:

ht=ht+ht2h_t= \frac{\overrightarrow{h_t}+\overleftarrow{h_t}}{2}

比較如下:

方法優點缺點
串接完整保留兩個方向資訊維度與計算量增加
相加維度不變正反向資訊混合
平均維度不變、數值較穩定同樣會混合資訊

具體合併方法通常依實驗結果決定。

Stacked RNN 與 Bidirectional RNN 的差異

結構增加方式主要目的
Stacked RNN垂直增加層數學習不同抽象層次
Bidirectional RNN增加反向處理同時利用前文與後文

兩者可以同時使用,建立多層雙向 RNN。

雙向 RNN 的任務應用

雙向 Token Classification

每個 Token 都使用目前位置的正向與反向狀態:

xt[ht;ht]ytx_t \rightarrow [\overrightarrow{h_t};\overleftarrow{h_t}] \rightarrow y_t

適合 NER 等每個位置都需要輸出的任務。

雙向 Sequence Classification

正向 RNN 完整讀完序列後的狀態為:

hn\overrightarrow{h_n}

反向 RNN 完整讀完序列後的狀態位於:

h1\overleftarrow{h_1}

整段文字表示為:

hsequence=[hn;h1]h_{\text{sequence}}=[\overrightarrow{h_n};\overleftarrow{h_1}]

再交給分類器:

hsequenceFFNSoftmaxSequence Classh_{\text{sequence}} \rightarrow \text{FFN} \rightarrow \text{Softmax} \rightarrow \text{Sequence Class}

注意:反向 RNN 的最終狀態不是 hn\overleftarrow{h_n},而是反向讀完整段序列後位於第一個位置的 h1\overleftarrow{h_1}

重點比較

架構可利用的資訊主要優點主要限制
FFN固定輸入向量結構簡單、容易平行化不擅長序列與長度變化
單向 RNN目前與前文能處理詞序與序列長期記憶有限、難平行化
Stacked RNN多層序列表示表示能力較強訓練成本高
Bidirectional RNN前文與後文上下文資訊更完整計算量與參數增加

結論

  • Embedding 將文字轉換成可供神經網路處理的向量。
  • 上下文化詞嵌入會根據語境動態改變同一個詞的表示。
  • FFN 適合固定維度資料,但缺乏序列記憶。
  • RNN 透過隱藏狀態保留前文資訊,適合文字與時間序列。
  • 傳統 RNN 存在梯度消失、長期記憶不足及無法平行化等限制。
  • Token Classification 對每個 Token 輸出標籤;Sequence Classification 對整段序列輸出一個類別。
  • Stacked RNN 透過增加層數提升表示能力。
  • Bidirectional RNN 同時利用前文與後文,能建立更完整的上下文化表示。