CTR預估系列(7)——PNN模型理論與實踐

一、介紹

非常感謝PNN論文作者,上海交通大學曲彥儒同學的耐心講解,PNN細節的地方還是挺多的。作者的github大家也可以關注下:https://github.com/Atomu2014

1.1 名詞解釋

User Response Prediction: 在信息檢索領域(IR,Information Retrieval),個性化任務是一類非常重要的任務。包括:推薦系統、web search、線上廣告。 其核心就是User Respinse Predicton,是指給出用戶關於一個預先定義好的行為的概率。這些行為包括:clicks、purchases。預測的概率代表了用戶對特定物品感興趣的程度,物品包括:新聞、商品、廣告。而這會影響商家對於展示文檔的排序,廣告投標等。

1.2 數據特點

IR問題最大的數據特點就是multi-field categorical,舉例來說: [Weekday=Tuesday, Gender=Male, City=London],經過one-hot之後轉換成高緯度稀疏的數據:

CTR預估系列(7)——PNN模型理論與實踐

一個類別型特徵就是一個field,比如上面的Weekday、Gender、City這是三個field。

1.3 參數約定

我們約定參數含義如下:

N Field個數,也是嵌入向量的個數。

M Embedding Vector的維度。

D1 第一個隱藏層的神經元個數。

lz Product Layer中z對應的輸出,也就是lz乘以全連接權重w就得到了第一個隱層的輸入的一部分。

lp Product Layer中p部分對應的輸出,再經過全連接權重W就得到第一個隱層的輸入的一部分。

二、相關工作

在PNN之前提出了Logistic Regression、GBDT、FM等模型,期待能高效的學習線性與非線性模式,減少人工特徵工程的干預。但是都不是非常理想,像LR GBDT依舊非常依賴人工特徵工程,FM則缺少對高階組合特徵的建模,僅僅對特定階的組合特徵建模。

隨著DNN在圖像處理、語音識別、自然語言處理領域大放異彩,將DNN應用於CTR預估或者推薦系統的研究逐漸多了起來。DNN的輸入往往是dense real vector 但是multi-field類別型特徵起初是高維且稀疏的。常見的做法是通過加入Embedding Layer將輸入映射到低維度的Embedding空間中。FNN使用FM初始化embedding vector,同時也受限於FM;CCPM利用CNN卷積來學習組合特徵,但是隻在相鄰的特徵間卷積,沒有考慮到非相鄰的特徵的組合;

所以有了PNN,主要的做法如下:PNN包括三層:Embedding Layer、Product Layer、Full-connect Layer。

1、最開始的輸入太稀疏維度太高,沒法直接放到DNN中去學習,所以比較通用的做法就是通過Embedding到一個低維的稠密的實數向量中,作為原始特徵的在Embedding空間中的表示。

2、然後PNN利用Product Layer來學習filed之間的交互特徵,這也就引入了非線性的組合特徵。可以採用內積、外積、內積+外積的形式。

3、最後利用全連接層充分的學習高階組合特徵,並得到最終CTR預測概率。

三、損失 & 評價函數

3.1 損失函數

PNN使用的是log loss,形式化如下:

CTR預估系列(7)——PNN模型理論與實踐

3.2 評價函數

論文中給出了幾種常用的評價函數,包括:AUC、log loss、RIG、RMSE。

RIG(Relative Information Gain), RIG = 1 - NE。 NE就是我們上一篇文章LR+GBDT中提到過的Normalized Cross Entropy。

四、PNN詳解

4.1 架構圖

CTR預估系列(7)——PNN模型理論與實踐

我們按照上圖,一層一層的來分析,看看從輸入到輸出,模型有哪些參數,參數的維度大小是多少,哪些需要訓練,哪些不用訓練:

Input:

首先,一個類別型特徵就是一個Field。比如用戶信息包括:性別、職業等,這裡的性別是一個Field,職業是另一個Field。上圖中的Input是one-hot之後的,而且只給出了類別型特徵。所以每個Field i都是一個向量,向量的大小就是類別型特徵one-hot之後的維度。所以不同Field的維度是不同的。

Embedding Layer:

上圖說的非常清楚,Embedding是Field-wisely Connected。什麼意思那?就是每個Field只管自己的嵌入,Field之間網絡的權重毫無關係,自己學習自己的。而且只有權重,沒有bias。一個Field經過嵌入後,得到一個Feature,也就是對應的Embedding Vector嵌入向量。其維度一般是預先設定好的定值,論文中採用的是10. 也就說是不同Feature的維度都是一樣的。

