RS Meet DL(64)-通過自注意力機制來自動學習特徵組合
- 2019 年 10 月 4 日
- 筆記
本文要介紹的論文題目是《AutoInt: Automatic Feature Interaction Learning via Self-A entive Neural Networks》 論文下載地址為:t.cn/AipG8aXz
這篇文章使用Multi-Head self-Attention進行自動的特徵提取,整體思路相對而言比較簡單易懂,但是論文結構比較完整。除介紹論文外,最後本文介紹了如何使用Python繪製熱力圖,一起來看一下吧。
1、背景
點擊率預估問題對推薦系統來說比較重要,但是目前存在許多挑戰: 1)特徵數量巨大,離散特徵多,存在特徵稀疏問題。 2)高階特徵組合對於提升點擊率預估的性能至關重要,但發現一些有實際意義的特徵組合需要依靠專業知識,這一過程費時費力,需要通過模型自動去學習高階特徵組合。 3)現有的方法如FM,它只能學習低階的特徵組合,而DeepFM等通過神經網絡的方法往往進行隱式的特徵組合,缺乏一定的可解釋性。
基於上述問題,本文提出了AutoInt,通過目前比較火熱的Multi-Head Attention來自動進行特徵組合。一起來看一下。
2、AUTOINT框架
2.1 整體框架
AUTOINT框架的整體框架比較簡單,如下圖:
接下來,我們逐層進行介紹。
2.2 輸入層
這裡咱們的目標是預測用戶u點擊某個物品i的概率,因此輸入層包含用戶相關的特徵和物品相關的特徵:
上面的M是特徵域的個數,一個離散特徵和一個連續特徵都屬於一個單獨的特徵域。
2.3 Embedding層
在Embedding層,我們對三種不同的特徵分別進行了處理,這三種特徵分別是單值離散特徵、多值離散特徵和連續特徵。
對於單值離散特徵,直接通過Embedding詞表得到對應的Embedding表示:
對於多值離散特徵,通過Embedding詞表得到對應Embedding之後,還需要通過avg-pooling的方式對同一個field的Embedding進行平均:
上面的q就是多值離散特徵中取值的個數。對於離散特徵來說,上面的xi是one-hot向量或者multi-hot向量,取值非0即1,而對於連續特徵,直接就是一個標量,我們將標量的取值直接與其對應的Embedding相乘:
2.4 交互層
交互層是Transformer的encoder部分,由多層進行堆疊來學習特徵之間的高階組合。Transformer中最重要的是multi-head attention,其簡單的示意圖如下:
有關Transformer,咱們這裡也不講了,可以參考之前的文章。
2.5 輸出層
輸出層的計算公式如下:
首先將交互層得到的輸出進行對位相加,然後經過一層全連接層並進行sigmoid變換得到點擊率的預估值。
而模型的損失採用的是logloss:
2.6 特徵組合學習
接下來,我們來解釋一下,模型是如何來學習高階特徵之間的組合的。假設我們有4個field的輸入,分別是x1、x2、x3、x4。這裡重點介紹二階和三階特徵組合。
二階特徵組合
在第一層的交互層,通過attention map我們可以學習不同特徵的相關性,並通過加權求和的方式進行組合。假設第一個field的輸出為e1,e1中就包含了第一個field和4個field之間的交互。
三階特徵組合
對於三階特徵組合,在第二層的交互層就可以學習到。我們知道,在transformer中encoder的每一個block中,存在residual connection的過程,這樣輸出e1中不僅包含了第一個field和其他field組合的信息,還包含第一個field自身的信息,這樣在與e3(第三個field在第一個交互層的輸出)進行multi-head attention時,就可以得到第一個field和第二三個field的交互結果。
3、實驗結果
3.1 實驗結果分析
文中使用了不同的數據集,與一些base模型進行了效果的對比,結果如下:
可以看到,AutoInt在所有的數據集上,AUC都是最優的。
3.2 可解釋性分析
最後再來看看如何對推薦過程中的特徵組合進行一定的解釋性分析,這主要需要觀察multi-head attention過程中的attention map:
上圖中,左邊是針對一條電影推薦數據的結果,對於該條數據,通過attention map可以得到的結論是18-24歲的年輕人比較喜歡看恐怖片或者動作片。
而右圖是對所有訓練數據集中對應field的attention score的一個平均值,可以看到性別和電影類別、年齡和電影類別等都具有更高的相關性。
4、Python繪製熱力圖
論文整體上就介紹完了。有一說一,整體上的創新點不是很足,不過相比於其他的論文,對於特徵組合的構建、以及可解釋性的分析比較充分,論文結構相對來說更加完整。最後,咱們也一起來學習一下3.2節中提到的熱力圖的繪製:
import matplotlib.pyplot as plt import seaborn as sns import numpy as np # cmap(顏色) np.random.seed(20180316) x = np.random.randn(4, 4) f, (ax1, ax2) = plt.subplots(figsize=(6,6),nrows=2) sns.heatmap(x, annot=True, ax=ax1) sns.heatmap(x, annot=True, ax=ax2, annot_kws={'size':9,'weight':'bold', 'color':'blue'}) plt.show()
上面結果的如下:
其中,最重要的函數是sns.heatmap函數,這裡我們用到了四個參數,第一個參數是我們的輸入數據,也就是熱度矩陣,這裡是4*4大小的;第二個參數是annot,代表是否要標註熱力值大小,默認為false;第三個參數ax是指定我們的畫布;第四個參數annot_kws是對顯示的字體進行一定的設定。
好了,今天就到這裡了,大夥假期注意勞逸結合哇!