[自然語言處理](https://app.notion.com/p/3e6fc631b03081b4a9e8f91f3411f61f) › [W3(9/24)](https://app.notion.com/p/3e6fc631b03081ff9776f36fab3e6e50) › 06|影片 [2:12:42–2:33:51](https://www.youtube.com/watch?v=g0QE6O17BWE&t=7962s)|投影片 W2_Word embeddings and Language Modeling (RNN)_v2 p.1–14|上一章 [05 作業一說明(1:46–2:02)](https://app.notion.com/p/3e6fc631b03081e59d87d1d5fa01e936)|下一章 [07 語言模型定義與困惑度(2:33–2:51)](https://app.notion.com/p/3e6fc631b03081b4b99acb876fd0bb2d)
跳過提示:(2:26:23–2:33:53) 老師在推導 bigram/n-gram 的機率計算與加一平滑法(Add-1 smoothing),聽不懂可以直接跳到 [2:33:53](https://www.youtube.com/watch?v=g0QE6O17BWE&t=9233s),接著會進入語言模型的正式定義。
跳過的這段在做什麼(白話):老師在示範「怎麼用數次數算出一句話有多常見」,以及「遇到語料裡沒看過的字組時,怎麼不讓機率變成 0」。這兩個想法都寫在下面 2:27:25 和 2:30:08 兩段的白話裡,不看推導也懂。
## 重點
- 語言模型(language model)只做一件事:看前面的字,算下一個字的機率。問答、寫文章、聊天、Google 搜尋建議都靠它。
- 最早的做法叫 n-gram:直接在語料庫裡數「哪些字常連在一起」,用次數相除得到機率;整句的機率就是每一步的機率連乘。
- 最大的麻煩是資料不夠:前文越長越少見,一個 0 就讓整句歸零,所以只看前一個字(bigram)並做平滑(smoothing)。同樣的統計能認出作者風格,但抓 AI 寫的文章很容易被騙過。
名詞小補充:語料庫(corpus)是拿來統計的一大堆真實文字,例如一萬篇新聞。機率是 0 到 1 之間的數字,越接近 1 代表越常發生。「連乘」就是一個接一個乘起來,只要其中一個是 0,結果就是 0。
## Exam-ready
- **Motivation (GAI for NLP tasks)**: "Supervised learning ◦Text classification ◦QA system … Issues ◦Lack of training data ◦Limitation of domain knowledge … Think about your learning strategies !"(W2 p.2)
- 中文:文字分類、問答系統這類任務靠 supervised learning(監督式學習,人先標好答案),問題是缺訓練資料、缺領域知識(domain knowledge)。白話:沒人標答案時,要自己想辦法讓模型學。
- **Natural Language Generation**: "The commonest way to generate sentences is by writing the words down, one after another."(W2 p.3)
- 中文:產生句子最常見的方法,就是一個字接一個字寫下去。白話:模型每次只猜「下一個字」,例如 Please turn your homework 後面接 in 還是 over。
- **Markov (1913) / Shannon (1951)**: "The chance of a letter appearing depends on the letter before it." / "Prediction and Entropy of Printed English"(W2 p.4)
- 中文:Markov 說一個字母出現的機會取決於前一個字母;Shannon 1951 年的論文談英文文字的預測與熵(entropy,不確定程度)。白話:「看前面猜後面」一百多年前就有了。
- **N-gram**: "An n-gram is a sequence of n words" — 1-gram (unigram), 2-gram (bigram), 3-gram (trigram)(W2 p.8)
- 中文:n-gram 是連續 n 個字組成的片段(sequence,序列)。1 個字叫 unigram,2 個叫 bigram,3 個叫 trigram。例:Please turn your homework 的 bigram 是 please turn、turn your、your homework。
- **Linguistic signature (stylometric analysis)**: "Sequences of four-character strings (four-grams), which are strong indicators of authorship. The frequency of the most common words. The distribution of word lengths. Pairs of words that frequently appeared together."(W2 p.9)
- 中文:文體計量分析(stylometric analysis)看四種特徵:連續四個字元的片段(很強的作者指標)、最常用字的頻率、字長分布、常一起出現的字對。白話:用字習慣像指紋。
- **N-gram LM (bigram counts)**: "We can use a naïve statistic method to model the language … In a bi-gram model we have to count the occurrences of each bi-gram."(W2 p.10); "Draw a table of bigram counts for eight of the words in all of the sentences"(W2 p.11)
- 中文:可以用很天真(naïve)的統計方法描述語言:bigram 模型只要數每個相鄰字對出現幾次(例如 I want 2 次),p.11 把八個字兩兩的次數畫成表。白話:不用訓練,數次數就好。
- **Add-one smoothing**: "Apply add-k smoothing (k=1)" → "Compute Probability (relative frequency)"(W2 p.12)
- 中文:做 add-k 平滑、k = 1:每一格次數先加 1,再用相對頻率(relative frequency,次數相除)算機率。白話:沒看過的組合也分到一點點機率,整句不會因為一個 0 就歸零。
- **P(w|h) = C(w,h) / C(h)**: "w: the word to be generated … h: some history … C: the times the pattern show up in the dataset"(W2 p.13)
- 中文:下一個字的機率 =「前文 h 後面接 w」這整串的次數 ÷ 前文 h 的次數。w 是要生成的字,h 是前文(history),C 是片段在資料裡出現幾次。
- **Chain rule, N-gram model: P(w₁…wₙ) = P(w₁)P(w₂|w₁)P(w₃|w₁:₂)…P(wₙ|w(n−N+1)) = ∏ₖ₌₁ⁿ P(wₖ|w(k−N+1))**: "Compute probabilities of entire sequences like … N-gram model(Chain Rule of Probabilities)"(W2 p.14,括號裡是下標)
- 中文:整句的機率用連鎖律(chain rule)拆成一串條件機率相乘;N-gram 模型把每一項的前文砍到只剩最近 N−1 個字。白話:像接龍,每一步的機率乘起來。
- 符號怎麼讀:∏ 是「全部乘起來」的符號(就像 Σ 是全部加起來);ₖ₌₁ⁿ 表示 k 從 1 數到 n,也就是句子裡每一個字都算一次;w₁:₂ 表示「第 1 到第 2 個字」;直線 | 讀作「在……之後」。
- **Bigram model: P(w₁…wₙ) = ∏ₖ₌₁ⁿ P(wₖ|wₖ₋₁)**(W2 p.14): "The assumption that the probability of a word depends only on the previous word is called a Markov assumption."(W2 p.18,下一堂正式講)
- 中文:bigram 模型讓每個字只看前一個字,這個假設叫馬可夫假設(Markov assumption)。白話:只記得上一個字的接龍。
## [2:12:42](https://www.youtube.com/watch?v=g0QE6O17BWE&t=7962s) 接到 W2:先想為什麼需要
Slido 上的作業繳交問題交給助教回覆。W2 投影片延續語言模型:前面的 word2vec 只是很簡單的兩層神經網路,後面會講更聰明的序列模型 RNN、LSTM。老師先提醒學習方法:不要只記「序列就用 RNN、LSTM」,要回頭想當時遇到什麼問題、這個方法為什麼剛好能解決它。
比喻:像學看病,只背「咳嗽吃這個藥」不夠,要懂病因和藥為什麼有效,換一個病人才判斷得了。
考試可能怎麼問:本身不考,但後面每個模型(n-gram → RNN → LSTM)都能用「它解決了前一個方法的什麼問題」作答。
要先懂什麼?RNN 和 LSTM 是什麼?
- RNN(recurrent neural network,循環神經網路):一次讀一個字,把讀過的內容濃縮成一個「記憶向量」帶到下一步。
- LSTM(long short-term memory):RNN 的改良版,多了「閘門」決定哪些記憶要留、哪些要忘,比較記得住很前面的字。
- 所以對這章的影響是:n-gram 只記得前 N−1 個字,RNN、LSTM 就是為了「記得更遠」而發明的。
老師原話是什麼?
「他是這樣做,但是你可能要先知道為什麼,這時候到底是發生什麼事、為什麼需要這個,然後為什麼這個方法是可以解決這個問題的」(2:13:59)
## [2:14:25](https://www.youtube.com/watch?v=g0QE6O17BWE&t=8065s) 真實場域沒有 SOP
以前的 NLP 任務(文字分類、問答、意圖分類)走 supervised learning(監督式學習:人先標好答案,模型照著學),前提是訓練資料和未來資料分布一樣,但常常不一樣;p.2 也列出它的問題:缺訓練資料、缺領域知識。現在的起手式是先丟給 LLM 或 agent 試,自己 fine-tune、LoRA、RAG 的比例在下降,因為 foundation model(用海量資料預先訓練好的通用大模型)越來越強。但更常遇到的是根本沒有標註資料,這時要自己設計不用人工標註的訓練任務,就像 word2vec 用「猜周圍的字」當題目(第 3 章)。
「分布」是什麼:資料整體長什麼樣子,例如新聞裡體育占三成、政治占兩成。訓練時看到的分布跟上線後真正遇到的不一樣(例如訓練用舊新聞、上線卻遇到新話題),模型就容易猜錯。
比喻:像自學外語沒有老師出考卷,就自己把課文遮住一個字來猜;語言模型正是這樣學的。
考試可能怎麼問:What are the issues of supervised learning for NLP tasks?
要先懂什麼?supervised、unsupervised、self-supervised 差在哪?
- Supervised(監督式):答案由人工一筆一筆標註。例:新聞分類,每篇先標好「體育/政治」。
- Unsupervised(非監督式):沒有答案,只找資料裡的結構。例:LSA 把意思相近的文件湊在一起(第 2 章)。
- Self-supervised(自監督):從資料本身挖出題目和答案。例:word2vec 用中間字猜周圍字;語言模型用前文猜下一個字。
語言模型天生是 self-supervised:任何文字都自動變成「前文 → 下一個字」的考題,所以 n-gram 只要有語料就能算。
老師原話是什麼?
「其實你並沒有人告訴你SOP,沒有人告訴你說這時候要怎麼樣」(2:14:36)
「只要你的訓練資料跟未來資料的分佈是一樣的話,那就OK解決掉問題」(2:15:45)
「其實我們可能會更常遇到的是沒有 training data」(2:16:06)
## [2:16:39](https://www.youtube.com/watch?v=g0QE6O17BWE&t=8199s) 語言模型:根據前文猜下一個字
問答、寫文章、聊天都是「給一段輸入,生出一段句子」,所以需要語言模型。p.3:生成句子就是一個字接一個字寫下去,「Please turn your homework …」下一個字是 in 還是 over?這個想法可追到 Markov(1913)和 Shannon(1951),跟 W1 p.66 重疊(第 1 章)。Google 搜尋建議(p.5)也是例子:打「台南最好吃的」和「新竹最好吃的」,後面建議的字不同;資料來自 query log(使用者搜尋紀錄),道理相同。
下面這張圖是語言模型寫句子的循環:
```mermaid
flowchart LR
A["前文:Please turn your homework"] --> B["算每個候選字的機率"]
B --> C["in 機率高、over 機率低"]
C --> D["挑一個字接上去"]
D --> E["變成新的前文"]
E --> B
```
語言模型本身只會「算下一個字的機率」,問答、聊天、寫文章都是這個循環一直轉。
比喻:像手機輸入法的選字建議,打到一半它就猜你下一個字要打什麼。
考試可能怎麼問:What is a language model, and why do QA systems and chatbots need one?
進階摺疊在做什麼(白話):用幾句周杰倫歌詞實際數一次,「妳」後面接「說」的機會是四次裡一次;但前文換長一點,就因為語料太少直接變成 0。這正是後面整章要解決的問題。
要先懂什麼?P(說 | 妳) 這種寫法是什麼意思?
- 機率:0 到 1 的數字,表示一件事多常發生。1/4 就是四次裡大概一次。
- 中間的直線「|」讀作「在……的條件下」。P(說 | 妳) 就是「已經看到『妳』,下一個字是『說』的機會」。這叫條件機率(conditional probability)。
- 怎麼算:數次數相除。「妳說」出現幾次 ÷「妳」後面有接字的次數。
- 所以對這章的影響是:後面的 P(w | h)、P(want | I) 全是同一個意思,只是把字換掉。
它到底怎麼運作?用周杰倫歌詞算一次(進階,可跳過)
p.6–7 拿幾句周杰倫歌詞當語料,數「妳」後面接什麼字(只算同一行):
- 妳就(雨還沒停妳就撐)、妳說(妳說這一句)、妳是(形容妳是我的誰)、妳翹(為妳翹課)→ 共 4 次;「等妳」在行尾,後面沒字,不算。接「說」的有 1 次 → P(說 | 妳) = 1/4。
- 前文換成更長的「沒停妳」:只出現 1 次、後面接「就」→ P(說 | 沒停妳) = 0/1 = 0。
- 「沒停妳說」並非不合理,只是語料太少剛好沒出現;後面的 smoothing、bigram 簡化都是為了對付這種 0。
老師原話是什麼?
「如果我要做一個問答,就是一句話後面接著一句話,或者是要叫電腦自己去寫出一個文章,或是要跟我聊天」(2:17:01)
「語料庫沒那麼多,如果你只拿單一的歌曲的語料來做的時候,其實很難算出一些很好的分佈」(2:18:16)
## [2:18:31](https://www.youtube.com/watch?v=g0QE6O17BWE&t=8311s) N-gram 與 Google n-gram 資料集
n-gram 是連續 n 個字組成的片段:1-gram 叫 unigram,2-gram 叫 bigram,3-gram 叫 trigram。Google 做搜尋引擎時基本上用 n-gram 建索引,後來釋出 n-gram 統計資料集,做資訊檢索(IR,搜尋引擎那一派)的人如獲至寶:有了「哪些字常連在一起」的次數就能做斷詞,出現頻率很高的片段就該黏在一起。例如大量新聞裡「台積電」三個字幾乎總是一起出現,就該當成一個詞。一篇文章也可以從 1-gram 掃到 n-gram,把所有片段都存成索引,因為你不知道使用者會用長的還是短的說法來找。
兩個名詞:斷詞是指中文句子字和字之間沒有空格,電腦要自己決定哪幾個字合起來算一個詞(「台積電」要黏在一起,不能切成「台」「積電」)。索引(index)像書最後面的關鍵字索引,記下每個片段出現在哪幾篇文章,搜尋時直接查表(第 2 週學過:反向索引,用一個字去查有哪些文件含有它)。
比喻:拿不同寬度的窗框在句子上從頭滑到尾,一次框 1、2、3 個字,框到的每一段都記下來。
考試可能怎麼問:What is an n-gram? List the bigrams of "Please turn your homework".
進階摺疊在做什麼(白話):數一句話能切出幾個片段。結論是文章越長、n 從 1 掃到最大,片段數量就暴增,所以 Google 的 n-gram 索引非常龐大。
一句話能切出幾個 n-gram?(進階,可跳過)
用 p.8 的「Please turn your homework」:unigram 4 個、bigram 3 個(please turn、turn your、your homework)、trigram 2 個、4-gram 1 個。規則:長度 L 的句子有 L − n + 1 個 n-gram。老師說的「100 個字的文章從 1-gram 掃到 100-gram」,共 100 + 99 + … + 1 = 5,050 個片段,所以索引非常龐大。
老師原話是什麼?
「這個dataset一release出來,這個當初做資訊檢索的如獲至寶」(2:19:19)
「有了統計分佈,其實你拿那個來做斷字系統就非常好用,因為出現頻率很高就是應該要在一起」(2:19:33)
## [2:21:01](https://www.youtube.com/watch?v=g0QE6O17BWE&t=8461s) 語言指紋:J.K. Rowling 的筆名
Linguistic signature(語言指紋:每個人用字的統計習慣,像簽名一樣認得出來)。《哈利波特》作者 J.K. Rowling 用筆名 Robert Galbraith 出版推理小說《The Cuckoo's Calling》,文筆好到不像新人,引起懷疑。學者 Patrick Juola 用軟體 JGAAP 比對兩本書,做 stylometric analysis(文體計量分析),發現風格相似度很高。老師的重點:光靠簡單的統計,就能認出一個人的寫作風格。
p.9 列的四種特徵,每一種都在數某種片段或頻率:
| 特徵(p.9) | 在數什麼 | 小例子 |
| Four-character strings(字元 4-gram) | 每連續 4 個字元(含空格)的頻率 | 「the cat」切成 the_、he_c、e_ca、_cat(_ 代表空格) |
| Most common words(最常用字) | the、of、and 這類小字各占多少 | 有人愛用 and,有人愛用 but |
| Word lengths(字長分布) | 3 個字母、4 個字母……的字各占多少 | 愛用長字的人,分布偏向長的 |
| Word pairs(常一起出現的字對) | 相鄰兩個字(word bigram)的頻率 | 「of the」「in a」的比例因人而異 |
這些都是下意識習慣,很難刻意改;投影片說 four-grams 是很強的作者指標。
比喻:像聽腳步聲認人,每個人走路的節奏自己改不掉,用字習慣也是。
考試可能怎麼問:What is a linguistic signature? Name the features used to identify J.K. Rowling as Robert Galbraith.
事情的經過是什麼?
老師記不清是 Rowling 先承認還是先被抓到。依 p.9 附的 Scientific American 文章:2013 年《Sunday Times》記者先請 Juola 分析,結果指向 Rowling,之後她承認(我補充)。老師的比喻:像網路上突然冒出沒人認識的人連發頂尖論文,大家會起疑;Rowling 則像資深教授去參加年輕教授的獎項,降維打擊。
老師原話是什麼?
「這個已經有點像現在很資深的教授,但是他也去參加那個年輕教授的獎項那種感覺」(2:24:01)
「其實可以用統計上語法,語法學上的統計的東西,就可以知道一個人的風格」(2:24:11)
## [2:24:09](https://www.youtube.com/watch?v=g0QE6O17BWE&t=8649s) 用統計抓 AI 寫的文章靠得住嗎
國科會和 ICML 都在處理 AI 寫的審查意見(老師說 ICML 抓到用 AI 寫審查的人,連他自己的論文都被拒)。GPTZero 這類工具最陽春的做法,是算一段文字的 perplexity(困惑度:模型讀這段文字有多意外,下一章正式講),AI 寫的文字 perplexity 偏低。但改幾個字、故意留一個錯字就能打亂分布、拉高 perplexity,被判成人寫的。Turnitin 的 AI 偵測也一樣:只要準確率不是百分之百,就很難拿數字斷定你用了 AI。就算誤判率只有 1%,1,000 份真人寫的報告裡平均仍有約 10 份被冤枉,這就是老師說的「錯殺」。
(ICML 是機器學習領域的頂尖國際研討會,論文要先經過其他研究者審查才會被接受;國科會是台灣補助研究計畫的政府機關,計畫也要找學者審查。)
偵測工具怎麼判斷、為什麼容易被騙:
```mermaid
flowchart LR
A["一段文字"] --> B["語言模型算 perplexity"]
B -->|"很低,讀起來很順"| C["判成 AI 寫的"]
B -->|"偏高,有意外的字"| D["判成人寫的"]
E["故意改幾個字、留一個錯字"] --> B
```
偵測的依據只是「順不順」,而這很容易被人為改掉。
比喻:AI 寫的句子像印刷體,故意寫錯一個字就像在印刷體中間塞一個手寫字,看起來就「不像 AI」。
考試可能怎麼問:How do tools like GPTZero detect AI-generated text, and why are they unreliable?
進階摺疊在做什麼(白話):用一個小例子算 perplexity。算出來的數字可以讀成「模型平均每一步在幾個字之間猶豫」;數字越小,代表這段文字對模型越不意外,越像 AI 寫的。
perplexity 怎麼算?(進階,可跳過)
Perplexity 可以想成模型平均每一步在幾個選項之間猶豫,越低越不意外。例:3 個字、每步機率都是 1/4 → 整句 1/64 → PPL = (1/64)^(−1/3) = 4。完整定義在下一章(W2 p.16–17)。
老師原話是什麼?
「這個只要你研究過大語言模型就知道說這個太容易了,我就改幾個字」(2:25:47)
「故意寫一個錯字這樣子,因為他知道AI不會寫錯字」(2:25:55)
「就算他真的很準,他也沒有辦法百分之百去判斷這件事情」(2:26:48)
「他等下真的錯殺了怎麼辦」(2:27:02)
## [2:27:25](https://www.youtube.com/watch?v=g0QE6O17BWE&t=8845s) Bigram 計數表與加一平滑
只要有語料庫就能數。p.10 用三句話示範:I want to eat lunch、I want to eat Chinese food、I don't want to spend time cooking,數出 C(I want) = 2、C(want to) = 3、C(spend time) = 1。老師說想自己做,就 vibe coding 一下,叫 agent 抓一萬篇文章來算。問題是表裡一大堆 0,而整句機率是連乘的,一個 0 就讓整句變 0,所以要做 smoothing(挪一點機率給沒看過的組合);最簡單的是每格都加 1(p.12 的 add-k,k = 1)。
(vibe coding:不自己一行一行寫程式,而是用口語告訴 AI 想做什麼,讓它把程式寫完。)
步驟(用文字說):
1. 把語料切成字,數每對相鄰字出現幾次,填進「前字 × 後字」的表。
2. 每一格都加 1(加一平滑)。
3. 每一格除以那一列的總數,得到「前字後面接後字」的機率。
下面是 p.11 的真實次數表,先看有多少格是 0:

圖上重點:
- 標題 N-gram Language Models(N-gram 語言模型),An example of bi-gram LM(一個 bigram 語言模型的例子)。
- Draw a table of bigram counts for eight of the words:挑八個字,把「兩個字相鄰出現的次數」畫成一張表。
- 左邊每一列是「前一個字」,上面每一欄是「後一個字」,格子裡是次數。例:I 那一列、want 那一欄是 827,代表語料裡「I want」出現 827 次。
- 很多格是 0(例如 to 後面接 want):不是不可能,只是這份語料剛好沒出現過。
- 這張圖在講:bigram 模型的原料就是這張次數表,而表裡大量的 0 正是需要平滑的原因。
0 代表語料裡 to 後面從沒接過 want,模型就會斷定機率是 0。
注意:p.11–12 表頭的 launch、speed 是 lunch、spend 的筆誤(p.10 例句和教科書原表都是後者)。
比喻:老師說,假設期末分數是四次作業「相乘」,有一次沒交就整個歸零;smoothing 就像「沒交也先給 1 分」,分數很低但還有機會。
考試可能怎麼問:Why do n-gram models need smoothing? Describe add-one smoothing.
進階摺疊在做什麼(白話):拿上面那張真實次數表算一次加一平滑。結果是常見組合(I want)的機率從 0.33 降到 0.21,原本是 0 的組合(to want)變成一個很小但不是 0 的數字。等於把常見組合的一點點機率,分給沒看過的組合。
它到底怎麼運作?用 p.11 算一次加一平滑(進階,可跳過)
- 公式(我補充):P(wₙ | wₙ₋₁) = (C(wₙ₋₁ wₙ) + 1) ÷ (C(wₙ₋₁) + V),V 是詞彙量(這一列每格都多 1,分母就加 V);add-k 把 1 換成 k。
- 不平滑:表上只列 8 個字,I 的總次數要看整份語料(教科書原表 C(I) = 2,533、V = 1,446,可用 p.12 驗算),P(want | I) = 827 ÷ 2,533 ≈ 0.33。
- 加一:828 ÷ (2,533 + 1,446) = 828 ÷ 3,979 ≈ 0.21,正是 p.12 下表 I → want 那格。原本是 0 的 P(want | to) = 1 ÷ (2,417 + 1,446) ≈ 0.00026,不再是 0。
- 注意:p.12 下表有 11 格差了 10 倍(例如 I → speed 應為 0.00075,speed 那一列大多應為 0.00058),用公式算才對。
- 補充:取 log 把連乘變連加,能避免數字小到存不下,但救不了 0(log 0 是負無限大)。
老師原話是什麼?
「就是非常肯定的告訴模型說,to後面不會出現want」(2:28:50)
「值很小的好處是,雖然乘起來會整個下降沒錯,但是他不會變成0,不會變成0就有機會了」(2:29:36)
「那你說那我有一次沒交,最後就是0」(2:29:56)
## [2:30:08](https://www.youtube.com/watch?v=g0QE6O17BWE&t=9008s) 條件機率連乘:從 bigram 到 n-gram
一個字的機率 =「前文後面接這個字」的次數 ÷ 前文的次數(p.13 的例子:the 接在 its water is so transparent that 後面)。整句的機率用 chain rule(連鎖律)拆成一串條件機率相乘(p.14):i want to eat,就是 i 的機率 × i 後面接 want 的機率 × …… 一路乘下去。問題是前文越長,那串字在語料裡出現的次數越少(常常只有 0 或 1 次),估出來的機率很不可靠,不同語料還要做不同的調整。所以簡化成 bigram:每個字只看前一個字(這個假設叫 Markov assumption,下一堂 p.18 正式講)。老師說這聽起來不會 work,但以前這樣就很厲害了。
下面這張圖把整章的推理串起來:
```mermaid
flowchart TD
A["想算整句的機率"] --> B["連鎖律:每個字看全部前文"]
B --> C["前文越長越少見,次數常是 0 或 1"]
C --> D["馬可夫假設:只看前一個字"]
D --> E["Bigram 模型:一串兩字機率相乘"]
E --> F["沒看過的字對仍是 0"]
F --> G["加一平滑"]
```
每往下一格,都在解決上一格的問題:n-gram 的簡化全是「資料不夠」逼出來的。
步驟(用文字說):把句子拆成字 → 每個字算「接在前一個字後面」的機率(次數相除)→ 全部乘起來。
比喻:翻聊天紀錄猜朋友下一個字,只看最後一個字有幾百次可參考;要求前十個字一模一樣,可能一次都找不到。n 小資料夠但近視,n 大看得遠但次數太稀。
考試可能怎麼問:Write the chain rule for a word sequence and its bigram approximation. Why is the approximation needed?
進階摺疊在做什麼(白話):先用「戴眼鏡的人裡有多少女生」講懂條件機率,再用 p.10 那三句話實際算兩個句子的機率。結論:沒平滑時,多一個沒看過的字對,整句就變 0;加一平滑後兩句都不是 0,而且合理的句子機率仍然比較高。
它到底怎麼運作?條件機率與整句手算(進階,可跳過)
- 條件機率 P(A | B) = P(A, B) ÷ P(B)。例:20 人戴眼鏡、其中 8 人是女生 → P(女生 | 戴眼鏡) = 0.4;把戴眼鏡換成前文 h、女生換成下一個字 w,就是 P(w | h)。
- Chain rule 完全精確:P(I want to eat) = P(I) × P(want | I) × P(to | I want) × P(eat | I want to)。Trigram 近似:P(w₃ | w₁w₂) = C(w₁w₂w₃) ÷ C(w₁w₂);bigram 近似:P(eat | I want to) ≈ P(eat | to)。
- p.14 最後一項 P(wₙ | w(n−N+1)) 是 N-gram 近似,意思是只看前 N−1 個字(教科書寫成 w(n−N+1):(n−1))。
- 用 p.10 三句當語料(V = 11,三句都以 I 開頭):A = I want to eat lunch,不平滑 = 2/3 × 3/3 × 2/3 × 1/2 = 2/9 ≈ 0.222。B = I want to eat Chinese lunch 多了一個沒看過的 P(lunch | Chinese) = 0/1,整句 = 0。加一平滑後 A ≈ 0.00202、B ≈ 0.000168:B 不再是 0,A 仍比 B 高 12 倍;代價是機率被稀釋很多。
- p.11–14 的表和公式出自 Jurafsky & Martin 教科書 [第 3 章](https://web.stanford.edu/~jurafsky/slp3/3.pdf)。
老師原話是什麼?
「你的語料庫沒有出現,或只出現一次的時候,就沒辦法算」(2:31:21)
「bigram 就是我現在這個字呢,只會跟前一個字有關」(2:33:19)
「不是它不好算,因為你根本沒辦法統計這些」(2:33:37)
「這個東西其實是很有bias的probability,因為你的corpus很少」(2:33:41)
## 補充:老師直接用、沒解釋的詞
2:14:25 那段老師一口氣提到 agent、fine-tune、LoRA、RAG、foundation model。這幾個詞之後常出現,這裡補白話。
foundation model、fine-tune、LoRA、RAG、agent 各是什麼?
把模型想成一個人的養成:
- foundation model(基礎模型):先用全網路的大量文字 pre-train(預訓練)出來的通用大模型,像念完大學的通才。從頭訓練非常花錢,一般人只能拿現成的。
- fine-tune(微調):拿現成大模型,再用自己的少量資料多訓練一下,讓它擅長某個領域,像送去上專業訓練班。
- LoRA(low-rank adaptation):便宜版的微調。原本的參數不動,只外掛一小組新參數來訓練,要的運算和記憶體少很多(我補充)。
- RAG(檢索增強生成):不改模型,回答前先去資料庫找相關文件,連同問題一起交給模型(第 04 章)。
- agent(代理人):會自己分步驟做事的 AI,不只回答,還會搜尋、跑程式、呼叫工具,把一整件任務做完。
老師的觀察:現在起手式是先丟給 LLM,「能夠用agent的方式做就做」(2:14:53);自己 fine-tune、LoRA、RAG 的比例在下降,因為 foundation model 越來越強。第 07 章會看到,fine-tune 可能把模型原本會的東西弄壞。
## Self-check
Q1. Given the corpus "I want to eat lunch. / I want to eat Chinese food. / I don't want to spend time cooking.", compute P(eat | to) and P(lunch | Chinese) by relative frequency. Why is the second value a problem?(中文:用這三句當語料,用次數相除算 P(eat | to) 和 P(lunch | Chinese),第二個值為什麼是問題?)
**Answer**: P(eat | to) = C(to eat) / C(to) = 2/3. P(lunch | Chinese) = C(Chinese lunch) / C(Chinese) = 0/1 = 0. Since a sentence probability is the product of its bigram probabilities, one unseen bigram makes the whole sentence probability 0. Smoothing (e.g., add-one) gives unseen bigrams a small non-zero probability.
中文:P(eat | to) =「to eat」出現 2 次 ÷「to」出現 3 次 = 2/3。P(lunch | Chinese) =「Chinese lunch」出現 0 次 ÷「Chinese」出現 1 次 = 0。整句機率是 bigram 機率連乘,一個沒看過的字對是 0,整句就變 0,即使句子完全合理(例如 I want to eat Chinese lunch)。解法是平滑,例如每格加 1。
Q2. Write the add-one (Laplace) smoothed bigram probability. Compute P(to | want) given C(want to) = 608, C(want) = 927, and V = 1446.(中文:寫出加一平滑的 bigram 機率公式,並用給的數字算 P(to | want)。)
**Answer**: P(wₙ | wₙ₋₁) = (C(wₙ₋₁ wₙ) + 1) / (C(wₙ₋₁) + V). P(to | want) = (608 + 1) / (927 + 1446) = 609 / 2373 ≈ 0.26.
中文:公式是(兩字一起出現的次數 + 1)÷(前一個字的次數 + 詞彙量 V)。分母加 V,是因為 want 這一列有 V 格、每格都多了 1。代入:609 ÷ 2373 ≈ 0.26。
Q3. Write the probability of a word sequence w₁…wₙ using the chain rule, then its bigram approximation. What assumption does the bigram model make, and why is it needed?(中文:用連鎖律寫出整句機率,再寫 bigram 近似;bigram 做了什麼假設、為什麼需要?)
**Answer**: Chain rule: P(w₁…wₙ) = P(w₁)P(w₂|w₁)P(w₃|w₁:₂)…P(wₙ|w₁:ₙ₋₁). Bigram: P(w₁…wₙ) ≈ ∏ₖ₌₁ⁿ P(wₖ|wₖ₋₁). This is the Markov assumption: the probability of a word depends only on the previous word. It is needed because long histories rarely appear in a finite corpus, so their counts are 0 or 1 and the estimates are unreliable.
中文:連鎖律把整句機率拆成「第一個字的機率 × 第二個字在第一個字之後的機率 × ……」,每一項看全部前文,完全精確。Bigram 改成只看前一個字,這就是馬可夫假設。需要它,是因為語料有限,很長的前文次數只有 0 或 1,機率不可靠;只看前一個字,次數才夠多。
Q4. What is a linguistic signature, and how did it reveal J.K. Rowling as Robert Galbraith?(中文:什麼是語言指紋?它怎麼認出 Robert Galbraith 就是 J.K. Rowling?)
**Answer**: It is the statistical pattern of a person's word use, like a fingerprint of authorship. Juola's JGAAP compared four-character strings, the most common words, word lengths, and frequent word pairs; the distributions were highly similar.
中文:語言指紋是一個人用字的統計習慣,像指紋能認出作者。Juola 用 JGAAP 比對四種特徵:四字元片段、最常用字頻率、字長分布、常一起出現的字對,兩本書非常相似,指向筆名 Robert Galbraith 就是 Rowling。
讀完了嗎?下一章:[07 語言模型定義與困惑度(2:33–2:51)](https://app.notion.com/p/3e6fc631b03081b4b99acb876fd0bb2d)|回到週頁:[W3(9/24)](https://app.notion.com/p/3e6fc631b03081ff9776f36fab3e6e50)