此分類用於記錄吳恩達深度學習課程的學習筆記。
課程相關信息鏈接如下:
- 原課程視頻鏈接:[雙語字幕]吳恩達深度學習deeplearning.ai
- github課程資料,含課件與筆記:吳恩達深度學習教學資料
- 課程配套練習(中英)與答案:吳恩達深度學習課後習題與答案
本篇為第五課的第一週內容,1.5到1.7的內容。
本週為第五課的第一週內容,與 CV 相對應的,這一課所有內容的中心只有一個:自然語言處理(Natural Language Processing,NLP)。
應用在深度學習裏,它是專門用來進行文本與序列信息建模的模型和技術,本質上是在全連接網絡與統計語言模型基礎上的一次“結構化特化”,也是人工智能中最貼近人類思維表達方式的重要研究方向之一。
這一整節課同樣涉及大量需要反覆消化的內容,橫跨機器學習、概率統計、線性代數以及語言學直覺。
語言不像圖像那樣“直觀可見”,更多是抽象符號與上下文關係的組合,因此理解門檻反而更高。
因此,我同樣會儘量補足必要的背景知識,儘可能用比喻和實例降低理解難度。
本篇的內容關於語言模型,是在瞭解 RNN 原理上的進一步應用。
1. 不同類型的 RNN
我們在上一篇中用命名實體識別作為示例來演示 RNN 的基本原理,但我們也提到了:
模型輸入序列的長度 \(T_x\) 和輸出序列的長度 \(T_y\) 並不都是相等的。而二者的對應關係不同,往往就代表了不同的任務類型。
因此,我們以 \(T_x\) 和 \(T_y\) 的不同對應關係,劃分了不同類型的 RNN,常見情況可以概括為以下幾類:
- 一對一(One-to-One)
- 多對一(Many-to-One)
- 一對多(One-to-Many)
- 多對多(Many-to-Many,等長)
- 多對多(Many-to-Many,非等長)
現在,來逐個簡單展開一下:
現在,我們就知道了:如果我們要完成之前用來演示的命名實體識別任務,那一般需要構建等長的多對多 RNN 模型。
而語言模型,同樣也是一種等長的多對多 RNN 模型,由此,我們正式開始引入語言模型。
2.語言模型(Language Model, LM)
先擺一下語言模型較為官方的定義:
語言模型是一種用於刻畫自然語言中詞(或字符)序列概率分佈的模型。其核心目標是:對一個序列中下一個符號出現的可能性進行建模,即在已知前文的條件下,預測當前或下一時刻的詞。
而通俗點來説,語言模型所實現的功能是:猜你輸入的下一個字更可能是什麼。
比如輸入“我愛”時,它可以預測到下一個字更可能是“你”,而在輸入“我愛你”時,模型會預測一個表示句子結束的特殊符號的概率較高。
顯然,問題來了:什麼樣的訓練邏輯可以得到擁有這種預測功能的語言模型呢?
先給出一個較簡潔的結論,然後我們來進行演示:在每一個時間步 \(t\),把前 \(t-1\) 個詞作為輸入,讓模型去預測第 \(t\) 個詞,計算損失,不斷優化參數,實現學習。
來看看它的具體運行過程:
2.1 語言模型的數據準備
在這裏,你可能會有這樣一個問題:我們定義了一個控制信號 <EOS> 來表示序列的終止,但是在語言直覺上,句號本身不就是終止的意思嗎?能不能直接用句號來代表終止信號?
答案當然是不能的,使用<EOS>並非是多此一舉,不能使用句號本身直接代替的<EOS>的原因可以簡單概括為一句話:語言結束並不代表序列結束。
來看這樣幾個例子:
| 語言 | 句子示例 | 説明 | 為什麼句號不能直接代表 <EOS> |
|---|---|---|---|
| 中文 | 我真的愛你。我真的餓了。 | 句子中包含多個子句。 | 第一個句號是子句結束,句號是語法結束,但整個序列可能還沒結束,無法作為統一序列終止信號。 |
| 中文 | 他愛你嗎? | 句子中沒有句號。 | 不使用句號也可以代表結束。 |
| 英文 | “Dr. Smith works at St. Mary’s Hospital.” | 英文中縮寫、專有名詞中包含句點。 | 句點不一定表示句子或序列結束,例如縮寫中的“Dr.”,如果直接用句號作為 <EOS>,會誤判序列結束。 |
從這些例子來看,<EOS> 並不是語言符號,而是模型訓練與生成過程中必不可少的控制信號。
因此,你會發現:我們需要一個明確不歧義,在各語言中統一且唯一的控制信號來代表序列的結束,這就是 <EOS> 。
在完成了數據準備之後,我們就正式來看看語言模型的傳播邏輯。
2.2 語言模型的傳播過程
回憶我們最開始簡述的正向傳播邏輯:在每一個時間步 \(t\),把前 \(t-1\) 個詞作為輸入,讓模型去預測第 \(t\) 個詞。
現在就來先展開看看語言模型的正常傳播過程:
用語言模型的正向傳播過程並不複雜,但要真正明白它的學習邏輯,自然還離不開它的反向傳播,而一個需要再次強調的就是:模型每一步的輸出是一個概率分佈,也就是“可能性”。
帶着這一點,我們來看看反向傳播的過程:
仍然是反向傳播不變的基本邏輯:計算損失,計算梯度,更新參數,實現學習。
我們在上一篇中也展開了 RNN 具體的反向傳播邏輯,這裏就不再多提了。
至此,我們已經從訓練視角理解了語言模型是如何學習到序列建模能力的。
在模型訓練完成之後,如何利用這個語言模型真正生成新的文本序列,就成為接下來需要回答的問題,其中相關的一門技術叫做新序列採樣。
3.新序列採樣
當我們擁有一個訓練好的語言模型時,有時我們會想具體地看看這個模型都學到了什麼,它的“文風”是什麼樣的,其中一種方法就是新序列採樣。
這個概念同樣不難理解:
新序列採樣,指的是:在語言模型生成文本時,不再固定選擇概率最大的 token,而是根據模型給出的概率分佈,從中 “抽樣”生成下一個 token,從而逐步生成一整段新序列的過程。
再通俗一點:新序列採樣不是“選最可能的那個”,而是“按可能性來抽一個”,讓模型生成更自然、多樣的文本。
它的具體過程是這樣的:
再複述一下這個過程:
給定一個已訓練好的語言模型,在生成階段,模型以起始符號作為輸入,在每個時間步根據當前上下文輸出一個 token 的概率分佈,並通過採樣策略選取下一個 token,將其作為下一步輸入,直到生成 <EOS> 或達到設定長度為止。
而在實際應用中,常見的新序列採樣策略包括:
- 隨機採樣(Sampling)
- Top-k 採樣:只在概率最高的 \(k\) 個 token 中採樣。
- Top-p(Nucleus)採樣:在累計概率達到 \(p\) 的最小 token 集合中採樣。
這樣,我們便可以較直觀地觀察模型在語言層面所學習到的統計規律與生成偏好。
在具體部署中合理使用新序列採樣策略,也可以在保證基本語言合理性的前提下,提高生成文本的多樣性。
最後,吳恩達老師還提及了基於字符的語言模型。這類模型不再以詞或子詞作為基本單位,而是直接以字符序列作為輸入與預測對象,如字母、空格及標點符號等。
字符級建模的優勢在於不依賴分詞規則、天然不存在未登錄詞問題,但代價也十分明顯:單個字符所攜帶的語義信息極弱,序列長度顯著變長,模型需要先“學會拼詞”,再學習句法與語義結構,訓練難度和計算成本都更高。
因此,這種模型在實際部署中的價值並不高,實際上也並不流行,我們就不再展開了。
4. 總結
| 概念 | 原理 | 比喻 |
|---|---|---|
| 不同類型的 RNN | 根據輸入序列長度 \(T_x\) 與輸出序列長度 \(T_y\) 的對應關係,RNN 可適配不同任務結構,如分類、序列標註、生成等 | 不同規格的傳送帶:有的只收一件吐一件,有的收一排給一個結果 |
| 語言模型(LM) | 建模序列的條件概率分佈 \(P(w_t \mid w_{<t})\),在已知前文的情況下預測下一個 token | 根據已經寫下的內容,猜作者下一筆會寫什麼 |
| 語言模型的訓練邏輯 | 在時間步 \(t\),用前 \(t-1\) 個 token 作為輸入,預測第 \(t\) 個 token,通過損失函數和反向傳播更新參數 | 做完一句話的“完形填空”,錯了就記住,下次改正 |
<EOS> 結束符 |
使用一個不歧義的特殊符號明確標記序列結束,而不是依賴語言中的標點 | 像文件裏的“結束標誌”,而不是文章裏的句號 |
| 語言模型輸出 | 每一步輸出的是對整個詞表的概率分佈,而不是一個確定結果 | 給出一張“可能性排行榜”,而不是直接拍板 |
| 新序列採樣 | 在生成階段,不固定選擇概率最大的 token,而是根據概率分佈進行抽樣生成 | 不是每次都選第一名,而是按權重抽籤 |
| 字符級語言模型 | 以字符而非詞或子詞為建模單位,逐字符預測 | 先學拼字母,再學組詞、造句 |
| 字符級模型不流行原因 | 序列過長、語義單位過弱,訓練和推理成本高,工程性價比低 | 用積木一粒一粒搭摩天樓,理論可行但太慢 |