解構阿里深度興趣網絡(DIN):如何將注意力機制引入推薦系統?

本文授權轉載自王喆的機器學習筆記(https://zhuanlan.zhihu.com/wangzhenotes ),每隔一到兩週作者會站在算法工程師的角度講解一些計算廣告、推薦系統相關的文章。本文以阿里的深度興趣網絡(DIN)爲例講解了推薦系統中的注意力機制。

選擇文章的標準有三個:

  • 一是工程導向的;

  • 二是阿里、facebook、google 等一線互聯網公司出品的;

  • 三是前沿或者經典的。

我們從阿里的深度興趣網絡(Deep Interest Network)開始。很多同學已經非常熟悉這篇文章了,但我覺得一篇優秀的文章多強調幾遍也不爲過。說這篇文章好,主要有三個原因:

  1. 一是因爲這篇文章的工程性很強。工程性很強的文章首先是便於實現的,其次你可以從字裏行間看到很多實踐出真知的影子,比如 DIN 這篇文章中 GAUC 這樣的 metric 的改進,以及 Dice 這樣的激活函數的創新,都是對經典知識在實踐中改進的例子。

  2. 第二個原因是因爲這篇文章對用戶行爲的觀察非常精準。有句話說做推薦其實就是“揣摩人心”,你把用戶的行爲和習慣揣摩好了,才能夠以此出發,從技術上映射用戶的習慣。DIN 這篇文章有效的利用了用戶興趣多樣性以及當前候選商品僅與用戶一部分興趣有關這一特點,引入注意力機制,這是非常精準的動機。

  3. 第三個原因是模型的微創新,從低維到高維是創新,從離散到連續是創新,從單一到融合也是創新,這篇文章把 NLP 大行其道的注意力機制引入推薦領域,當然是典型並且有效的創新手段,也是所有算法工程師應該學習的地方。

好了,廢話講完了,我們看看這篇文章到底做了什麼。

用戶場景很簡單,就是在一個電商網站或 APP 中給用戶推薦廣告,當然對於阿里媽媽來說,廣告也是商品,所以這篇文章的廣告場景其實也是一個經典的推薦場景。

好,既然要推薦,我們當然需要利用用戶的歷史數據了,對於一個電商來說,歷史數據當然就是點擊,添加購物車,下單這些行爲了。論文中給了一位用戶的行爲序列。

image

用戶的行爲序列

顯然是一個女生的行爲歷史啦,從最左邊的手套,鞋子到右邊的杯子,睡衣。要被推薦的候選商品是一件女式大衣。我們應該如何計算這件大衣的 CTR 呢?

如果按照之前的做法,我們會一碗水端平的考慮所有行爲記錄的影響,對應到模型中就是我們會用一個 average pooling 層把用戶交互過的所有商品的 embedding vector 平均一下形成這個用戶的 user vector,機靈一點的工程師最多加一個 time decay,讓最近的行爲產生的影響大一些,那就是在做 average pooling 的時候按時間調整一下權重。

但是我們仔細想一想我們自己的購買過程,其實每個用戶的興趣都是多樣的,女生喜歡買衣服包包,也喜歡化妝品,甚至還爲自己男朋友挑選過球衣球鞋,那麼你在買大衣的時候,真的要把給男朋友買球鞋的偏好考慮進來麼?具體到本文的例子中,在預測大衣的 CTR 這件事情上,用戶瀏覽過杯子,跟用戶瀏覽過另一件大衣這兩個行爲的重要程度是一樣的嗎?

這事不用問算法工程師,你就回家問問你老媽估計答案都是一定的,肯定是瀏覽過另一件大衣這件事的參考價值高啊。好了,就是這件你老媽都知道的事情,讓阿里媽媽的算法工程師們加上了 attention 機制。

注意力機制顧名思義,就是模型在預測的時候,對用戶不同行爲的注意力是不一樣的,“相關”的行爲歷史看重一些,“不相關”的歷史甚至可以忽略。那麼這樣的思想反應到模型中也是直觀的。

image

上式中, V_u 是用戶的 embedding 向量, V_a 是候選廣告商品的 embedding 向量, V_i 是用戶 u 的第 i 次行爲的 embedding 向量,因爲這裏用戶的行爲就是瀏覽商品或店鋪,所以行爲的 embedding 的向量就是那次瀏覽的商品或店鋪的 embedding 向量。

因爲加入了注意力機制, V_u 從過去 V_i 的加和變成了 V_i 的加權和, V_i 的權重 w_i 就由 V_i 與 V_a 的關係決定,也就是上式中的 g(V_i,V_a) ,不負責任的說,這個 g(V_i,V_a) 的加入就是本文 70% 的價值所在。

那麼 g(V_i,V_a) 這個函數到底採用什麼比較好呢?看完下面的架構圖自然就清楚了。

image

相比原來這個標準的深度推薦網絡(Base model),DIN 在生成用戶 embedding vector 的時候加入了一個 activation unit 層,這一層產生了每個用戶行爲 V_i 的權重,下面我們仔細看一下這個權重是怎麼生成的,也就是 g(V_i,V_a) 是如何定義的。

傳統的 Attention 機制中,給定兩個 item embedding,比如 u 和 v,通常是直接做點積 uv 或者 uWv,其中 W 是一個|u|x|v|的權重矩陣,但這篇 paper 中阿里顯然做了更進一步的改進,着重看上圖右上角的 activation unit,首先是把 u 和 v 以及 u v 的 element wise 差值向量合併起來作爲輸入,然後餵給全連接層,最後得出權重,這樣的方法顯然損失的信息更少。但如果你自己想方便的引入 attention 機制的話,不妨先從點積的方法做起嘗試一下,因爲這樣連訓練都不用訓練。

再稍微留意一下這個架構圖中的紅線,你會發現每個 ad 會有 good_id, shop_id 兩層屬性,shop_id 只跟用戶歷史中的 shop_id 序列發生作用,good_id 只跟用戶的 good_id 序列發生作用,這樣做的原因也是顯而易見的。

好了,到這裏爲止我們基本講完了這篇文章的重點部分,如果說上面的部分是文 70% 的價值所在,那麼餘下 30% 應該還有這麼幾點:

  • 用 GAUC 這個離線 metric 替代 AUC

  • 用 Dice 方法替代經典的 PReLU 激活函數

  • 介紹一種 Adaptive 的正則化方法

  • 介紹阿里的 X-Deep Learning 深度學習平臺

上面幾項介紹起來略顯繁瑣,大家有興趣的可以參考原文。對於廣大算法工程師來說,知道如何引入 attention 機制應該是最實用的收穫。

參考文獻:

https://arxiv.org/abs/1706.06978https://github.com/wzhe06/Ad-papers

原文鏈接:

https://zhuanlan.zhihu.com/p/51623339

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