此分類用於記錄吳恩達深度學習課程的學習筆記。
課程相關信息鏈接如下:
- 原課程視頻鏈接:[雙語字幕]吳恩達深度學習deeplearning.ai
- github課程資料,含課件與筆記:吳恩達深度學習教學資料
- 課程配套練習(中英)與答案:吳恩達深度學習課後習題與答案
本篇為第五課第三週的內容,3.1和3.6的內容。
本週為第五課的第三週內容,與 CV 相對應的,這一課所有內容的中心只有一個:自然語言處理(Natural Language Processing,NLP)。
應用在深度學習裏,它是專門用來進行文本與序列信息建模的模型和技術,本質上是在全連接網絡與統計語言模型基礎上的一次“結構化特化”,也是人工智能中最貼近人類思維表達方式的重要研究方向之一。
這一整節課同樣涉及大量需要反覆消化的內容,橫跨機器學習、概率統計、線性代數以及語言學直覺。
語言不像圖像那樣“直觀可見”,更多是抽象符號與上下文關係的組合,因此理解門檻反而更高。
因此,我同樣會儘量補足必要的背景知識,儘可能用比喻和實例降低理解難度。
本週的內容關於序列模型和注意力機制,這裏的序列模型其實是指多對多非等長模型,這類模型往往更加複雜,其應用領域也更加貼近工業和實際,自然也會衍生相關的模型和技術。而注意力機制則讓模型在長序列中學會主動分配信息權重,而不是被動地一路傳遞。二者結合,為 Transformer 等現代架構奠定了基礎。
本篇的內容關於seq2seq 模型,是對多對多非等長模型的展開介紹。
1.seq2seq 模型(Sequence to Sequence Model)
2014 年被普遍認為是seq2seq模型真正成型的關鍵年份。
首先,起源論文 Sequence to Sequence Learning with Neural Networks被髮表,其中首次系統性地驗證了基於 RNN 的 Encoder–Decoder 架構 可以直接建模“輸入序列 → 輸出序列”的生成過程,併成功應用於機器翻譯任務。這項工作明確確立了 seq2seq 作為一種通用序列生成範式,也奠定了後續神經機器翻譯模型的基本結構。
幾乎在同一時期,另一篇論文Learning Phrase Representations using RNN Encoder–Decoder for Statistical Machine Translation從表示學習的角度提出了 RNN Encoder–Decoder 這一結構性思想,並引入了帶門控機制的循環單元(後來發展為 GRU)。這項工作強調編碼器學習語義表示、解碼器建模條件生成分佈,為隨後注意力機制的提出提供了直接的理論與結構基礎。
這兩篇論文從工程實現與結構抽象兩個互補視角,共同奠定了 seq2seq 模型與編碼–解碼範式在自然語言處理中的核心地位。
同樣簡單介紹一下歷史,看起來很高深,但其實許多內容在我們之前就已經知道了,只是現在我們為其正式命名引入了,下面就來分點展開:
1.1 seq2seq 模型:編碼-解碼結構
seq2seq 模型的全稱是 Sequence to Sequence 模型,顧名思義,是指 “序列到序列” 的模型。
在我們之前介紹的RNN 結構類型中,seq2seq 模型專指輸入為序列,輸出同樣為序列的多對多非等長模型。
這裏很容易產生一個問題:為什麼多對多等長模型,就像我們之前演示的命名實體識別,不也是輸入序列,輸出序列嗎?它為什麼不被歸納在 seq2seq 模型中呢?
實際上,二者的差異存在於它們的模型結構和傳播邏輯上,我們簡單展開如下:
總結來説,seq2seq 面向的是“生成另一段序列”的問題,而命名實體識別等對多等長模型面向的是“對原序列逐位置打標籤”的問題。
前者是非等長的序列生成,後者是等長的序列標註,因此後者不被歸入 seq2seq 模型範疇。
在明確了概念後,接下來就可以具體來看 seq2seq 模型內部最核心的結構設計——編碼–解碼(Encoder–Decoder)框架。
在剛剛的圖中我們已經看到了,在經典的 seq2seq 模型中,整體網絡通常由兩個相互獨立但邏輯上強耦合的子網絡組成:
- 編碼器(Encoder):將輸入序列壓縮為語義表示。
- 解碼器(Decoder):基於語義表示生成輸出序列。
展開如下:
從整體結構上看,seq2seq 的編碼–解碼框架有幾個特點:
- 輸入序列與輸出序列在時間維度上不要求對齊,既非等長。
- 編碼階段與解碼階段在結構上明確分離。
- 輸出是一個生成過程,而非逐位置的判別結果,其傳播類似我們之前介紹的新序列採樣。
正是這些特徵,讓其擁有廣泛的應用領域和極高的延展性,下面就來看看seq2seq 的一些具體應用。
1.2 seq2seq 模型的應用領域
可以看到,seq2seq 模型的核心能力在於:在不要求輸入輸出對齊的前提下,將一段序列映射為另一段序列,並通過生成過程逐步給出結果。
這一特性決定了 seq2seq 並不適用於“逐位置判別”的任務,而是天然適合語義層面的序列轉換問題。
聽起來有些抽象,展開來説:seq2seq 模型的應用並不依賴具體任務形式,而依賴於一個條件:
任務是否可以被表述為“在理解一段序列後,生成另一段序列”。
正是這一能力,使得 seq2seq 在多個領域中展現出極強的通用性,簡單列舉如下:
| 應用領域 | 輸入序列 | 輸出序列 |
|---|---|---|
| 機器翻譯 | 源語言句子 | 目標語言句子 |
| 文本摘要 | 長文本序列 | 短摘要序列 |
| 對話系統 / 文本生成 | 用户輸入文本 | 系統回覆文本 |
| 語音識別 | 聲學特徵序列 | 文本序列 |
這些都並不難理解,無非是數據不同,編碼解碼的模型結構都是相通的,就不再展開了。
值得一提的是,吳恩達老師在課程裏舉了一個特別的例子:圖像描述生成(Image Captioning)。
如圖,在這一任務中,模型的輸入不再是文本序列,而是一張圖像,輸出則是一段自然語言描述。 但它依然可以被納入 seq2seq 的框架之中。
其核心思想在於: 只要能夠將輸入數據編碼為一種序列化或向量化的語義表示,後續的解碼過程就仍然可以按照“序列生成”的方式進行。
在圖像描述生成任務中,圖像通常首先由卷積神經網絡提取為高層語義特徵,作為編碼器的輸出,解碼器則在這一語義表示的條件約束下,逐詞生成對應的文本描述。
像這種“非文本輸入 → 文本輸出”的建模方式,讓模型不再侷限於單一模態的數據,我們便稱這類建模方式為多模態學習。
我們最常見的 AI 就是一種多模態模型,你不僅可以和 AI 進行文字交流,還可以上傳圖片或文件並讓其輸出不同內容。
從這一視角來看,seq2seq 並不僅是一類 NLP 模型結構,而是一種可以跨模態複用的序列建模範式。
對 seq2seq 的基礎內容就介紹到這裏,下面我們展開介紹一下 seq2seq 模型特有的評估指標:BLEU 得分。
2. BLEU 得分(Bilingual Evaluation Understudy)
seq2seq 模型出現後,一個緊隨而來的問題就是:如何非手工地判斷模型生成的這一整段序列,究竟好不好?
對於分類或序列標註任務,我們可以逐位置對比預測結果與真實標籤,直接計算準確率或 F1。
但在機器翻譯、文本摘要等 seq2seq 任務中,輸出往往是不固定長度的一整句話甚至一整段文本,且“正確答案”並不唯一。 這就使得傳統指標幾乎失效。
以機器翻譯為例,假設參考譯文為:I like machine learning.
而模型輸出為: I enjoy machine learning.
從語義上看,這兩個句子幾乎完全一致。但如果我們採用“逐詞是否相同”的方式進行評估,模型反而會被判定為錯誤。
也就是説: seq2seq 任務的評價目標是“語義相似度”,而不是“形式一致性”。
於是,在 2002 年的論文: BLEU: a Method for Automatic Evaluation of Machine Translation中,首次提出了 BLEU 指標,用於在不依賴人工逐句評審的前提下,對機器翻譯結果進行自動化評估。
其基本思想可以概括為一句話: 如果模型生成的結果,在局部片段層面上與人工參考結果高度重合,那麼整體質量往往也是可信的。
下面就來展開介紹其評估過程:
2.1 n-gram 精確率(Modified n-gram Precision)
計算 BLEU 得分的第一步,是 計算n-gram 精確率。
所謂 n-gram,就是把候選序列劃分為長度為 \(n\) 的連續詞片段,例如:
- unigram(\(n=1\)):單個詞就是一個 unigram
- bigram(\(n=2\)):相鄰兩個詞組合起來是一個 bigram
- trigram(\(n=3\)):相鄰三個詞組合起來是一個 trigram
BLEU 的關鍵並不在於“詞有沒有出現”,而在於模型生成的局部結構,是否與人工譯文存在重合。
我們仍然使用前面的例子,並假設已經完成分詞:
- 參考標籤:
[I, like, machine, learning],長度 \(r = 4\)。 - 候選輸出:
[I, enjoy, machine, learning],長度 \(c = 4\)。
下面,就是用這一公式來計算對應的 n-gram 精確率:
我們用文字來展開這個計算過程:
- 枚舉候選序列中的每一個 n-gram:將模型輸出序列切分成長度為 \(n\) 的連續片段。
- 統計候選 n-gram 與參考 n-gram 的匹配次數:
- \(\text{Count}_{\text{cand}}\) 表示候選序列中該 n-gram 出現的次數。
- \(\text{Count}_{\text{ref}}\) 表示參考序列中該 n-gram 出現的次數。
- 取最小值 \(\min(\text{Count}_{\text{cand}}, \text{Count}_{\text{ref}})\) 計算合理匹配次數。
- 除以候選序列中所有 n-gram 的總數:這相當於計算了候選序列中有多少比例的 n-gram 與參考序列匹配,即“精確率”。
下面就來具體演示一下:
首先,我們計算 Unigram,即 \(n=1\):
| Unigram | Candidate 出現次數 | Reference 出現次數 | \(\min(\text{Count}_{\text{cand}}, \text{Count}_{\text{ref}})\) |
|---|---|---|---|
| I | 1 | 1 | 1 |
| enjoy | 1 | 0 | 0 |
| machine | 1 | 1 | 1 |
| learning | 1 | 1 | 1 |
因此:
繼續,我們在試試 Bigram,即 \(n=2\):
| Bigram | Candidate 出現次數 | Reference 出現次數 | \(\min(\text{Count}_{\text{cand}}, \text{Count}_{\text{ref}})\) |
|---|---|---|---|
| (I, enjoy) | 1 | 0 | 0 |
| (enjoy, machine) | 1 | 0 | 0 |
| (machine, learning) | 1 | 1 | 1 |
因此 Bigram 精確率為:
以此類推,繼續計算:
- trigram:完全無匹配,\(p_3 = 0\)
- 4-gram:完全無匹配,\(p_4 = 0\)
最終,你會發現,這一步,其實是在不同尺度上計算候選序列和參考序列的匹配度。
2.2 長度懲罰 BP(Brevity Penalty)
在最終計算之前,BLEU 專門設置了一個參數 BP 用來解決這樣一個問題:
如果只看 n-gram 精確率,模型可以“作弊”——生成很短的序列,只輸出部分正確詞,就可能獲得很高分。
其公式如下:
其中, \(c\) 是模型生成序列的長度、\(r\) 是參考序列的長度。
計算得到的 BP 會作為最終評估的係數,因此,它的語義是這樣的:
- 如果生成序列長度 >= 參考長度,BP = 1,不額外懲罰。
- 如果生成序列太短,BP < 1,會對總分進行指數級扣分。
舉個例子:
設參考序列長度 \(r = 4\) 、模型生成序列長度 \(c = 2\) ,計算 BP 為:
這樣,即使 unigram/bigram 匹配較好,最終 BLEU 分數也會因為序列太短而大幅下降。
BP 的引入確保 BLEU 得分不僅考慮 局部 n-gram 匹配,還考慮 生成序列長度合理性。
簡單來説:短序列不能通過“少輸出”來刷分。
2.3 多階 n-gram 的幾何平均
你會發現:低級 n-gram 到高階 n-gram 實際上是對語序的逐步注重。
而如果只使用 unigram,模型可能生成一堆“正確的詞”,但語序混亂;如果只使用高階 n-gram,又會對細微差異過於苛刻。
因此,BLEU 的做法是:同時計算多個 \(p_n\),並取它們的幾何平均。
其中,最常見的就是 BLEU-4,即和我們剛剛一樣計算前四階 n-gram 進行最終評估,公式如下:
其中,參數 \(w_n\) 就是第 \(n\) 階 n-gram 在最終得分中所佔的權重,通常取均等權重 \(w_n = \frac{1}{4}\)。
而對數和再指數的方式,可以把幾何平均轉化為加權 log 和的形式,計算更穩定,同時也避免了直接乘法下的數值下溢(數值太小了超出存儲位數,導致計算機無法精確表示)。
在我們的例子中:
此時可以看出一個問題:只要某一階 \(p_n = 0\),整體 BLEU 就會變為 0。
這並不是缺陷,而是 BLEU 的一個重要使用前提: BLEU 是為“語料級評估”設計的,而不是單句評估指標。
在真實使用中,BLEU 會在整個測試集上累加 n-gram 統計後再計算,此時 \(p_n\) 幾乎不會為 0。
由此,我們就完成了 BLEU 指標的計算。
BLEU 是首個自動化、可復現的序列生成評價指標,為神經機器翻譯和 seq2seq 研究奠定了基礎,它主要依賴 n-gram 匹配,極大加速了模型調試與對比,但也有其侷限性:對語義和多樣性敏感性不足。
因此,後續也發展出更多了指標,如 BERTScore、ROUGE、CIDEr 等,它們在語義理解、多樣性和跨模態任務上進行了改進與拓展,我們遇到再展開。
3.總結
| 概念 | 原理 | 比喻 / 直觀理解 |
|---|---|---|
| seq2seq 模型 | 輸入序列映射到輸出序列,允許非等長,基於編碼–解碼結構 | 將一句話“翻譯”成另一句話,就像把中文句子轉換成英文句子 |
| 編碼器 (Encoder) | 將輸入序列壓縮為固定維度的語義表示 | 像把整篇文章壓縮成大腦裏的核心理解 |
| 解碼器 (Decoder) | 根據編碼器提供的語義表示逐步生成輸出序列 | 像根據腦中理解逐字複述或生成一句話 |
| 應用領域 | 機器翻譯、文本摘要、對話系統、語音識別、圖像描述生成 | 將不同模態的輸入(文本、語音、圖像)轉化為另一段序列輸出 |
| BLEU 指標 | 基於 n-gram 精確率和長度懲罰 BP 計算序列生成質量 | 檢查生成句子中局部片段有多少和參考句子重合,順序和長度也考慮在內 |
| n-gram 精確率 | 統計候選序列與參考序列 n-gram 的匹配比例 | 像對比兩段文字中每個詞或詞組出現情況 |
| Brevity Penalty (BP) | 對生成過短的序列進行懲罰,防止“少説就高分” | 就像考試中答題太短,即使答案對也會扣分 |
| 幾何平均 (多階 n-gram) | 對不同階 n-gram 精確率取幾何平均並加權 | 平衡單詞準確性和語序準確性,既考慮詞對又考慮短語對 |
| BLEU 侷限 | 單句容易為 0,主要用於語料級評估,對語義和多樣性敏感性不足 | 就像只看字面重合,可能忽略同義表達 |