騰訊QQ看點團隊:用遷移學習架構解決短影片冷啟推薦問題

機器之心發表於2020-10-31

騰訊QQ看點團隊:用遷移學習架構解決短影片冷啟推薦問題


一、背景

新使用者和冷使用者喜好預測問題一直是推薦系統領域的難題,並廣泛存在於計算廣告、App 推薦、電子商務和資訊流推薦場景。

目前絕大多數解決方案都是基於使用者外部畫像資料進行喜好預測,因此預測準確率嚴重受制於畫像資料準確率,並且使用者畫像資料蒐整合本高,還涉及敏感的隱私問題;另外,據瞭解,即便擁有十分精準的使用者畫像資料,仍然很難針對新冷使用者做到個性化推薦,其點選率和相應的 top-N 指標仍然顯著低於常規熱使用者。

那麼關於使用者冷啟動的場景,有沒有更好的解決辦法呢?最近,騰訊團隊 SIGIR 2020 長文《Parameter-Efficient Transfer from Sequential Behaviors for User Modeling and Recommendation》提出了一種遷移學習架構 PeterRec,專門解決新使用者和冷使用者推薦問題。 

PeterRec 的基本思想是透過自監督學習一個通用的使用者表徵,然後將該使用者表徵應用到下游任務中,例如冷啟動使用者場景(PeterRec 同時可以解決使用者畫像預測)。從論文的實驗結果來看,這種採用自監督預訓練網路學習使用者點選行為的方法可以高效地推測出使用者偏好等資訊。

近年來,遷移學習對CV和NLP領域產生了重大的影響,但尚未被廣泛應用於推薦系統領域,並且據我們調查,推薦系統領域目前相應的遷移學習科研工作都沒有明確的展示出pretrain網路對於下游任務具有positivetransfer效果。而在騰訊,我們具有非常豐富的業務場景,部分業務,例如騰訊影片,QQ瀏覽器具有數億的DAU使用者,並且很多使用者具有數百上千的點選行為,這些海量的使用者點選行為為其他推薦業務場景(例如騰訊新聞,QQ看點,微視,騰訊廣告, 應用寶,微信看一看)新冷使用者提供了豐富的可遷移的知識。

在本文中,由騰訊新聞畫像平臺團隊和看點推薦團隊協力合作,對PeterRec模型進行工程化改造,落地到PCG事業群下面的多個推薦業務中。選擇PeterRec模型除了其較好的個性化推薦能力外,很重要一點,PeterRec可以實現一個pretrain網路服務數十/百個推薦業務場景能力。下面我們選擇兩個影片推薦業務(分別作為source業務端和target業務端),將從模型架構,資料處理,模型實現,後續工作這四個方面來介紹。

二、模型架構

根據預訓練的自監督方式,PeterRec 可以分為單向自迴歸方式(autoregressive)和雙向遮掩式,這一點類似於近期的 NLP 工作,例如 GPT。根據微調階段模型補丁嫁接插入方式又可以分為序列插入(serial)和並行插入(parallel)。這裡只介紹 autoregressive、serial 版本的 PeterRec 模型。

1. 模型框架的輸入輸出

騰訊QQ看點團隊:用遷移學習架構解決短影片冷啟推薦問題

圖 1 模型結構

預訓練階段:

該階段採用單向自迴歸的訓練方式,根據使用者觀看的前 k 個影片預測其可能會看的下一個影片。輸入是使用者在source業務端看過的影片 id 序列 [x_1, x_2, x_3,······, x_n-1],然後透過 embedding lookup 的方式獲取每一個影片的隱向量並輸入到預訓練網路中;輸出是對應的下一個影片 id,即 [x_2, x_3,······, x_n-1, x_n]。可以看到,PeterRec 模型不需要藉助任何影像和文字特徵,僅需要使用者點選影片的 ID 即可,影片的向量表示完全由模型訓練得到,省去了特徵工程的步驟, 這種預訓練方式已經被應用於 CV 和 NLP 領域,並且取得了非常認可的效果,然而並沒有在推薦系統領域得到推廣。

微調階段:

