[自然語言處理](https://app.notion.com/p/3e6fc631b03081b4a9e8f91f3411f61f) › [W2(9/17)](https://app.notion.com/p/3e6fc631b03081a18b13fad72a8874fd) › 06|影片 [1:48:46–2:07:15](https://www.youtube.com/watch?v=MnA5KUETSg4&t=6526s)|投影片 W1_NLP_brief_v2 p.48–52|上一章 [05 資訊檢索、索引與前處理(1:20–1:48)](https://app.notion.com/p/3e6fc631b0308148a521f4d07ae31526)|下一章 [07 課堂提問與 BM25(2:16–2:29)](https://app.notion.com/p/3e6fc631b030819ca51ee21869f5c86d) 跳過提示:(1:52:34–1:55:34) 老師在推導 TF 和 IDF 的公式(含下標記法與正規化),聽不懂可以直接跳到 [1:55:34](https://www.youtube.com/watch?v=MnA5KUETSg4&t=6934s),接著講「IDF 是用來區分字詞重要性的『鑑別器』,白話解釋」。 跳過的這段在做什麼:老師把 TF 和 IDF 寫成符號公式,內容就是下面兩段的白話(TF=這篇出現幾次 ÷ 這篇幾個字;IDF=文件總數 ÷ 含這個字的篇數,再取 log)。懂白話就夠了。 跳過提示:(2:00:06–2:03:08) 老師在推導 cosine 相似度公式(向量內積、單位向量正規化),聽不懂可以直接跳到 [2:03:08](https://www.youtube.com/watch?v=MnA5KUETSg4&t=7388s),接著講「向量資料庫用的 Dense Vector,跟剛算的 Sparse Vector 有什麼不同」。 跳過的這段在做什麼:老師在證明「比兩篇文章像不像,看兩支箭頭的夾角」可以寫成一條算式(內積 ÷ 兩個長度)。結論只有一句:先把每支箭頭都縮成長度 1,夾角分數就等於內積。 跳過提示:(2:04:39–2:06:10) 老師在講 TF-IDF 權重公式的變形(log 壓縮、ltn/lnc 記法),聽不懂可以直接跳到 [2:16:39](https://www.youtube.com/watch?v=MnA5KUETSg4&t=8199s),接著講「下課後從 BM25 開始,老師會強調公式不用背,重點是它是 TF-IDF 的進階版」。 跳過的這段在做什麼:老師在介紹 TF-IDF 的幾種改良算法(例如次數先取 log,讓出現很多次的字不要太佔便宜),用三個字母當代號。老師說這些公式不用背。 ## 重點 - 向量空間模型(vector-space model)把每篇文件變成固定長度的向量:詞表有幾個字就有幾維,字有出現就有值。一篇文章只用到詞表裡很少的字,所以向量幾乎全是 0(稀疏)。 - 每一維的權重用 TF × IDF:TF 看這個字在「這一篇」出現得多頻繁(要除以文章長度),IDF 看這個字在「整個文件集」有多稀有。每篇都有的字 IDF=0,沒有鑑別力。 - 文件和查詢像不像,用 cosine(內積除以兩個向量的長度)算。向量先正規化成長度 1,cosine 就等於內積,RAG 的向量資料庫算的就是這個。TF-IDF 還有很多憑經驗調出來的變形(例 ltn.lnc)。 ## Exam-ready - **Vector-space model**: "Text documents are mapped to a high-dimensional vector space"; "Each document d represented as a sequence of terms ω(t)", d = (ω(1), ω(2), ω(3), …, ω(|d|)); "ω1, ω2 and ω3 are terms in document, x and x′ are document vectors"(W1_NLP_brief p.48)【老師強調】(1:49:28) - 中文:文字文件被放進一個高維的向量空間;每篇文件 d 看成一串詞項(term),ω(t) 是第 t 個字;圖上的 ω1、ω2、ω3 是字(座標軸),x、x′ 是兩篇文件的向量。白話:把一篇文章變成空間裡的一支箭頭,才能用數學比兩篇像不像。 - **Sparsity**: "Vector-space representations are sparse, |V| >> |d| (the number of distinct terms in any single document)"(W1_NLP_brief p.48) - 中文:向量表示是稀疏的(sparse),因為詞表大小 |V| 遠大於任何一篇文件裡「不同的字」的數量 |d|。白話:3 萬格裡只有幾百格有值,其他都是 0。 - **Term frequency (TF)**: "A term that appears many times within a document is likely to be more important than a term that appears only once"; TFᵢⱼ = nᵢⱼ / |dᵢ|, "nᵢⱼ - Number of occurrences of a term ωⱼ in a document dᵢ"(W1_NLP_brief p.49) - 中文:在一篇文件裡出現很多次的字,可能比只出現一次的字重要;TF=字 ωⱼ 在文件 dᵢ 的出現次數 nᵢⱼ,除以這篇的長度 |dᵢ|。白話:看比例、不看絕對次數,長文章才不會佔便宜。 - **Inverse document frequency (IDF)**: "A term that occurs in a few documents is likely to be a better discriminator than a term that appears in most or all documents"; IDFⱼ = log(n / nⱼ)(W1_NLP_brief p.50)【老師強調】(1:56:31) - 中文:只出現在少數文件的字,比出現在大多數或全部文件的字更適合當鑑別器(discriminator,能把文件分開的東西);IDF=log(文件總數 ÷ 含這個字的文件數)。白話:越稀有的字越有鑑別力,每篇都有的字 IDF=0。 - **nⱼ and n**: "nⱼ - Number of documents which contain the term ωⱼ"; "n - total number of documents in the set"; IDF is an "absolute measure of term importance"(W1_NLP_brief p.50) - 中文:nⱼ 是含有字 ωⱼ 的文件篇數(不是總出現次數),n 是文件集的文件總數;IDF 是字詞重要性的絕對量測(absolute measure)。白話:同一個字在整個文件集只有一個 IDF,不會因為換一篇文件而改變。 - **Cosine coefficient**: "Ranks documents by measuring the similarity between each document and the query"; "Similarity between two documents d and d′ is a function s(d, d′) ∈ R"; "In a vector-space representation the cosine coefficient of two document vectors is a measure of similarity"; cos(x, x′) = xᵀx′ / (‖x‖ · ‖x′‖), cost O(|d| + |d′|); "Cosine similarity vs. dot product"(W1_NLP_brief p.51)【老師強調】(2:02:20) - 中文:依每篇文件和查詢的相似度排序;兩篇文件 d、d′ 的相似度是一個回傳實數的函數 s(d, d′);在向量空間裡,用兩個文件向量的 cosine 係數衡量相似度;計算成本只跟兩篇的非 0 字數有關;投影片提醒要分清 cosine 和內積(dot product)。白話:cosine 只看方向、不看長度。 - **tf-idf variants**: "tf-idf weighting has many variants"; "Columns headed 'n' are acronyms for weight schemes."; "Many search engines allow for different weightings for queries v.s. documents"; "ltn.lnc ?"; letters: l = 1 + log(tf), a = 0.5 + 0.5 × tf / max tf, t = log(N / df), c = cosine normalization(W1_NLP_brief p.52) - 中文:tf-idf 加權有很多變形;表中每一格前面的字母(n、l、a…)是加權方式的代號;很多搜尋引擎讓查詢和文件用不同的加權;ltn.lnc 是一組例子。白話:TF、IDF、正規化各有幾種選法,用三個字母記下選了哪一種(l=TF 取 log、t=乘 IDF、n=不做、c=cosine 正規化)。 ## [1:48:46](https://www.youtube.com/watch?v=MnA5KUETSg4&t=6526s) 向量空間模型 上一章的反向索引(inverted index)只能回答「哪些文章有這個字」。使用者丟十幾個字,或丟一整篇文章要找相似文章時,需要一種能比「像不像」的表示法。向量空間模型把每篇文件變成固定長度的向量:詞表定了 3 萬個字就是 3 萬維,一維代表一個字,有出現填 1、沒出現填 0。一篇文章通常只有兩三百個不同的字,向量幾乎全是 0,所以叫稀疏(sparse)。以前的搜尋基本上都建立在這個模型上,現在也常拿它當 baseline(比較基準)。【老師強調】(1:49:28) 先補三個詞(我補充):向量(vector)就是一排順序固定的數字,例如 (0, 1, 1);維度(dimension)是這排數字有幾格,一格叫一維;詞表(vocabulary)是事先定好、要追蹤的所有字。反向索引是上一章學過的:一本「字 → 出現在哪幾篇」的對照表,像書末的索引([05 資訊檢索、索引與前處理](https://app.notion.com/p/3e6fc631b0308148a521f4d07ae31526))。 生活比喻:像每篇文章都填同一張 3 萬格的勾選表,格子順序固定,兩張表才能直接對照。 步驟:先定好詞表 → 詞表裡每個字對應一個維度 → 文章有這個字,那一維就填值,沒有就填 0 → 得到長度固定的向量,跟文章多長無關。 考試可能怎麼問:How does the vector-space model represent a document, and why are the vectors sparse?(向量空間模型怎麼表示文件?為什麼向量很稀疏?) 下面是投影片的示意圖,只畫 3 個字(3 個座標軸): ![向量空間模型:每個字(ω1、ω2、ω3)各佔一個座標軸,文件 d、d′ 各是一個向量 x、x′,夾角 α 越小代表兩篇越像](file-upload://3e7fc631-b030-816b-8742-00b2f2e16622) 圖上重點: - 標題 Document Representation: Vector-space Model:文件的表示法,向量空間模型 - ω1、ω2、ω3:三個字,各當一條座標軸(真正的詞表有 3 萬條軸,這裡只畫 3 條) - document d、document d′ 和箭頭 x、x′:兩篇文件各變成一支箭頭(向量) - α:兩支箭頭的夾角,越小代表兩篇用字越像 - 左邊文字 sparse:向量很稀疏,詞表的字數遠大於一篇文章用到的不同字數 這張圖在講:每個字是一個方向,每篇文章是一支箭頭,比文章像不像就是比箭頭方向。 兩支箭頭方向越接近,代表兩篇用的字越像;後面的 cosine 相似度量的就是這個夾角。 下面的摺疊用三篇短新聞,實際把文章變成一排數字。要帶走的只有一件事:不管文章多長,每篇最後都變成一樣長的一排數字,才能互相比較。
它到底怎麼運作?用三篇短新聞走一次(進階,可跳過) 假設前處理完只剩三篇極短的新聞(本章後面的例子都用這三篇): - d1:ohtani ohtani homer report - d2:dodgers win report - d3:ohtani dodgers report 詞表依字母排成 (dodgers, homer, ohtani, report, win),每篇是 5 維向量:d1 = (0, 1, 1, 1, 0)、d2 = (1, 0, 0, 1, 1)、d3 = (1, 0, 1, 1, 0)。 老師補充的做法:每個字先寫成 one-hot 向量(只有自己那一維是 1),例如 ohtani = (0, 0, 1, 0, 0);把一篇文章所有字的 one-hot 向量做 OR(任一個是 1 就是 1),就得到上面的文件向量。如果改成相加,d1 會變成 (0, 1, 2, 1, 0),也就是出現次數,這就是下一段 TF 的起點。
老師原話是什麼? 「可能你覺得很Trivial但是其實這個概念還蠻重要的」(1:49:28) 「這是一種固定的表示方式對電腦的理解來講是比較有利的」(1:50:00) 「雖然有3萬個這麼這麼長但是呢可能只有300個是有出現的」(1:52:09)
## [1:52:22](https://www.youtube.com/watch?v=MnA5KUETSg4&t=6742s) TF:詞頻與正規化 只記「有/沒有」太粗,出現 1 次和 20 次應該有差別。TF(term frequency,詞頻)=這個字在這篇出現的次數,除以這篇的總字數。老師的例子:一篇文章一直出現「大谷翔平」,大概就是在講他;如果只出現一次,其他都是一大堆道奇球員,那篇就不是在講大谷。要除以總字數(正規化),因為長文章的次數天生就大,不除會壓過短文章。 生活比喻:朋友聊天一直提某個人,話題八成就是他;但要看比例,講 3 句提 1 次,比講 3 萬句提 5 次更專心在講他。 步驟:數這個字在這篇出現幾次 → 除以這篇的總字數 → 得到這一維的 TF。 考試可能怎麼問:Why must term frequency be normalized by document length?(為什麼 TF 要除以文件長度?) 下面的摺疊實際算一次 TF,想解決的問題是:長文章和短文章怎麼公平比較。算出來的 TF 代表「這個字占這篇文章的比例」,越大代表這篇越專心在講它。
它到底怎麼運作?TF 算一次(進階,可跳過) d1 共 4 個字:TF(ohtani) = 2/4 = 0.5,homer、report 各 1/4 = 0.25。d2、d3 各 3 個字,每個字的 TF 都是 1/3 ≈ 0.333。 為什麼要除以長度:短文 3 個字、ohtani 出現 1 次,TF ≈ 0.333;長文 30,000 個字、ohtani 出現 5 次,TF ≈ 0.00017。只看次數是長文贏,但短文每三個字就有一個 ohtani,更專心在講大谷。
老師原話是什麼? 「你一定要Normalize不然會被大文章所Dominate」(1:53:49)
## [1:54:01](https://www.youtube.com/watch?v=MnA5KUETSg4&t=6841s) IDF:逆文件頻率 DF(document frequency,文件頻率)=整個文件集裡有幾篇文件含有這個字。IDF(inverse document frequency,逆文件頻率)把它倒過來:文件總數除以 DF 再取 log,越少篇有的字分數越高。老師的例子:一萬篇新聞每篇都寫「某某記者報導」,「報導」的 DF 等於總篇數,IDF=log 1=0,完全沒有權重,幾乎可以濾掉。所以 IDF 是鑑別器(discriminator):判斷一個字能不能把文件區分開。 log 是什麼(我補充):log₁₀ x 問的是「10 要自乘幾次才等於 x」,所以 log 1=0、log 10=1、log 100=2。它把很大的比值壓成小數字,罕見字會加分,但不會加到失控。 注意:老師口頭把 DF 說成「這個字總共出現幾次啊」(1:54:24),投影片的定義是「含有這個字的文件數」,同一篇出現 10 次也只算 1 篇,考試寫投影片的版本。課本 IIR 的例子(我補充):try 和 insurance 總次數差不多,但 try 散在很多篇、insurance 集中在少數講保險的文章,看 DF 才分得出 insurance 較有鑑別力。 生活比喻:班上每個人都戴眼鏡,說「戴眼鏡的那位」認不出是誰;只有一個人左臉有酒窩,一說就知道是他。 步驟:數整個文件集有幾篇含這個字(DF)→ 文件總數除以 DF → 取 log → 得到 IDF。 考試可能怎麼問:What does IDF measure, and what is the IDF of a term that appears in every document?(IDF 在衡量什麼?每篇都有的字 IDF 是多少?) 下面的摺疊用三篇新聞實際算 IDF,想看的是哪些字有鑑別力。算出來的數字越大,代表這個字越稀有、越能指出是哪幾篇;三篇都有的 report 算出 0,等於沒用。
它到底怎麼運作?三篇新聞的 IDF(進階,可跳過) IDF = log₁₀(3 / DF),總共 3 篇: - homer、win:只在 1 篇 → log₁₀ 3 ≈ 0.477 - ohtani、dodgers:在 2 篇 → log₁₀ 1.5 ≈ 0.176 - report:3 篇都有 → log₁₀ 1 = 0 先懂 log:log₁₀ x 問「10 要自乘幾次才等於 x」(log 1 = 0、log 10 = 1、log 1000 = 3)。log 長得很慢,比值大 1000 倍 IDF 只多 3,罕見字加分但不會失控。投影片沒指定底數;換底數等於所有 IDF 乘同一個常數,排名不變。
## [1:55:34](https://www.youtube.com/watch?v=MnA5KUETSg4&t=6934s) 為什麼做 RAG 還要懂 TF-IDF 做 RAG(retrieval-augmented generation:先去資料庫找相關文件,再交給 LLM 回答)時,只用句子 embedding(模型把整句壓成的稠密向量)算相似度,效果常常不夠好,因為句子 embedding 有點模糊。在稠密向量(dense vector)之外再加上 TF-IDF 這種稀疏向量(sparse vector),關鍵字比對的效果會變好。老師說 TF-IDF 很古老,但仍是非常強的 baseline。要記住 IDF 是用來衡量一個字在整個文件集裡的鑑別性【老師強調】(1:56:31):一萬篇都有的字,查了等於把全部結果丟給使用者;只出現在一篇的字,一查就知道是哪一篇。 這段用到第 1 週的概念(第 1 週學過:LLM 是讀過大量文字、能接著往下寫的大型語言模型,像 ChatGPT;老師當時也說 TF-IDF 是很強的 baseline,見 [W1 05 預訓練模型改變 NLP 做法](https://app.notion.com/p/3e7fc631b03081c69424e055b260badc))。embedding 的白話(我補充):用一個模型把一句話變成幾百個數字,意思相近的句子,數字也會相近。 生活比喻:像找書時同時問兩個人,一個是懂內容但記不清書名的館員(embedding),一個是只認關鍵字、但一字不差的索引卡(TF-IDF),兩個一起用最準。 考試可能怎麼問:Why is TF-IDF still useful for RAG retrieval when dense embeddings are available?(有了 embedding,做 RAG 為什麼還要用 TF-IDF?)
稀疏向量(TF-IDF)稠密向量(embedding)
維度詞表大小約 3 萬,大多是 0常見幾百到幾千維,都不是 0
一維代表什麼一個字說不出來,很多概念混在一起
擅長精確關鍵字:人名、型號、罕見詞換句話說、同義詞
弱點字不同就對不上(car 和 automobile)罕見關鍵字容易被「糊」掉
用生活例子講,為什麼兩種向量要一起用? 查「大谷翔平 第 50 支全壘打」:embedding 可能理解成「棒球選手打全壘打」,把別的球員的新聞也找來;TF-IDF 會抓住「大谷」「50」這種 IDF 高的字,把真正講那一支全壘打的新聞排到前面。一個補「意思相近但用字不同」,一個補「關鍵字一定要對上」(業界叫 hybrid search,混合檢索;我補充)。
老師原話是什麼? 「通常你轉成句子的embedding它其實會有點模糊度」(1:56:02) 「雖然它是很古老的東西但是它是一個非常Strong的Baseline」(1:56:24) 「大家就要記住IDF是用來幹嘛」(1:56:31)
## [1:57:07](https://www.youtube.com/watch?v=MnA5KUETSg4&t=7027s) IDF 的正規化與分佈 一個字只出現在 1 篇文件時,IDF=log n,是最大值;出現在每一篇時 IDF=0,是最小值。再除以 log n,就把 IDF 正規化到 0~1。不正規化的話,文件越多、最大的 IDF 越大,沒有上限,只是 log 長得慢,不會大到哪裡去。IDF 是 heuristic(經驗法則:以前的學者發現好用,大家就一直用),但它和 entropy 有理論上的關係,老師說以後再講。 entropy 是什麼(我補充):資訊理論的名詞,中文叫「熵」,白話是「一件事平均有多難猜」;越難猜的事,知道答案時得到的資訊越多。這裡只要知道 IDF 不是亂湊的就好。stop words 是上一章學過的:the、of、「的」這種到處都有、本身沒什麼意思的字。 下面是投影片右邊那張實際統計圖:橫軸是字的頻率(取 log),縱軸是 IDF。 ![IDF 分佈圖:橫軸是字頻率取 log10,縱軸是 IDF。左上是只出現一次的稀有字、專有名詞,右下是 stop words,中間一大團是一般的字](file-upload://3e7fc631-b030-81b0-b3e9-00b2a99b7879) 圖上重點: - IDF(縱軸):逆文件頻率,越高代表字越稀有 - log10 frequency(橫軸):字出現的頻率取 log₁₀ 之後的值(0 到 5,也就是 1 次到 10 萬次) - 每個小圓圈是一個字:左上是很少見的字,右下是到處都有的字 - A theoretical justification of IDF, Papineni 2001:一篇替 IDF 找理論根據的論文(2001 年) 這張圖在講:字越常見,IDF 越低,而且幾乎排成一條往右下的直線。 怎麼讀:右下角的 stop words(到處都有的字)IDF 很低,TF 乘上 IDF 就掉下來,通常先拿掉。老師的用法:自己設計權重公式後,把想區分的字放上去看,如果它們全擠在中間、IDF 都差不多,這個公式就分不開它們,要改;能把它們拉開,才是好的鑑別工具。 生活比喻:像檢查一份考卷的成績分佈,全班都考 60 分左右,這份考卷就分不出誰會誰不會。 考試可能怎麼問:What are the minimum and maximum values of IDF, and how can IDF be normalized to the range 0–1?(IDF 最小、最大是多少?怎麼正規化到 0~1?) 下面的摺疊在做兩件事:一是把 IDF 換算成 0~1 的分數,方便不同大小的文件集互相比較(1=最稀有,0=每篇都有);二是說明 IDF 不只是湊出來的,背後跟「越少見的事越有資訊」這個想法相通。
它到底怎麼算?正規化 IDF 和 entropy(進階,可跳過) n = 10,000 篇、用 log₁₀,最大值是 log₁₀ 10,000 = 4:只在 1 篇出現 → 4 ÷ 4 = 1;在 100 篇出現 → 2 ÷ 4 = 0.5;每篇都有 → 0。 IDF 跟 entropy 的關係(我補充;投影片引了 Papineni 2001 "A theoretical justification of IDF"):隨機抽一篇文件,它含有字 j 的機率是 pⱼ = nⱼ / n,IDF = log(n / nⱼ) = −log pⱼ,正好是資訊理論的自訊息量(self-information:越少發生的事,發生時帶來的資訊越多);entropy 就是自訊息量的平均。另外 IDF = log n − log nⱼ,所以對 log 頻率畫圖會接近一條往右下的直線,就是上面那張圖的樣子。
老師原話是什麼? 「但是其實IDF有一些理論的基礎它其實跟Entropy會有點關係」(1:58:30)
## [1:59:58](https://www.youtube.com/watch?v=MnA5KUETSg4&t=7198s) cosine 相似度與內積 每篇文件換成 TF-IDF 權重後,就是一個 3 萬維、大多是 0、少數是零點幾的向量。兩篇文件(或文件和查詢)像不像,看兩個向量的夾角:完全一樣就沒有夾角,cos 0° = 1。cosine=內積 ÷ 兩個向量長度的乘積。內積(dot product)只把同一維的值相乘再加總、不管長度,長文件天生佔便宜;cosine 多除了長度,只看方向。所以向量事先都正規化成長度 1(都落在半徑 1 的球面上)時,cosine 就等於內積;做 RAG 建的向量資料庫(vector database),最標準的做法就是在算這個。【老師強調】(2:02:20) cos 是什麼(我補充):高中三角函數的 cosine,用來把「角度」換成分數:夾角 0° 時是 1(方向完全一樣),90° 時是 0(完全不相干)。所以它剛好可以當「像不像」的分數,越接近 1 越像。 老師也提醒:向量資料庫存的通常是模型壓縮過的稠密向量,很多概念黏在一起,不像 TF-IDF 每一維都看得懂。計算量方面,3 萬維大多是 0,只要掃過兩篇有值的字,所以投影片寫成本是 O(|d| + |d′|),跟兩篇的字數成正比,不是跟 3 萬成正比。 O(…) 是電腦科學的寫法(我補充),意思是「計算量大約跟括號裡的東西成正比」。 生活比喻:比兩個人口味像不像,要看「各種菜吃的比例」,不是看「吃多少」;大胃王和小鳥胃都最愛牛肉麵,口味就一樣。cosine 看比例,內積會偏向吃得多的人(長文章)。 考試可能怎麼問:What is the difference between cosine similarity and the dot product, and when are they equal?(cosine 和內積差在哪?什麼時候相等?) 下面這張圖把整章串起來:文件和查詢走同一條路,最後在內積那一步比較。 ```mermaid flowchart LR D["文件"] --> T["算 TF:這篇出現多頻繁"] Q["查詢"] --> T T --> W["乘 IDF:字越稀有越重"] W --> U["除以長度:變成長度 1"] U --> C["兩兩做內積=cosine"] C --> R["分數高的排前面"] ``` 前三段講的是圖的左半(TF、IDF),這一段講的是右半(正規化和內積)。 下面的摺疊用小數字分別算內積和 cosine,想證明的是:只用內積,又長又只有一半相關的文章會贏;改用 cosine,真正跟查詢最像的短文才會排第一。
它到底怎麼算?cosine 和內積各算一次(進階,可跳過) 先懂三個詞:內積(投影片寫 xᵀx′)是同位置相乘再加總;長度(norm,‖x‖)是每項平方加總再開根號;cosine 是內積 ÷ 兩個長度的乘積,方向一樣是 1,沒有共同的字是 0。TF-IDF 權重不會是負的,所以文件間的 cosine 落在 0~1。 例子:查詢 q = (1, 1, 0)。短文 A = (1, 1, 0),和查詢完全一樣;長文 C = (10, 0, 10),只有一半相關但字很多。 - 內積:q · A = 2,q · C = 10,長文 C 贏。 - cosine:cos(q, A) = 1;cos(q, C) = 10 ÷ (√2 × √200) = 10 ÷ 20 = 0.5,短文 A 贏。 - 先把每個向量除以自己的長度,q 和 A 都變成 (0.707, 0.707, 0),內積 = 0.5 + 0.5 = 1,剛好等於 cosine。 用前面三篇新聞查「ohtani homer」(每一維=TF × IDF):cosine 是 d1 ≈ 0.96、d3 ≈ 0.25、d2 = 0,排名 d1 > d3 > d2。report 三篇都有,權重是 0,對分數沒有貢獻。
老師原話是什麼? 「分子就是算內積嘛就是兩個Vector之間的內積」(2:00:55) 「那這件事情其實還蠻重要的尤其是到時候現在你說做LM做RAG你會建所謂的Vector Database」(2:02:20)
## [2:03:38](https://www.youtube.com/watch?v=MnA5KUETSg4&t=7418s) TF-IDF 的各種變形 TF、DF、正規化三個部分各有好幾種算法,投影片用一個字母代表一種(課本叫 SMART 記法,我補充)。老師講了三種 TF:n(natural)直接用次數,不乘 IDF、不正規化,是最偷懶的做法;l(logarithm)直接取 log,讓出現一兩萬次的字不會壓扁只出現一兩次的字;a(augmented)把 0~1 壓到 0.5~1,讓很少出現的字也分到一點權重,又不會被蓋過。查詢短、文件長,兩邊可以用不同算法再做內積,例如 ltn.lnc。老師坦白說這些很 heuristic、像硬湊,能證明的只是「在我的應用裡,想強調的東西拉得出來」;做 RAG 時也會用到這種想法。 注意:老師在下一章說這些變形的公式不用背;要懂的是 TF 和 IDF 各在衡量什麼。 生活比喻:a 像期末把 0~100 分壓到 50~100 分,排名不變,但原本只拿 10 分的人變 55 分,不會被高分的人完全蓋過。 考試可能怎麼問:Why might a search engine use different weighting schemes for queries and documents, such as ltn.lnc?(為什麼查詢和文件要用不同的加權方式,例如 ltn.lnc?) 下面是老師對 ltn.lnc 的讀法:查詢和文件各走一套算法。 ```mermaid flowchart LR Q["查詢:很短"] --> Q2["ltn:TF 取 log、乘 IDF、不正規化"] D["文件:很長"] --> D2["lnc:TF 取 log、不乘 IDF、cosine 正規化"] Q2 --> S["兩邊做內積"] D2 --> S S --> R["相關分數"] ``` IDF 只在查詢那一邊乘一次,文件那邊只做 log 和長度正規化。 下面的摺疊列出每個字母代表哪種算法,再用 ltn.lnc 實際算一次分數。結果代表:換了算法,排名仍然和 cosine 一樣,變形只是微調各個字的份量。
它到底怎麼算?字母對照和 ltn.lnc(進階,可跳過) 三個字母依序是 TF、DF、正規化: - TF:n(natural)= tf;l(logarithm)= 1 + log(tf);a(augmented)= 0.5 + 0.5 × tf / max tf;b(boolean)、L(log ave)老師沒講 - DF:n(no)= 1,不乘 IDF;t(idf)= log(N / df);p(prob idf)老師沒講 - 正規化:n(none)= 1;c(cosine)= 1 / √(w₁² + … + w_M²);u(pivoted unique)、b(byte size)老師沒講 ltn.lnc 用三篇新聞查「ohtani homer」:查詢 ltn → ohtani 1 × 0.176、homer 1 × 0.477;d1 用 lnc → 次數 2、1、1 取 l 得 1.301、1、1,再除以長度 1.922 得 0.677、0.520、0.520。分數(d1) = 0.176 × 0.677 + 0.477 × 0.520 ≈ 0.37;d3 ≈ 0.10;d2 = 0。排名和 cosine 一樣。 注意(我補充):課本 Introduction to Information Retrieval 的 SMART 記法是「文件在前、查詢在後」,標準例子是 lnc.ltc。投影片只寫「ltn.lnc ?」沒說順序,老師讀成查詢 ltn、文件 lnc。考試遇到時,把兩邊三個字母的意思都寫出來最保險。
老師原話是什麼? 「你的query跟document長相不一樣的時候你可能需要有不同的權重計算的方式」(2:06:41) 「因為就是非常heuristic」(2:07:02)
## Self-check
Q1. In the vector-space model, what does each dimension represent, and why are document vectors sparse?(中文:向量空間模型裡每一維代表什麼?為什麼文件向量很稀疏?) **Answer**: Each dimension corresponds to one term in the vocabulary V, and each document is mapped to a vector in this high-dimensional space. The vectors are sparse because |V| >> |d|: the vocabulary has about 30,000 terms, but a single document contains only a few hundred distinct terms, so almost all entries are zero. 中文:每一維對應詞表裡的一個字,每篇文件是這個高維空間裡的一個向量。向量很稀疏,是因為詞表大小 |V| 遠大於一篇文件裡不同字的數量 |d|:詞表約 3 萬個字,一篇文章只用到幾百個不同的字,所以向量幾乎每一格都是 0。
Q2. A collection has 1,000 documents. Term A appears in all 1,000 documents; term B appears in 10. Compute their IDF (log base 10). Which is the better discriminator?(中文:文件集有 1,000 篇,字 A 每篇都有,字 B 只在 10 篇出現。用 log₁₀ 算兩者的 IDF,哪一個比較有鑑別力?) **Answer**: IDF(A) = log(1000/1000) = 0; IDF(B) = log(1000/10) = 2. Term B is the better discriminator: a term that occurs in a few documents separates them from the rest, while a term that appears in all documents gets zero weight. 中文:IDF(A) = log(1000 ÷ 1000) = log 1 = 0;IDF(B) = log(1000 ÷ 10) = log 100 = 2。B 比較有鑑別力:只出現在少數文件的字,能把這些文件和其他文件區分開;每篇都有的字(像新聞裡的「報導」)IDF 是 0,查它等於把全部文件都丟出來。
Q3. What is the difference between cosine similarity and the dot product, and when are they equal?(中文:cosine 相似度和內積差在哪?什麼時候兩者相等?) **Answer**: cos(x, x′) = xᵀx′ / (‖x‖ · ‖x′‖). The numerator is the dot product; dividing by the two lengths removes the effect of vector length, so only the angle matters. The raw dot product grows with length and favors long documents. When all vectors are normalized to unit length, cosine similarity equals the dot product, which is what a vector database computes. 中文:cosine 的分子就是內積,再除以兩個向量的長度,所以只看方向(夾角)、不受長度影響。內積沒有除長度,向量越長分數越大,長文件會佔便宜。如果所有向量事先都正規化成長度 1,分母就是 1,cosine 就等於內積;向量資料庫做相似度搜尋時算的就是這個。
Q4. Why does the lecturer say TF-IDF is still worth knowing for RAG, and what is IDF used for?(中文:為什麼老師說做 RAG 還是要懂 TF-IDF?IDF 是用來做什麼的?) **Answer**: Sentence embeddings (dense vectors) are somewhat fuzzy, so similarity search with embeddings alone is often not good enough. Adding sparse TF-IDF vectors on top of the dense vectors improves keyword matching; TF-IDF is old but a very strong baseline. IDF measures how well a term discriminates between documents in the collection: a term in every document has IDF 0 and is useless for retrieval, while a term in only one document points straight to that document. 中文:句子轉成 embedding(稠密向量)會有點模糊,只用它算相似度效果常常不夠好;在稠密向量之外加上 TF-IDF 稀疏向量,關鍵字比對會變好,所以 TF-IDF 雖然古老,仍是很強的 baseline。IDF 是鑑別器:衡量一個字能不能把文件集裡的文件分開。每篇都有的字 IDF=0,查了沒意義;只出現在一篇的字,一查就知道是哪一篇。
讀完了嗎?下一章:[07 課堂提問與 BM25(2:16–2:29)](https://app.notion.com/p/3e6fc631b030819ca51ee21869f5c86d)|回到週頁:[W2(9/17)](https://app.notion.com/p/3e6fc631b03081a18b13fad72a8874fd)