推薦技術隨談

  • 2019 年 11 月 21 日
  • 筆記

文章作者:翦浩 脈脈

編輯整理:蔣權

大家好,今天想和大家討論下相關推薦技術通用的特點及在實踐中的改進點,這也是我們團隊在研發實踐中一些經驗總結。

首先,推薦解決主要問題是給用戶在沒有行為的新聞上預測一個偏好概率,然後通過概率值由高到低排序推薦給用戶。如圖簡單地表達了用戶在新聞上的稀疏行為矩陣,通過我們會基於用戶的畫像特徵、內容特徵、上下文場景特徵、用戶對新聞的各種操作行為特徵等對內容候選集進行排序打分。其中很直觀的解決辦法是通過計算用戶之間相似或者商品之間的相似來推薦。

那麼,協同過濾中 UserCF 模型和 itemCF 模型是最簡單的辦法。這裡著重對兩者進行對比:

1. itemCF 比較適合個性化推薦場景(比如,商品、電影、短影片等各種場景),它偏重當前用戶的當前行為,從而能推薦與當前相關新聞的內容,而 UserCF 更偏群體性(比如,新聞推薦場景),計算當前用戶的 K 個相似用戶時,當 K 值偏大,UserCF 推薦更偏熱點;

2. itemCF 興趣擴展比 UserCF 弱,因為 itemCF 會根據你當前的行為推薦與當前相關的內容,不像 UserCF 能夠學習到多個用戶不同的偏好;

3. itemCF 能解決用戶的冷啟動問題,只要新用戶對一個新聞產生行為,就能夠推薦和該新聞相關的內容,相反 UserCF 能解決 item 冷啟動問題,因為用戶相似度計算通常是離線計算的,新聞上線後一段時間,一旦有用戶對新聞產生行為,就可以將新上線的新聞推薦給和對它產生行為的用戶興趣相似的其他用戶。

這裡,用數學的角度去解釋協同過濾為什麼能夠在推薦中可行。如下基本假設換成數學解釋就是,一個矩陣向量,如果行向量部分相同,那麼行向量其餘部分也有可能相同,代數上解釋就是向量線性相關性,那麼線性相關帶來的是向量低秩,即向量是冗餘的,冗餘的向量帶來的資訊和消耗的計算資源是完全可以避免的,那麼如何進行矩陣壓縮並且保證不影響資訊的丟失是推薦技術中的另一個關鍵。

比如說,矩陣分解。如下一個比較大的稀疏矩陣(低秩)能夠拆分成兩個比較小的矩陣相乘。公式 E 是由經驗損失函數和結構風險函數組成的損失函數。

其實,基於前面的假設,協同過濾和矩陣分解兩者具有很緊密的內在聯繫,只是兩種不同的表達形式。我們需要弄清楚一個問題:超大維度矩陣表式形式帶來的是資訊的不相似,及稀疏數據計算的相似結果很有可能是不置信並且過擬合的,這樣會導致資訊準確性不足問題。在特徵表示方面CF是維持了原有的元數據形式,能夠捕捉更細粒度的局部特徵,但這樣帶來的計算開銷也是巨大的,所以,實際工業上出現了很多的變體方法。

業界解決 item2vec 的常用的演算法是 ALS 和 Word2Vec。其中 Word2Vec 在序列表徵用戶和商品向量,然後直接計算相似度是非常熟知的方案。在實際的新聞資訊流推薦中,Word2Vec 的點擊效果比 ALS 要好30%+,主要有兩個原因:

1. 用戶的興趣和行為是多樣的,局部的行為往往更偏相關,往往整體的樣本差異是很大的;

2. 在負樣本取樣中,ALS 是全局的負樣本取樣,Word2Vec 更傾向高頻,傾向高頻的取樣更不容易讓學習出的結果都與高頻(頭部)的結果相似。

我們思考一個問題,既然樣本對模型的效果有顯著的影響,那麼我們想辦法優化負樣本會不會帶來更大的提升呢?

針對 ctr 預測問題,我們把上一次點擊、下一次展現和樣本是否點擊組成若干個三元組,然後我們去估計給定兩個 item_id 的點擊率,從而計算出兩個 item 的相似。實踐證明這種直接優化點擊率目標函數的效果是非常好的,但是這種模型在遇到新的文章或者物品時是沒法計算歷史資訊的,這其實是一個泛化性問題,怎麼理解呢?

我們思考,能不能用一些泛化性的特徵來表達 item_id 呢?當然可以。下面 side information 代表多個特徵,熟悉 word2vec 的同學知道右邊結構就是一個 skip-gram 的結構,給定一個 item_id,求其指定的窗口區間的 item_id,那麼如果把 d3 替換成 itemid, keyword, category, author 等泛化特徵,再放入模型中,word2vec 實質上變成一個多分類模型。同理,我們也可以在用戶側融入 side information。

下面右側圖實際上是演化二的形式,只是在左側用戶特徵部分也融入了 side information,然後用戶特徵和電影特徵兩兩計算相似,其中一般通過神經網路學習特徵之間的交互資訊。從整體上看,抽象的來理解演化三上下部分分別對應的是矩陣分解和特徵融合兩個過程。

上面三種都是基於矩陣分解的演化過程,但是你會發現他們特徵之間的分開融合的,也就是用戶特徵和商品特徵分別融合後再計算相似。下面介紹一種特徵之間交互更緊密的模型。

FM(Factorization Machines),主要是為了解決數據稀疏的情況下,特徵怎樣組合的問題。如下其前半部分是我們熟悉的邏輯回歸,後半部分就是多個 MF(n 個向量與向量相乘)。無論 MF 還是 FM 最後都是得到特徵向量的表式,特徵之間先 dot-product 再加和,與特徵向量先加和再 dot-product 性質是一樣的,只是 FM 在進行特徵交叉時二元特徵交叉參數不是獨立的,而是相互影響的。那麼這裡讀者可以思考一個問題,FM 既然一開始是做 ctr 預估排序模型,那為什麼也能做召回?

雖然「天下武功出一家」,但是每個模型都有它的不足之處,在實際項目中最後的推薦效果都是多個模型組合的效果。最有效也最容易的解決辦法就是採用集成手段,從不同的角度生成多個 ctr 預估模型,然後通過 GBDT 去做適合 dense 特徵交互,這樣集成的方法效果是非常大的。

前面涉及到的都是追求的一個業務指標最大化的問題,其實往往在實際業務場景中追求的是多個指標。下面以電商為例,提升點擊率不是最核心的,提升成交轉化率才是目的,所以,如何在點擊和轉化兩個目標平衡是非常關鍵的。我們的解決辦法是分別建立 ctr 和 cvr 模型,排序公式:

這裡前提條件是兩個模型預估準確率是非常高的。

另外,其中有個非常重要的超參是藉助強化學習來解決的,超參可以理解你要求解的公式中相關的不確定的權重係數,這裡不展開強化學習細節,業界強化學習在超參的調試中是比較成熟的解決方案。我們最後花了一周左右的時間調到最佳參數後成交率提升達到10幾個百分點。

最後,分析一下排序模型,排序模型是一個貪婪模型,它往往是把高 PV 和高點擊等前排商品推薦出來,這樣能保證推薦效果的置信度。但是那些因為長尾問題而展現不足,品質比較好的內容就不容易被探索出來。業界現在比較成熟的解決方案就是採用個性化的 UCB 演算法,該類型演算法能很好的探索出一些被隱藏的高品質的商品。

以上,基本上關於常用的推薦技術做了大致的介紹,最後一點時間,我們談一下演算法之外與業務非常相關的問題。搜索更多是用戶主動檢索資訊,然後通過用戶提供的資訊推出相關的內容,而推薦通過收集用戶更多資訊,更加主動推薦相關或相似或者可能感興趣的內容。但推薦是沒法捕捉長尾的內容的,所以沒法分發不了一些需求和流量,因為推薦本質上還是「大眾投票」的模型。總的來說,「搜索求准,推薦求新」。

推薦技術要在業務場景中落地,其實並不是太難,難就難在如何推出用戶真正感興趣的高品質內容,並且很多工程化上的細枝末節還是需要大家在實踐中多積累、多試錯、多復盤。

好,今天跟大家分享的觀點,可能都是錯的,因為隨著技術的進步,上一秒可能正確的做法,下一秒可能就用不到了。

這就是今天所要分享的內容,感謝大家。