Finetune階段是根據使用者在source業務端觀看記錄,預測其可能會在target業務端感興趣的影片。輸入是[x1, x2, x3,······, xn-1, xn, [CLS] ], 其中[x1, x2, x3,······, xn-1, xn]使用者在source業務端看過的影片ID序列,[CLS]是一個特殊的記號,表示在這個位置輸出分類結果;輸出Label是target業務端的影片ID,即預測使用者在target業務端可能會看的top-N個影片ID。

2. 模型的網路結構

預訓練階段:

在模預訓練階段,我們將其看作一個超大多分類問題。輸入的影片 ID 序列經 embedding_lookup 操作後,提供給後面的空洞卷積網路。整個空洞卷積網路由若干個 residual block(如下圖 (a) 所示)堆疊構成。每個 block 包含兩個空洞卷積層(DC layer),每層的空洞因子以 2^n 增加。最後透過一個 softmax 層預測出下一個影片。
相較於其他時序模型如 RNN、Transformer 等,PeterRec 模型基於空洞卷積神經網路構建大規模預訓練模型,同時透過疊加空洞卷積層達到可視域指數級的增加,這種網路結構使得它在對超長的使用者點選序列進行建模時更加高效。而相比之下,RNN 模型在對超長序列建模時,通常會遇到梯度消失和梯度爆炸的問題;而像 Transformer 這類 self-attention based 的模型,時間複雜度和視訊記憶體需求會隨著序列長度以二次方的級別增加。
           

騰訊QQ看點團隊:用遷移學習架構解決短影片冷啟推薦問題

圖 2:residual block 和模型補丁

微調階段:

為了實現對預訓練網路引數的最大化共享,微調階段僅對預訓練模型做了兩處改動:

1)在 residual block 中以序列的方式插入模型補丁(如上圖 (b) 所示),每個模型補丁由一個瓶頸結構的殘差塊構成(如上圖 (f) 所示),且引數量不到原始空洞卷積的十分之一;
2)直接移除預訓練 softmax 層,然後新增新任務的分類層。

微調通常要重新訓練整個網路,並更新模型所有引數,因此從引數量的角度來看,微調是非常低效的。相比這種微調所有引數的方式,PeterRec 模型在微調階段僅對模型補丁和新任務的 softmax 層中的引數進行更新,引數量大大減小的同時卻可以達到與微調所有引數相當甚至更好的效果。而且,由於僅有少數引數參與更新,PeterRec 模型還具有很好的抗過擬合能力。

3. 損失函式

預訓練階段:

預訓練階段採用 softmax 的多分類交叉熵損失函式。在實際操作中,source業務端中的影片經過各種過濾 ID 對映後還有數百萬級別的有效影片。如果採用 full softmax,訓練效率會很低,所以這裡採用了 tf.nn.sampled_softmax_loss,實際只取樣了 20% 的 item 作為負樣本用做訓練,當然其他 efficient 取樣和 loss 設定也同樣適用,例如 NCE loss 或者下文提到的 LambdaFM 方式。

微調階段:

對於排序場景,pairwise 類方法要比 pointwise 類方法(直接看做分類或者回歸)更合適,所以微調階段採用了 pairwise ranking loss (BPR)。pairwise loss 構造樣本時我們同時考慮兩個 item 比如 x_i 和 x_j,這兩個 item 是有順序的,比如使用者在排序列表裡點選了 x_i,而未點選 x_j,我們可以看做 x_i 要優於 x_j。

因此,我們需要為每一個真實物品 label(y)取樣一個負樣本 y-,透過計算使用者的隱向量與 y 和 y- 的隱向量的內積作為兩個 item 的打分 o_y 和 o_y-,然後算出最終的 BPR loss:

騰訊QQ看點團隊:用遷移學習架構解決短影片冷啟推薦問題


具體取樣時採用 LambdaFM(CIKM2016)方式,其效果顯著好於隨機取樣和僅僅使用曝光未點選作為負樣本的方式。

三、資料處理

這裡介紹我們在最佳化模型過程中幾個有效的資料處理方法:

1、item 過濾與編碼

過濾:

由於涉及到不同業務資料,從source業務端得到使用者的原始觀看序列後,需要過濾一些過熱或過冷的影片item(過熱的影片沒有區分度,無法看出使用者特定的偏好;過冷的影片由於出現次數少,模型學得的隱向量很難準確反映影片的資訊,並且沒有充分的訓練,很容易成為噪聲而影響最終效果)。過濾後,source業務端的影片數量在200w+的級別。

