您當前的位置:首頁 > 繪畫

推薦系統-預測使用者對標籤的興趣-User-tag Profile Model-UTPM-論文復現-Part 2 模型細節

作者:由 Kunverse 發表于 繪畫時間:2022-04-05

1 綜述

本篇文章,依然是對騰訊2020年的論文Learning to Build User-tag Profile in Recommendation System進行講解,如何使用深度學習模型代替傳統的統計方法,來準確地預測使用者對於標籤的興趣度。但本篇文章的側重點是模型細節,對於UTPM的原理概述和使用場景講解,不清楚的朋友,可以先移步這篇文章推薦系統-預測使用者對標籤的興趣-User-tag Profile Model-UTPM-論文復現-Part 1 原理講解

2 模型細節

模型一共有5個部分構成:

Feature input layer, Attention fusion layer, Cross feature layer, Fully connet layer, Predicting layer。

我們逐層來進行講解。

但是,首先我還是需要再強調的是,模型在訓練時是一個二分類問題,但在預測時,我們要輸出的不是0/1或者一個機率值,而是user embedding或者使用者對Top N標籤的興趣度。對這一點不清楚的朋友,建議移步上一篇文章,謝謝。

2。1 Feature input layer - 特徵輸入層

推薦系統-預測使用者對標籤的興趣-User-tag Profile Model-UTPM-論文復現-Part 2 模型細節

圖2-1-1 - 輸入特徵

UTPM是一個強使用者側特徵的模型,並且輸入的特徵都必須是

類別型特徵

。由圖中可以看到,item側只有tag一個特徵;而user側,則和平常我們搭建模型時一樣,有很多特徵的輸入,人口統計學特徵、從使用者行為中抽取到的特徵等等。

這些類別型特徵可以分為兩類,

One-hot

特徵和

Multi-hot

特徵;對於

連續型特徵

,按照這個模型的思路,只能將其離散化成類別型特徵來使用。

並且需要注意的是,user側和item側的tag,為了保持tag的Embedding在模型兩側意義的一致性,共享Embedding Table。同時,這麼做也可以減少計算量。

2。2 Attention fusion layer

2。2。1 Why attention

通常,我們將特徵Embedding之後得到vector,都會面臨著如何處理多個的vector的問題。一般有2種解決辦法:(1)Pooling(2)concat

但是這兩種方法都有一個問題,就是我們在進行以上兩種操作時,我們一視同仁地看待所有vector,它們都同樣重要,沒有區分度,這顯示是不合理的。因為我們的注意力不是平均分配的,不同的特徵對我的影響不同,我們應該對其進行區別對待,所以才有了後來Attention機制的引入。

Attention機制有很多種,這裡,UTPM使用的是Hierarchical Attention Networks for Document Classification,一種很簡單的Multi-head Attention:輸入資料經過啟用函式為Relu的Dense,然後和向量

q

相乘,透過Softmax計算Attention score。不同的head,代表不同的向量變換空間。

推薦系統-預測使用者對標籤的興趣-User-tag Profile Model-UTPM-論文復現-Part 2 模型細節

圖2-2-1-1 - UTPM使用的Attention公式

在同一個域內,作者使用Attention將Multi-hot特徵得到的多個向量進行融合,代替傳統的Pooling操作,這是第一層融合:

推薦系統-預測使用者對標籤的興趣-User-tag Profile Model-UTPM-論文復現-Part 2 模型細節

圖2-2-1-2 - 域內向量融合

然後,又透過Attention將不同的域向量,再進行融合,代替傳統的concat操作,這是第二層融合:

推薦系統-預測使用者對標籤的興趣-User-tag Profile Model-UTPM-論文復現-Part 2 模型細節

圖2-2-1-3 - 不同的域向量融合

2。2。2 向量q的共享

推薦系統-預測使用者對標籤的興趣-User-tag Profile Model-UTPM-論文復現-Part 2 模型細節

圖2-2-2-1 - q向量的共享

這個

q

-query向量比較特殊。

我們把

綠色

的計算路徑看作

計算空間1

,把

紫色

的計算路徑看作

計算空間2

。在每一個空間內,都有2層Attention fusion,第一層是每一個域內的向量融合,第二層是不同的域之間向量的融合。而在每一個空間內的2層Attention,共享同一個

q

It is worth mentioning that while merging these features in the first head of attention, the same query vector

q

1 is shared in all attention units within and across fields, thus the same evaluation criterion of feature usefulness is learned together in all attention units。 We argue that learning from features of different fields with a shared query vector helps build a more robust and accurate selection criterion than learning from each separate field with different query vectors, especially for fields with sparse features。

據作者說,之所以進行

q

的共享,是為了在同一個計算空間內的2層Attention中,共享學習到的不同特徵的重要度,從而有助於打造一個穩健並且準確的特徵選擇機制。

關於這個說法,我覺得Fancy大於實際,他這麼一說,我們這麼一聽,就完了。當然,也可能是我沒有科學素養,並且以小人之心度君子之腹。說不定你在使用時,這個

q

向量加與不加,最後的結果確實有天壤之別。

此處插一句,小弟我孤陋寡聞,一開始我在看論文時,沒細看,一看到Multi-head attention, query vector這兩個關鍵字,我立即理解成了Attention Is All You Need的Multi-head attention,然後改一下,共享

