【個人上課筆記】2026 TAICA 自然語言處理 - 第五周
【個人上課筆記】2026 TAICA 自然語言處理 - 第五周
Hello Guys I’m LukeTseng. 本篇筆記主要紀錄跟統整上課內容,性質屬於個人學習用途,敬請斟酌參考,謝謝。
清大 MOOCS 2026 TAICA 自然語言處理課程網址:https://mooc.nthu.edu.tw/course/info/470
上下文化詞嵌入
1. 從固定視窗改成較長的上下文
傳統的詞向量方法,通常會觀察一個字附近固定範圍內的詞,也就是用一個較小的上下文視窗(Context Window)。
上下文化詞嵌入的基本精神為:
- 不只觀察附近幾個字。
- 盡可能參考較長的句子或文章。
- 根據目前的上下文,動態產生詞的表示。
老師將其概括成「把句子放長、看的東西更多,並且讓詞向量可以動態學習」,相較於傳統上直接統計大量條件機率,現在主要會利用神經網路預測各種可能的輸出。
2. 語句機率的分解
也可寫成:
- :第 個詞。
- :從第一個詞到第 個詞。
- :已知前面所有詞時,第 個詞出現的機率。
假設這句「我今天去學校」,模型會拆成:$$P(\text{我今天去學校}) = P(\text{我})P(\text{今天} \mid \text{我})P(\text{去} \mid \text{我今天})P(\text{學校} \mid \text{我今天去})$$
也就是模型每次根據前面已經出現的詞,預測下一個詞。
此為語言模型的核心概念:一句話的機率,可以由每個位置的條件機率相乘得到。
Embedding 是模型的一部分

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 的參數。
訓練流程變成:
- Embedding 只負責把詞轉成向量。
- Embedding 的數值保持不變。
- 只訓練後面的神經網路模型。
例如使用一組已經訓練好的 Word2Vec 詞向量:詞 固定 Word2Vec 向量 分類模型
即使分類模型持續訓練,Word2Vec 的向量也不會改變,這種方法的優點是:
- 訓練成本較低。
- 訓練速度較快。
- 不容易破壞原本已經學好的詞向量。
若通用 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)

Image Source:TAICA MOOCs | 自然語言處理 | 高宏宇老師 | 5-1 投影片
前饋神經網路(FFN)的特點是:資訊只從輸入層向前傳到隱藏層,再傳到輸出層,網路中沒有循環,公式為:$$\begin{aligned} h &= \sigma(Wx + b) \ z &= Uh \ y &= \text{softmax}(z) \end{aligned}$$
- :輸入向量。
- :輸入層到隱藏層的權重。
- :偏差。
- :啟動函數。
- :隱藏層表示。
- :隱藏層到輸出層的權重。
- :輸出分數。
- :經過 Softmax 後的機率分布。
例如輸入是一個固定的 維特徵向量,FFN 可以輸出一個 Yes/No 的分類結果。
FFN 特性:
- Input size 固定。
- Output size 固定。
- 層與層之間通常是 Fully Connected。
- 適合處理欄位數固定的一般機器學習資料。
FFN 處理文字的限制
1. 缺乏序列建模能力
文字的順序非常重要。
例如:
- 狗咬人。
- 人咬狗。
兩句話包含相同的詞,但順序不同,意思完全不同。
傳統 FFN 只接收一個固定向量,沒有「前一個時間點的狀態」傳到下一個時間點的機制,因此不容易直接表達詞語之間的序列關係。
FFN 的基本架構不會特別保留序列資料的性質。
2. 輸入大小固定
假設 FFN 設計成接收 維輸入,它就只能接收這個固定維度。
但句子長度可能不同:
- 句子 A:10 個詞。
- 句子 B:50 個詞。
- 文章 C:2000 個詞。
若直接切割文章,句子或段落的語意可能被截斷。
3. 上下文資訊有限
許多文字任務需要理解相隔很遠的詞語關係。
例如一句話前面出現主詞,後面很遠才出現與它對應的動詞,純粹的 FFN 沒有持續保存前文狀態的設計,因此較難處理長距離依賴。
這些限制使得 FFN 不適合作為早期序列文字模型的主要架構。
循環神經網路(Recurrent Neural Network)

