1 問題
1.1 某業務拉新場景—冷啟動決策問題
拉新場景是指在大流量業務場景中投放拉新業務的相關優質內容,從而吸引使用者訪問,快速增加使用者量。這個拉新場景需要從4千+專輯池(每日會加入一些新的物品)中挑選出兩個專輯投放給使用者,使用這兩個專輯來吸引新使用者,從而達到拉新的目的。由於是投放給新使用者,所以沒有歷史行為資料作為依據去推測該使用者喜歡什麼。能夠依賴的資料包含專輯本身的特徵,如:分類資訊、更新時間等,使用者的畫像資料(達芬奇畫像維護和挖掘了使用者的基本畫像資料),如:年齡、性別、地域等。開始時,我們使用傳統的機器學習模型,如LR、FM等,將每日拉新使用者量做到了5千-1.1萬。這裡存在的問題是,傳統機器學習非常依賴正負樣本的標註。對於某些新物品,如果它從來沒有被曝光,那麼它永遠也不可能被標記為正樣本,這對於新物品來講是不公平的,也是推薦領域不願看到的現象。一種比較直接的做法是,保留一股流量專門用來做新物品的探索,但是這裡又會有一些新的問題產生,如:這股流量用多大?探索的時機該怎麼把握?新物品中每一個物品曝光多少次、曝光給誰是最合適的?如何保證整體收益是最大的, 等等一系列問題,而MAB(Multi-armed bandit problem,多臂老虎機)方法正是解決這類決策問題的。所以我們嘗試使用MAB的思想來解決新使用者和新物品的推薦問題。事實證明,該方法是可靠的,使用MAB中的UCB演算法之後,該拉新場景每日拉新量提高到最初base的2.3倍。
1.2 短視訊推薦結果多樣性控制
短視訊推薦場景的特點是在保質的前提下,需要向使用者推薦有創意、多樣的、新鮮、熱點等不明確討厭的短視訊。從直觀的體驗結合相關流水統計分析來看,使用者非常反感連續推薦同一主題的短視訊,所以需要使用一定的策略來對多樣性進行控制,提高使用者體驗,儘可能把使用者留下來。在騰訊內部某短視訊推薦場景中,我們使用MAB中的Exp3演算法來進行多樣性控制。事實證明,Exp3用在探索新使用者的興趣場景下,與隨機、Thompson sampling等方法對比,視訊平均觀看時長提升了10%,對於老使用者增加了推薦結果的多樣性,視訊平均觀看時長略有提升。
2 神盾如何解決拉新場景的冷啟動問題
2.1 MAB如何解決決策問題
在說明神盾如何解決冷啟動問題前,這裡先對MAB問題做一個綜述性的介紹。
什麼是MAB問題?
MAB的定義非常有意思,它來源於賭徒去賭場賭博,搖老虎機的場景。一個賭徒打算去搖老虎機,走進賭場一看,一排排老虎機,外表一模一樣,但是每個老虎機吐錢的概率可不一樣,他不知道每個老虎機吐錢的概率分佈是什麼,那麼想最大化收益該怎麼辦?這就是MAB(多臂賭博機)問題。怎麼解決這個問題呢?最好的辦法是有策略的試一試,越快越好,這些策略就是MAB演算法。
推薦領域的很多問題可以轉化為MAB問題,例如:
1. 假設一個使用者對不同類別的內容感興趣程度不同,那麼我們的推薦系統初次見到這個使用者時,怎麼快速地知道他對每類內容的感興趣程度?這就是推薦系統的使用者冷啟動問題。
2. 在推薦場景中,往往會有多個演算法或模型線上上做A/B Test,一般情況下我們會把流量按照一定比率來進行分配,而在不同的時間點,不同的演算法線上效果往往是不一致。我們期望每時每刻都能把佔比大的流量分配給效果最好的演算法。有沒有比A/B Test更合適的流量分配方法來讓業務的收益最大化?
可以看到全部都屬於選擇問題。只要是關於選擇的問題,都可以轉化成MAB問題。在計算廣告和推薦系統領域,這個問題又被稱為EE問題(Exploit-Explore問題)。Exploit意思是,使用者比較確定的興趣,要儘可能的使用。Explore意思是,要不斷探索使用者新的興趣,否則很快就會越推越窄。
MAB的數學表述:
- A.設共有k個手柄(對應拉新場景中的k個專輯)
- B.k個手柄的回報分佈<D1,D2,D3……Dk>(對應拉新中,專輯推薦帶來的新使用者量的分佈情況)
- C.回報均值 u1,u2……uk(對應每一個專輯在以前的實驗的平均收益)
- D.回報方差 v1,v2……vk(對應每一個專輯每一次實驗收益的穩定性)
- E.最佳手柄平均收益
- F.T輪之後的Regret值 ,使用一定的演算法策略使得其T輪之後最小
Rt是後悔值,T表示實驗輪數,u*最佳手柄平均收益,ut表示t時刻,所選手柄的收益
MAB問題目前常用演算法:
1. 樸素選擇演算法:其思想是對於每個手柄都進行k次實驗,選擇出平均收益最高的手柄。在之後的所有手柄選擇中都選擇這個最好的。
2. Epsilon-Greedy演算法(小量貪婪演算法):每一輪在選擇手柄的時候按概率p選擇Explore(探索),按概率1-p選擇Exploit(歷史經驗)。對於Explore,隨機的從所有手柄中選擇一個;對於Exploit,從所有手柄中選擇平均收益最大的那個。
3. Softmax演算法:該演算法是在Epsilon-Greedy演算法的基礎上改進的,同樣是先選擇是Explore(探索)還是Exploit(原有)。對於Exploit階段,與Epsilon-Greedy演算法一致。對於Explore,並不是隨機選擇手柄,而是使用Softmax函式計算每一個手柄被選中的概率。armi表示手柄i,ui表示手柄i的平均收益,k是手柄總數。
4. UCB(Upper Confidence Bound)演算法:通過實驗觀察,統計得到的手柄平均收益,根據中心極限定理,實驗的次數越多,統計概率越接近真實概率。換句話說當實驗次數足夠多時,平均收益就代表了真實收益。UCB演算法使用每一個手柄的統計平均收益來代替真實收益。根據手柄的收益置信區間的上界,進行排序,選擇置信區間上界最大的手柄。隨著嘗試的次數越來越多,置信區間會不斷縮窄,上界會逐漸逼近真實值。這個演算法的好處是,將統計值的不確定因素,考慮進了演算法決策中,並且不需要設定引數。在選擇手柄時,一般使用如下兩個公式進行選擇:
t表示t時刻或者t輪實驗,arm(t)表示t時刻選擇的手柄, ui均值表示手柄i在以前實驗中的平均收益,ni表示手柄i在以前實驗中被選中的次數。α是(0,1)為超引數,用以控制探索部分的影響程度。
“選擇置信區間上界最大的手柄”這句話反映了幾個意思:
如果手柄置信區間很寬(被選次數很少,還不確定),那麼它會傾向於被多次選擇,這個是演算法冒風險的部分。
如果手柄置信區間很窄(被選次數很多,比較好確定其好壞了),那麼均值大的傾向於被多次選擇,這個是演算法保守穩妥的部分。
UCB是一種樂觀的演算法,選擇置信區間上界排序。如果是悲觀保守的做法,是選擇置信區間下界排序。
5. Thompson sampling:該演算法跟UCB類似,Thompson sampling演算法根據手柄的真實收益的概率分佈來確定所選手柄。假設每個臂是否產生收益,其背後有一個概率分佈,產生收益的概率為p。不斷地試驗,去估計出一個置信度較高的概率p的概率分佈就能近似解決這個問題了。 假設概率p的概率分佈符合beta(wins, lose)分佈,它有兩個引數: wins, lose。每個臂都維護一個beta分佈的引數。每次試驗後,選中一個臂,搖一下,有收益則該臂的wins增加1,否則該臂的lose增加1。每次選擇臂的方式是:用每個臂現有的beta分佈產生一個隨機數b,選擇所有臂產生的隨機數中最大的那個臂去搖。
以上演算法優缺點:
1. 樸素選擇演算法需要為每一個手柄準備合適次數的實驗,用以計算每個手柄的平均收益,並不適合物品快速迭代的場景,同時會浪費大量流量。
2. Epsilon-Greedy演算法與Softmax演算法有一個很明顯的缺陷是它們只關心回報是多少,並不關心每個手柄被拉下了多少次。這就意味著,這些演算法不再會選中初始回報特別低的手柄,即使這個手柄的只被測試了一次。而UCB演算法,不僅關注回報,同樣會關注每個手柄被探索的次數。Epsilon-Greedy and Softmax的特點,預設選擇當前已知的回報率最高的手柄,偶爾選擇那些沒有最高回報的手柄。
3. Thompson sampling。UCB演算法部分使用概率分佈(僅置信區間上界)來量化不確定性。而Thompson sampling基於貝葉斯思想,全部用概率分佈來表達不確定性。相比於UCB演算法,Thompson sampling,UCB採用確定的選擇策略,可能導致每次返回結果相同(不是推薦想要的),Thompson Sampling則是隨機化策略。Thompson sampling實現相對更簡單,UCB計算量更大(可能需要離線/非同步計算)。在計算機廣告、文章推薦領域,效果與UCB不相上下。
LinUCB演算法:
以上介紹的MAB演算法都沒有充分利用上下文資訊,這裡所說的上下文資訊包括使用者、物品以及其他相關環境相關的特徵。而LinUCB演算法是在UCB演算法的基礎上使用使用者、物品以及其他相關環境相關的特徵來進行UCB打分。LinUCB演算法做了一個假設:一個Item被選擇後推送給一個User,其回報和相關Feature成線性關係,這裡的“相關Feature”就是上下文資訊。於是預測過程就變成:用User和Item的特徵預估回報及其置信區間,選擇置信區間上界最大的Item推薦,然後依據實際回報來更新線性關係的引數。
相關論文中(見附件)提出兩種計算辦法,這裡將論文中演算法虛擬碼貼出來,方便大家閱讀,詳情請查閱附件論文。
2.2 神盾推薦如何使用UCB來解決拉新場景推薦問題
神盾在UCB演算法的基礎上,嘗試為其新增上下文環境資訊,該環境資訊主要包括使用者畫像、物品畫像、環境資訊(時刻,節假日,網路環境)等,因此將其命名為PUCB(Portrait Upper Confidence Bound)。該演算法包括兩部分,第一部分使用使用者已有的行為資料生成物品在某些畫像特徵下的UCB得分(該分數綜合考慮物品的歷史平均收益和潛在收益)。第二部分使用預訓練好的分類器,在對user-item pair打分時,將原有特徵值替換為UCB打分,然後計算最終的打分。
UCB打分
資料準備階段
圖 1 神盾PUCB-資料準備階段示意圖
該階段的目的是確保使用使用者行為資料和畫像特徵資料生成所需時間視窗下的【畫像,物品ID,行為統計數】。這部分神盾在實現時,考慮了一些容錯機制,如:當歷史時刻資料不存在時,是否可以根據已有時刻的行為資料和已有時刻的【畫像,物品ID,行為統計數】統計資料來重新生成等等。
統計打分階段
使用公式6,基於時間視窗內的資料,採用一定的衰減策略來計算ucb分。對某一物品某種畫像進行ucb打分。其中i表示物品ID,j表示畫像特徵MD5編碼,cij 表示t時刻j特徵編碼的物品i的點選量,Cij 表示歷史時刻j特徵編碼的物品i的點選量,λ表示新行為對得分的影響程度,λ越大表示最新行為越大,反之亦然,eij表示t時刻j特徵編碼的物品i的曝光量,Eij表示歷史時刻j特徵編碼的物品i的曝光量,e為無意義初始值防止分母為0,Thj表示當前時刻j特徵編碼的物品總的曝光次數,Taj表示歷史時刻和當前時刻所有專輯j特徵編碼的物品總的曝光數,α表示bonus項用於探索物品的權重,α越大越容易出新物品。
是否需要對Cij,Eij,Taj全部進行衰減,如下公式為計算曆史資料的公式。d(t)表示t時刻的統計量,d’(i)表示i時刻的實際統計量,f(|t-i|)表示時間衰減函式,θ表示時間衰減引數,新時刻行為的影響越大,就應該跳大θ,反之亦然。
虛擬碼如下:
doStatistic()
Input: 歷史時刻物品-畫像曝光點選統計資料hisFirstItemPortraitStatis
(t-w+1, t)時刻物品-畫像曝光點選統計資料otherItemPortraitStatis
isUseDefaultValue歷史時刻資料是否使用預設值
toolItemID池子所有物品ID
Output: itemPortraitUCBScore ItemID,畫像MD5的ucb得分
1 if isUseDefaultValue then
2 向hisFirstItemPortraitStatis補充缺失的物品曝光和點選資料(使用預設值)
3 hisRDD,realRDD←對hisFirstItemPortraitStatis,otherItemPortraitStatis分組合並統計
4 itemPortraitUCBScore ← 使用上述公式計算ucb得分
5 return itemPortraitUCBScore
分類器糅合UCB打分
經過上述處理之後,我們會得到圖2所示資訊,其中owner列為特徵值,primary_key為歷史實時行為標記,secondary_key為物品ID,value為統計到的次數。
圖 2 PUCB演算法中間統計結果-示例圖
換句話說,經過上述處理,我們將原始的特徵抽象為UCB得分,接下來需要做的事情是使用一定的策略將不同維度的資訊糅合起來。論文中使用了嶺迴歸的方式來為每一個特徵維度計算權重,神盾這裡設計的比較靈活,可以使用任意一種分類器(如:LR、FM等)來糅合最終的結果,需要注意的是該分類器所使用的特徵應該跟計算UCB打分的特徵體系一致。
3
神盾如何保證短視訊推薦場景中的多樣性
3.1 exp3多樣性保證
Exp3(Exponential-weight algorithm for Exploration and Exploitation)演算法是2001年提出來的一種解決MAB問題的演算法。它的核心思想是維護一組臂的權重資訊,然後使用數學方法得到一組臂的概率分佈,接著每次擲骰子去選擇臂,根據選擇後觀察到的收益情況去調整臂的權重,如此迭代下去。論文中證明了使用這種策略能夠保證後悔值的在一定可以接受的範圍內,從而保證了結果不會是最壞的一種情況。
Exp3演算法虛擬碼如下:
ϒ是一個超引數,值域為[0,1],可以採用固定值,在實驗輪數確定的情況下,建議使用公式9來計算ϒ,其中K為臂的個數,T為實驗的輪數。
首先為每一個臂初始化權重為1,然後使用演算法1步驟中的公式計算每一個臂的概率,該公式保證了所有臂的概率和為1,接著隨機出一個[0,1]之間的值,觀察該值落在哪個臂中,選擇之後觀察該臂的收益情況,使用公式11計算其預估收益。
使用公式12來更新權重。
該演算法在計算臂的概率時,雖然有可能趨向於0,但是不會等於0,所以對於任意一個臂,都有機會被選中,只是收益高的臂更容易被選中,收益低的臂更不容易被選中。
3.2 神盾推薦如何應用exp3來做多樣性控制
圖 3 神盾Exp3演算法流程
1. 首先規劃Exp3的臂策略,最簡單的臂策略為不同的召回策略,複雜一些可以按照一定的業務規則來對物品進行重分桶,如:在短視訊推薦中按照物品類別資訊(遊戲、風景、美女等)構建了20+個臂。
2. 在tesla(騰訊內部叢集任務排程系統)上配置Spark Streaming任務,這個任務的目的是分鐘級消費TDBank業務資料,按照業務規則構建正負反饋資料,然後使用一定的更新策略來更新權重。神盾推薦在這裡設計了三種權重更新策略。
a.原版演算法更新策略,使用每條反饋資料來更新。這裡存在的問題是由於TDBank資料收集,近線訓練和線上服務鏈條較長,近線訓練的結果不能非常實時的推送到線上去,存在一定的誤差。
b.小batch更新策略,收集一段時間的資料(神盾使用1分鐘的資料)對每個臂的收益值做歸一化,然後更新演算法引數。與a相比,優點是權重更新更加穩定,缺點是收斂速度相對比a緩慢。
c.在b的基礎上引入視窗概念,會週期性的使用初始值來重置演算法引數。
其他:在實際推薦業務場景中可以依照實際的應用情況,對正負反饋構建,權重更新策略,為每位使用者構建Exp3選擇器等。
3. 推送計算引數到Kafka Server,更新R2線上演算法引數。
4. 神盾推薦在短視訊推薦上應用Exp3的結構如下圖所示,可以看到exp3被應用在ReRank層,每一個臂都可能被搖到,同時從數學角度保證整體選擇的收益肯定遠高於最壞情況,進而在保證多樣性的同時,整體收益高於最壞收益。
圖 4 神盾推薦短視訊推薦上Exp3演算法結構示意圖
4 總結
綜合上述場景的實際應用情況,說明在面臨使用者或物品冷啟動的情況時,值得使用PUCB的方法進行嘗試,而內容類對多樣性有要求的場景,可以嘗試使用Exp3來解決。
本文所述MAB方法的經驗來自組內所有同事在實際業務中的總結。歡迎大家交流討論!
參考資料:
exp3數學推導: https://jeremykun.com/2013/11/08/adversarial-bandits-and-the-exp3-algorithm/
Python版demo:https://github.com/j2kun/exp3
https://zhuanlan.zhihu.com/p/21388070
http://blog.csdn.net/scythe666/article/details/74857425
http://x-algo.cn/index.php/2016/12/15/ee-problem-and-bandit-algorithm-for-recommender-systems/
Adversarial Bandits and the Exp3 Algorithm
來源:騰訊QQ大資料