「推薦系統」 領域的最新進展你知道麼?

騰訊技術工程發表於2019-12-11

介紹

工業界通用推薦系統包括兩個階段的流程,匹配(match)和排序(rank)。在匹配的過程中主要是根據使用者的一些興趣點,找到可能感興趣的潛在商品集。由於整個商品集的海量性,對實時訪問的使用者去計算他對全部商品的感興趣程度是不實際的,所以需要預先根據一些興趣、特徵策略等來尋找使用者可能感興趣的潛在商品集,在此基礎上,再根據特定的模型演算法來進行商品集興趣分深層排序,效果指標往往通過點選率(Click Trough Rate)、轉化率、時長等來量化,所以 rank 階段的主要目的就在於預測一個使用者在他感興趣的商品中的 CTR 等,並且根據預測分值的大小進行排序,最終返回排序作為推薦系統的推薦結果。

本文將介紹三篇重點分別在 ranking,matching 和 feature enginerring 上的文章,藉此來展示業界推薦系統方面的一些最新工作進展。

1. Ranking:

Behavior Sequence Transformer for E-commerce Recommendation in Alibaba

這篇文章主要關注在 rank 階段的改進。以往在預測 CTR 場景下常見的深度學習方法是基於嵌入層與多層前饋神經網路的結合,將大量的低階原始特徵通過簡單地嵌入層進行降維,然後降維後的低維特徵再作為全連線網路的輸入,最終通過網路輸出對 CTR 點選率的概率預測(由於輸出結果是一個點選概率,所以取值範圍落在區間[0,1]上)。具有代表性的工作參考 WDL(wide and deep learning by Google)和 DIN(Deep Interest Neworks by Alibaba)。

但是上述方法存在一個比較明顯的問題,直接輸入原始特徵實際上缺失了很多高階的特徵資訊,比如高階的互動項、序列資訊等。這類特徵在推薦場景下往往比較重要,比如年齡特徵與性別特徵的互動項可以刻畫不同年齡層與不同性別的購買需求差異性。另一點,一個客戶在購買了手機後很有可能會繼續瀏覽手機配件等商品,就需要一些行為序列特徵去捕捉這些資訊。因此,從這些例項中可以獲知,高階的特徵在進行點選率預測的任務十分重要。對比前面提到的兩種方法,WDL 僅僅是簡單地拼接 raw features,DIN 考慮了通過注意力機制來刻畫商品與使用者的歷史興趣的多峰表徵,二者都沒有考慮行為的序列特徵。

為了解決這方面的問題,作者參考了在 NLP 領域機器翻譯任務 transformer 模組。由於在機器翻譯中,語言的序列資訊是十分關鍵的,而 transformer 可以取得很好的效果,所以認為如果把客戶的購買歷史看做是一串文字,那麼每種商品之間的序列相關性的資訊也可以通過 transformer 捕捉到。

該論文整體網路結構如下,主要包含三個部分:嵌入層,轉換層,前饋網路層。

「推薦系統」 領域的最新進展你知道麼?
BST整體網路結構
嵌入層的主要目的僅僅在於將高維的特徵對映到相對低維的空間中,通過一個嵌入矩陣「推薦系統」 領域的最新進展你知道麼?,其中「推薦系統」 領域的最新進展你知道麼?就是嵌入空間的維度。需要輸入到嵌入層的特徵主要有一下幾個部分:包含序列資訊的 item 特徵和其他特徵。其他特徵的內容如下表格所示:
「推薦系統」 領域的最新進展你知道麼?

序列資訊的 item 特徵作者又分為了兩個部分,分別是 Sequence Item Features 和 Position Features。其中 Sequence Item Features 主要是商品的 item_id 和 category_id 這兩個可以表徵商品資訊的特徵,原因是考慮到提取序列資訊的計算複雜性,輸入全部的 item 特徵效率很低。Position Feature 實際上是通過 postional embedding 的變換來獲取的,在"Attention is all your need"中有提及。本文中考慮一個客戶的瀏覽歷史,時間間隔最能夠體現瀏覽歷史中的位置資訊。