Image Source:TAICA MOOCs | 自然語言處理 | 高宏宇老師 | 5-1 投影片
循環神經網路(RNN)是專門用來處理序列資料的神經網路,核心概念:目前時間點的計算,除了使用目前輸入,也會使用前一個時間點留下來的狀態。
公式:$$\begin{aligned} h_t &= f(Ux_t + Wh_{t-1}) \ y_t &= g(Vh_t) \end{aligned}$$
- :第 個時間點的輸入。
- :前一時間點的隱藏狀態。
- :目前時間點的新隱藏狀態。
- :目前時間點的輸出。
- :輸入到隱藏狀態的權重。
- :前一隱藏狀態到目前隱藏狀態的權重。
- :隱藏狀態到輸出的權重。
RNN 的展開
看到上圖,左邊是一個具有循環箭頭的 RNN 單元,右邊則是將它沿著時間軸展開:
每一個時間點都會接收:
- 當前輸入 。
- 前一個狀態 。
接著產生:
- 新狀態 。
- 當前輸出 。
用「一個字一個字餵進去」來描述這個過程,當模型讀取第二個字時,除了第二個字本身,也會接收讀取第一個字後留下的狀態。
隱藏狀態代表模型的記憶
隱藏狀態 可以理解成模型讀到目前位置時所保留的資訊。
例如輸入「我/今天/去/學校」
處理過程可以想成:
- 讀到「我」: 記錄目前看過「我」。
- 讀到「今天」: 結合「我」與「今天」。
- 讀到「去」: 保留「我今天去」的部分資訊。
- 讀到「學校」: 根據前文理解「學校」。
前面的上下文可以透過隱藏狀態逐步傳遞到後面。
中間狀態可比喻成人的腦袋:它理論上應該記住前面看過哪些詞,以及這些詞的意義。
更新目前的隱藏狀態
- :時間點 的目前輸入。
- :前一個時間點留下來的隱藏狀態。
- :目前時間點更新後的隱藏狀態。
- :處理目前輸入 的權重矩陣。
- :處理前一個隱藏狀態 的權重矩陣。
- :隱藏層使用的活化函數(Activation Function)。
因此, 並不是只根據目前輸入 計算,而是同時考慮現在看到的內容以及前面已經讀過的內容。
可以將 理解成模型讀到第 個位置時,所保留下來的「目前理解」或「內部記憶」。
例如模型依序讀取:I → have → flight → to → New → York
當模型讀到「York」時,除了接收目前的輸入「York」,也會接收前面讀到「New」之後形成的隱藏狀態,所以模型有機會理解「New York」是一個完整的地名,而不是兩個互不相關的單字。
RNN 的輸出會回饋至下一個時間點,使後面的處理能讀取前面累積下來的資訊。
根據隱藏狀態產生輸出
- :目前隱藏狀態。
- :將隱藏狀態轉換為輸出的權重矩陣。
- :輸出層的活化函數。
- :時間點 的輸出。
也就是說,RNN 會先把「目前輸入」和「前面資訊」整合成 ,再由 產生目前的輸出 。
整體流程可以寫成:,其中並不是直接相加,而是分別經過 與 的線性轉換,再經過活化函數 。
所有時間點共享參數
RNN 的一個重要特徵是:不同時間點使用相同的一組 weight 與 bias,也就是圖中的 、、 會在每個位置重複使用。
這代表無論句子有多少個詞,RNN 都可以重複使用同一個神經網路單元依序處理,而不需要為每個位置建立不同模型。
RNN 仍然有記憶限制
理論上,隱藏狀態會保存前面所有詞的資訊,但實際上句子越長,較早以前的資訊越可能逐漸消失。
以人類記憶作比喻:如果要記住一百個字,讀到第二十個字時,可能已經忘記第一個字的內容。
RNN 也有類似情況:
- 最近讀到的內容通常比較容易保留。
- 距離很遠的資訊較容易遺失。
- 長句中的中間資訊也可能無法完整保存。
RNN 雖然比 FFN 更適合處理序列,但並不代表它能完全記住所有長距離上下文。
RNN 為什麼能處理序列?
假設句子包含三個字 ,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}$$
可以看出, 必須使用 ,而 必須使用 ,所以第三個位置的隱藏狀態 ,間接包含了:
- 第一個輸入 的資訊。
- 第二個輸入 的資訊。
- 第三個輸入 的資訊。
這就是 RNN 能夠保留前文脈絡(Context)的主要原因。
不過,這種脈絡主要是「往前累積的脈絡」,目前位置能讀取前面位置留下的資訊,但在這個基本 RNN 架構中,不能直接看到後面的字。
RNN 的四項性質
序列處理(Sequential Processing)
RNN 會按照資料原本的順序逐步處理(),這使它適合處理文字、語音或其他具有時間先後關係的資料。
以這句為例:「他不是一個壞人」,如果忽略順序,只知道句子包含「他、不是、一個、壞人」,可能無法正確理解整句話,「不是」出現在「壞人」前面,會改變句子的語意,因此順序不能被丟棄。
RNN 的優點為可以依照序列處理資料,並捕捉前面文字與目前文字之間的關係。
循環連接(Recurrent Connections)
RNN 的隱藏狀態會從前一個時間點傳到下一個時間點(),這種連接就像模型具有一個持續更新的筆記本,每讀到一個新字,就將新資訊寫入筆記本,再把更新後的筆記本交給下一個時間點。
不過,這個「記憶」不是人為規定要記住哪些內容,而是模型在訓練過程中,透過參數自行學習,我們通常無法直接知道隱藏狀態究竟記住了什麼,只知道它會被訓練成有助於完成任務的表示。
參數共享(Parameter Sharing)
RNN 在不同時間點會重複使用相同的權重矩陣:
- 每個時間點都使用同一個 。
- 每個時間點都使用同一個 。
- 每個時間點都使用同一個 。
例如:$$\begin{aligned} h_1 &= f(Ux_1 + Wh_0) \ h_2 &= f(Ux_2 + Wh_1)\end{aligned}$$
雖然輸入 、 不同,但使用的 和 是相同的。
這代表模型不需要為句子的第一個字、第二個字和第三個字各自訓練一套不同參數,而是使用同一組規則處理所有位置。
像閱讀一本書時,我們不會為每一頁建立一套完全不同的閱讀方法,而是使用相同的語言理解能力,逐頁處理不同內容。
不管哪一個字進入 RNN,模型都持續使用並更新同一組矩陣參數。
梯度消失問題(Vanishing Gradient Problem)
雖然 RNN 理論上可以讓資訊持續往後傳遞,但序列太長時,前面的資訊可能逐漸變弱或模糊。
例如一篇文章前面先稱讚某件事,後面又提出許多負面分析,當所有資訊不斷累積在固定長度的隱藏狀態中時,模型可能無法清楚保留文章一開始的內容。
以人的記憶作為類比:當我們閱讀很長的內容時,前面看過的細節也可能逐漸模糊,RNN 在計算梯度時,也會出現類似的現象,使較早時間點的資訊難以有效影響後面的學習。
RNN 具有傳遞長期資訊的結構,但傳統 RNN 在實際訓練時,可能因梯度消失而難以真正學好很長距離的依賴關係。
RNN 無法平行化的問題
RNN 的計算具有明確依賴 ,因為 必須等待 算完, 又必須等待 算完,所以無法同時把所有位置完全獨立地計算。
例如這三個字 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$$
這裡的 可以表示目前這個字所屬的類別。
| 輸入詞 | 模型判斷 |
|---|---|
| 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 | 標籤 |
|---|---|
| New | B-GPE |
| York | I-GPE |
這種做法能把 NER 轉換成多類別的 Token 分類問題。
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$$
- :第 個字或 Token 的輸入表示。
- :RNN 在第 個位置產生的表示。
- :目前位置對各種標籤的預測結果。
:輸入的 Word Embedding
輸入通常不直接用文字,而是先將每個字轉換成詞嵌入(Word Embedding)。理論上也可以使用 One-hot Vector,但實際上會用已經預訓練好的 Word Embedding,效果通常較好。
:具有上下文的表示
RNN 會將目前的 Word Embedding,與前面字詞留下的資訊結合,產生 ,因此即使同一個字出現在不同句子中,其 也可能不同。
例如 I live in New York. 與 This is a new book.,雖然都出現 new,但由於前後文不同,經過 RNN 後產生的表示也會不同。
這種會隨句子位置與前文改變的向量,稱為上下文化詞嵌入(Contextualized Embedding),與 Word2Vec 產生的固定詞嵌入不同,會受到前面字詞影響。可以將兩者的差異簡化為:
| 表示方式 | 同一個字在不同句子中的向量 |
|---|---|
| 傳統 Word Embedding | 相同 |
| RNN 產生的 Contextualized Embedding | 可能不同 |
FFN:把表示轉換成標籤分數
RNN 的輸出 是一個向量,但 NER 最後需要的是明確的類別,例如:
- O
- B-GPE
- I-GPE
- B-TIME
- I-TIME
所以會在每一個 RNN 輸出後面加上一個 FFN,將 轉換成各類別的分數。這個部分可以是一個很簡單的全連接層(Fully Connected Layer),用來完成多類別分類。
Softmax:轉換成各類別的機率
投影片中的輸出為:$$[p_O, p_{B-GPE}, p_{I-GPE}, p_{B-GPE}, p_{I-GPE}, \dots]$$
這代表模型對每一種標籤給出一個機率。例如,對 New 的輸出可能是 ,分別代表:
| 標籤 | 機率 |
|---|---|
| O | 0.03 |
| B-GPE | 0.85 |
| I-GPE | 0.10 |
| 其他 | 0.02 |
模型會選擇機率最大的類別 ,最後這個位置會被預測為 B-GPE。
另外在投影片提到輸出會對應到 One-hot Vector,意思是正確答案可以表示成 ,其中只有正確類別的位置為 。
NER 如何進行監督式學習
要訓練這個模型,需要事先標註好的資料,如:
| Token | 正確標籤 |
|---|---|
| I | O |
| have | O |
| flight | O |
| to | O |
| New | B-GPE |
| York | I-GPE |
| at | O |
| 5pm | B-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

