Embedding在騰訊應用寶的推薦實踐

騰訊技術工程發表於2020-08-20

Embedding 技術目前在工業界以及學術界中應用非常廣泛,關於 Embedding 的探索和應用從未停歇。Embedding 的訓練方法主要分成 DNN 的端到端的方法以及序列學習的非端到端的方法,其中最經典的 word2vec 以及由此衍生出 sentence2vec,doc2vec,item2vec 等都屬於非端到端的學習方法;本文主要介紹 Embedding 技術的非端到端學習方法在應用寶推薦場景的應用實踐。

1.經典的 word2vec 模型

word2vec 模型的問世,極大的促進了 Embedding 技術的發展。下面我們先從 word2vec 模型切入,簡單介紹一下 embedding 的推導過程。以業界最廣泛使用的 Skip-gram+negative sampling 為例。

損失函式如下所示:

Embedding在騰訊應用寶的推薦實踐

其中 a 表示當前中心詞,c 表示序列上下文詞,Dp 為 window_size 中的詞集合,Dn 為全域性隨機取樣的負樣本集合。損失函式中左半部分為正樣本的損失函式項,右半部分為負樣本的損失函式項。

為什麼正樣本和負樣本能夠透過加法的方式組合起來構成損失函式呢?首先,原始的 skip-gram 模型的損失函式(1)如下:

Embedding在騰訊應用寶的推薦實踐

其中 w 為中心詞,c 為 w 的上下文單詞,D 為訓練集中 w 和 c 的 pair 對,θ 為需要學習的引數;我們可以把這個最佳化問題轉化為一個分類問題,利用 softmax 函式展開後:

Embedding在騰訊應用寶的推薦實踐

我們得到如下格式的函式(2):

Embedding在騰訊應用寶的推薦實踐

其中 vc 和 vw 分別為中心詞和上下文詞的 embedding,C 為訓練集中所有上下文單詞的集合。接著我們可以對損失函式(1)進行 log 變換得到(3):

Embedding在騰訊應用寶的推薦實踐

由於需要對所有的上下文單詞集合進行計算,公式(3)的計算複雜度非常高,所以 Negative sampling 的訓練方式應運而生。Negative sampling 的思想本質上是一個二分類的問題,即預測(w, c)pair 是否存在訓練集中。我們用公式:

Embedding在騰訊應用寶的推薦實踐

表示(w, c) 存在訓練集的機率,相應的:

Embedding在騰訊應用寶的推薦實踐

表示(w, c)不存在訓練集中的機率。此時的我們的損失函式(4)如下所示:

Embedding在騰訊應用寶的推薦實踐

即我們把實際出現過的(w, c) pair 對當成了正樣本,損失函式的目標就是希望能學習到引數 θ 來最大化(w, c)作為正樣本的機率,透過對:

Embedding在騰訊應用寶的推薦實踐

進行 sigmoid 函式和 log 轉換,我們得到了上式右半部分的公式,如此便得到了我們正樣本的損失函式表達。但是並不是所有(w,c)pair 對都來自訓練集合,因此需要構造一些負樣本來修正損失函式擬合正樣本的機率表達,最終 SGNE 的損失函式如下所示:

Embedding在騰訊應用寶的推薦實踐

其中 D‘即為全域性隨機取樣的負樣本。

2.應用寶相關推薦場景介紹

接下來我們來介紹一下 Embedding 技術在應用寶相關推薦場景中的應用實踐。首先,簡單介紹一下應用寶相關推薦場景的概況。應用寶相關推薦場景主要包括詳情頁、OMA(one more app)以及下載管理和應用更新。推薦的方式主要是根據上文 APP(詳情頁當前 APP、OMA 正在下載的 APP)召回相關 APP 進行推薦。

Embedding在騰訊應用寶的推薦實踐
圖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,兩者並沒有相關性。

Embedding在騰訊應用寶的推薦實踐
圖3 使用者行為序列示意圖

因此我們以天為 session 粒度,重新構建使用者的下載行為序列。在序列長度的設定上,過短的序列,無法有效表達行為之間的相關性,不利於模型學習 APP 的 embedding 表達。在我們相關推薦場景中,設定的閾值為 5。模型訓練方式採用傳統的 Skip-gram+negative sampling 的方式訓練。透過拉長資料週期的方式擴充訓練樣本,使得我們的訓練樣本資料增長了 5 倍。

4.2 引入圖隨機遊走模型

在上一步的迭代中,雖然我們透過拉長資料週期的方式擴充訓練樣本,但是由於使用者行為的稀疏性,天級別 session 粒度的下載序列樣本非常少,僅佔 5%,因此並不能很好的解決長尾 APP 學習困難的問題。

因此借鑑圖遊走演算法的思想,我們利用使用者的 APP 下載序列,構造使用者的下載行為圖,並在圖中做隨機遊走,生成新的行為序列。

Embedding在騰訊應用寶的推薦實踐
圖4 隨機遊走示意圖