編碼:

在預訓練階段,我們採用了 sampled_softmax_loss 來代替 full softmax loss,tensorflow 的 sampled_softmax_loss 函式在進行負取樣時,是透過 log_uniform_candidate_sampler 進行的,使用這個 sampler 的效果是:item 編號越小,它被取樣為負樣本的機率越大。針對這種情況,我們在對影片 item 進行編號時,按照 item 在播放序列中的出現次數降序排列,然後從 0 開始編號。(原因可見下文「LambdaFM 負取樣」)。微調階段則採用 BPR loss,沒有用到 log_uniform_candidate_sampler,因此可以不用按 item 頻率進行編號。

2、樣本構造

預訓練階段:

首先,我們先從source業務端的流水資料中拿到使用者a的播放序列。經過過濾(根據影片的播放時長和完播率,過濾掉自動播放的影片)和去重(對原始播放序列的相鄰item去重)後, 取使用者a最新的50個播放影片作為一個pretrain的訓練樣本[x1, x2, x3,······, x50](若使用者的播放序列長度不足50,則在前面填充[PAD])。使用者播放序列行為可以根據計算資源設定,如果具有較充足的計算資源,可以設定行為序列為更大,例如200甚至1000。

微調階段:

以相同方式從target業務端的流水資料中拿到使用者a的播放行為[y1 y2, y3,······, ym]。 這時,根據使用者a在source業務端和target業務端的播放序列,我們可以為使用者a構造m條finetune的訓練樣本:[x1, x2, x3,······, x50, [CLS], y1], [x1, x2, x3,······, x50, [CLS], y2], ...... , [x1, x2, x3,······, x50, [CLS], ym]。(需要注意的是,只有source業務端和target業務端的交集使用者才能用於構造finetune的訓練樣本,預測時候則不需要。)

3、樣本選擇

經過上述處理,對於不同觀看歷史的使用者,PeterRec 模型預測出來的 top-N 結果已經具有一定的相關性。實際的 case 分析顯示,這些強相關影片仍然容易出現得分較低於高頻 item 的情況,如排在 top100 之外,但是在頭部都出現了 item vocab 中最熱的那些影片,由此可見高頻 item 對模型的影響還是很大。為了緩解 top-N 推薦結果中的頭部效應問題,減少高頻 item 對模型的影響,我們嘗試了不同的均衡正負樣本的策略,其中下列兩種較為有效:

高頻降取樣

Word2vec 的實現中,會指定一個機率 P(wi) 對高頻詞進行打壓,同時保留所有的低頻詞。實際原始碼中,高頻詞在每個樣本中被保留的機率實現如下:
 
轉換成公式就是:

騰訊QQ看點團隊:用遷移學習架構解決短影片冷啟推薦問題


其中,引數 sample 用於控制降取樣的程度,sample 值越小,降取樣強度越大,實際使用中需要根據 item 的頻率分佈來確定,一般取 0.001 ~ 0.00001。

於是,我們在構造finetune訓練樣本的時候,先根據機率分佈對使用者在target業務端的播放序列[y1 y2, y3,······, ym]進行一次降取樣,按照一定比例丟棄一些高頻的影片item。然後再與其在source業務端的播放序列做拼接,得到finetune的訓練樣本。

LambdaFM 負取樣:

關於負取樣,常用的做法有兩種:1)採用曝光未點選作為負樣本;2)從總的候選池子中隨機取樣。

我們發現(1)方法效果較差,因此採用從候選 item 池子隨機選擇 itemID,但這種方式仍然存在一定的缺陷,它取樣出來的樣本多數集中在長尾處,LambdaFM 論文中是這麼描述的:

In fact, it has been recognized that item popularity distribution in most real-world recommendation datasets has a heavy tail, following an approximate power-law or exponential distribution. 
Accordingly, most non-positive items drawn by uniform sampling are unpopular due to the long tail distribution, and thus contribute less to the desired loss function. Based on the analysis, it is reasonable to present a popularity-aware sampler to replace the uniform one before performing each SGD.


這裡 popularity-aware sampler 的意思是讓更受歡迎的 item 有更大的機率被取樣為負樣本,這其實是符合直覺的,因為相比那些不受歡迎且使用者沒有觀看的影片,那些受歡迎但使用者沒有觀看的影片更具資訊量,更能幫助我們發現使用者的偏好。我們發現 LambdaFM 論文提供了 3 種負取樣方法,本文這裡採用了第一種負取樣方式,在後續工作我們也會嘗試動態負取樣,根據論文動態負取樣通常推薦 top-N 效果更好。

