search
尋找貓咪~QQ 地點 桃園市桃園區 Taoyuan , Taoyuan

「雙管齊下」魅族資訊流推薦演算法快速滿足用戶個性化需求

作者:吳夢玲,魅族演算法工程師。2013年開始從事機器學習、推薦系統相關工作,2016年初加入魅族,負責個性化推薦模型策略和演算法研發。
責編:錢曙光,關注架構和演算法領域,尋求報道或者投稿請發郵件[email protected],另有「CSDN 高級架構師群」,內有諸多知名互聯網公司的大牛架構師,歡迎架構師加微信qianshuguangarch申請入群,備註姓名+公司+職位。

摘要:隨著內容生產門檻降低和自媒體興起,互聯網上的內容無論從量級還是多樣性上都有顯著提高。這對於資訊類應用的挑戰在於,傳統的由人工對內容進行編排的模式已經不能滿足用戶在資訊內容上的渴求,而推薦演算法正好能幫助每一個用戶挑選自己感興趣的內容,為每個人訂製一個智能化的資訊流。對於魅族而言,Flyme系統上原生的資訊App是用戶拿到一部新的魅族手機時最快能觸達的獲取資訊的入口,因此我們致力於在原生資訊App上為用戶提供及時、有趣、豐富的智能化資訊流。

一、背景介紹

首先從目前移動互聯網的大環境來看,資訊流是最能給產品帶來商業價值的形式之一,一方面因為資訊流作為用戶消費內容的途徑,能帶來較長的用戶在線時間,足夠讓商業推廣活動得到有效的用戶觸達;另一方面因為資訊內容之間相對獨立,這意味著用戶在資訊流上的在線時長是細分度較高的,這也有利於商業推廣活動的開展。
然後對於魅族的Flyme系統而言,原生的資訊App是Flyme用戶閱讀資訊內容最便捷的入口,同時還可以整合全系統用戶偏好,以更精準地進行內容推薦,滿足用戶的個性化需求。

二、整體推薦框架

在設計一個推薦系統時,除了要滿足準確性要求之外,還需要具備多樣性,以避免陷入內容單一的困局。另外,由於資訊內容本身生命周期較短,資訊流推薦還要兼顧時效性。

基於以上標準,我們目前的推薦框架如下圖所示:

整體框架包括兩個主要環節:

1. 召回。作用是從較龐大的原始文章庫中挑選出量級較小的文章候選集,挑選的依據包括與用戶偏好的相關性、文章本身的熱度等,因此召迴環節本身也由若干個分支組合而成,目前使用的主要是三個分支:new-hot分支,反映的是當前的熱點新聞和群體偏好;content-based分支,與用戶歷史閱讀過的文章內容強相關,特化能力較強;userCF分支,根據相似人群的偏好進行推薦,相對泛化。
2. Ranking。作用是對召迴環節挑出的文章候選集進行重排,以使得推薦結果排序最優,提高系統準確性。Ranking重排的依據是基於用戶真實反饋數據訓練得到的模型,在用戶進行請求時,根據當時時間、地點、網路狀況等上下文信息、用戶畫像信息、物品畫像信息,去預測該用戶對候選集中各文章的閱讀概率,從而依據預估的概率值對文章進行排序。

得到Ranking模型的過程分成3個步驟:

  • 將業務目標量化
  • 針對量化的業務目標進行抽象建模
  • 定義機器學習任務

比如衡量推薦系統質量有一個最常用的量化指標是系統的整體轉化率,提高整體轉化率這個問題可以拆解成根據各文章的預估轉化率進行推薦排序,也就是說問題轉化為文章預估轉化率的預測問題,針對這個預測問題,定義一個機器學習任務,即給定用戶畫像、文章畫像、上下文數據,去預測某篇文章的點擊概率。

接下來就可以基於這個機器學習任務進行訓練樣本構造。如下圖左側所示,由於目標是預測點擊概率,因為以系統中真實的文章曝光點擊行為構造出label. 而features則主要是反映用戶、文章、上下文信息的一些特徵,以用戶features為例,用戶features包括但不限於:用戶的基本身份信息,如常住地,比如在深圳的人可能對深圳周邊的新聞比較感興趣;用戶對文章的偏好標籤,包括粗粒度的類別標籤和細粒度的文本標籤。

而基於在線預測性能考慮,目前使用得最多的是LR模型。

以上是我們目前推薦演算法框架及主要組件的介紹,目前的效果見下圖:左邊為通過人工運營編排的內容,右邊是通過系統推薦出來給我本人的內容,直觀上可以看出右邊的內容跟偏好更加相關,而通過A/B Test去看大盤數據可得,截至上一個月份,通過個性化推薦能使整體轉化率比人工推薦提高18.6%。