因此本文定義如下 position embedding:pos(v_i) = t(v_t) - t(v_i),其中 t(v_t) 代表的是推薦系統的推薦時間點,t(v_i)代表使用者點選第 i 件商品的時間點。構造序列特徵之後,通過「推薦系統」 領域的最新進展你知道麼?進行序列特徵的嵌入,「推薦系統」 領域的最新進展你知道麼?代表瀏覽歷史的長度,「推薦系統」 領域的最新進展你知道麼?是嵌入空間的維度。

轉換層:

Multi-Head Self-Attention(多頭注意力模型)是 Transformer 的核心單元,理解 MH Attention 機制對於 Transformer 層原理掌握特別重要,並且在 Encoder 和 Decoder 中都有用到。MH Self-attention 最新應用可以替代一些基於 RNN 行為序列模型在推薦場景落地。另外在下文即將介紹的 AutoInt 中也是引入了 Multi-head Self-attention 核心思想,所以這裡花一定篇幅對此進行原理講解。

先從一個機器翻譯的小例子來看:
”The animal didn't cross the street because it was too tired”
單詞"it"表示什麼呢,是"animal"還是"street",對機器演算法來說識別這個不是一件簡單的事情,演算法在處理每個詞的時候需要知道上下文資訊。

較早一代 NLP 演算法中 RNN、LSTM、SRU 等序列模型可以處理這種場景,基本做法是將句子分詞,然後每個詞轉化為對應的詞向量序列,經過 RNN 演算法來處理詞序列資訊,在翻譯這種場景僅用 RNN 很難做到高水準,這樣出現了 RNN 的變種:Encoder-Decoder,也叫 Seq2Seq。如下圖所示,在 Encoder 階段,輸入資料編碼成一個上下文語義向量 c(語義向量 c 可以有多種表達方式,最簡單的方法就是把 Encoder 的最後一個隱狀態賦值給 c),Encoder 是一個 RNN。Decoder 是同樣的 RNN(也可以不一樣的結構),拿到 c 之後,對其進行解碼操作,c 當做之前的初始狀態 h0 輸入到 Decoder 中,每一次得到一個最有可能的翻譯結果,然後讓所有單詞的 cross entropy 達到最小。

「推薦系統」 領域的最新進展你知道麼?

RNN、LSTM 這種型別演算法自然可以很好的處理序列資訊,結構相對比較簡單,本質上都是遞迴處理結構,缺點是無法做到並行,訓練速度比較慢,另外它也是一種馬爾科夫決策過程,無法很好的學習全域性結構資訊。那有沒有改進的演算法呢?Attention,對"Attention is All you need",這也是谷歌 17 年的一篇經典論文,後面在此基礎上也誕生了各種優秀論文。
接著看上面翻譯的小例子,這裡的"it"表示"animal"還是"street"呢,聯絡上下文,就知道 it 很大概率指的是 animal。

下圖直觀地展示了 self-attention 機制,計算每個單詞與其他單詞之間的關聯,這裡用 attention score 來表示關聯度,處理"it"時"the"、"animal"就有比較高的 attention score。這些 score 在 self-attention 中就是權重的概念,對輸入 vector 加權然後喂入前饋神經網路中,得到新的表示,這樣可以很好的獲取上下文資訊。

「推薦系統」 領域的最新進展你知道麼?
cite from  Illustrated Transformer by ay Alammar
Self-attention layer:一般的注意力層定義如下:
「推薦系統」 領域的最新進展你知道麼?
cite from  Illustrated Transformer by ay Alammar

「推薦系統」 領域的最新進展你知道麼?
Scaled Dot-Product Attention

attention 計算:

「推薦系統」 領域的最新進展你知道麼?

Q 是查詢,K 是鍵,V 是數值。光從上面圖中理解起來比較抽象,結合原論文以及程式碼,就比較容易理解了,先看看核心部分程式碼:

def scaled_dot_product_attention(q, k, v, mask):
  """
  引數:
    q: 請求的形狀 == (..., seq_len_q, depth)
    k: 主鍵的形狀 == (..., seq_len_k, depth)
    v: 數值的形狀 == (..., seq_len_v, depth_v)
          (..., seq_len_q, seq_len_k)。預設為None。
  返回值:
    輸出,注意力權重
  """
  matmul_qk = tf.matmul(q, k, transpose_b=True)  # (..., seq_len_q, seq_len_k)
  # 縮放 matmul_qk
  dk = tf.cast(tf.shape(k)[-1], tf.float32)
  scaled_attention_logits = matmul_qk / tf.math.sqrt(dk)

  # softmax 在最後一個軸(seq_len_k)上歸一化,因此分數
  # 相加等於1。
  attention_weights = tf.nn.softmax(scaled_attention_logits, axis=-1)  # (..., seq_len_q, seq_len_k)
  output = tf.matmul(attention_weights, v)  # (..., seq_len_q, depth_v)
  return output, attention_weights