Product Layer:

重點來了,上圖有個地方困擾我很久,最終跟論文作者討論了下終於看懂了。先給出結論:

1、 Product Layer中z中每個圈都是一個向量,向量大小為Embedding Vector大小,向量個數 = Field個數 = Embedding向量的個數。

2、Product Layer中如果是內積,p中每個圈都是一個值;如果是外積,p中每個圓圈都是一個二維矩陣

一個是向量,一個是值(也可能是矩陣),全給畫成圈了(吐槽下……) 解釋下怎麼回事,這裡對於Embedding Vector有兩種處理策略:

1、直接和內積或外積結果拼接,輸入到神經網絡

2、先進行一次線性變換,再和內積或外積結果拼接,輸入到神經網絡

Embedding Layer中的那個1,其實就是直接把Embedding Vector拿來用並沒有進行線性變換。這樣做處理起來很簡單,但是也有個缺點。Embedding Vector和內積項或外積項的數值分佈差異交大,沒有進行線性變換,導致分佈不穩定不利於訓練。不過,聽作者說,在新論文中這個問題已經被很好的解決了,大家拭目以待吧~

在數據流中,假設Field個數為N,那麼經過Embedding後的Field得到了N個Feature,或者說是N個嵌入向量。這N個嵌入向量直接拿過來並排放到z中就是z。這部分代表的是對低維度特徵,或者說原始特徵的建模。

然後,針對這N個嵌入向量,兩兩組合進行Product operation,把結果放到一起就得到了p。首先,N個向量兩兩組合,會產生N(N-1)/2對組合,這就是p中圓圈的個數,或者說神經元的個數。如果是內積運算,那麼每個神經元就是一個實數值;如果進行外積運算,那麼每個神經元就是一個二維矩陣。後面我們詳細討論。

Hidden Layer:

把z和p直接拼接起來,就得到了第一個隱層的輸入。經過多個隱藏層最後給出CTR預測值。 根據Product Layer的操作不同,PNN有三種變體:IPNN、OPNN、PNN*

4.2 IPNN

如果Product Layer使用內積運算,那麼就是IPNN。p中每個神經元都是一個實數值,和z中的嵌入向量拼接起來,餵給神經網絡就行了。

4.3 OPNN

如果Product Layer使用外積運算,就得到OPNN。外積得到的是一個矩陣,所以p中的每個神經元都是一個矩陣。針對兩個M維的嵌入向量e1和e2. 它們外積得到的是M*M的二維矩陣。一共有N個嵌入向量,那麼矩陣就有N(N-1)/2個。那麼一個二維矩陣怎麼輸入到神經網絡中去那?

針對外積產生的每一個二維矩陣,我們都通過另外一個矩陣W,大小為M*M。這兩個矩陣對應位置相乘,再相加,就得到了最終的結果。

也就是說,最終外積產生的二維矩陣,通過和另外一個需要學習的參數矩陣,對應位置相乘,再相加,得到了一個標量,一個實數值。

邏輯上如下圖所示:

CTR預估系列(7)——PNN模型理論與實踐

上圖是最樸素的邏輯,實際寫代碼的時候利用下面的公式來稍微降低下複雜度: 假設兩個嵌入向量,列向量U,V。⊙表示對應位置相乘,然後再相加的操作。UV的外積結果為二維矩陣。那麼有公式:

UVT⊙W=UTWV UVT⊙W=UTWV

等式右邊比左邊的複雜度要低一些。寫代碼的時候,就是按照公式右邊來計算的。公式可以這樣理解:外積與參數矩陣相乘,相當於對u經過w矩陣投影,在投影空間中與v計算內積。是一個非常有用的trick。這裡的參數矩陣並不是神經網絡的參數矩陣,而是用來把外積的結果矩陣,轉變為一個實數值的矩陣,對應代碼中的kernel矩陣。

4.4 PNN*

如果Product Layer同時使用內積+外積,把內積和外積的結果拼接起來,就得到PNN*。

五、優化

PNN中針對內積和外積的運算都進行了優化。但是其實並不是必須的,只要計算資源足夠,兩個優化直接忽略即可。

PNN原始的論文中,針對外積部分每兩個嵌入向量組合,一共有N(N-1)/2這麼多對組合。這個複雜度是O(NN)的,論文中通過下面的公式進行了化簡:

CTR預估系列(7)——PNN模型理論與實踐