三、召回模型在線更新

召回模型在線更新是和冷啟動問題相關的。

前文提到資訊內容本身的特性要求系統具備時效性,因此如何讓持續實時入庫的新文章出現在推薦結果中是需要解決的一個問題,這也就是所謂的文章冷啟動問題。

另一方面是用戶的冷啟動問題。目前對於新用戶冷啟動問題的解決方法是給他提供一些覆蓋多個類別的熱門文章作為啟動頁,但用戶會對這個啟動頁的文章產生反饋,如何通過這些反饋及時捕捉新用戶偏好並反映到模型中,是另一個影響推薦效果的問題。因為基準模型是批量計算的,按天進行更新,如果一個新用戶在這一天之內產生的反饋不能及時歸納成他的偏好並反映到他的推薦結果中,那麼對用戶體驗的影響是比較大的。

目前解決這兩個問題主要是用在召回模型在線更新的方式。

如下圖所示,將content-based和userCF兩個召回分支的基準模型存儲起來:content-based分解成用戶標籤向量和文章標籤向量兩部分;userCF分解成用戶鄰居表和用戶文章評分兩部分。

對於文章側,在新文章通過文章流入庫時,立即用文章內容解析器去做文本處理和分析,從中抽取出有用的文章標籤,更新到文章標籤向量中。

而對於用戶側,每當有用戶對文章產生新行為,包括閱讀、評論、轉發等的時候,立即將這些反饋行為進行收集並計算轉化成用戶profile,分別更新到用戶標籤向量和用戶鄰居表中,相當於將用戶實時產生的新偏好反映到content-based和userCF兩個模型中。

以下是以一個新用戶的行為日誌為例,直觀上去看召回模型實時更新所產生的效果:
左上截圖是該新用戶首次訪問時看到的由人工進行編排的內容,主要是一些足球相關的以及社會新聞,接下來推薦系統會做用涵蓋多個類別的熱門文章作冷啟動,而右上截圖是他在接下來十分鐘瀏覽的3篇文章,最底下截圖是在他產生這些行為之後推薦演算法給他展示的一些文章,可以看出這些文章其中的有一些與他剛瀏覽的三篇文章的內容是強相關的,還有一些是科技類的,沒有與歷史瀏覽文章直接掛鉤,但也可看出一些潛在的相關性。

以上過程都是在半小時內發生的,如果沒有做召回模型在線更新,那麼一個新用戶在每一天訪問的全過程所看到的都只能是人工統一編排的或啟動頁的文章,與個人偏好無關。而實現了召回模型在線更新之後,推薦系統就能及時捕捉到他的興趣偏好並及時表達出來。

四、Ranking模型演化

熟悉機器學習的同學都知道,模型最重要的是泛化能力,而在實際應用中,真正要關注的廣義的「泛化能力」不僅僅是在隨機切分的cv集或test集上的表現,而是在一個真實的業務場景上線之後的表現。

我們在做Ranking模型優化的時候也是以此為目標的,要無限逼近這個目標,首先需要有一個正確的評估機制,也就是說在離線實驗時構造一個與在線試驗儘可能接近的實驗場景和評估方式。如下圖所示, 模型訓練好之後部署在一個動態環境中,也就是說模型在發揮在線預測作用時所面臨的用戶或文章都是隨時間動態產生的,很有可能數據的分佈與模型訓練時所使用的數據不一致,特別是文章側,因為不斷有新文章進行實時入庫。正因為這個特性,在離線訓練時不能單純地取固定時間窗口的數據切成train/test集然後根據test集的效果估計線上效果,而是需要額外取這個時間窗口之後的某個時間段作為一個test集,用這個test集的表現來估計線上效果。

有了一個正確的評估機制之後,就可以以這個評估機製為目標對模型進行調整,以提高模型泛化能力。目前我們所做的主要是以下幾點:

1. 使得訓練數據與在線場景對齊

推薦系統主要是在資訊App的頭條頻道使用,但最開始的時候由於系統還沒有積累到足夠的數據,Ranking演算法使用了全部頻道的用戶反饋作為訓練數據。這樣做的問題是離線實驗和在線預測的場景不對齊,導致離線實驗上的一些調優成果部署到線上后表現與預期不符,因此後期在Ranking模型優化過程中做的一個改進是使用頭條頻道的反饋數據作訓練,以使得離線實驗效果盡量與在線效果正相關。

2. 拉大訓練樣本時間窗口

目前的做法是從3天拉長到一周,這樣做的好處一個是增加樣本量,另一個是使得抽取的樣本能覆蓋到一周中各天的數據分佈情況,比如周末和工作日的數據分佈是有差異的。以上總的來說是為了減輕模型過擬合程度。