class MultiHeadAttention(tf.keras.layers.Layer):
  def __init__(self, d_model, num_heads):
    super(MultiHeadAttention, self).__init__()
    self.num_heads = num_heads
    self.d_model = d_model
    assert d_model % self.num_heads == 0

    self.depth = d_model // self.num_heads
    self.wq = tf.keras.layers.Dense(d_model)
    self.wk = tf.keras.layers.Dense(d_model)
    self.wv = tf.keras.layers.Dense(d_model)
    self.dense = tf.keras.layers.Dense(d_model)

  def split_heads(self, x, batch_size):
    """分拆最後一個維度到 (num_heads, depth).
    轉置結果使得形狀為 (batch_size, num_heads, seq_len, depth)
    """
    x = tf.reshape(x, (batch_size, -1, self.num_heads, self.depth))
    return tf.transpose(x, perm=[0, 2, 1, 3])

  def call(self, v, k, q, mask):
    batch_size = tf.shape(q)[0]
    q = self.wq(q)  # (batch_size, seq_len, d_model)
    k = self.wk(k)  # (batch_size, seq_len, d_model)
    v = self.wv(v)  # (batch_size, seq_len, d_model)
    q = self.split_heads(q, batch_size)  # (batch_size, num_heads, seq_len_q, depth)
    k = self.split_heads(k, batch_size)  # (batch_size, num_heads, seq_len_k, depth)
    v = self.split_heads(v, batch_size)  # (batch_size, num_heads, seq_len_v, depth)
    # scaled_attention.shape == (batch_size, num_heads, seq_len_q, depth)
    # attention_weights.shape == (batch_size, num_heads, seq_len_q, seq_len_k)
    scaled_attention, attention_weights = scaled_dot_product_attention(
        q, k, v, mask)

    scaled_attention = tf.transpose(scaled_attention, perm=[0, 2, 1, 3])  # (batch_size, seq_len_q, num_heads, depth)

    concat_attention = tf.reshape(scaled_attention,
                                  (batch_size, -1, self.d_model))  # (batch_size, seq_len_q, d_model)

    output = self.dense(concat_attention)  # (batch_size, seq_len_q, d_model)

    return output, attention_weights

程式碼是 Multi-head attention 類的構建方式,下面會提到 Multi-head attention 是什麼,這裡先介紹 self-attention 中的 attention score 怎麼計算的,Q、K、V 怎麼來的。其實是從輸入 embeding 經過線性層變換得到了,有三個權重矩陣,WQ、WK、WV,輸入 X 與這三個權重矩陣相乘得到,其實表示的意義大致相同,只是生成了不同的表達形式,也是神經網路裡面一些思想,很難去說清楚為什麼要這樣做。WQ、WK、WV 這三個權重矩陣其實也是模型需要訓練的引數矩陣。Attention score 生成大概可以分為以下幾個步驟:

1、輸入詞生成 embedding 向量,經過線性層變換得到對應 Q、K、V 向量。

2、計算輸入詞 Query Vector 與其他相關詞 Key Vector 點積,再對 score 進行歸一化,再通過 softmax 來獲取權重(attention_weights = tf.nn.softmax(scaled_attention_logits, axis=-1) )。

3、將 softmax 結果與 Value Vector 相乘得到加權的權重向量 attention score(output = tf.matmul(attention_weights, v))

投影矩陣「推薦系統」 領域的最新進展你知道麼?「推薦系統」 領域的最新進展你知道麼?是一個共用的嵌入矩陣。再結合一層全連線神經網路「推薦系統」 領域的最新進展你知道麼?對映來加強非線性形式,最終的 self_attention 模組的形式為:

「推薦系統」 領域的最新進展你知道麼?

「推薦系統」 領域的最新進展你知道麼?

