打分排序系統漫談3 - 貝葉斯更新/平均
標籤(空格分隔): 部落格園 統計 打分系統 待完成
上一節我們聊了聊用Wilson區間估計來處理小樣本估計,但從原理上來說這種方法更像是一種Trick,它沒有從本質上解決樣本量小的時候估計不置信的問題,而是給估計加上一個和樣本量相關的置信下界,然後用這個下界替代估計進行打分。
想要從本質上解決小樣本估計不置信的問題,一個更符合思維邏輯的方法是我們先基於經驗給出一個預期估計,然後不斷用收集到的樣本來對我們的預期進行更新,這樣在樣本量小的時候,樣本不會對我們的預期有較大影響,估計值會近似於我們預先設定的經驗值,從而避免像小樣本估計不置信的問題。
假設\(\theta\)是我們要給出的估計,x是我們收集的資料, \(\pi(\theta)\)是我們基於經驗給出的預期。貝葉斯表示式如下:
\[ \begin{align} p(\theta|x) \propto p(x|\theta) * \pi(\theta) \end{align} \]
原理看似簡單,但落實到實際應用就會出現幾個問題:
- 如何把實際問題抽象成概率分佈 \(p(x|\theta)\)
- 如何設定預期概率分佈 \(\pi(\theta)\)
- 如何用新樣本對分佈進行更新得到引數估計
讓我們繼續用之前點讚的例子,一個一個解答上面的問題
二元貝葉斯更新
樣本分佈抽象 \(p(x|\theta)\)
我們上一章已經討論如何對使用者的點贊拍磚行為進行抽象。簡單來說每一個使用者是否點贊\(\sim Bernoulli(p)\),使用者間相互獨立,所以N個使用者對某一篇文章點贊量\(\sim Binomial(n,p) = \left(\! \begin{array}{c} n \\ k \end{array} \! \right)p^k(1-p)^{(n-k)}\)
抽象出了樣本的概率分佈,,我們要如何用這些樣本對我們想要估計的引數p(點贊率)進行更新呢?預期分佈抽象- 共軛分佈\(\pi(\theta)\)
這就涉及到另一個概念- 共軛先驗分佈。名字非常高大上難以記住(剛剛wiki過才找到對應的中文...)。簡單解釋如果你的先驗分佈和後驗分佈一致,它們就分別是共軛先驗和共軛後驗。這個性質之所以如此吸引人就在於,可以持續用新樣本更新先驗分佈。因為如果分佈不變 \(p(\theta|x_i) \propto p(x_i|\theta) * \pi(\theta)\)就可以一直連著乘下去\(x_i , i \in (1,2,..N)\)
有這種性質的分佈有幾種,而適用於二項分佈的就是Beta分佈。把先驗分佈設為beta分佈,不斷用二項分佈的樣本資料去更新先驗分佈,後驗分佈還是beta分佈。記憶卡片~Beta分佈
Beta函式: \(Beta(a,b) = \frac{(a-1)!(b-1)!}{(a+b-1)!}\)
Beta分佈概率密度 \(f(x;a,b) = x^{(a-1)}(1-x)^{(b-1)}/Beta(a,b)\)
Beta分佈統計值:\(\mu = \frac{a}{a+b}\)- 分佈更新-貝葉斯更新
看到Beta分佈的概率密度很容易聯想到二項分佈,因為它們十分相似。和二項分佈對比x就是我們要估計的引數p,Beta分佈的兩個引數a,b分別對應正負樣本數量k,n-k。換言之Beta分佈是二項分佈引數的分佈。
下一步我們就需要用到Beta分佈作為共軛分佈的性質(先驗後驗分佈不變)來對引數進行更新:
\[ \begin{align} \pi(p|\alpha+k, \beta+n-k) &= P(X=k|p, n) * \pi(p|\alpha, \beta)\\ E(\hat{p}) &= \frac{\alpha + k}{\alpha + \beta + n} \leftarrow \frac{\alpha}{\alpha + \beta} \\ where & \quad \pi(\alpha, \beta) \sim Beta(\alpha, \beta) \\ & \quad x \sim Binomial(n,p) \end{align} \]
如果我們預期點贊和拍磚的概率是50%/50%,既\(\alpha=\beta\)。當我們對預期不是非常肯定的時候(對使用者行為更相信),我們的\(\alpha,\beta\)可以給的相對比較小,這樣樣本會很快修正先驗概率,反之\(\alpha,\beta\)給更大值。這裡\(\alpha,\beta\)可以理解為我們根據預期設定的虛擬樣本,下面是一個直觀的例子:
\(\alpha =2, \beta = 2,\hat{p}=0.5\), 當收集到1個點贊樣本,更新後的引數變為,$\alpha = 3, \beta=2, \hat{p} \to 0.67 $
\(\alpha =10, \beta = 10, \hat{p}=0.5\), 當收集到1個點贊樣本更新後的引數變為,$\alpha = 11, \beta=10, \hat{p} \to 0.52 $
一個更直觀的\(\alpha, \beta\)取值變化對引數p分佈的影響如下圖:
- \(\alpha, \beta\)越大方差越小,p的分佈越集中
- \(\alpha\)增加,p估計均值越大
- \(\beta\)增加,p估計均值越小
拋開數學的部分,用貝葉斯更新的方法來估計使用者評分可以非常簡單的用下面的表示式來表示,其中\(\alpha\)是預設的點贊量, \(\beta\)是預設的拍磚量, n是收集到的全部樣本量,其中k是收集到的樣本中點讚的數量。
\[ \hat{p} = \frac{\alpha + k}{\alpha + \beta + n} \]
如何設定\(\alpha \beta\)決定了最終打分從哪裡開始更新,以及最終打分對新樣本的敏感程度。
多元貝葉斯更新
上述我們對使用者的行為做了一個最簡單的抽象,只包括點贊和拍磚兩種行為。現實情況往往更復雜,比如使用者打分(五星評分),這種情況我們應該如何使用貝葉斯來得到更加穩健的分數估計呢?
讓我們對照著上面二項分佈的思路來梳理一下
樣本分佈抽象 \(p(x|\theta)\)
假設使用者的評分從1分-5分,使用者最終打了3分,則可以抽象成一個有5種可能的多項分佈,使用者的選擇用向量表示就是 \((0,0,1,0,0)\) 。多項分佈的表示式如下
\[ \begin{align} P(x|\theta) &= \begin{pmatrix} N \\ x_1,...,x_5 \\ \end{pmatrix} \prod_{i=1}^5 \theta_i^{x_i} \\ score &= \sum_{i=1}^5 p_i * i \end{align} \]
其中N是使用者量,\(x_i\)是選擇打i分的使用者數,滿足$\sum_{i=1}^5 x_i = N $, \(\theta_i\)是打i分的概率,滿足 \(\sum_{i=1}^5 \theta_i = 1\)
我們通過收集到的使用者打分來給出打1分-5分的概率,最終用多項分佈的期望作為最終打分。共軛先驗
和二項分佈一樣,現在我們需要找到多項分佈的共軛先驗分佈 - Dirchlet分佈,也就是beta分佈推廣到多項。Dirchlet的分佈概率密度如下:
\[ Dir(\theta|\alpha) = \frac{\Gamma(\alpha_0)}{\Gamma(\alpha_1)...\Gamma(\alpha_K)} \prod_{k=1}^K \theta^{\alpha_k-1} \]
其中\(\alpha_0 = \sum_i^K \alpha_k\),當K=2的時候Dirchlet就是beta分佈。和Beta分佈相同, 其中\(\alpha_i\)可以理解為對打分為i的預期先驗。貝葉斯更新
確定了先驗分佈和後驗分佈,我們用和beta相同的方法用收集到的樣本對引數進行更新。
\[ \begin{align} Dir(\theta|D) &\propto P(D|\theta) * Dir(\theta|\alpha)\\ Dir(\theta|D) &= \frac{\Gamma(\alpha_0 + N)}{\Gamma(\alpha_1 + m_1)...\Gamma(\alpha_K + m_k)} \prod_{k=1}^K \theta^{\alpha_k + m_k-1}\\ \end{align} \]
上述的條件概率可以被簡單理解為,當我們收集到N個樣本其中\(m_i\)個樣本打了i分,則打i分的概率會從預置的先驗概率\(\frac{\alpha_i}{\sum_i^k\alpha_i}\)被更新為 \(\frac{\alpha_i + m_i}{\sum_i^k\alpha_i + N }\)
有了後驗概率,我們就可以得到最終打分如下
\[ \frac{\sum_{i=1}^K i * (\alpha_i + m_i)}{\sum_i^k\alpha_i + N } \]貝葉斯平均
針對小樣本打分一種很常用的方法叫做貝葉斯平均,許多電影網站的打分方法都來源它。讓我們先寫一下表示式:
\[ x = \frac{C*m + \sum_{i=1}^K{x_i}}{C+N} \]
其中C是預置樣本量(給小樣本加一些先驗樣本), N是收集的樣本量,m是先驗的總體平均打分,\(x_i\)是每個使用者的打分。貝葉斯平均可以簡單理解為用整體的先驗平均打分來對樣本估計進行平滑。
但其實讓我們對上述基於Dirchlet分佈給出的打分式進行一下變形 $\sum_{i=1}^K i * \alpha_i = C *m $, \(\sum_{i=1}^K i * m_i = \sum_{i=1}^K x_i\), 會發現兩種計算方式是完全一致的!!
針對打分我們分別討論了時間衰減,以及兩種解決小樣本估計不置信的方法。 但這只是打分系統很小的一部分,還有一塊很有趣的是如何基於偏好調整最終的打分。以後有機會再聊吧
To be continue
Reference