快轉到主要內容

白話圖解 - 什麼是 BM25

BM25 是用統計方式,預測「文章與關鍵字的相關度」,常被搜尋引擎如 Elasticsearch 使用 – 聽起來很像 上一篇的 TF-IDF

那是因為,BM25 就是一種 TF-IDF

只不過 BM25 的 TF 項與 IDF 項比較細膩,而且有「特性參數」可調整:小美用的 BM25 跟小明用的 BM25 可以不一樣!

BM25 is a TF-IDF with two hyperparameters k1 and b
BM25 是一種 TF-IDF, 且有 k1, b 兩個參數可調整

本篇分兩大環節

  • 先假設小美用了 k1=1, b=1 的 BM25 公式,來說明 BM25 的本質,跟最基礎的 TF-IDF 有什麼不同
  • 再來探討 k1, b 對於 BM25 的意義是什麼

IDF 項 #

BM25 使用的 IDF 公式跟基礎的幾乎一樣。而且跟 k1, b 無關,不能調整

Formula of the IDF term in BM25: log ((N+1) / (n+0.5))
BM25 的 IDF 項幾乎跟普通的一樣

如下圖,BM25 的 IDF 稍稍平滑,極罕見詞之間的差異更小(直覺解釋:因為送了 0.5 次的出現,變得稍微不罕見)

Comparison of the IDF curve used in BM25
BM25 的 IDF 跟基礎 IDF 的曲線(紅色線在罕見詞更為平滑,在常用詞則沒差)

特殊參數之下的 TF 項 #

假設 k1 = 1 , b = 1 的時候,BM25 的 TF 項公式為

Formula of the TF term in BM25 when k1=1 and b=1
BM25 的 TF 項是 關鍵字出現次數 與 相對文長 的角力 (以 k1=1, b=1 為例)

看公式太累的話,探討這三個情境就好

  1. 如果兩篇同樣長度的文章,一篇出現關鍵字的「次數」是另一篇的兩倍,會怎樣?
  2. 如果兩篇文章,關鍵字出現次數一樣,但「文長」一篇是另一篇的兩倍,會怎樣?
  3. 如果關鍵字出現「頻率」一樣,但文長一篇是另一篇的兩倍,會怎樣?
The 3 cases to study BM25
用三種情境探討 BM25 特性

次數兩倍,TF 不到兩倍 #

  • 關鍵字出現兩倍,TF 雖然會變大,卻不會到兩倍大。也就是 TF 有邊際效應,會「飽和」
  • 在 k1 = 1 時,TF 不會比 2 還大

也就是關鍵字出現越多次,雖然相關分數會變高,但是會越來越無感

Plot that shows doubling the appearance does not double the TF value; it saturates
關鍵字從出現 4 次到 8 次,TF 卻只從 1.6 漲到 1.77

文越長,TF 越小 #

假設因為文章長度,導致關鍵字出現頻率折半,TF 會變小,但不會到折半這麼小

Plot that shows doubling the article length drops the TF value, but not that much; it has marginal effect as well
假設兩篇文章都出現關鍵字兩次,但一篇 40 個字,一篇 80 個字

頻率一樣,TF 一樣 #

當 b = 1 時,如果每篇文章出現關鍵字的「頻率」一樣,例如長 100 的文章出現一次,長 200 的文章出現兩次…

TF 不變!當 b=1 時,只要頻率一樣, TF 跟文長無關。也就是 b=1 時,BM25 也遵從著頻率,也就是資訊「密度」

Plot that shows when b=1, TF stays the same if the freq is the same
當文章出現頻率都是每 100 字出現 1 字時

前面一段是 k1, b 兩者都設成 1 的情況。不過 k1 跟 b 是可以自己調整的。BM25 完整的公式為

General formula of the TF term in BM25, which contains hyperparameter k1 and b
完整 BM25 的 TF 項公式,仍然是兩者角力,但 k1, b 各控制其重要性

k1 對於 BM25 的影響 #

『兩篇同樣長度,一篇出現關鍵字的「次數」是另一篇的兩倍』

k1 越大,越慢出現「邊際效應」 – 也就是 TF 越容易被關鍵字出現次數影響(但還是會越來越無感)

Plot that shows the more k1 is, the slower the TF saturates
相比兩個有著不同 k1 的 BM25,當關鍵字次數增倍,比較大的 k1 的 BM25 分數增加的比例較多