再來看看 multi-head attention:

「推薦系統」 領域的最新進展你知道麼?

multi-head attention
「推薦系統」 領域的最新進展你知道麼?

簡單來說,multi-head attention 就是多個 self-attention 的整合,為什麼要這麼做呢,論文中說是將模型分為多個頭,形成多個子空間,這樣可以讓模型從不同角度去學習多方面不同的資訊,再去融合,具體是不是真的可以讓模型學習"不同子空間的特徵",這裡還沒有深入作研究。其實通過增加模型 layer 是不是也可以學習到更多資訊,當然相對 multi-head 來說效能肯定比不上,因為 multi-head 是並行的,這也是論文中提到的一個優勢,那論文裡面提到的 multi-head 其他優點可以增加網路空間,怎麼去考量,其實也存在一定玄學在裡面。

前饋網路層:

將其他特徵與轉換器的輸出拼接後輸入三層前饋神經網路,目的是為了處理其他特徵的有效資訊。由於 CTR 問題是一個預測點選概率的問題,所以作者選擇一個 sigmoid 函式作為輸出層,損失函式的選擇也是標準的交叉熵損失:

「推薦系統」 領域的最新進展你知道麼?

模型評估:

本文選擇 WDL 和 DIN 作為對比模型,構建了一個 WDL+seq 的基準模型,基準模型的序列資訊是通過簡單地將歷史資訊直接進行嵌入得到的。本文的網路結構和 WDL 的區別在於轉換層的搭建,與 DIN 區別則是在處理序列資訊上思路不同。

作者選擇 AUC 來作為模型評估的度量,並且也考量了 A/B 測試的 CTR 結果和推薦系統的響應時間(RT response time)。

「推薦系統」 領域的最新進展你知道麼?

從上述的結果可以看出,文章提出的 BST 網路具有更好的效果。
BST 的主要工作在於改進 raw feature 的重新組合問題以及進行高階特徵提取,在推薦系統中針對特徵工程的工作也有很多。有一類基於 WDL 的工作,主要考慮在於將 item 的特徵或者使用者的特徵進行互動項的構建,比如 DeepFM, Cross networks 等,大多借鑑了 Factorization Machines。這類方法的問題主要在於特徵的構建效率比較低,而且高階互動項沒有辦法提取。

因此另一類基於深度學習的方法通過複雜網路結構來提取高階特徵,這類方法的問題在於獲取到的特徵解釋性較差,一些任務場景中需要特徵的解釋性與實際意義來提升工作效率。同時考慮了特徵的解釋性與高階複雜性的結果,AutoInt 有相對較好的效果,但是也受制於任務種類和應用場景。AutoInt 也是基於 multihear self-attention 機制,重點考慮對於使用者資訊、商品資訊這類原始特徵的處理(下文有介紹),AutoInt 實際上可以作用在"other features"中,來得到更高質量的資訊。

但本文依舊是選擇手動來構建"other features"中的 cross features 互動部分。AutoInt 的缺陷在於無法提取序列資訊。DIN 確實也考慮利用使用者行為序列的資訊,但是處理辦法與本文不同,DIN 是通過注意力機制來刻畫當前推薦商品與歷史商品之間的多峰表徵,而本文則是利用注意力機制構建轉換器將序列資料進行提取與嵌入。

總而言之,本文通過對序列資料特徵的合理構建與利用,可以明顯地提升推薦效果,淘寶將其投入在實際的生產場景中,也取得了較好的線上效果。

2. Matching:

Multi-Interest Network with Dynamic Routing for Recommendation at Tmall

本工作的主要目的在於在 matching 階段進行特徵工程的工作,實現提取更加結構化,使模型能夠得到更多資訊增益的特徵。獲取更高質量的特徵就可以進而促進整個推薦系統的效果改善。

Matching 階段需要獲取客戶感興趣的商品,或者客戶對某種商品感興趣的概率。所以在這個階段,如何量化客戶的“興趣”更重要。多數文章的做法一般是把使用者的一些 profile 特徵或者 history 資訊簡單地作為一個單向量輸入。這種做法忽略了存在多種興趣的可能性:首先,有未利用的資訊,在對整個模型而言會帶來相應的資訊損失;其次,用一個向量來代表所有不同興趣本身就比較難,等價於把每個使用者所有不同的興趣壓縮在一起,因此將使用者的所有興趣資訊混合在一起會導致在 matching 階段匹配到不準確的商品型別或者商品個體。而且文中選擇對使用者的每個不同型別興趣都會獨立計算,這樣能夠保證 matching 階段的待推薦商品的準確度。