微調訓練過程中,我們採用了 LambdaFM 中的 Static & Context-independent Sampler 進行負取樣,即影片 j 被取樣為負樣本的機率 pj 與它的熱度排名 rank(j) 呈正相關:

騰訊QQ看點團隊:用遷移學習架構解決短影片冷啟推薦問題


其中,rank(j) 表示影片 j 在所有影片 item 集合 I  中的熱度排名,ρ 表示閾值,通常取 0.3-0.5。

4、Predict 處理

前面的處理過程已經可以很精準的實現target業務端影片推薦的個性化或者相關性,我們隨機挑選了兩個例項見表1。 同時,還能有效處理使用者在source業務端和target業務端的偏好不一致的問題:在具體的case分析中,我們發現部分使用者在source業務端看的大多是卡通類的影片,而在target業務端很少看這類影片,此時,PeterRec模型推出的影片是更接近於他們在target業務端看過的真實影片的,而非卡通類的影片。 我們推測主要原因可能是該部分使用者在source業務端大多是學齡兒童甚至是學齡前期,主要是使用其父母賬號觀看source業務端,而在target業務端賬號大多是其父母在使用,因此推出的影片偏向於年輕父母偏好。

騰訊QQ看點團隊:用遷移學習架構解決短影片冷啟推薦問題

表 1:target業務端的新冷使用者推薦示例


後續為了增加推薦 top-N 結果中的多樣性,我們在 Predict 的過程中做了一些改變:
 

騰訊QQ看點團隊:用遷移學習架構解決短影片冷啟推薦問題

圖 3:Predict 處理


如上圖所示,我們在為使用者生成推薦列表時,不再是直接將使用者在source業務端的播放序列輸入到模型中,我們將其拆分成了兩類子序列:

第一類是播放序列裡的有效播放序列的子串。取子串的原因是,我們發現,使用者觀看的相鄰影片之間興趣點比較一致,也就是使用者會在某個時刻連續觀看一些同類的影片。這使得子串裡的影片大多屬於同一類,使用者的興趣點明確,更有利於模型找到使用者的偏好。

第二類是從使用者的有效播序列中隨機取樣一些 item 來構造子序列,原因是使用者的播放序列中往往包含了多個種類的影片,隨機構造子序列引入了隨機性,可以更好地豐富 top-N 結果中包含的影片種類。

最後將使用者對應的所有子序列的 top-N 結果,進行 concat、shuffle 和去重,得到使用者最終的 top-N 推薦列表。

四、模型實現

模型程式碼是由參考原始論文原始碼,採用 tensorflow estimator + tf.data + spark-fuel 框架實現,完整程式碼可參考 git

1、輸入處理

Google 官方推薦處理中大資料集時,先將資料集轉化為 TFRecord 資料,這樣可加快資料讀取和預處理中的速度。因此,我們先使用 spark 對訓練資料進行處理,然後轉成 TFRecord 的格式傳到 hdfs 上。TFRecord 做好了,要怎麼讀取呢?可以透過 tf.data 來生成一個迭代器,每次呼叫都返回一個大小為 batch_size 的 batch,這樣可以很方便地支援多執行緒讀取資料。關於如何最佳化 input pipeline 的效能,可參考 Better performance with the tf.data API、How to improve data input pipeline performance?
需要注意的是,預訓練階段和微調階段的 click_id_list 長度是不一樣的。
 

騰訊QQ看點團隊:用遷移學習架構解決短影片冷啟推薦問題

圖 4:讀入 TFRecord

2、模型構建

PeterRec 模型的網路結構比較簡單高效,且空洞卷積的使用也使得模型能夠並行訓練和降低視訊記憶體需求,這裡直接複用了原始碼中的模型結構和模型補丁結構。另外,在採用 PS 策略進行分散式訓練時,為了均衡 ps 節點的負載和加速訓練,最好是對模型引數做分割槽,以便模型引數被均勻分配到各個 ps 上。
 

騰訊QQ看點團隊:用遷移學習架構解決短影片冷啟推薦問題