Image Source:TAICA MOOCs | 自然語言處理 | 高宏宇老師 | 5-3 投影片
序列分類不是判斷每一個字屬於什麼類別,而是判斷整段文字屬於哪一類。例如:「這部電影非常精彩,我很喜歡。」整個句子的分類結果可能是 Positive,而不是對每一個字分別輸出 Positive 或 Negative。
依序處理完整序列
RNN 會依序讀取 ,並持續更新隱藏狀態 ,最後一個隱藏狀態 是模型讀完整段文字後所產生的表示。
使用最後一個隱藏狀態
Take the hidden layer for the last token of the text.
也就是取最後一個 Token 對應的隱藏狀態 ,再將它輸入進 FFN:,最終輸出整段文字的類別。
以句子情緒分類為例,說明可以在最後一個 Hidden State 後接一個分類層,再依照監督式資料更新 RNN 參數。
為什麼用 ?
因為 RNN 是依序累積資訊的(),理論上, 已經整合了前面所有 Token 的資訊,因此可用來表示整段序列。
可以想成閱讀文章後的「總結筆記」:
- 讀第一個字後,筆記內容很少。
- 繼續閱讀時,不斷更新筆記。
- 讀完最後一個字時,最後版本的筆記就是 。
Stacked RNN:將多層 RNN 疊在一起