文中提出了先利用類似聚類的思想,先在使用者的歷史資訊中分析提取客戶的多興趣的形式,並且每個使用者的總興趣數允許是不同的。通過構建的多興趣網路(MIND)可以實現這個目標,利用膠囊網路對使用者行為的 embeded features 再提取就可以得到較好的興趣類。基於這些興趣類,就可以在整個商品池中通過近似最近鄰查詢的方式找出該客戶最可能感興趣的 N 個商品作為 candidates,隨後放入 ranking 階段進行推薦方面的預測。

網路結構如下圖所示:

「推薦系統」 領域的最新進展你知道麼?

整體網路結構就是通過將商品集合中的特徵通過嵌入,對映到低維的特徵空間,再將不同商品的嵌入特徵連線起來輸入到多興趣提取層,通過學習膠囊網路中的引數,得到較好的模型後,再將膠囊網路提取的使用者行為資訊與使用者的畫像資訊進行連線輸入給全連線層作為最後的特徵整合。
在訓練階段,有幾個主要的與其他工作不同之處:

  1. 通過構建合適的 label-attention 層來加強 capsules 網路的類內聚合性,原因是利用了商品類別作為查詢,興趣膠囊作為鍵值,如下圖所示。輸出的形式如下:

「推薦系統」 領域的最新進展你知道麼?

其中當 p 為 0 是,代表 capsule 選擇最均勻的特徵資訊;如果 p 逐漸增大,那麼 capsule 會選擇相似度高的資訊。如果 p 無窮大,那麼最終就會變為一個最大 Attention 方法,並且會忽略其他的值。文中就是選擇這種最大 attention 的方法。

  1. 在訓練過程中的模型引數初始化過程中,為了防止每個 capsules 的訓練出很類似的效果,在動態路由演算法的基礎上,做了小量的修改和調整。本文中,作者選擇希望訓練得到的膠囊落在同一個向量空間中,但是希望不同的 bilinear mapping 能夠將興趣對映到不同的向量空間中,所以選擇 routing logit 為:

    「推薦系統」 領域的最新進展你知道麼?

    「推薦系統」 領域的最新進展你知道麼?代表商品 i 的嵌入特徵,「推薦系統」 領域的最新進展你知道麼?代表興趣的向量。

  2. 由於 Bilinear 矩陣是在各對膠囊之間共享的,為了避免矩陣訓練得到單一結果,所以應該避免直接將所有權重初始化為 0,而應該從一個隨機分佈中抽樣產生。本文選擇從正態分佈中產生這些隨機初始值。

  3. 因為不同使用者所用的興趣膠囊個數可能是不同的,所以文中允許了動態的興趣個數來提高網路的可塑性與準確性。

    「推薦系統」 領域的最新進展你知道麼?,由於多數人們的興趣膠囊比較少量,這種可變個數的興趣膠囊設定可以節省很多資源。

整個 B2I Dynamic Routing 虛擬碼如下:

「推薦系統」 領域的最新進展你知道麼?

在模型最終訓練完成之後,整個 MIND 網路拿掉 label-aware 層就可以當做一個使用者行為的表徵對映。在執行階段,使用者的行為序列以及使用者的畫像特徵全部輸入到「推薦系統」 領域的最新進展你知道麼?中,就可以得到多個向量特徵。這些特徵進一步用來選出前 N 個備選商品,用於推薦系統的下一階段的 ranking 工作。

與其他工作的聯絡與區別:

  1. YouTube DNN:兩種方法都採用了 deep learning 的優勢,通過深度學習可以獲取較好的高階特徵表示。但是 YouTube 僅僅使用一個向量來表示使用者行為,本文中的 MIND 使用多個向量來表示一個使用者。所以 MIND 可以看做 DNN 的一種泛化模型。

  2. DIN:二者都利用到了使用者的不同的性卻特徵。DIN 僅僅使用了商品層面上的注意力機制,簡單來說就是對商品 ID 的一些相似度計算;而本文利用了動態路由演算法產生的興趣網路來提取興趣層面的資訊。DIN 將 ranking 階段融合在一起,而 MIND 實際上不是端到端的,他通過將兩部分拆解開來,為整個系統提供了更好的穩健性。