圖 5:預訓練網路結構

3、模型訓練

模型訓練的過程採用 tf. Estimator 實現。tf.Estimator 的特點是:既能在 model_fn 中靈活的搭建網路結構,也不至於像原生 tensorflow 那樣複雜繁瑣。相比於原生 tensorflow 更便捷、相比與 keras 更靈活,屬於二者的中間態。 

實現 tf.Estimator 主要分三個部分:input_fn、model_fn、main 三個函式。其中 input_fn 負責處理輸入資料,model_fn 負責構建網路結構,main 來決定要進行什麼樣的任務(train、eval、predict 等)。input_fn 在上文「輸入處理」一節中已經介紹過,這裡只介紹 model_fn 和 main 函式。

model_fn 函式:模型的網路結構、loss 已在上一節中介紹過,這裡只給出了定義 train_op 的部分。這裡採用了同步更新機制,每個 worker 節點直接訪問外部儲存系統(hdfs)獲得一個 batch,然後計算 loss 和 gradient,彙總到 PS 節點,當所有 worker 節點都完成一個 batch 時,才更新一次引數;在實際實驗中,我們透過調節 replicas_to_aggregate,我們透過忽略幾個速度慢的 worker 梯度來加速訓練 。
 

騰訊QQ看點團隊:用遷移學習架構解決短影片冷啟推薦問題

圖 6:model_fn 函式

main 函式:有了輸入資料 input_fn 和模型 model_fn,main 函式就負責如何使用模型和資料。這裡使用 train_and_evaluate 來一邊訓練一邊輸出驗證集效果。另外,hook 可以看作是在訓練驗證基礎上實現其他複雜功能的「外掛」,比如本例中的 EvalHooks(用於計算 NDCG 等評估指標)。
 

騰訊QQ看點團隊:用遷移學習架構解決短影片冷啟推薦問題

圖 7:main 函式

4、離線打分

離線打分時,採用 spark-fuel 的分散式預測方式,如下圖所示。需要注意的是,預測過程其實就是一個 Spark 作業,沒有 TensorFlow Cluster,每個 Spark Task 中透過 TensorFlow API 載入模型,對 RDD Partition 中的每條資料做推理。
 

騰訊QQ看點團隊:用遷移學習架構解決短影片冷啟推薦問題

圖 8:分散式預測

在模型的預測階段,我們需要對每一個模型輸出的使用者向量(即 [CLS] 對應的最後一個 hidden layer 的輸出),快速求出最相關的 Top-K 個影片,如下圖所示。當 item 數量較大時,下圖中直接計算內積的速度會比較慢,可以採用 faiss 的 IndexHNSWFlat 來完成 Top-K 的查詢。參考長影片推薦:基於歐氏轉換的 top-k 內積解決方案。
 

騰訊QQ看點團隊:用遷移學習架構解決短影片冷啟推薦問題

圖 9:預測階段求 top-K

五、後續工作

後續我們將推進PeterRec在其他業務場景上的嘗試(包括畫像預測), 充分利用PeterRec的引數高效特性優勢, 同時騰訊新聞畫像平臺團隊和看點推薦團隊近期將釋出PeterRec完整的工程化程式碼和配套遷移學習資料集用於學界和業界研究使用。

另外,騰訊看點推薦團隊近期推出使用者表徵的 lifelong learning(文獻 4)模型 Conure,是首個能實現不同推薦任務,不同業務場景間的可持續學習演算法模型, 離線實驗結果顯示該方法可以實現一個模型支援數十個推薦業務,尤其擅長解決冷啟動問題和畫像預測問題。如果各個下游任務之間存在一定的關聯性,那麼 Conure 可以比 PeterRec 取得更好的預測準確率

參考文獻:
[1] A Simple Convolutional Generative Network for Next Item Recommendation. Yuan et al, 2019, WSDM.
[2] Parameter-Efficient Transfer from Sequential Behaviors for User Modeling and Recommendation. Yuan et al, 2020, SIGIR.
[3] LambdaFM: Learning Optimal Ranking with Factorization Machines Using Lambda Surrogates. Yuan et al, 2016, CIKM.
[4] One Person, One Model, One World: Learning Continual User Representation without Forgetting. Yuan et al, 2020, Arxiv: https://arxiv.org/pdf/2009.13724.pdf.

相關文章