【DNN】PNN(Product Net )

0.前言

相比Embedding+MLP的傳統結構,PNN在embedding層後設計了Product Layer,以顯示捕捉基於Field的二階特徵相關性。

motivation

Embedding+MLP結構是DNN應用在CTR預估的標準模式。通常,NN層之間都使用“add operation” ,通過激活函數來引入非線性。作者認爲,單純的“add”也許不足以捕獲不同的Filed特徵間的相關性,原文表述爲:"The ‘add’ operations of the perceptron layer might not be useful to explore the interactions of categorical data in multiple fields. ”

文中指出,一些相關研究表明“product”相比“add”能更好得捕捉特徵間的dependence,因此作者希望在NN中顯示地引入“product”操作,從而更好地學習不同Field特徵間的相關性,在DNN結構中引入product layer即是這樣的一個嘗試。

1.網絡結構

PNN包括三層:Embedding Layer、Product Layer、Full-connect Layer。

  1. 最開始的輸入太稀疏維度太高,沒法直接放到DNN中去學習,所以比較通用的做法就是通過Embedding到一個低維的稠密的實數向量中,作爲原始特徵的在Embedding空間中的表示。
  2. 然後PNN利用Product Layer來學習filed之間的交互特徵,這也就引入了非線性的組合特徵。可以採用內積、外積、內積+外積的形式。
  3. 最後利用全連接層充分的學習高階組合特徵,並得到最終CTR預測概率。

作者提出Product-based Neural Network(PNN),PNN的結構非常直觀,如下圖所示:

PNN與標準的「Embedding+MLP」差異僅在於引入了Product Layer。上圖中Product Layer左邊Z部分其實就是將Embedding層學到的嵌入直接原封不動地搬來,右邊P部分纔是我們討論的重點。注意,product layer 中每個節點(見藍色節點)是兩兩Field的embedding對應的“product”結果,而非所有Field的。

根據 product 函數的不同選擇,PNN也有不同實現,這裏的想象空間就很多了。文中嘗試了相對常見的向量內積(inner product)和外積(outer product),對應 IPNN 和OPNN。

雖然結構簡單,但這裏存在一個大問題:product層的節點數至少是輸入Field數的平方級別。在業界現實場景中,輸入Field的規模往往很大,這大大增加了網絡複雜度,對PNN的實際落地構成了挑戰。作者把L1層每個節點的輸入來源拆分爲兩部分,分別來自Embedding層與Product層。

Embedding Layer

Embedding Layer跟DeepFM中相同,將每一個field的特徵轉換成同樣長度的向量,這裏用f來表示。

Product layer

  • Product Layer中z中每個圈都是一個向量,向量大小爲Embedding Vector大小向量個數 = Field個數 = Embedding向量的個數
  • Product Layer中如果是內積,p中每個圈都是一個值;如果是外積,p中每個圓圈都是一個二維矩陣

IPNN

IPNN中p的計算方式如下,即使用內積來代表pij:

所以,pij其實是一個數(標量),得到一個pij的時間複雜度爲M,p的大小爲N*N,因此計算得到p的時間複雜度爲N*N*M。而再由p得到lp的時間複雜度是N*N*D1。因此 對於IPNN來說,總的時間複雜度爲N*N(D1+M)。文章對這一結構進行了優化,可以看到,我們的p是一個對稱矩陣,因此我們的權重也是一個對稱矩陣,對這個對稱矩陣進行如下的分解:

總結:得到一個標量,通過一階矩陣分解來近似W,從而降低複雜度。

OPNN

此時pij爲M*M的矩陣,計算一個pij的時間複雜度爲M*M,而p是N*N*M*M的矩陣,因此計算p的事件複雜度爲N*N*M*M。從而計算lp的時間複雜度變爲D1 * N*N*M*M。這個顯然代價很高的。

如何跟送入到L1層?

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

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

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

L1層

L1 = z + p +b.

可以認爲z就是embedding層的複製。對於p來說,這裏需要一個公式進行映射:p= f(f1, f2).f()函數由上述兩種方法計算得到。

損失函數

交叉熵損失函數。

2.代碼

作者公開的代碼

3.總結:

  1. PNN的動機很直觀,通過在NN的嵌入層和隱層之間引入product層,顯示地引入基於field的“product”,從而加強單純基於“add”的NN的特徵相關性學習能力。
  2. product函數的選擇有不少想象空間;而引入product後的模型複雜度,將直接影響落地可行性。構造怎樣的product函數以及如何降低複雜度是使用product layer的關鍵,例如文中對IPNN和OPNN的處理。一個實用的落地trick是基於先驗知識,只在指定的Field間作product,從而降低複雜度,當然這也導致了需要human effort的坑。
  3. PNN從FM何FNN的角度出發,提出利用內積或者外積來學習高階的非線性特徵,還是挺有創新的。
    基本上使用DNN的模型,最開始都是經過Embedding把原始高緯度稀疏的輸入轉換爲低維度稠密的向量,PNN也不例外。對於FM來說,這就是隱向量,FNN也是利用FM來進行Embedding Vector的初始化的。

4.其他

工作中使用的pnn比較簡單了,內積的形式,選擇一部分特徵手動進行交叉,類似FM的操作。

參考:

1.作者源代碼:https://github.com/Atomu2014/product-nets

2.論文:https://arxiv.org/pdf/1611.00144.pdf

3.https://zhuanlan.zhihu.com/p/56651241

4.https://zhuanlan.zhihu.com/p/74726919

5.跟作者討論過:https://blog.csdn.net/u010352603/article/details/82670323

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章