其中的fi就是嵌入向量。也就是說先把所有的嵌入向量相加求和,然後再和自己進行外積。得到一個(N,N)的外積矩陣。然後再和D1個不同的W進行對應位置相乘相加的操作,就得到了最後隱藏層輸入的D1個值。

這裡的優化主要是把嵌入向量的N(N-1)/2個組合對,優化成了一個。把平方的複雜度降低到線性的。

但是,經過作者溝通了解到,這一部分的優化其實沒必要,在新的PNN中已經去掉了! 為什麼那?因為即使是N平方的複雜度,但是每兩個嵌入向量進行外積的計算完全可以並行化!其實是可以接受的,所以現在已經去掉了。 我們後面給出的代碼也是沒有進行優化的,因為嵌入向量的pair仍然是N^2的。

六、總結

PNN從FM何FNN的角度出發,提出利用內積或者外積來學習高階的非線性特徵,還是挺有創新的。 基本上使用DNN的模型,最開始都是經過Embedding把原始高緯度稀疏的輸入轉換為低維度稠密的向量,PNN也不例外。對於FM來說,這就是隱向量,FNN也是利用FM來進行Embedding Vector的初始化的。

1、PNN中如果採用內積操作,那麼嵌入向量兩兩組合每對組合都得到一個實數值。如果後面隱藏層的權重矩陣W全是1的話,那麼PNN就變成了FM。

2、PNN使用外積操作稍微麻煩,因為嵌入向量兩兩組合後,每對組合就是一個二維矩陣。那麼怎麼把這些二維矩陣輸入到神經網絡中那?通過和一個矩陣對應位置相乘在相加,就把這些二維外積矩陣轉換成了一個實數值。

3、OPNN的實現代碼中利用了公式進行了轉換,稍微降低了複雜度。公式如下:UVT⊙W=UTWVUVT⊙W=UTWV

4、另外,PNN論文中針對外積部分的優化,跟作者溝通得知在新的論文中已經去掉了,大家就不用糾結了

七、代碼實戰

數據的輸入,Embedding Vector都是相同的,關鍵代碼如下: 初始化Sparse Input到Embedding向量的權重參數,注意沒有bias。而且Field自己進行自己的嵌入,不同的Field之間沒有關係。

CTR預估系列(7)——PNN模型理論與實踐

Product Layer中p部分pair數量,以及其輸出的維度lz+lp:

CTR預估系列(7)——PNN模型理論與實踐

Embedding操作,得到Embedding向量xw3d以及lz部分xw:

CTR預估系列(7)——PNN模型理論與實踐

分別得到進行內積或外積操作的向量對,p中存儲第一個向量,q中存儲對應的第二個向量:

CTR預估系列(7)——PNN模型理論與實踐

IPNN 對嵌入向量兩兩進行內積操作,得到

CTR預估系列(7)——PNN模型理論與實踐

lz部分和lp部分組合起來,得到最終的Product Layer的輸出:

CTR預估系列(7)——PNN模型理論與實踐

經過隱藏層的激活,得到最終CTR結果:

CTR預估系列(7)——PNN模型理論與實踐

OPNN 和IPNN不同的地方只有內積改為外積,也就是Product Layer中p部分的輸出不同。關鍵代碼如下: 初始化用於對外積結果矩陣進行對應位置相乘,再相加操作的矩陣:

CTR預估系列(7)——PNN模型理論與實踐

得到組合的嵌入向量對p,q。根據公式UVT⊙W=UTWVUVT⊙W=UTWV,兩個嵌入向量外積,再與矩陣W對位相乘相加,就等價於p的轉置先和W相乘(真正的向量與矩陣相乘),在與V相乘(向量與向量相乘)。 但是,tensorflow不支持矩陣與向量相乘。所以我們需要把他拆分為向量與向量相乘,然後再求和。這就是tf.multiply(p,k)這裡還利用了multiply的boradcast特性:

CTR預估系列(7)——PNN模型理論與實踐

最後,得到Product Layer層的輸出,再連接到神經網絡中得到最後的輸出。注意Product Layer與First Hidden Layer之間是有全連接層連接的,這裡的參數是需要學習的哦:

CTR預估系列(7)——PNN模型理論與實踐

完整的代碼,可以在github上找到,地址:https://github.com/gutouyu/ML_CIA

Reference

1、Product-based Neural Networks for User Response Prediction

2、論文作者給出的實現 https://github.com/Atomu2014/product-nets


分享到:


相關文章: