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是對顯示的字體進行一定的設定。

好了,今天就到這裡了,大夥假期注意勞逸結合哇!