模型評估:

「推薦系統」 領域的最新進展你知道麼?

CTR 預測:

「推薦系統」 領域的最新進展你知道麼?

膠囊網路的興趣提取示例:

「推薦系統」 領域的最新進展你知道麼?

從第一個表格我們可以看出,所有與 Multi-interest 結合的模型對比起原始模型或者其他模型都得到了更好的效果。利用多興趣網路確實可以得到不同客戶的多種興趣表徵,能夠篩選出更加有效的待推薦商品,從而提升推薦系統的準確度。在天貓的資料上,這種提升更加明顯,因為大多數的人在購物時候的興趣是由多種型別的。對於不同資料之間客戶群體興趣類別個數的比較,可以根據每個資料最好的超引數 K 的比較結果來確定。

在 CTR 預測上,MIND 也有明顯的效果提升。

對於多興趣特徵的提取有效性,可以從圖 5,圖 6 中分析。圖 5 中,上下兩塊代表了兩個 user,每一行代表針對每個 user 訓練得到的 interest,橫軸上代表的是 user 的挑選商品行為,可以很明顯的看出每種 Interest 所關聯的商品型別是高度相近的,這反映了 interest capsules 得到的 multiple interest 都具有較好的聚合性。圖 6 則表示在系統服務階段,根據第一個 user 的 interest 來進行待推薦商品的選擇。可以看到其中的商品相似度是很高的,最後一行代表的是 Youtube DNN 的商品相似度,對比發現,multi-interest 分出的多種興趣效果十分明顯。

3. Feature Engineering:

AutoInt: Automatic Feature Interaction Learning via Self-Attentive Neural Networks

在整個推薦系統中,特徵工程方面最常遇到兩個問題:

  1. 輸入特徵的維度過高而且稀疏性很強;

  2. 有效的點選率預測都要基於高度準確的交叉特徵,人為地構造交叉特徵是一件十分耗時耗力的操作。

因此,尋找一種高效的特徵提取方法是提升推薦系統表現效果的關鍵步驟。本文利用了深度學習的抽象特徵提取的優勢,通過 Multi-head attention 層進行高階的特徵組合。這種方法對於數值型特徵與分類特徵都很適用。

之前的工作也有考慮過交叉特徵的文章,有的將全部的特徵進行外積展開得到一組非常高稀疏性的特徵,這類特徵在進行模型訓練的過程中十分容易造成過擬合的現象。尋找有意義的高階交叉特徵一般都是需要有經驗的人進行人為構建,但是窮舉出所有潛在的可能性是很難的,所以需要藉助深度學習類的方法來進行有效的特徵的低維表示學習。

深度學習類的方法雖然可以提取出高階的特徵,但是也有很大的侷限性:

  1. 全連線神經網路已經被證實過在學習互動特徵的過程中效率很低;

  2. 對提取出來的特徵很難具有解釋性;

本文提出的這種 AutoInt 方法就是針對上述兩個問題對深度學習網路進行調整加以改進。

首先將數值變數與分類變數都進行低維嵌入,得到一個低維空間的向量表達,也是為了解決分類變數與數值變數之間沒有良定義的內積這類運算元的問題。隨後將低維嵌入的特徵向量輸入到本文提出的 Interacting Layer,目的是為了得到具有互動性的新的特徵。在每一層的 Interacting Layer 裡,每一個特徵都會通過 multi-head attention 機制和其他特徵進行變換組合,這就是產生交叉特徵的原理。而且由於 multi-head attention 可以把一個特徵向量對映到多個不同的空間中,因此在經過 multi-head attention 變換後的特徵的組合方式也是具有多種形式的。在經過一層的 Interacting Lyaer,特徵經過了一階的交叉組合,多次疊加 Interacting Layer 就可以得到高階複雜的特徵交叉組合。對於特徵的解釋性,由於注意力機制模組主要是利用變數之間的相似度,因此高度相似的特徵進行組合時很容易得到較好的解釋。

