Embedding在腾讯应用宝的推荐实践
作者:carloslin,騰訊 PCG 應用研究員
Embedding 技術目前在工業界以及學術界中應用非常廣泛,關于 Embedding 的探索和應用從未停歇。Embedding 的訓練方法主要分成 DNN 的端到端的方法以及序列學習的非端到端的方法,其中最經典的 word2vec 以及由此衍生出 sentence2vec,doc2vec,item2vec 等都屬于非端到端的學習方法;本文主要介紹 Embedding 技術的非端到端學習方法在應用寶推薦場景的應用實踐。
1.經典的 word2vec 模型
word2vec 模型的問世,極大的促進了 Embedding 技術的發展。下面我們先從 word2vec 模型切入,簡單介紹一下 embedding 的推導過程。以業界最廣泛使用的 Skip-gram+negative sampling 為例。
損失函數如下所示:
其中 a 表示當前中心詞,c 表示序列上下文詞,Dp 為 window_size 中的詞集合,Dn 為全局隨機采樣的負樣本集合。損失函數中左半部分為正樣本的損失函數項,右半部分為負樣本的損失函數項。
為什么正樣本和負樣本能夠通過加法的方式組合起來構成損失函數呢?首先,原始的 skip-gram 模型的損失函數(1)如下:
其中 w 為中心詞,c 為 w 的上下文單詞,D 為訓練集中 w 和 c 的 pair 對,θ 為需要學習的參數;我們可以把這個優化問題轉化為一個分類問題,利用 softmax 函數展開后:
我們得到如下格式的函數(2):
其中 vc 和 vw 分別為中心詞和上下文詞的 embedding,C 為訓練集中所有上下文單詞的集合。接著我們可以對損失函數(1)進行 log 變換得到(3):
由于需要對所有的上下文單詞集合進行計算,公式(3)的計算復雜度非常高,所以 Negative sampling 的訓練方式應運而生。Negative sampling 的思想本質上是一個二分類的問題,即預測(w, c)pair 是否存在訓練集中。我們用公式:
表示(w, c) 存在訓練集的概率,相應的:
表示(w, c)不存在訓練集中的概率。此時的我們的損失函數(4)如下所示:
即我們把實際出現過的(w, c) pair 對當成了正樣本,損失函數的目標就是希望能學習到參數 θ 來最大化(w, c)作為正樣本的概率,通過對:
進行 sigmoid 函數和 log 轉換,我們得到了上式右半部分的公式,如此便得到了我們正樣本的損失函數表達。但是并不是所有(w,c)pair 對都來自訓練集合,因此需要構造一些負樣本來修正損失函數擬合正樣本的概率表達,最終 SGNE 的損失函數如下所示:
其中 D‘即為全局隨機采樣的負樣本。
2.應用寶相關推薦場景介紹
接下來我們來介紹一下 Embedding 技術在應用寶相關推薦場景中的應用實踐。首先,簡單介紹一下應用寶相關推薦場景的概況。應用寶相關推薦場景主要包括詳情頁、OMA(one more app)以及下載管理和應用更新。推薦的方式主要是根據上文 APP(詳情頁當前 APP、OMA 正在下載的 APP)召回相關 APP 進行推薦。
圖1 詳情頁相關推薦場景 ? ?圖2 OMA相關推薦場景3.傳統 word2vec 的不足
傳統的 word2vec,在實際應用中存在一些不足:
只能學習訓練數據中 window_size 內當前詞和上下文詞的相關性,無法表達未登錄詞與當前詞的相關性;
負樣本和正樣本的定義無法表達上下文場景中上文和下文的關系。
應用寶的業務特點存在以下三個挑戰:
從用戶層面來看,用戶月均下載 APP 量級僅個位數,用戶行為非常稀疏;
從 APP 層面來看,APP 流量差異巨大,75%的 APP 下載集中在 top1000 個 APP,大量長尾 APP 行為稀疏,傳統的序列建模無法準確學習長尾 APP 的 embedding 表達;
在相關推薦場景,看重上下文的相關性、相似性,從業務角度看,召回 APP 與上文 APP 需要在類目層面上有相關度,傳統的序列建模無法表達這個信息。
接下來我們將會從用戶序列的樣本優化以及模型優化來解決上述三個挑戰。
4.用戶序列優化
4.1 長周期用戶序列優化
線上 Base 流量的解決方案是通過拉長數據周期,擴充訓練樣本,選取過去 180 天的用戶的下載行為序列作為訓練數據。這種方法存在一個問題,下載序列的周期跨度過長,APP 下載行為間隔大,APP 的下載之間幾乎沒有相關性,同時在短期的下載序列中,是有一定的相關性的。以下圖的下載序列為例子,上半部分為 10 月 25 號的下載行為,幾乎都是交友類的 APP,而下半部分為 11 月 07 號的下載行為,幾乎都是購物類 APP,兩者并沒有相關性。
圖3 用戶行為序列示意圖因此我們以天為 session 粒度,重新構建用戶的下載行為序列。在序列長度的設定上,過短的序列,無法有效表達行為之間的相關性,不利于模型學習 APP 的 embedding 表達。在我們相關推薦場景中,設定的閾值為 5。模型訓練方式采用傳統的 Skip-gram+negative sampling 的方式訓練。通過拉長數據周期的方式擴充訓練樣本,使得我們的訓練樣本數據增長了 5 倍。
4.2 引入圖隨機游走模型
在上一步的迭代中,雖然我們通過拉長數據周期的方式擴充訓練樣本,但是由于用戶行為的稀疏性,天級別 session 粒度的下載序列樣本非常少,僅占 5%,因此并不能很好的解決長尾 APP 學習困難的問題。
因此借鑒圖游走算法的思想,我們利用用戶的 APP 下載序列,構造用戶的下載行為圖,并在圖中做隨機游走,生成新的行為序列。
圖4 隨機游走示意圖如上圖所示,我們有三個原始的用戶行為序列 u1/u2/u3,其中 a 表示行為 APP。首先我們把序列中各個 APP 抽取出來構造圖節點,序列的先后行為發生關系構造節點之間的有向邊來構造 APP 的行為轉換圖(如圖 4-(b)圖所示),接著我們在圖中進行隨機游走,生成長度為 m 的新的行為序列作為我們的訓練數據。
其中隨機游走的概率公式如下:
其中鄰接矩陣以圖 4-(a)圖三個原始行為序列為例,鄰接矩陣如下所示:
圖5 用戶行為序列鄰接矩陣圖下圖為 randomwalk 后 app 的樣本分布圖:
圖7 APP樣本分布圖圖8 APP樣本分布占比變化圖從圖 7 可以發現 randomwalk 能有效緩解長尾 APP 訓練樣本不足的問題,randomWalk 前后對比,APP 的樣本分布相比更加均勻;圖 8 展示樣本數為 1~10 的 APP 占比從 35%下降到 1.47%,同時 APP 樣本數在 100~10000 的占比從 35%左右提升到了 75%以上,低頻長尾 APP 的樣本得到增強。
在這一步優化中我們通過構造用戶的 APP 下載行為序列圖,并通過隨機游走的方式生成新的用戶行為,極大的提高了長尾 APP 的訓練樣本量,解決長尾 APP 學習不充分的問題。但是這里 APP 下載行為序列圖的在隨機游走的過程中并沒有體現上文 APP 對下載行為的影響。
4.3 圖游走+約束采樣
在應用寶的相關推薦場景中,以詳情頁、OMA 場景為例:進入詳情頁有一個前置行為,即用戶首先需要點擊上文 APP,才有可能進入到詳情頁。OMA 場景則需要用戶點擊下載上文 APP,才會出現相關推薦卡片。
比如我們在首頁中展示的 APP feeds 如下圖,以第一個 APP “七貓免費小說”為例,當我們點擊七貓免費小說后,我們會進入詳情頁,當我們點擊下載按鈕,會彈出 OMA(one more app)卡片。
圖9 詳情頁、OMA相關推薦邏輯示意圖這里都表達了用戶的對上文也是感興趣的,但是上文的信息在傳統的 word2vec 或隨機游走算法中并沒有考慮。因此在這里我們通過對 randomWalk 的引入上文 APP 的約束,只有出現過同上文的 APP 會被采樣,從訓練樣本的層面引入上文 APP 的信息。首先我們在隨機游走概率公式中加入同上文的約束:
其中下面兩個變量分別表示節點 i 和 j 的上文集合:
游走過程的示意圖如下:
圖10 引入上文約束的隨機游走示意圖從圖 9-(b)中可以看到,下半部分我們引入了各個 APP 的上文 APP 信息,并且在(c)中,如 a4->a2->a1->a3->...->am 將不會出現在訓練數據中,因為 a1 和 a3 沒有共同的上文;a5->a6->a1->a3->...->am 也不會出現,因為 a1 和 a6 沒有共同的上文。
通過引入上文約束的隨機游走方式生成的樣本,初步地表達了上文信息對于下載行為序列的影響;后續我們將嘗試更多的圖算法如 GraphSage 在我們場景應用實踐。
比如我們對比可愛女生鬧鐘(長尾 APP)的召回推薦結果,相比傳統的 i2v,i2v+randomWalk 的方式召回結果更加相似。
圖11 i2v召回與i2v+randomWalk 長尾APP召回Case對比圖5.模型優化
上一 part 的優化中,我們主要是從樣本層面對長尾 APP 的稀疏性以及上文的約束性進行優化,接下來我們從模型層面來優化模型的相關性。傳統的 word2vec 模型的損失函數中只有 windonw_size 中的正樣本以及全局隨機采樣的負樣本,借鑒 air-bnb embedding 的思想,我們在損失函數中引入上文 APP 作為序列的全局 context,引入同類目隨機采樣負樣本
在 air-bnb 的 paper?Real-time Personalization using Embeddings for Search Ranking at Airbnb 中,通過引入 booked-listing 作為序列的全局 context,相當于對于這一條用戶行為序列,把 booked-listing 作為正樣本引入到損失函數中。
圖12 AirBnb embedding序列圖5.1 正樣本 Loss 優化
借鑒 airbnb-embeding 的思想,在相關推薦場景中,用戶下載相關 APP 首先是基于對上文 APP 感興趣才會進入詳情頁或展示 OMA 相關 APP,因此把上文 APP 信息引入到模型中一起學習是 make sense。
如下圖是傳統的 SGNE 的損失函數,正樣本為 windown_size 內的 app,負樣本為全局隨機采樣的 APP。
圖13 word2vec損失函數及序列示意圖接下來我們通過引入上文 APP 作為序列正樣本項,在學習序列的相關性的同時,也學習序列與上文 APP 的相關性,我們希望最終學習到的 embedding 表達中,上文 embedding 和下文的 embedding 也盡可能的相似。其中序列的上文app_r選取邏輯為當前 ?target?app_i? 的上文。
圖14 引入上文APP正樣本的損失函數及序列示意圖5.2 負樣本 Hard example 挖掘
在 air-bnb embedding 的 paper 中,作者用同城隨機采樣的方式生成負樣本,并且在損失函數中保留全局隨機負采樣和同城隨機負采樣兩個負樣本損失函數項。在應用寶的相關推薦場景中,我們的做法是,全局隨機負采樣的同時,對當前 APP 的同類目 APP 也進行隨機負采樣。
全局隨機負采樣得到的負樣本可以理解為 easyexample,因為這部分負樣本只有很小的概率是來自 window_size 中的(w,c)組合,模型很容易學習;而對于同類目采樣的得到的負樣本為 hard example,因為這部分樣本本身是有一定的相關性的(同類目),我們希望讓模型能夠學習到同類目 APP 中的內部差異。具體地我們會從當前 app_i 的同一級類目中隨機采樣 APP 作為負樣本。
其中
表示從 m 個同一級類目 app 中隨機采樣的負樣本。
圖15 引入上文APP正樣本及同類目負樣本的損失函數及序列示意圖我們對比兩個 APP 分別小紅書(頭部 APP),可愛女生鬧鐘(長尾 APP)的召回推薦結果,相比傳統的 i2v,模型優化后召回結果與上文 APP 更加相關。
圖16 模型優化的case召回結果對比圖6.小結
為了解決用戶和 APP 的行為稀疏性,我們首先通過拉長數據周期的方式擴充訓練樣本;然后利用 randWalk 的方式,有效提升長尾 APP 的樣本比例,從一定程度上緩解了長尾 APP 的樣本不足導致學習不充分的問題;在模型層面,我們通過引入上文的輔助 loss 使得模型能夠學習到上下文 APP 的相關性,引入當前 APP 同類目的負樣本學習同類目 APP 內部的差異性。
總結
以上是生活随笔為你收集整理的Embedding在腾讯应用宝的推荐实践的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ClickHouse留存分析工具十亿数据
- 下一篇: 首届“开悟AI+游戏高校大赛”启动