q,k,v

中的

k, v

照舊,改一下把

q

改成共享的,然後按照這個理解去搭模型了。然後幾經周折也搭出來了,但最後發現我給整複雜了,很尷尬。然後我想著將錯就錯,這也算是個創新吧,於是就把這個做法拿去申請專利了,然後就沒有然後了。

2。3 Cross feature layer

推薦系統-預測使用者對標籤的興趣-User-tag Profile Model-UTPM-論文復現-Part 2 模型細節

圖2-3-1 - Cross feature layer

這一層的計算,我們可以用MOE的視角來看。在之前的經過2個計算空間內的計算之後,我們得到2個長度相同的向量,然後將它們cocat後得到一個長向量v_cross_layer_input,然後將之分別送入兩個不同的expert進行計算。

左邊的expert_left,簡單的線性變換,所見即所得;

右邊的expert_right,計算過程稍微複雜一點。假設現在 v_cross_layer_input 的長度是6,那麼我們會根據v_cross_layer_input的索引,對其每一個索引位置再進行一個隱向量的對映,然後該位置對應的隱向量和該位置中v_cross_layer_input的值相乘。如圖中所示,v_cross_layer_input的第一維索引是1,該位置的隱向量是一個3維的

v_1

v_1*x_1

得到一個新的中間向量

tmp1

,然後

tmp_1。。。tmp_6

之間再兩兩進行Element-wise相乘再相加,最終得到一個長度為

\frac{6*(6-1)}{2}=15

的向量。這個過程可以類比FM來看。這一步在實現過程中是一個難點,因為一旦把向量之間的每一維進行兩兩相乘這個操作,放到一個batch的操作尺度上,難度就變大了。

推薦系統-預測使用者對標籤的興趣-User-tag Profile Model-UTPM-論文復現-Part 2 模型細節

圖2-3-2 - expert_right的輸出結果

我們可以把expert_right的操作,當作是DNN的變種,以此來構造inexplicable的特徵交叉。我們可以在實際操作中,把這個部分替換成一個2-3層的DNN。當然,這樣就沒有創新,就不Fancy啦。

2。4 Fully connet layer

推薦系統-預測使用者對標籤的興趣-User-tag Profile Model-UTPM-論文復現-Part 2 模型細節

圖2-4 - Fully connet layer

Fully connet layer有2層。

首先,來自於Cross feature layer左右2個Expert輸出的結果,先各自經過一層啟用函式為Relu的Dense,然後兩側的結果concat起來,形成一個新的向量

tmp

;然後,

tmp

再經過一層Dense,同樣,啟用函式是Relu,但是這一層的輸出結果要和tag的Embedding table中向量的維度保持一致。

Fully connet layer的輸出結果,

就是

user embedding

2。5 Predicting layer

這一層的靈活性非常大,我們可以把tag的預測候選集,當作一個特徵輸入,然後直接和user embedding計算,輸出最後結果,使用者對Top N標籤的興趣的;也可以,在這一層,只構造Joint loss的計算,但是輸出仍然是輸出上一層user embedding,待模型訓練好後,匯出tag的Embedding table,再拿到tag候選集對應的向量,再去和user embedding計算輸出結果。我自己在使用時,選擇的是後一種策略,因為這樣處理起來更靈活,user embedding我存起來還可以做其它用途。關於Joint loss的討論,請見上一篇文章的

3.3 模型預測

3 程式碼實現

這是我自己搭的程式碼:Czkonverse/UTPM: Model implementation of paper - Learning to Build User-tag Profile in Recommendation System - UTPM (github。com)

我是狗,程式碼寫的醜。這裡要特別感謝DeepCTR團隊,我在搭建的過程中使用了他們的特徵包裝類,也從中學習了很多的搭建方法。

執行環境,tensorflow/tensorflow:2。8。0-jupyter-gpu映象,不需要安裝其它包。關於如何基於Docker搭建深度學習環境,請見文章Docker搭建-Tensorflow&Pytorch+JupyterNotebook深度學習環境+Pycharm除錯-Part 1以及Docker搭建-Tensorflow&Pytorch+JupyterNotebook深度學習環境+Pycharm除錯-Part 2。

但在預測結果輸出的部分,我沒有放出來,因為我寫的時候和業務高度粘合了。而且也不難,向量element-wise相乘再相加,根據score降序排列取Top N,對應的score再過個sigmoid,然後結果存hive。

4 實際效果

之前線上有分流做過實驗,引擎用這個結果進行召回,其它流程不動,CTR最多能提升2個點。還是很值得大家試一試的,當然,還是得強調,這 ,是在我的場景下進行測試的結果,在您的場景,說不定有奇效。

5 Acknowlegement

非常感謝

LCJ-小小楓葉子

RG

CYP

,在我模型搭建和上線過程中對我的幫助;同時,非常感謝淺夢大佬DeepCTR團隊,讓我學習到很多搭建模型時的技巧。

如果您覺得這篇文章寫的還行,還請您點個贊、收個藏、關個注,這是對我莫大的鼓勵,謝謝。

標簽: 向量  layer  Attention  特徵  tag