整個網路的結構如下:

「推薦系統」 領域的最新進展你知道麼?

本文主要的核心模組 Interacting Layer 的結構如下:

「推薦系統」 領域的最新進展你知道麼?

實際上是以關注的某個特徵作為 query,其他的特徵向量作為 key, value,並且允許多種不同型別的相似度計算從而得到不同的 attention value,這也是 multi-head 的主要特點。

「推薦系統」 領域的最新進展你知道麼?

最後把所有的「推薦系統」 領域的最新進展你知道麼?向量拼接起來作為學習到的組合特徵,最後經過一個 ReLU 變換與之前的 feature 重新結合即可得到 Interacting Layer 的輸出:

「推薦系統」 領域的最新進展你知道麼?

最終的預測輸出為:

「推薦系統」 領域的最新進展你知道麼?

「推薦系統」 領域的最新進展你知道麼?

由於本文的主要貢獻在於,更加快速有效的高階特徵提取工作以及特徵的可解釋性,所以從這兩個角度來看本文方法的效果。

「推薦系統」 領域的最新進展你知道麼?

通過表格可以看出 AutoInt 在大多數場景下都有更好的效果,對於 Interacting Layer 的層數選取也是依據實驗結果得到的啟發式結論:

「推薦系統」 領域的最新進展你知道麼?

當 Interacting Layer 過多的時候不僅會增加模型複雜度,模型的預測效果也會受到影響。最後是模型的特徵解釋:

「推薦系統」 領域的最新進展你知道麼?

在這個資料任務當中,Interacting Layer 確實捕捉到了有意義的組合特徵:,左圖中紅色方框部分。右圖我們給出了資料本身的相關性的熱力圖,從中可以發現,注意力機制基本能夠將高度相關的特徵進行組合並且給以較高的權重,這樣的話一層 Interacting Layer 之後輸出的特徵實際上就具有了較好的解釋性。

總結

以上這些是今年來在推薦系統方面比較有意義的工作,任何模型的效果都強依賴資料、特徵、樣本質量。論文思想實際上也是來源於人的本身行為習慣生活經驗等,例如購物時候行為序列的重要性等。通過思考如何讓計算機模擬或者關注人們在日常行為的一些關鍵模式,得到特徵的有效轉變和對映,讓整個模型能夠有更好的表現。所謂網路的構建不同也無非在於不同應用場景,特徵的利用方式不同。

另外推薦領域一些最新論文其實也是參考了 NLP 一些新的思路,例如上面介紹的 BST、autoint 都引入了 Transformer 的核心模組 Multi-head Self-attention,在此基礎上做各種變換,實現各種玩法。看懂論文需要先徹底熟悉 Multi-head Self-attention 的原理,可以結合源論文與程式碼去看,用開源資料集去跑流程,列印中間結構,熟悉論文思想的同時也可以提升工程實現能力。

從各自的出發點來看,三篇文章都可以相互彌補:

對於 MIND 而言,雖然已經考量了顧客在瀏覽商品的時候會有固定類別的興趣偏好,但是僅僅考慮了歷史行為中的聚類資訊而沒有利用行為的序列或者趨勢資訊,這種序列資訊往往在下一步的對未來行為的推薦中會更有作用。另外文中也提及了,這種聚類的方式還有待改進,通過結合其他方法能夠提升類別的聚合性,進一步提升類別的準確程度。而 BST 本身恰恰就是利用原始特徵在 ranking 模組通過網路結構來獲取序列行為資訊。但 BST 本身的劣勢在於,如果原始特徵維度很大,人工的構建交叉特徵很不現實。

此時,AutoInt 就可以出面幫助解決對於 raw features,如何快速高效構建 cross features 的問題。通過 AutoInt 構建出來的特徵是否在其他的分類器或者模型上依舊能夠帶來提升,這是有待進一步實驗研究的問題。另外,如何針對推薦系統的冷啟動問題或者不同客戶群體進行推薦的策略也可以基於以上工作加以改進。最後,這些光鮮亮麗的論文思想聽上去很是高大上,在實際場景下真正復現論文裡面的效果還是比較難的,需要結合資料場景作各種優化,模型結構優化,還要具備生產環境下複雜模型上線的能力,這些都是需要努力去攻克的。

相關文章