Image Source:https://web.stanford.edu/~jurafsky/slp3/
單層 RNN 只有一層序列處理(),而堆疊式 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}$$
其中上標表示第幾層。
圖中的兩種資訊流動
理解這張圖時,要分清楚兩個方向:
- 水平方向是時間順序:
- 垂直方向是網路層數:
每個位置的資料會先由底層處理,再逐層向上傳遞。
當一層 RNN 不足時,可以再疊加第二層、第三層,但每增加一層,都必須對整段序列進行更多計算。
不同 RNN 層可能學習不同抽象程度
多層 RNN 通常能學習不同層次的表示。
- 較底層可能處理較基礎的資訊,例如:
- 字詞形式。
- 局部搭配。
- 語法關係。
- 較高層則可能形成較抽象的資訊,例如:
- 句子語意。
- 整體內容。
- 任務需要的高階特徵。
可將上述簡化表示成:$$\text{Word Embedding} → \text{較基礎的表示} → \text{較抽象的語意表示}$$
接近 Word Embedding 的底層可能偏向處理語法,而較高層可能更適合語意任務,但這並不代表我們能直接打開某一個 Hidden State,明確看到「這一維是語法、那一維是語意」等等。
這些向量本身就難以直接解釋,只能透過不同任務的實驗結果,觀察高層表示是否在語意任務上表現較好。
Stacked RNN 的優點與成本
優點
多層結構可以對輸入進行多階段轉換(原始詞向量→第一層表示→第二層表示→第三層表示),因此,相較於單層網路會具有更強的表示能力。
成本
層數增加後,訓練成本也會快速上升。
原因是 RNN 本來就必須依序處理時間位置;堆疊多層後,每個位置還需要進行多層運算。
例如三層 RNN 就要 ,每個 Token 都要經過三層,且整段序列仍需依序計算。
因此增加層數就會導致:
- 計算量增加。
- 訓練時間增加。
- 需要更多運算資源。
疊得越多層,成本就越高。
Bidirectional RNN:同時利用前文與後文