『兩篇文章,關鍵字出現次數一樣,但「文長」一篇是另一篇的兩倍』

跟上面一樣,當 k1 越大,TF 受關鍵字出現頻率的影響越大

Plot that shows the more k1 is, the bigger change the TF has per frequency
相比兩個有著不同 k1 的 BM25,當關鍵字次數增倍,比較大的 k1 的 BM25 分數增加的比例較多

所以簡單說,k1 就是控制「關鍵字次數」或「關鍵字頻率」給 BM25 分數的影響力

b 對於 BM25 的影響 #

先直接說結論:b 越小,「文章長度」影響 BM25 分數的「傾向」就越小

『兩篇文章,關鍵字出現次數一樣,但「文長」一篇是另一篇的兩倍』

見下圖,文章越長,密度、也就是頻率越低,然而 b 較小時 TF 變小的情況比較不明顯

Compare BM25 TF as the article gets longer between b=1 and b=0.5
b=0.5 時,TF 減少的傾向變小; b=0 時,TF 根本與文長無關!

『兩篇同樣長度,一篇出現關鍵字的「次數」是另一篇的兩倍』

見下圖:比較長的文章,頻率容易比較低,TF 容易比較小。但 b 比較小的時候劣勢沒那麼明顯,所以紅線比綠線高

反之,較短的文章也是同樣道理,只不過是反過來,b 較小的時候優勢不明顯,所以橘線比藍線低

Compare BM25 TF as the keyword appears more often between b=1 and b=0.5
b=0.5 較小,TF 因為文章長短的浮動比較保守

『關鍵字出現「頻率」一樣,但文長一篇是另一篇的兩倍』

「頻率」是 出現次數 除以 文章長度,可視作兩者的角力

然而 b 比較小時,因為「文長」影響力變小,所以 TF 不再尊重頻率,而是尊重次數

b < 1 ,就算資訊密度一樣,但出現次數越多的話 TF 越高

b 比 1 小的話,BM25 分數不再只看頻率;次數越多 TF 越高

文章特性與 k1, b 的選擇 #

  • k1 控制關鍵字次數本身的影響力:k1 越大,BM25 分數越不會有邊際效應(越容易因出現次數增大)
  • b 控制文章長短本身的影響力:b 越小,文章長度越不會影響 BM25 分數

改善搜尋品質時,雖然在調整 k1 跟 b 之前有很多事要做 ,但 k1 與 b 也確實會影響使用 BM25 分數的排名方式。

以三種文章為例子:書本章節、網頁、與產品標題

  • 書本內容通常不會特別 spam 某個不相關的關鍵字
    • 裡面內容出現多次的詞很可能是主題,所以 k1 或許能試大一點的值,就算關鍵字出現多次仍有一定的影響,不會馬上飽和無感
  • 網頁由普羅大眾所撰寫
    • 有人可能濫用關鍵字,把不相關但很流行的詞重複寫多次,惡意增加 TF。雖然 anti-spam 是完全另一個領域,或許也能同時考慮比較小的 k1 ,讓多次出現的邊際效益降低
  • 產品標題,裡面的字通常代表「屬性特質」,跟密度無關
    • 兩個產品「iPhone 15」與「特價黑色 iPhone 15 256G 隔日到貨」都是 iphone,不應該光憑因為標題比較長,導致頻率比較低,進而讓分數比較低 – 文長不是重點,所以可考慮用比較小的 b

當然,BM25 是非常基本、用途有限的統計量,而光靠 k1, b 並不能解決所有問題


現在你知道了,BM25 「只是」一種 TF-IDF ,只不過對於關鍵字頻率有邊際效應,而且有參數可調

  • k1 控制關鍵字次數本身的影響力(飽和難易度)
  • b 控制文章長短本身的影響力

然而 TF-IDF 的缺點(tokenization, proximity, 語意, …),BM25 也都有。只不過 BM25 被大家研究與運用已久,大家熟悉度比較高。

BM25 只是眾多「搜尋相關度」的其中一個 signal 。就算用在傳統搜尋,但現代的 RAG 也可能融合 embedding / kNN 與傳統搜尋手法,也就是 hybrid search – 之後有空的話會簡單寫一下 hybrid search 的小知識


若您覺得有趣, 請 追蹤我的Facebook 或  Linkedin, 讓你獲得更多資訊!