如上圖所示,我們有三個原始的使用者行為序列 u1/u2/u3,其中 a 表示行為 APP。首先我們把序列中各個 APP 抽取出來構造圖節點,序列的先後行為發生關係構造節點之間的有向邊來構造 APP 的行為轉換圖(如圖 4-(b)圖所示),接著我們在圖中進行隨機遊走,生成長度為 m 的新的行為序列作為我們的訓練資料。

其中隨機遊走的機率公式如下:

Embedding在騰訊應用寶的推薦實踐

其中鄰接矩陣以圖 4-(a)圖三個原始行為序列為例,鄰接矩陣如下所示:

Embedding在騰訊應用寶的推薦實踐
圖5 使用者行為序列鄰接矩陣圖

下圖為 randomwalk 後 app 的樣本分佈圖:

Embedding在騰訊應用寶的推薦實踐
圖7 APP樣本分佈圖
Embedding在騰訊應用寶的推薦實踐
圖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)卡片。

Embedding在騰訊應用寶的推薦實踐
圖9 詳情頁、OMA相關推薦邏輯示意圖

這裡都表達了使用者的對上文也是感興趣的,但是上文的資訊在傳統的 word2vec 或隨機遊走演算法中並沒有考慮。因此在這裡我們透過對 randomWalk 的引入上文 APP 的約束,只有出現過同上文的 APP 會被取樣,從訓練樣本的層面引入上文 APP 的資訊。首先我們在隨機遊走機率公式中加入同上文的約束:

Embedding在騰訊應用寶的推薦實踐

其中下面兩個變數分別表示節點 i 和 j 的上文集合:

Embedding在騰訊應用寶的推薦實踐
Embedding在騰訊應用寶的推薦實踐

遊走過程的示意圖如下:

Embedding在騰訊應用寶的推薦實踐
圖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 的方式召回結果更加相似。

Embedding在騰訊應用寶的推薦實踐
圖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 作為正樣本引入到損失函式中。

Embedding在騰訊應用寶的推薦實踐
圖12 AirBnb embedding序列圖

5.1 正樣本 Loss 最佳化

借鑑 airbnb-embeding 的思想,在相關推薦場景中,使用者下載相關 APP 首先是基於對上文 APP 感興趣才會進入詳情頁或展示 OMA 相關 APP,因此把上文 APP 資訊引入到模型中一起學習是 make sense。

如下圖是傳統的 SGNE 的損失函式,正樣本為 windown_size 內的 app,負樣本為全域性隨機取樣的 APP。

Embedding在騰訊應用寶的推薦實踐
圖13 word2vec損失函式及序列示意圖

接下來我們透過引入上文 APP 作為序列正樣本項,在學習序列的相關性的同時,也學習序列與上文 APP 的相關性,我們希望最終學習到的 embedding 表達中,上文 embedding 和下文的 embedding 也儘可能的相似。其中序列的上文app_r選取邏輯為當前  target app_i  的上文。

Embedding在騰訊應用寶的推薦實踐
圖14 引入上文APP正樣本的損失函式及序列示意圖

5.2 負樣本 Hard example 挖掘

在 air-bnb embedding 的 paper 中,作者用同城隨機取樣的方式生成負樣本,並且在損失函式中保留全域性隨機負取樣和同城隨機負取樣兩個負樣本損失函式項。在應用寶的相關推薦場景中,我們的做法是,全域性隨機負取樣的同時,對當前 APP 的同類目 APP 也進行隨機負取樣。

全域性隨機負取樣得到的負樣本可以理解為 easyexample,因為這部分負樣本只有很小的機率是來自 window_size 中的(w,c)組合,模型很容易學習;而對於同類目取樣的得到的負樣本為 hard example,因為這部分樣本本身是有一定的相關性的(同類目),我們希望讓模型能夠學習到同類目 APP 中的內部差異。具體地我們會從當前 app_i 的同一級類目中隨機取樣 APP 作為負樣本。

其中

Embedding在騰訊應用寶的推薦實踐

表示從 m 個同一級類目 app 中隨機取樣的負樣本。

Embedding在騰訊應用寶的推薦實踐
圖15 引入上文APP正樣本及同類目負樣本的損失函式及序列示意圖

我們對比兩個 APP 分別小紅書(頭部 APP),可愛女生鬧鐘(長尾 APP)的召回推薦結果,相比傳統的 i2v,模型最佳化後召回結果與上文 APP 更加相關。

Embedding在騰訊應用寶的推薦實踐
圖16 模型最佳化的case召回結果對比圖

6.小結

為了解決使用者和 APP 的行為稀疏性,我們首先透過拉長資料週期的方式擴充訓練樣本;然後利用 randWalk 的方式,有效提升長尾 APP 的樣本比例,從一定程度上緩解了長尾 APP 的樣本不足導致學習不充分的問題;在模型層面,我們透過引入上文的輔助 loss 使得模型能夠學習到上下文 APP 的相關性,引入當前 APP 同類目的負樣本學習同類目 APP 內部的差異性。

相關文章