Image Source:TAICA MOOCs | 自然語言處理 | 高宏宇老師 | 5-3 上課投影片
一般單向 RNN 只能從左到右處理(),所以在第 個位置產生表示時,主要只能使用 ,也就是目前位置以前的資訊。
但在文字理解中,一個字的意思有時也需要依靠後面的內容才能判斷。字詞不一定只受到前面文字影響,也可能受到後面字詞影響,因此文字處理常使用雙向結構。
正向 RNN
正向 RNN 從句首讀到句尾(),在位置 產生正向狀態 ,主要包含左側前文資訊。
反向 RNN
反向 RNN 從句尾讀回句首(),在位置 產生反向狀態 ,主要包含右側後文資訊。
合併兩個方向
最後將正向與反向的表示結合,得到 ,這裡可以把中括號理解成將兩個向量合併。
每一個位置都同時具有:
- 前面字詞提供的資訊。
- 後面字詞提供的資訊。
在上課投影片中的 RNN1 是由左向右處理,RNN2 則由右向左處理;兩個方向的結果共同用來產生每個位置的輸出。
雙向 RNN 的運作細節
前面已說明雙向循環神經網路(Bidirectional RNN)會同時從左到右、從右到左處理序列。這裡進一步說明補充說明:兩個方向在同一個位置得到的 Hidden State 並不相同。
假設輸入序列為 。
正向 RNN
正向 RNN 依序處理 ,當正向 RNN 處理到 時,其 Hidden State 已經接收了前面 到 所傳遞過來的資訊。
因此 可以視為「從句首一路讀到句尾」後的表示。
反向 RNN
反向 RNN 則按照相反順序處理,但要注意,反向 RNN 剛開始讀取 時,尚未讀到其他字,所以此時的反向 Hidden State 並沒有包含完整序列資訊。
真正累積了後文資訊的,是反向 RNN 繼續向前處理後得到的狀態。例如在位置 ,反向 RNN 已經由 一路處理回來,因此包含了右側字詞傳遞而來的資訊。
雖然正向與反向 RNN 處理的是同一批文字,但由於資訊傳遞方向不同,同一個位置得到的兩個 Hidden State 具有不同含義。
圖中的每一個輸出 如何產生
投影片中每個位置都有兩個 RNN 狀態:
下方橘色:正向 RNN 的狀態。
上方灰色:反向 RNN 的狀態。
以位置 為例: 包含從 到 的資訊,而 包含從 倒著處理到 的資訊。
最後,兩個方向的表示被結合,用來形成位置 的輸出表示:$$y = \text{Combine}(\overrightarrow{h_t}, \overleftarrow{h_t})$$
能同時參考:
- 前面的內容。
- 後面的內容。
- 目前的輸入 。
這就是為什麼每個 都同時連接到上下兩個 RNN 狀態的原因。
正向與反向表示的結合方法
兩個方向的 Hidden State 可以用不同方式合併。
1. 串接(Concatenation)
最直接、也較常見的方法,是把兩個向量接在一起:。
假設兩個方向的 Hidden State 都是 維:$$\begin{aligned} \overrightarrow{h_t} &\in \mathbb{R}^d \ \overleftarrow{h_t} &\in \mathbb{R}^d \end{aligned}$$
串接後就會變成:。
這種方式的優點是保留兩個方向的全部資訊,缺點則是向量維度加倍,後續分類層的參數量與計算量也會增加。
串接是較一般化的做法,因為它不會預先將兩個方向的資訊壓縮或混合,而是完整保留下來。
2. 相加(Addition)
也可以直接把兩個向量對應位置相加:,相加後,維度仍是 ,不會變成 。
但這種方式會把正向與反向資訊混合,模型無法再直接區分某個數值究竟主要來自哪一個方向。
3. 平均(Average)
另一種做法是取平均:,同樣可以維持原本維度,但也會產生資訊混合。
這些合併方法具有相當程度的啟發式(Heuristic)性質,也就是通常透過實驗比較效果,而不是只有唯一固定的正確選擇。
Stacked RNN 與 Bidirectional RNN 的不同之處
| 結構 | 增加的方向 | 目的 |
|---|---|---|
| Stacked RNN | 垂直增加層數 | 學習不同抽象層次的表示 |
| Bidirectional RNN | 增加反向序列處理 | 同時利用前文與後文 |
Stacked RNN 是 。
而 Bidirectional RNN 是左到右 RNN + 右到左 RNN。
兩者解決的問題不同:
- Stacked RNN 著重於表示能力與抽象層次。
- Bidirectional RNN 著重於上下文方向是否完整。
雙向 RNN 用於序列分類

