bandit 算法在推薦系統中的應用

《bandit 算法在推薦系統中的應用》
圖片來源:Pexels; 攝影:Flickr;圖片授權基於:CCO協議

個性化推薦

隨着APP的流行,企業能收集更多更全的用戶數據,如何利用這些數據提高收入是各企業都會面臨的問題。最常見的方式就是個性化推薦,特別是在電商、視頻網站或其它的內容平臺。

個性化推薦大體上分爲三類。

一是穿插推薦用戶的歷史行爲數據中出現過的商品、轉化率或GMV高的商品。這類算法實現起來成本低,能快速上線。

二是利用協同過濾,大致想法是找出與用戶A相似度高的一批用戶,然後推薦這批用戶關注的商品給用戶A。將用戶和商品的互動行爲轉化爲矩陣,通常來說這個矩陣是個稀疏陣,這會造成用戶與用戶之間的“距離”約等於0. 常見的方法是通過矩陣分解進行降維處理,這樣解決了距離問題但卻造成模型的解釋性差。

三是利用用戶或商品的顯性特徵,即用戶標籤或商品標籤,直接通過標籤來找出相似度高的用戶。

Exploit-Explore問題及 bandit算法

個性化推薦確實能給大部分企業帶來不少幫助,但有時會出現問題。比如在某些手機瀏覽器上,我看了一條新聞後,它就不停地給我推薦相關的新聞,也不會考慮到我是否是不小心點到的。這是一個極端情況,但也能說明個性化推薦帶來的一個問題,就是推薦的內容類型趨向不變。

這就是推薦系統中的EE(exploit-explore)問題,exploit 指得是根據用戶的歷史記錄推薦出用戶的興趣,然後推薦與之相關的內容,explore 就是指不斷探索用戶其他興趣,否則推薦出的結果來來回回都差不多。

解決方法之一就是 Multi Armed Bandit(簡記爲bandit) 算法,該算法賦予商品(視頻/文章)一個 Beta 分佈,而不是單一的值。每次排序時通過採樣隨機獲得一個排序值,通過這種隨機性來加大商品排序的變動性。但同時beta分佈的均值會跟着商品的表現而改變,這樣就能對商品進行區分,讓表現好的商品有更大的概率獲得高排序值,而不會像均勻分佈那樣每個商品的曝光機率永遠保持不變。

爲了介紹這個算法,我們來看看必會提到的多臂賭博機問題: 一個賭徒,要去搖老虎機,走進賭場一看,一排老虎機,外表一模一樣,但是每個老虎機吐錢的概率不一樣,他不知道每個老虎機吐錢的概率分佈是什麼,那麼每次該選擇哪個老虎機可以做到最大化收益呢?

解決這個問題的方法就是有策略的快速試一試,而 bandit 算法就是一種有效的方法。

給每臺老虎機初始化一個beta分佈,其參數爲(a=1, b=1),下面是不同參數下的beta分佈圖像。

由於beta分佈的均值爲 a/(a+b),所以直觀上可以這麼理解:相對 b 來說 a 越大,分佈就越往1方向移動,即採樣後越有可能接近最大值1.

每次先對每臺老慮機進行採樣,選擇採樣值最大的那臺機器進行投幣,每次投幣後若獲得獎勵則讓 a+1,否則讓 b+1,後續反覆進行同樣的操作。

若累積足夠的次數,你會發現其beta分佈的均值實際上會趨近於老虎機吐錢的概率。由於每臺機器獲得的獎勵不同,所以在對每臺老虎機採樣後,把採樣值乘以獎勵後得到的值做爲選擇機器的標準的效果會顯著提高。

事實上,若每次獲得獎勵後讓 a 加上獎勵值而不是1可以達到類似的效果。理由如下:

我們假設獎勵爲 R,老虎機吐錢的概率爲p,則第一種方式的獎勵期望是a*R/(a+b), 而第二種的期望是a*R/(a*R+b).

由於a*R/(a*R+b)= a*R/(a+b) * (a+b)/(a*R+b).

由於投幣次數足夠大時 a/(a+b) -> p,我們可以簡單的認爲 b=a(1/p-1),代入上式即有

a*R/(a*R+b)= a*R/(a+b) * 1/(Rp-p+1)

由於 p、R 都是常數,且在實際生活中都是正數,所以以a*R/(a+b)a*R/(a*R+b)做爲排序值,並不會對排序造成影響。

當然在前期,這兩種方法會有不同,主要的原因是參數 a、b 值都比較小,採樣的波動性也就更大。

bandit 算法在推薦系統中的應用

相比較老虎機,用戶和“商品”之間的行爲操作會更多,“商品”本身的屬性也會更多,我們自行選擇那種獎勵方式。

我的一個建議是,所有與用戶行爲有關的數據,比如用戶查看、分享、喜歡、下單等指標都以第二種獎勵方式來更新beta分佈,而商品本身的屬性,比如價格則用第一種方式來影響排序值。

商品本身的屬性比如價格是會變化的,若用它來影響beta分佈本身則會對歷史紀錄造成影響,而上述方法可以快速適應商品本身的屬性的變化。

点赞