3. 在特徵工程上的調整和優化

a) 特徵組合

上文提到我們基於性能的考慮目前主要使用的是LR模型,但LR本質上是簡單的線性模型,不能反映特徵之間的交互關係,這就導致它的擬合能力相對較弱,特別是對於大部分的真實應用場景而言,很多任務是非線性可分的。

為了解決這個問題,我們目前使用的方式是對特徵進行高階組合,主要是使用二階交叉,如下圖所表示的是目前用到的一部分的二階特徵組合方式,大部分集中在用戶特徵域和文章特徵域之間。比如將用戶基本信息中的常住地與文章標題所包含的命名實體作交叉,反映的物理意義是文章標題所提到的命名實體是否包含用戶常住地這點會影響用戶對文章的閱讀意願。

b) 特徵抽取

特徵交叉之後會導致特徵量在數量級上膨脹,同時原始的特徵集和二階特徵一樣都會包含一些不相關或無效的特徵,這些特徵會影響模型的穩健性,同時也影響模型訓練或預測性能。

為了解決這個問題,我們採用在模型訓練前先做一次特徵抽取 的方式,主要是剔除無效的或與預測目標相關性低的特徵。

比如低置信度的特徵,一個極端情況是只在正樣本/負樣本中出現,如果將這些特徵加到模型中,那麼它們對分類預測的影響幾乎是是決定性:對應的參數預估值極高,因此只要樣本中出現這些特徵,就必定會被預測為正或負。假如我們的樣本和總體分佈是完全一致的,那麼 以上推斷並無問題,關鍵是在於哪怕是在所謂的「大數據」時代,我們也無法確保訓練樣本就是總體本身,因為這些決定性的特徵可能是由於抽樣所產生的偏差,也就是說特徵的置信度較低,需要將其從模型中剔除。

除此之外,還有一些特徵有足夠的置信度,但與預測目標相關性較低的特徵也需要進行過濾。由於目前幾乎所有的特徵都是做了one-hot encoding的離散特徵,而作為二分類問題,預測目標也是服從Bernoulli分佈,因此我們在檢驗特徵和label的相關性時使用的是基於列聯表的卡方檢驗,卡方統計量服從自由度為1的卡方分佈,因為目前的做法是取95%顯著的閾值3.84,認為3.84以上的特徵是顯著具備區分能力的。

對Ranking模型做了以上調整之後,我們將此作為一個新的Ranking模型去與舊模型做A/B Test, 兩個版本的推薦演算法中召迴環節是完全一致的,唯一的區別是使用了新舊兩個Ranking模型。下圖是觀察一周的A/B Test數據,可見Ranking模型的優化給線上效果帶來明顯的提升,平均CTR提升幅度達到12.86%.

五、總結和展望

總結過去這段時間發現,我們投入了較大精力在特徵工程上面,包括原始特徵、衍生特徵的構造和檢驗。雖然對於類似LR這些的線性模型而言,特徵工程收效不小,但從長遠來看線性模型+重特徵工程的方式存在瓶頸。首先在特徵構造上人的先驗經驗和精力有限,要嘗試所有可能的高階特徵組合需要大量的重複勞動。另外對模型本身而言,構造大量的高階特徵組合也並非一個毫無代價的方式,因為原始特徵本身存在較嚴重的稀疏性,再對其進行高階組合會使得數據稀疏性更為嚴重,同時特徵空間也開始不斷膨脹。這些都可能成為模型本身的瓶頸。

針對這些瓶頸,我們目前嘗試的方向是使用FM模型,FM的好處一個是不需要人工去構造高階特徵,另一個好處是各個高階特徵之間並非獨有一個參數,而是通過embedding的方式將參數映射到低維的連續空間。這一方面是減輕人力成本,另一方面是解決了模型參數空間隨高階特徵構造不斷膨脹的問題。

我們目前訓練所得的FM模型在離線評估指標上較最新的LR模型有6%~7%的提升,根據歷史經驗,它給線上效果帶來的提升是值得期待的:-)

除此之外我們也在嘗試基於TensorFlow和Padddle平台將深度學習應用到推薦業務上,比如將wide model與deep model進行融合,具體來說是一方面使用基於符號表示的原始特徵,另一方面將這些特徵通過FM embed 到低維的連續向量空間,作為DNN的其中一個隱藏層,在最後用一個全連接層進行分類預測。



熱門推薦

本文由 yidianzixun 提供 原文連結

寵物協尋 相信 終究能找到回家的路
寫了7763篇文章,獲得2次喜歡
留言回覆
回覆
精彩推薦