[自然語言處理](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 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) ## 重點 - 語言模型(language model)在做一件事:看前面的字,算出下一個字的機率。問答、寫文章、聊天、Google 搜尋建議都靠它。最早的做法叫 n-gram:直接在語料庫裡數次數。 - 算法只有一條:P(w | h) = C(h 後面接 w) ÷ C(h)。整句的機率用 chain rule(連鎖律)一步一步乘起來;bigram 只看前一個字,所以只要一張「前字 × 後字」的次數表。 - 最大的麻煩是資料不夠:前文越長,次數越少,表裡到處是 0,而一個 0 就讓整句機率變 0,所以要做 smoothing(平滑,最簡單的是每格加 1)。同樣的統計也能認出作者風格(J.K. Rowling 筆名事件),但拿來抓 AI 寫的文章很容易被騙過。 ## Exam-ready - **Motivation**: "Supervised learning ◦Text classification ◦QA system … Issues ◦Lack of training data ◦Limitation of domain knowledge … Think about your learning strategies !"(W2 p.2) - **Natural Language Generation**: "The commonest way to generate sentences is by writing the words down, one after another."(W2 p.3) - **Markov (1913)**: "The chance of a letter appearing depends on the letter before it."(W2 p.4) - **N-gram**: "An n-gram is a sequence of n words … 2-gram (bigram): "please turn", "turn your", or "your homework""(W2 p.8) - **Linguistic signature**: "Sequences of four-character strings (four-grams), which are strong indicators of authorship."(W2 p.9) - **N-gram LM**: "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) - **Smoothing**: "Apply add-k smoothing (k=1) … Compute Probability (relative frequency)"(W2 p.12) - **Probability from counts**: 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) - **Chain rule / N-gram**: "Compute probabilities of entire sequences like w₁…wₙ N-gram model (Chain Rule of Probabilities)": P(w₁…wₙ) = P(w₁)P(w₂|w₁)P(w₃|w₁:₂)…P(wₙ|w(n−N+1)) = ∏ₖ₌₁ⁿ P(wₖ|w(k−N+1))(W2 p.14,括號裡是下標) - **Bigram model**: P(w₁…wₙ) = P(w₁)P(w₂|w₁)P(w₃|w₂)…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,下一堂正式講) ## [2:12:42](https://www.youtube.com/watch?v=g0QE6O17BWE&t=7962s) 接到 W2 投影片:先想「為什麼需要」 Slido 上作業繳交格式的問題交給助教回覆,接著換到 W2 投影片。這份投影片延續語言模型:前面的 word2vec 只是很簡單的兩層神經網路,後面會講更聰明的序列模型 RNN、LSTM。老師先提醒學習方法:不要只記「序列就用 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 章)。
要先懂什麼?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(使用者搜尋紀錄),道理很接近。
它到底怎麼運作?用投影片上的周杰倫歌詞手算一次 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 統計資料(2006 年的 [Web 1T 5-gram](https://catalog.ldc.upenn.edu/LDC2006T13),從約一兆個英文字算出 1 到 5-gram 的次數),做資訊檢索(IR,搜尋引擎那一派)的人如獲至寶:有了「哪些字常連在一起」的次數就能斷詞,出現頻率很高的片段就該黏在一起。一篇文章也可以用滑動視窗從 1-gram 掃到 n-gram,把所有片段都存成索引,因為你不知道使用者會用長的還是短的說法來找。
它到底怎麼運作?一句話能切出幾個 n-gram? 用 p.8 的「Please turn your homework」(4 個字): - unigram:please、turn、your、homework → 4 個 - bigram:please turn、turn your、your homework → 3 個 - trigram:please turn your、turn your homework → 2 個 - 4-gram:整句 → 1 個 規則:長度 L 的句子有 L − n + 1 個 n-gram。老師說的「100 個字的文章從 1-gram 掃到 100-gram」,共 100 + 99 + … + 1 = 5,050 個片段,所以索引非常龐大。
用生活例子講,n-gram 次數怎麼幫忙斷詞? 中文沒有空格,電腦不知道「台積電股價」該切成「台積電/股價」還是「台/積電股/價」。如果大量新聞裡「台積電」這個 3-gram 出現非常多次,代表這三個字幾乎總是一起出現,就該當成一個詞。英文的「New York Times」也一樣。
老師原話是什麼? 「這個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)在數什麼小例子
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 是很強的作者指標。
事情的經過是什麼?(老師記不清楚的部分) 老師說他忘了是 Rowling 先承認,還是先被分析抓到。依 Juola 自己寫的 [Scientific American 文章](https://www.scientificamerican.com/article/how-a-computer-program-helped-show-jk-rowling-write-a-cuckoos-calling/)(p.9 附的連結):2013 年 7 月《Sunday Times》記者先請他分析,Rowling 在 7 月 13 日承認。老師的比喻:像資深教授跑去參加年輕教授的獎項,降維打擊。
老師原話是什麼? 「其實可以用統計上語法,語法學上的統計的東西,就可以知道一個人的風格」(2:24:11)
## [2:24:09](https://www.youtube.com/watch?v=g0QE6O17BWE&t=8649s) 用統計抓 AI 寫的文章靠得住嗎 國科會和 ICML 都在處理 AI 寫的審查意見(老師說 ICML 被抓到的審查者,自己的論文直接被拒)。GPTZero 這類工具最陽春的做法,是算一段文字的 perplexity(困惑度:模型讀這段文字有多意外,下一章正式講),AI 寫的文字 perplexity 偏低。但改幾個字、故意留一個錯字就能打亂分布、拉高 perplexity,被判成人寫的;Turnitin 的 AI 偵測也一樣,只要準確率不是百分之百,就很難拿數字斷定你用了 AI。
要先懂什麼?perplexity 的一句話版 - Perplexity 可以想成:模型平均每一步「在幾個選項之間猶豫」,越低越不意外。 - 手算:一句 3 個字,每一步機率都是 1/4 → 整句機率 = 1/64 → PPL = (1/64)^(−1/3) = 4,像每一步都在 4 個選項裡挑。完整定義在下一章(W2 p.16–17)。
用生活例子講,為什麼故意打錯字就能騙過偵測? AI 寫的句子像印刷體,每個字都在模型覺得最可能的位置,讀起來一點都不意外。故意寫錯一個字,就像在印刷體中間塞一個手寫字:那一步機率很低,連乘後 perplexity 上升,看起來就「不像 AI」。 反過來還會冤枉人:就算誤判率只有 1%,1,000 份真人寫的報告裡平均仍有約 10 份被判成 AI,這就是老師說的「錯殺」。
老師原話是什麼? 「這個只要你研究過大語言模型就知道說這個太容易了,我就改幾個字」(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。p.11 是教科書的真實例子:列是前一個字、欄是後一個字,格子是「前字後面接後字」的次數。表裡一大堆 0,而整句機率是連乘的,一個 0 就讓整句變 0,所以要做 smoothing(挪一點機率給沒看過的組合);最簡單的是每格都加 1(p.12 的 add-k,k = 1)。 [[IMG: C:\D槽\TAICA課程\_work\notes-v2\nlp-w3\img\nlp_w2slides_p011.png | W2 p.11:bigram 次數表,列=前一個字、欄=後一個字,例如 I 後面接 want 827 次、to 後面接 want 0 次]] **注意:p.11–12 表頭的 launch、speed,其實是 p.10 例句和教科書原表裡的 lunch、spend(投影片筆誤)。**
它到底怎麼運作?用 p.11 手算一次加一平滑 - 不平滑(relative frequency):P(want | I) = C(I want) ÷ C(I)。表上只列 8 個字,I 的總次數要看整份語料:教科書給 C(I) = 2,533,所以 827 ÷ 2,533 ≈ 0.33。 - 加一平滑:每格都 +1,分子變 828;這一列每一格都多了 1,所以分母加上詞彙量 V = 1,446(textbook)→ 828 ÷ 3,979 ≈ 0.21,正是 p.12 下表 I → want 那格。 - 原本是 0 的格子:P(want | to) = (0 + 1) ÷ (2,417 + 1,446) ≈ 0.00026,不再是 0。 - 公式:P(wₙ | wₙ₋₁) = (C(wₙ₋₁ wₙ) + 1) ÷ (C(wₙ₋₁) + V);add-k 把 1 換成 k:(C + k) ÷ (C(wₙ₋₁) + kV)(textbook)。 **注意:p.12 下表有幾格少了一個 0(例如 I → speed 應為 0.00075,speed 那一列大多應為 0.00058),用公式算就對得上。考試照公式算。**
用生活例子講,為什麼一個 0 就完蛋? 老師的比喻:假設期末分數是四次作業分數「相乘」。前三次滿分,有一次沒交,乘起來還是 0;改成相加就沒這問題。Smoothing 就像「沒交也先給 1 分」:分數很低,但不會歸零,還有機會。 補充:取 log 能把連乘變連加,解決「數字小到電腦存不下」的問題,但解決不了 0,因為 log 0 是負無限大,0 還是要靠 smoothing。
老師原話是什麼? 「就是非常肯定的告訴模型說,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) 條件機率連乘:從 n-gram 到 bigram 一個字的機率:P(w | h) = C(h 後面接 w) ÷ C(h)(p.13),例如 P(the | its water is so transparent that) 就是「its water is so transparent that the」的次數 ÷「its water is so transparent that」的次數。整句的機率用 chain rule 拆成一串條件機率相乘(p.14)。問題是前文越長,那串字在語料裡出現的次數越少(常常只有 0 或 1 次),估出來的機率很不可靠。所以簡化成 bigram:每個字只看前一個字(這個假設叫 Markov assumption,下一堂 p.18 正式講);老師說這聽起來不會 work,但以前這樣就很厲害了。
要先懂什麼?條件機率和 chain rule - 條件機率 P(A | B):已知 B 發生,A 也發生的機會 = P(A, B) ÷ P(B)。例:班上 20 人戴眼鏡,其中 8 人是女生 → P(女生 | 戴眼鏡) = 8/20 = 0.4。把「戴眼鏡」換成前文 h、「女生」換成下一個字 w,就是 P(w | h)。 - Chain rule:P(A, B, C) = P(A) × P(B | A) × P(C | A, B),完全精確。套到句子:P(I want to eat) = P(I) × P(want | I) × P(to | I want) × P(eat | I want to)。 - N-gram 近似:每個條件只留最近 N−1 個字。trigram:P(w₃ | w₁w₂) = C(w₁w₂w₃) ÷ C(w₁w₂)(分子三個字、分母兩個字);bigram:P(eat | I want to) ≈ P(eat | to)。 - p.14 第一行前幾項是精確的 chain rule,最後一項 P(wₙ | w(n−N+1)) 已換成 N-gram 近似,意思是「只看前 N−1 個字」;教科書寫成 P(wₙ | w(n−N+1):(n−1))。
它到底怎麼運作?用 p.10 三句話手算整句機率 語料就是 p.10 那三句。C(I) = 3、C(want) = 3、C(to) = 3、C(eat) = 2、C(Chinese) = 1;不同的字共 11 個,V = 11。比較 A = I want to eat lunch,和 B = I want to eat Chinese lunch(語料裡沒出現過 Chinese lunch)。三句都以 I 開頭,第一個字的機率 = 3/3 = 1,下面省略。
因子用在哪句不平滑(次數相除)加一平滑(V = 11)
P(want | I)A、B2/3 ≈ 0.6673/14 ≈ 0.214
P(to | want)A、B3/3 = 14/14 ≈ 0.286
P(eat | to)A、B2/3 ≈ 0.6673/14 ≈ 0.214
P(lunch | eat)A1/2 = 0.52/13 ≈ 0.154
P(Chinese | eat)B1/2 = 0.52/13 ≈ 0.154
P(lunch | Chinese)B0/1 = 01/12 ≈ 0.083
**A 整句**2/9 ≈ 0.222≈ 0.00202
**B 整句****0**≈ 0.000168
讀法:不平滑時,B 只因一個沒看過的 bigram 就整句歸零。加一之後 B 有了機率,A 仍比 B 高 12 倍,排序沒變;代價是 A 從 0.222 掉到 0.002,語料越小稀釋越嚴重。
用生活例子講,為什麼前文越長越難算? 翻聊天紀錄猜朋友下一個字:只看他最後打的一個字,有幾百次可以統計;要求前面十個字一模一樣,可能一次都找不到。n 小,資料夠但近視;n 大,看得遠但次數太稀,就像歌詞那頁的 P(說 | 沒停妳) = 0。
老師原話是什麼? 「你的語料庫沒有出現,或只出現一次的時候,就沒辦法算」(2:31:21) 「bigram 就是我現在這個字呢,只會跟前一個字有關」(2:33:19) 「不是它不好算,因為你根本沒辦法統計這些」(2:33:37) 「這個東西其實是很有bias的probability,因為你的corpus很少」(2:33:41)
別人怎麼教這個? Jurafsky & Martin《Speech and Language Processing》[第 3 章 N-gram Language Models](https://web.stanford.edu/~jurafsky/slp3/3.pdf):p.11–14 的次數表、平滑表和公式都出自這章(3.1 節 chain rule 與 Markov assumption,3.6 節加一與 add-k 平滑)。
## 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? **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. 中文重點:次數相除得 2/3 和 0;一個 0 讓整句連乘歸零,所以要平滑。
Q2. Write the add-one (Laplace) smoothed bigram probability. Compute P(to | want) given C(want to) = 608, C(want) = 927, and V = 1446. **Answer**: P(wₙ | wₙ₋₁) = (C(wₙ₋₁ wₙ) + 1) / (C(wₙ₋₁) + V). P(to | want) = (608 + 1) / (927 + 1446) = 609 / 2373 ≈ 0.26. 中文重點:分子加 1、分母加 V(整列每格都加了 1),得 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? **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 用馬可夫假設只看前一個字。