[自然語言處理](https://app.notion.com/p/3e6fc631b03081b4a9e8f91f3411f61f) › [W4(10/1)](https://app.notion.com/p/3ecfc631b03081b8aa2cf4a97467ed41) › 01|影片 [0:00:00–0:14:58](https://www.youtube.com/watch?v=7kgOuhuIjvY&t=0s)|投影片 W1_NLP_brief p.53;W2_Word p.17–19|上一章 無|下一章 [02 稀疏向量與 PPMI(0:14–0:30)](https://app.notion.com/p/3ecfc631b03081daa362fba68ecb5a0c) ## 重點 - BM25 是「改良版的 TF-IDF」:一樣在稀疏向量空間裡比 query 和文件有多像,但它讓詞頻的加分會「飽和」,還會依文件長度打折。老師特別說它雖然舊,現在還一直在用。 - Bigram 模型假設「下一個字只跟前一個字有關」,這個假設叫 Markov assumption。它讓機率變得算得出來,Hidden Markov Model 也是從這個假設延伸出來的。 - N-gram 語言模型的四個缺點:看不到遠處的字、N 一拉長參數就暴增又資料稀疏、片段太短會丟掉字的順序、處理不了同義字和新領域。這是後面改用「學出來的向量」的理由。 ## Exam-ready - **BM25**: "A ranking function used by search engines to rank matching documents according to their relevance to a given query."(W1_NLP_brief p.53)【老師強調】(0:03:48) - 中文:BM25 是搜尋引擎用的「排名函數」,依照文件和查詢句有多相關,把找到的文件排先後。白話:你打關鍵字,它決定哪篇排第一。難字:ranking function(排名函數)、relevance(相關程度)、query(查詢句)。 - **BM25 parameters, TF_BM25 ≈ f·(k1+1)/(f+k1)**: "k1, b are free parameters"(W1_NLP_brief p.53) - 中文:k1 和 b 是可以自己調的參數,投影片寫一般設 k1=2、b=0.75;同一頁把 BM25 定位成 "Alternative (improved) TF-IDF"(改良版 TF-IDF)。白話:BM25 有兩顆旋鈕,但大家通常用預設值。難字:free parameters(可自由設定的參數)、alternative(替代的)。 - **Perplexity**: "Perplexity quantifies the level of uncertainty or unpredictability that a model experiences when making predictions."(W2_Word p.17) - 中文:困惑度衡量模型在預測下一個字時有多「不確定」。白話:模型越拿不定主意,困惑度越高。難字:quantifies(量化)、uncertainty(不確定性)、unpredictability(難以預測)。 - **Lower perplexity**: "A lower perplexity indicates better language comprehension and prediction ability, signifying the model's efficiency in capturing language patterns."(W2_Word p.17) - 中文:困惑度越低,代表模型越懂語言、預測得越準,也越能抓到語言的規律。白話:分數越低越好。難字:comprehension(理解)、signifying(表示)、patterns(規律)。 - **Bigram model, P(w_n | w_1:n-1) ≈ P(w_n | w_n-1)**: "Approximates the probability of a word given all the previous words by using only the conditional probability of the preceding word."(W2_Word p.18) - 中文:本來要算「給定前面所有字,下一個字出現的機率」,bigram 只用「給定前一個字」的條件機率來近似。白話:只看前一個字猜下一個字。難字:approximates(近似)、conditional probability(條件機率)、preceding(前面的)。 - **Markov assumption**: "The assumption that the probability of a word depends only on the previous word is called a Markov assumption."(W2_Word p.18) - 中文:「一個字出現的機率只取決於前一個字」這個假設,叫做 Markov 假設。白話:只記得上一步,更早的都忘掉。難字:assumption(假設)、depends only on(只取決於)。 - **Limited context**: "N-gram models are unable to capture longer-distance (>>N) language dependencies."(W2_Word p.19) - 中文:N-gram 模型抓不到距離比 N 遠很多的字之間的關係。白話:句首的主詞,句尾就忘了。難字:capture(抓到)、dependencies(依賴關係)。 - **Data sparsity (High time/space complexity)**: "As the N value increases, the number of parameters to store and compute grows exponentially."(W2_Word p.19) - 中文:N 越大,要儲存和計算的參數數量呈指數成長。白話:多看一個字,要記的組合就翻好幾倍。難字:sparsity(稀疏)、exponentially(指數地)。 - **Ignoring word order**: "N-gram models assume independence between words, neglecting the influence of word order on semantics."(W2_Word p.19) - 中文:N-gram 模型假設字和字之間(片段以外)彼此獨立,忽略了字的順序對意思的影響。白話:「狗咬人」和「人咬狗」在它眼裡差不多。難字:independence(獨立)、neglecting(忽略)、semantics(語意)。 - **Low flexibility**: "N-gram language models struggle with synonyms and have limited ability to adapt to varying conditions. (e.g. dialogue)."(W2_Word p.19) - 中文:N-gram 模型處理不好同義字,也很難適應不同情境(例如對話)。白話:「買」和「購買」它當成兩個不相干的字。難字:synonyms(同義字)、adapt(適應)、varying conditions(不同情境)。 ## [0:00:27](https://www.youtube.com/watch?v=7kgOuhuIjvY&t=27s) 開場與本週安排 今天只上一半的時間,把 W2 的投影片講完。下半場是 TA Lab 課,改成看助教預錄的 PyTorch 教學影片,大約一個半小時,影片已經放上去了。老師說有機器學習經驗的人可能會覺得簡單,但還是要看。
老師原話是什麼? - 「今天我們會把 W2 的投影片講完。」(0:01:54) - 「我們今天大概會上一半的時間。然後剩下一半的時間就是讓大家回去看 TA Lab 課的第一段。」(0:02:45)
## [0:03:37](https://www.youtube.com/watch?v=7kgOuhuIjvY&t=217s) BM25:在向量空間算相似度 有同學問到 BM25,老師翻回 W1 投影片補講。它的精神是:把 query 和文件都用 TF-IDF(詞頻乘上「這個字有多稀有」的權重)表示成稀疏向量,再算兩個向量有多像,用這個分數幫文件排名。它的全名是 Okapi BM25,1980 年代提出;投影片上的 BM11、BM15 是同一家族的早期版本(我補充:大致相當於 b=1 和 b=0 的特例)。 要先懂的三個詞:query(查詢句,就是你打進搜尋框的那串字);稀疏向量(一長串數字,每一格代表字典裡的一個字,一篇文章只用到字典裡很少的字,所以大部分格子是 0);TF-IDF(第 2 週學過:TF 是一個字在這篇文章出現幾次,IDF 看這個字出現在幾篇文件裡,越少見越有鑑別力,兩個相乘就是這個字的權重,見 [W2 第 06 章](https://app.notion.com/p/3e6fc631b0308121891cc1705fe5be4a);BM25 第 2 週也提過,見 [W2 第 07 章](https://app.notion.com/p/3e6fc631b030819ca51ee21869f5c86d))。 為什麼公式裡只看 query 的字?因為算內積(兩個向量對應位置相乘再加總)時,query 沒出現的字在 query 向量裡是 0,乘了也是 0。所以實際上只算「query 裡的字在這篇文件出現幾次」。公式前半是 IDF,後半的 f 就是詞頻。 [[IMG: C:\D槽\TAICA課程\_work\notes-v2\nlp-w4\img\w1_nlp_brief_p053.png | W1 p.53:左下是 BM25 完整公式,前面是 IDF、分數線上面的 f 是詞頻;右邊是簡化版的 TF_BM25,以及 k1、b 的預設值]] 圖上重點:這張圖在講「BM25 就是 TF-IDF 再加上兩個修正:詞頻加分會飽和、長文件會打折」。 - 標題 BM25 (Best Matching 25):「最佳匹配」第 25 版;Okapi BM25 (1980s) 是 1980 年代 Okapi 檢索系統提出的。下面那句英文:搜尋引擎用來依「跟查詢句多相關」幫文件排名的函數。 - 左下 score(D, Q):文件 D 對查詢 Q 的總分=把查詢裡每個字 q_i 的「IDF × 調整過的詞頻」加起來(Σ 就是「全部加起來」)。分母裡的 |D|/avgdl 是「這篇文章長度 ÷ 平均長度」。 - 左下 IDF(q_i) = log(...):含這個字的文件越少,分數越高;log 是把數字壓小的運算,讓差很多倍的數字不會差太誇張。 - 右上 "k1, b are free parameters, generally k1=2, b=0.75":k1、b 是可以自己調的旋鈕,一般設 2 和 0.75。 - 右下 TF_BM25 簡化式和 "f from 1 to 2 v.s. f from 100 to 101":比較「出現次數 1 變 2」和「100 變 101」加分差多少;紅框 "Alternative (improved) TF-IDF" 意思是「改良版 TF-IDF」。 這張圖先看左下的大公式:Σ 是把 query 裡每個字的分數加起來,每個字的分數 = IDF × 調整過的詞頻。右邊那條簡化式是下一段的主角。
用生活例子講,BM25 在做什麼? 像圖書館員幫你找書。你說「找講 BM25 的書」,館員只看每本書裡「BM25」這個字出現幾次(query 以外的字他不管),再看這個字稀不稀有(很多書都有的字,例如「的」,幾乎不加分),最後把書排好順序遞給你。
## [0:06:05](https://www.youtube.com/watch?v=7kgOuhuIjvY&t=365s) BM25 的參數 k1 與 b TF-IDF 的 TF 就是直接數次數,所以長文章天生吃香:五萬字的文章,關鍵字出現次數一定比五個字的文章多。BM25 用兩個參數修正這件事:k1 控制「詞頻每多一次,加分加多少」,b 搭配平均文件長度(avgdl)做長度正規化。 正規化(normalization)在這裡的意思是:把「文章長短不同」造成的不公平扣回來,讓長文章和短文章站在同一個起跑點比分數。 為什麼要讓加分「越來越少」?因為一個字從出現 1 次變 2 次,代表這篇文件可能真的在講它;從 100 次變 101 次,幾乎沒有新資訊。BM25 讓詞頻的加分有上限(會飽和),這就是它比一般 TF-IDF 好的地方。IDF 那一半也有做類似的正規化。 | 參數 | 管什麼 | 調大會怎樣 | 預設 | |---|---|---|---| | k1 | 詞頻加分的敏感度 | 加分比較慢飽和,次數多的文件更吃香 | 2 | | b | 文件長度的打折程度 | 長文件被扣得越多;b=0 完全不管長度 | 0.75 | | avgdl | 所有文件的平均長度 | 是常數,用來算「這篇比平均長多少」 | 由資料決定 | 實務上大家直接用預設值,不太去調,因為 BM25 是一個 baseline(拿來比較的基準方法):大家都知道它的行為和參數,說「我用 BM25」別人就知道你做了什麼。 下面「進階」摺疊在做什麼(白話):拿 k1=2 實際代入幾個出現次數,讓你親眼看到「多出現一次」的加分越來越少、最多不會超過 3,再看長文件、短文件分別被扣分或加分多少。算出來的結論就是上面兩段講的:加分會飽和、長文章會被打折。
它到底怎麼運作?(進階,可跳過) 簡化式:TF_BM25 ≈ f·(k1+1) / (f+k1),取 k1=2。 - f=1 → 3/3 = 1 - f=2 → 6/4 = 1.5(多一次,加 0.5) - f=100 → 300/102 ≈ 2.94 - f=101 → 303/103 ≈ 2.94(多一次,幾乎不變) 不管 f 多大,都不會超過 k1+1 = 3,這就是「飽和」。k1 改成 20,上限變 21,飽和得慢很多。 加上長度:完整式的分母是 f + k1·(1 − b + b·|D|/avgdl)。取 b=0.75、f=2: - 文件剛好平均長(|D|/avgdl=1)→ 分母 2+2 = 4 → 1.5 - 文件是平均的兩倍長 → 分母 2+2×1.75 = 5.5 → 6/5.5 ≈ 1.09(被打折) - 文件只有平均的一半 → 分母 2+2×0.625 = 3.25 → 6/3.25 ≈ 1.85(加分) IDF 部分:IDF = log((N − n + 0.5)/(n + 0.5)),N 是文件總數、n 是含這個字的文件數。+0.5 是平滑(我補充:避免分母為 0)。
老師原話是什麼? - 「雖然這個東西是蠻舊的東西。」(0:03:44) - 「這個其實還蠻重要的。而且現在還是一直有在用。」(0:03:48) - 「它就是一個改良版的 TF-IDF。」(0:08:55) - 「通常現在也不太會去改,因為它有點像是一個 baseline。」(0:09:13)
## [0:09:32](https://www.youtube.com/watch?v=7kgOuhuIjvY&t=572s) 回到 W2:困惑度與 bigram 老師先回顧上次的困惑度(perplexity):它是用來衡量語言模型和資料集吻合程度的標準,越低代表模型越不「困惑」、預測越準。 要先懂的三個詞:語言模型(第 3 週學過:一個會替「一串字」打機率分數、能猜下一個字的程式,見 [W3 第 07 章](https://app.notion.com/p/3e6fc631b03081b4b99acb876fd0bb2d));N-gram(第 3 週學過:把句子切成「連續 N 個字」的小片段,N=2 叫 bigram,見 [W3 第 06 章](https://app.notion.com/p/3e6fc631b03081588140d7f6a95e5bb4));條件機率 P(the | that)(直線右邊是已知條件,讀作「已知前一個字是 that,下一個字是 the 的機率」)。 投影片 p.17 另外給了兩個角度:困惑度可以看成每一步平均有幾個「可能的下一個字」可選("average branching factor",平均分岔數);也可以看成模型把測試資料壓縮得多好(compression efficiency),預測機率越高、不確定越少,資訊就壓得越緊。投影片最後留了一個問題:能不能用困惑度判斷一段文字是不是 AI 寫的?(我補充:常見想法是 AI 寫的文字對語言模型來說困惑度通常偏低,但這只是線索,不是可靠的判斷。) 以前做語言模型不是訓練神經網路,而是用機率:把句子切成 N 個字一組的片段(N-gram),數它們出現幾次。問題是要看的前文太長時,機率根本算不出來。所以先退一步,用 bigram:下一個字只看前一個字。 [[IMG: C:\D槽\TAICA課程\_work\notes-v2\nlp-w4\img\w2_word_embeddings_and_language_modeling_rnn_p018.png | W2 p.18:本來要算 P(the | its water is so transparent that),bigram 只算 P(the | that)]] 圖上重點:這張圖在講「bigram 用『只看前一個字』換來算得出來的機率,這個假設叫 Markov assumption」。 - 標題 N-gram Language Models:N-gram 語言模型。 - Bigram model 那句:本來要算「已知前面所有字 w_1…w_n-1,下一個字 w_n 的機率」,bigram 改用「只知道前一個字 w_n-1」的條件機率來近似。 - 灰字 "i.e., Instead of computing…":與其算 P(the | its water is so transparent that),bigram 只算 P(the | that)。 - 最後一句(紅字 Markov assumption):「一個字的機率只取決於前一個字」這個假設,叫做馬可夫假設。 這張圖的例子:要猜 "that" 後面接 "the" 的機率,bigram 不管前面的 "its water is so transparent",只看 "that"。「只看前一個字」這個假設就叫 Markov assumption。
為什麼長的前文算不出機率? 機率要靠「數次數」:P(the | its water is so transparent that) = 「its water is so transparent that the」出現幾次 ÷「its water is so transparent that」出現幾次。這麼長的一整句,語料庫裡很可能一次都沒出現過,分母是 0,就算不出來。改成 P(the | that),只要數「that the」和「that」,兩個都很常見,數得到。
下面「進階」摺疊在做什麼(白話):示範一整句話的機率怎麼用 bigram 拆成「一對一對字」的機率相乘,以及每一對的機率怎麼用「數次數再相除」算出來。算出來的數字代表「模型覺得這句話有多像人會講的話」。
它到底怎麼運作?(進階,可跳過) 一句話的機率用 bigram 拆成連乘:P(its water is) ≈ P(its | 開頭) × P(water | its) × P(is | water)。 每一項都用次數算。例:語料中 "that" 出現 50 次、"that the" 出現 10 次 → P(the | that) = 10/50 = 0.2。
## [0:12:04](https://www.youtube.com/watch?v=7kgOuhuIjvY&t=724s) Markov 假設的延伸 直覺上 N 越長越好,等於記性越好、越能抓到前文;但計算複雜度也越高。Markov 假設是折衷:只看前一步。Hidden Markov Model(隱藏馬可夫模型)一樣只看前一步,但它把前面累積下來的資訊放進一個 hidden state(隱藏狀態),所以「只看前一步」不等於完全失憶。(我補充:嚴格說,HMM 的 hidden state 是一個看不到的離散狀態,例如詞性,它本身也遵守 Markov 假設;「把前面全部資訊濃縮成一個狀態」這個想法,到 RNN 才真正做到。) 幾個詞的白話:離散狀態(一格一格的類別,像「名詞/動詞」,不是連續的數字);詞性(一個字是名詞、動詞還是形容詞);RNN(循環神經網路,一邊讀字、一邊更新一份「目前記憶」的神經網路,後面的章節會教)。 ```mermaid flowchart LR A["看全部前文:最準但算不出來"] --> B["N-gram:只看前 N-1 個字"] B --> C["Bigram:只看前一個字(Markov 假設)"] C --> D["HMM:只看前一個 hidden state,但它累積了前面的資訊"] ``` 這張圖從左到右,是「記得越少、越好算」的取捨;最右邊的 HMM 用 hidden state 把記憶補回一些。
用生活例子講,hidden state 是什麼? 像看連續劇只看「前情提要」。你不用重看前面 20 集(全部前文),只要看上一集結尾的那段摘要(hidden state),就大概知道劇情走到哪。摘要只有一段,但裡面濃縮了前面所有集數。(我補充)這個想法後面講 RNN 時還會再出現。
## [0:12:35](https://www.youtube.com/watch?v=7kgOuhuIjvY&t=755s) N-gram 的缺點 如果自己從語料庫切 N-gram、用數次數的方式做語言模型,會碰到一堆問題。想更準就要把 N 拉長,但計算量暴增;老師說最大的問題是資料稀疏(data sparsity):語料再多也收集不到所有字的組合,很多組合只出現一次,用一次的次數算出來的機率偏差(bias)很大。 幾個詞的白話:語料庫(corpus,拿來數次數的一大堆文字);偏差(bias,估出來的數字跟真實情況差很遠);指數成長(每多看一個字,組合數就再乘上字典大小,例如字典有 1 萬個字,兩個字的組合有 1 億種,三個字就有 1 兆種)。 反過來把片段切短,好算,卻丟掉了字的順序。而且它只是直接數字和字的關聯,沒有「意思」的概念,所以同義字、沒看過的字、換一個領域的詞彙,都處理不好。 | 缺點(投影片) | 白話 | 老師的說法 | |---|---|---| | Limited context | 看不到 N 以外的字 | N 拉長才記得多,但很貴 | | Data sparsity | N 越大組合越多,大多數沒看過 | 只出現一次的組合,機率偏差很大 | | Ignoring word order | 片段之間當成無關 | 片段太短,字的順序特性就不見了 | | Low flexibility | 不懂同義字、不會適應新情境 | 沒看過的字、新領域都很難算 | 這些缺點就是下一章的動機:與其數次數,能不能學出更有語意(semantic)的向量?
用生活例子講,資料稀疏為什麼讓機率不準? 像只吃過一次某家餐廳,那次剛好很好吃,你就說「這家 100% 好吃」。樣本只有一次,結論很極端。N-gram 也一樣:「transparent that the」在語料裡只出現一次,而「transparent that」也只出現那一次,算出 P(the | transparent that) = 1/1 = 100%,顯然太誇張。
老師原話是什麼? - 「最大問題通常是來自於這個 data sparsity。」(0:13:16) - 「那出現一次,你在算這個機率,其實這個 bias 會相當的高。」(0:13:52)
## Self-check
Q1. Why is BM25 called an "improved TF-IDF", and why is it still widely used?(中文:為什麼 BM25 被稱為「改良版 TF-IDF」?為什麼現在還常用?) **Answer**: Like TF-IDF, BM25 scores a document by the query terms it contains, weighted by IDF. But raw TF favors long documents and keeps growing linearly. BM25 uses k1 to make term frequency saturate (going from 1 to 2 matters much more than from 100 to 101) and uses b with the average document length to normalize for document length. It is simple, works well with default parameters, and serves as a standard baseline. 中文:BM25 跟 TF-IDF 一樣,是用 query 裡的字在文件中出現的次數乘上 IDF 來打分數。但原本的 TF 直接數次數,長文章會一直占便宜。BM25 用 k1 讓詞頻的加分會飽和(1 次變 2 次很重要,100 次變 101 次幾乎沒差),再用 b 搭配平均文件長度,替長文件打折。它簡單、用預設參數就好用,所以至今仍是大家比較時的基準方法。
Q2. What is the Markov assumption in a bigram model, and what is the trade-off of choosing a larger N?(中文:bigram 模型的 Markov 假設是什麼?N 選大一點有什麼取捨?) **Answer**: The Markov assumption says the probability of a word depends only on the previous word, so P(w_n | w_1:n-1) is approximated by P(w_n | w_n-1). A larger N captures more context, but the number of parameters grows exponentially and most long word combinations are rarely or never seen, so computation is costly and estimates become unreliable. 中文:Markov 假設是「一個字出現的機率只看前一個字」,所以用 P(下一個字 | 前一個字) 取代 P(下一個字 | 前面所有字)。N 選大一點能記得更多前文,但參數數量會指數成長,而且長的字串組合在語料裡很少甚至沒出現過,所以計算很貴、估出來的機率也不可靠。
Q3. Explain the data sparsity problem of N-gram language models.(中文:解釋 N-gram 語言模型的資料稀疏問題。) **Answer**: N-gram models estimate probabilities by counting word sequences in a corpus. No corpus can contain all possible combinations, so many sequences appear only once or never. A sequence seen only once gives a highly biased probability, and an unseen one gets zero probability. This also makes rare or unseen words and new domains hard to handle. 中文:N-gram 模型是靠在語料庫裡數字串出現幾次來估機率。但任何語料都不可能包含所有字的組合,所以很多組合只出現一次,甚至沒出現過。只出現一次的組合,算出來的機率偏差很大;沒出現過的,機率直接是 0。也因為這樣,很少見或沒看過的字、換到新領域,模型都處理不好。
Q4. What does a lower perplexity mean for a language model?(中文:語言模型的困惑度比較低,代表什麼?) **Answer**: Perplexity measures how uncertain a model is when predicting the next word. A lower perplexity means the model assigns higher probabilities to the actual text, so it understands the language patterns better and predicts more accurately. 中文:困惑度衡量模型預測下一個字時有多不確定。困惑度越低,表示模型給真正出現的文字比較高的機率,也就是它比較抓得到語言的規律、預測得比較準。
讀完了嗎?下一章:[02 稀疏向量與 PPMI(0:14–0:30)](https://app.notion.com/p/3ecfc631b03081daa362fba68ecb5a0c)|回到週頁:[W4(10/1)](https://app.notion.com/p/3ecfc631b03081b8aa2cf4a97467ed41)