Image Source:TAICA MOOCs | 自然語言處理 | 高宏宇老師 | 5-4 上課投影片
前面單向 RNN 的序列分類,是取最後一個 Hidden State,雙向 RNN 的序列分類則需要分別取得兩個方向代表整段序列的狀態。
正向 RNN 的最終狀態
正向 RNN 從 讀到 ,因此使用 ,它包含由句首累積到句尾的資訊。
反向 RNN 的最終狀態
反向 RNN 從 讀回 ,因此使用 ,它包含由句尾反向累積到句首的資訊。
這裡很容易誤解,所謂「反向 RNN 的最終狀態」,不是位置 的反向狀態,而是反向處理完整段序列後,位於 的狀態。
合併成整段序列的表示
接著將兩個方向的最終狀態結合:,這個向量被視為整段文字的表示,再交給 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
例如情緒分類,整段文字只輸出一個結果:
兩者的差別可以整理如下:
| 任務 | 使用哪些雙向狀態 | 輸出數量 |
|---|---|---|
| Token Classification | 每個位置的 與 | 每個 Token 一個輸出 |
| Sequence Classification | 與 | 整段序列一個輸出 |
為什麼雙向 RNN 通常比單向 RNN 好
單向 RNN 在位置 只能使用 ,雙向 RNN 則可以同時使用 ,因此,在需要完整句子才能判斷語意的任務中,雙向 RNN 往往能建立更完整的上下文化表示。
例如:「他說這部電影一開始很無聊,但最後非常精彩。」
如果模型只從左到右處理,在讀到「很無聊」時,還不知道後面出現「但最後非常精彩」,雙向 RNN 在處理完整句子後,可以讓前面的字詞也取得後文資訊。
在許多應用上,雙向模型通常比單向模型表現更好,但最終效果仍會受到正反向表示如何合併影響。
總整理
上下文化詞嵌入
傳統詞嵌入通常只觀察固定大小的上下文視窗,且同一個詞在不同句子中會得到相同向量,而上下文化詞嵌入(Contextualized Embedding)則會:
- 參考較長的句子或文章。
- 根據詞語所在的上下文,動態產生向量。
- 讓同一個詞在不同語境中具有不同表示。
例如:
I live in New York.中的New與地名有關。This is a new book.中的new表示「新的」。
兩者雖然字面相同,但上下文不同,因此模型產生的表示也不同。
語句機率分解
語言模型會根據前面已經出現的詞,預測下一個詞:
例如:
因此,一句話的機率可視為每個位置條件機率的乘積。
Embedding 在模型中的角色
Embedding 負責將離散的詞或符號轉換為稠密向量(Dense Vector):
例如:
1 | [0, 0, 0, 1, 0, ...] |
稠密向量能以較少維度表示詞語的語意特徵,方便後續神經網路運算。
凍結 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)的資訊只會向前傳遞:
主要特性:
- 輸入大小固定。
- 輸出大小固定。
- 層與層之間通常為全連接。
- 適合處理固定維度資料。
FFN 處理文字的限制
缺乏序列能力
文字順序會影響語意:
- 狗咬人。
- 人咬狗。
兩句包含相同詞語,但順序不同,意思完全不同,傳統 FFN 沒有保存前一位置狀態的機制,因此較難表示詞序。
輸入維度固定
句子長度可能從數個詞到數千個詞不等,但 FFN 要求固定維度,必須截斷或填補,可能造成語意遺失。
難以處理長距離依賴
FFN 沒有持續保存前文資訊的機制,因此較難處理相隔很遠的主詞、動詞或其他語意關係。
循環神經網路
循環神經網路(Recurrent Neural Network, RNN)專門處理序列資料。每個時間點的計算會同時使用:
- 目前輸入 。
- 前一時間點的隱藏狀態 。
公式為:
其中:
- :目前隱藏狀態。
- :輸入到隱藏層的權重。
- :前一隱藏狀態到目前狀態的權重。
- :隱藏狀態到輸出的權重。
RNN 的核心流程可整理為:
實際上並非直接相加,而是分別進行線性轉換後,再通過活化函數。
隱藏狀態
隱藏狀態(Hidden State)可理解為模型目前保留的「內部記憶」。
以「我/今天/去/學校」為例:
- :記錄「我」。
- :整合「我今天」。
- :保留「我今天去」的部分資訊。
- :根據前文理解「學校」。
前文資訊會透過隱藏狀態逐步傳遞到後面。
時間展開
同一個 RNN 單元沿時間軸展開後,可表示為:
每個位置使用相同的權重矩陣 、、,稱為參數共享(Parameter Sharing)。
因此,句子無論包含多少個 Token,都可重複使用同一套 RNN 規則處理。
RNN 的四項重要性質
序列處理
RNN 按照原始順序逐步處理:
因此能保留詞語的先後關係,適合文字、語音與時間序列。
循環連接
前一個隱藏狀態會傳到下一個位置:
可將其想成一個持續更新的筆記本:每讀到一個詞,就更新目前理解,再傳給下一個位置。
參數共享
所有時間點使用相同的權重:
- 相同的 。
- 相同的 。
- 相同的 。
這能降低參數量,並讓模型使用相同規則處理不同位置。
梯度消失
序列過長時,較早位置的資訊可能逐漸變弱,導致模型難以學習長距離依賴。
因此傳統 RNN:
- 較容易保留近期資訊。
- 較容易遺失很早以前的內容。
- 不一定能完整保存長句或長文章資訊。
RNN 的主要限制
長期記憶能力有限
雖然理論上 可包含先前所有資訊,但隱藏狀態容量有限,前面的資訊可能隨序列變長而逐漸消失。
難以平行化
RNN 的計算具有前後依賴:
計算 前必須先得到 ,計算 前又必須先得到 ,因此無法同時完成所有位置的計算,訓練速度受到限制。
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 | 標籤 |
|---|---|
| New | B-GPE |
| York | I-GPE |
因此 NER 可轉換為每個 Token 的多類別分類問題。
RNN 的 NER 流程
- :Token 的 Word Embedding。
- :包含上下文資訊的表示。
- FFN:將表示轉換成各標籤分數。
- Softmax:轉換為各類別機率。
模型會比較預測結果與正確標籤,更新:
- RNN 參數。
- FFN 參數。
- 視設定決定是否更新 Embedding。
醫療資料去識別化
NER 可先找出病歷中的敏感資訊,再進行遮蔽或替換:
這類應用稱為去識別化(De-identification)。
Token Classification 與 Sequence Classification
| 任務 | 輸出方式 | 例子 |
|---|---|---|
| Token Classification | 每個 Token 一個標籤 | NER、詞性標記 |
| Sequence Classification | 整段文字一個類別 | 情緒分類、文章分類 |
RNN 序列分類
在序列分類中,RNN 依序處理所有輸入,最後使用最後一個隱藏狀態 表示整段文字:
例如情緒分類:
1 | 這部電影非常精彩,我很喜歡。 |
可理解為模型讀完整段文字後形成的「總結筆記」。
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
得到正向狀態:
主要包含目前位置以前的資訊。
反向 RNN
得到反向狀態:
主要包含目前位置以後的資訊。
合併雙向表示
最常使用串接:
若正向與反向狀態皆為 維,串接後會變成 維。
其他方法包括:
或:
比較如下:
| 方法 | 優點 | 缺點 |
|---|---|---|
| 串接 | 完整保留兩個方向資訊 | 維度與計算量增加 |
| 相加 | 維度不變 | 正反向資訊混合 |
| 平均 | 維度不變、數值較穩定 | 同樣會混合資訊 |
具體合併方法通常依實驗結果決定。
Stacked RNN 與 Bidirectional RNN 的差異
| 結構 | 增加方式 | 主要目的 |
|---|---|---|
| Stacked RNN | 垂直增加層數 | 學習不同抽象層次 |
| Bidirectional RNN | 增加反向處理 | 同時利用前文與後文 |
兩者可以同時使用,建立多層雙向 RNN。
雙向 RNN 的任務應用
雙向 Token Classification
每個 Token 都使用目前位置的正向與反向狀態:
適合 NER 等每個位置都需要輸出的任務。
雙向 Sequence Classification
正向 RNN 完整讀完序列後的狀態為:
反向 RNN 完整讀完序列後的狀態位於:
整段文字表示為:
再交給分類器:
注意:反向 RNN 的最終狀態不是 ,而是反向讀完整段序列後位於第一個位置的 。
重點比較
| 架構 | 可利用的資訊 | 主要優點 | 主要限制 |
|---|---|---|---|
| FFN | 固定輸入向量 | 結構簡單、容易平行化 | 不擅長序列與長度變化 |
| 單向 RNN | 目前與前文 | 能處理詞序與序列 | 長期記憶有限、難平行化 |
| Stacked RNN | 多層序列表示 | 表示能力較強 | 訓練成本高 |
| Bidirectional RNN | 前文與後文 | 上下文資訊更完整 | 計算量與參數增加 |
結論
- Embedding 將文字轉換成可供神經網路處理的向量。
- 上下文化詞嵌入會根據語境動態改變同一個詞的表示。
- FFN 適合固定維度資料,但缺乏序列記憶。
- RNN 透過隱藏狀態保留前文資訊,適合文字與時間序列。
- 傳統 RNN 存在梯度消失、長期記憶不足及無法平行化等限制。
- Token Classification 對每個 Token 輸出標籤;Sequence Classification 對整段序列輸出一個類別。
- Stacked RNN 透過增加層數提升表示能力。
- Bidirectional RNN 同時利用前文與後文,能建立更完整的上下文化表示。

