DIN+DIEN,机器学习唯一指定涨点技Attention
文 | 水哥
源 | 知乎
Saying
1. 如果你面對一個全新的機器學習任務,讓你來漲點。你可能第一個想到的往往是attention,第一個實現的是attention,第一個真的漲點了的技術也是attention;
2. DIN的最主要的意義,把attention引入到用戶序列上,根據變化的item對象挑出合適的響應對象;
3. 別的地方還在吭哧吭哧研究embedding+DNN時,阿里媽媽啪的一下就把attention放進來了,很快啊!
這是【從零單排推薦系統】系列的第18講。如果說機器學習有什么技巧是百試百靈,放到哪都可以用的上的話,我會推薦兩個招。一是人海戰術,可以理解為前面講過的ensemble learning。
人海戰術在工業推薦中做的不多,即使是決定要用,也用的很保守,復雜度控制的比較小心。到了打比賽,項目pk的時候,那可是脫了韁了。幾年前ILSVRC還有的時候,上好幾個模型把輸出結果加起來做最終結果都只是常規操作,到了要pk那項目的時候幾千個模型(當然不是CNN這種)也是有所耳聞。
二是attention,attention的發展也是比較有意思。最早的時候說自己是attention,必須得旁征博引,從生理角度分析引用了什么原理,哪里能體現出人的認知過程。到了現在,加一個系數就叫attention。不過說歸說,attention確實是一種非常好用的技巧,在這一講中我們先開個頭,關于它的更多分析留在下一講。
Deep Interest Network[1]
當其他人還在學習適應embedding+DNN這種結構的形式時,阿里媽媽這邊已經在考慮更加細致的問題了。在今天看來,DIN里面使用的attention是整個機器學習領域里面幾乎最直觀的attention方式,其主要動機來源于對輸入特征的觀察,如圖:
像我們上一講提到過的,用戶的特征主要有兩種:一種是非序列的,可以稱之為non-sequential的。這類特征往往是User ID,年齡性別城市這種(后面的可稱之為profile,即一些用戶畫像信息)。另一種是序列化的(sequential),主要是用戶的歷史行為(User Behaviors),比如在電商場景下,就是用戶過去購買過的產品;在短視頻場景下,可以是用戶過去點贊的視頻。為了能順利接下面的MLP,特征得是定長度的,所以這里序列特征要選擇,最近的 個,多了截斷,少了補0。
將序列特征輸入MLP時,list中的每一個item都有對應的embedding,如果拼接起來,是一個巨大的長度,非常浪費空間(舉個例子,最近的30個,如果每一個都是64維,這就將近2000維了。實際上現在常見的大公司的解決方案中,MLP第一層承接的輸入總共也就幾千維)。那么sum pooling就會是一個相對柔和的方案,可以保證特征的長度不會太長。但是sum pooling有兩個缺點:
不會隨著到來的廣告變化而變化,無論來的是美食還是母嬰產品,遇到的都是同樣的歷史行為表示。然而一個廣告是否應該發生點擊,應該更加重視對應類別的過往行為強度是否足夠大。換句話說就是美食來了應該看看過往的行為中美食的行為多不多,和這個廣告像不像。其他類別和當前這個廣告聯系并不大。所以我們需要一個動態的機制挑出需要的部分。
會對信息有所壓縮,如果一個item的信息需要16維才能裝得下,最后30個item的信息也只存在于16維里面的話,肯定是有壓縮的。我們很難控制這個過程,或許需要的信息就剛好壓縮沒了。所以我們也需要一個盡量不壓縮關鍵信息的機制。
而attention是什么呢?它就是能夠動態挑出需要的部分,而且可以控制壓縮的程度。所以就和上面的需求剛好對上了!這也就是DIN的最主要的意義,把attention引入到用戶序列上,根據變化的item對象挑出合適的響應對象。
而為了完成這個attention,我們要決定(1)挑選出來的部分根據誰來變化(2)最終融合的形式。根據上面說的,為了要適應廣告的變化,當然要把當前的廣告信息作為輸入,除此之外,用戶本身的歷史序列當然也是。對于第二個問題,我們最終還是希望結果的維度和sum pooling差不多,因此加權和是一個好的選擇,這也是大多數attention的做法。綜合以上兩點,就得到:
其中 就對應序列中第 個item的embedding,而 是對應的attention系數。得到的結果是一個定長的向量,再和其他特征的embedding一起拼接起來,作為MLP的輸入即可。這里沒有對attention系數做歸一化,主要是考慮到scale其實反映了興趣的強度。加上attention的圖如下所示,其中attention部分用紅框突出了一下:
至此對DIN的思想和主要的實現就梳理完成了,還留著的一個細節是上面的attention系數怎么得到。其網絡結構如下:
這個圖畫的不是很清楚,外積之后得到的應該是一個矩陣,然后得到中間綠色的向量是通過什么方式(乘以 還是拉平)?這里還是按照代碼里面的邏輯來介紹[2]。item側的輸入是 的,這里 就是embedding的大小,比如64. user側的輸入是 ,第二項是序列的長度。先把item擴充成和user形狀一樣,然后把item,user,item-user,item*user四個張量在最后一維拼接。拼接后的張量經過FC層,一直映射到1,那么此時剩下的是 的結果了。這里的分數就是我們要的attention分數,拿它和user的list做一個矩陣乘法即可(還有一些別的操作,這里就省略掉了)。
Deep Interest Evolution Network[3]
有了DIN的基礎,我們理解DIEN就更加容易。DIEN的主要出發點是,用戶的歷史行為體現了他自身興趣的變化,而這個過程本身是時序的。而且這是一個發展的過程,這也就是題目中evolution的由來。
既然用戶的序列是時序發生的,使用RNN,GRU和LSTM就顯得非常自然。這里選擇的是不容易梯度消失且較快的GRU。整體架構如下圖所示:
圖中的 是用戶的行為序列,而 是對應的embedding。隨著自然發生的順序, 被輸入GRU中,如果忽略上面的AUGRU環節,GRU中的隱狀態 就應該成為用戶的行為序列最后的表示。這部分就是兩大組成部分之一的Interest Extractor Layer。
如果直白的做,也是可以的,但是會訓練的不夠“細”。 的迭代經過了很多步,然后還要和其他特征做拼接,然后還要經過MLP。這樣的結果就是最后來了一個正樣本,歸因不到 上,整個網絡感覺一團漿糊。基于此DIEN給出了第一個要點:使用輔助loss來強化 。
上面詳細畫了一下輔助loss的做法,我們本質上認為,如果發生了點擊,那么當前的 和即將到來的廣告的embedding應該很像。也就是 時刻得到的隱狀態 和下一個要來的點擊廣告 要相近。可以對它們做內積然后求最大。僅僅是這樣還不夠,還可以采樣一些不出現在歷史序列的廣告,構成負樣本 ,然后和 內積后取最小。通過這個輔助的loss,讓隱狀態開始富有語義:點擊與否能具體的歸因到某一個時刻的狀態上。
輔助loss的作用
當我看到DIEN使用了輔助loss的時候,就覺得很靠譜了。根據我的經驗,輔助任務往往能帶來好處。真正應用場合下,你把開始的輸入和最后的要求告訴網絡,他就能給你一個好的結果的情況非常少。大多數時候是需要你去控制每一步的輸入輸出,每一步的loss才能防止網絡各種偷懶作弊。輔助loss(1)能夠使得網絡更受控制,向我們需要的方向發展;(2)能夠把正負樣本的原因更清晰的歸因到特征層面。
我非常建議大家在實際業務中多試試輔助loss
GRU的部分體現了對于行為信息的一種更高階的抽取,但是對于evolution體現的還不夠強。于是需要第二個模塊Interest Evolving Layer來完成。具體來說,興趣的發展可以等價為attention的變化,在GRU的不同位置加入attention,則體現了不同的發展方式。
attention在這里的計算方式是:
和狀態以及當前item都有關系。在GRU中有三個地方可以放如attention,
對隱狀態乘上attention,稱為AIGRU
改變update gate為attention系數,稱為AGRU
改變update gate為原來的gate乘以attention,就是AUGRU了,這是效果最好的選擇。含義也很清楚,attention決定了現在的興趣轉變有多快
上面就是AUGRU的示意圖,先和原來的update gate相乘,再以這個gate控制隱狀態的更新。
為什么人海戰術總是有用?
在本講和下一講我們分別思考兩個問題,第一個問題是,為什么人海戰術總是有用的,第二個問題是,為什么attention總是有效的。在這一講中我們先嘗試回答第一個問題,第二個問題留到下一講來闡述。
我們這里舉一個例子來理解一下,如果一個分類器在某個樣本上得到正確輸出的概率為 ,那么有 個分類器時(簡單起見,假設他們平均意義上的概率差不多),按照投票制度獲得正確輸出的種類為 ,這里忽略打平的情況,所以 都取奇數。而總體的情況則是 . 我們可以驗證一下,是否存在
如果存在這個關系,那我們可以說,經過人海戰術,我們獲得了更好的結果。下面的表格對不同的 和 的取值代入進行計算,我們可以發現前一項的概率確實相對于原來都獲得了提升。
| p=0.6 | 0.648 | 0.683 | 0.710 |
| p=0.7 | 0.784 | 0.837 | 0.874 |
| p=0.8 | 0.896 | 0.942 | 0.967 |
| p=0.9 | 0.972 | 0.991 | 0.997 |
但是要強調一點,人海戰術并不是沒有條件的,我這里總結的情況是原分類器均勻地有在樣本上能超過半數的判對,才能提升效果(這個條件沒有經過證明,讀者可以當做是輔助理解的條件)。比如說有三個分類器,分別在三個樣本上輸出 , , ,單獨選一個都可以得到33%的正確率,但是大家合起來卻變成了0%。但是如果這個概率分布能夠變的更平均一點,變成 , , ,這樣正確率變成了100%,像后面這樣的情況人海戰術才能有用。不過實際中我們遇到的也都是后面的情況,像前面這種非常畸形的分布很難遇見。
這一講的DIN+DIEN這兩個方案在實現上完全可以由后續要講的基于transformer來替換。但重要的是我們要體會這其中思考的過程。DIN出現的時候,大多數人可能連embedding+DNN是什么都沒搞清楚(也可以說,大多數人還在搞CV/NLP,哈哈),而DIN就抓住了用戶行為信息和用戶畫像信息結構上不協調的點,深挖了attention的操作。在DIN把attention告訴大家后,DIEN又換了一個思路,從行為發生的時序上進行研究。這一系列的工作從來都不是別人發表了什么我就用什么,而是我的系統缺什么我就開發什么,這是最需要上一講的逍遙派學習的地方。
思考題
sum pooling并不是一定就會損失信息的,這一點在DIN的論文中也說了,embedding維度越高,sum pooling保留的信息就可以越多。如何理解這句話?你能設計一個embedding使得sum pooling之后沒有信息損失嗎?
下期預告
推薦系統精排之鋒(13):Attention有幾種寫法?
往期回顧
召回 粗排 精排,如何各司其職?
拍不完的腦袋:推薦系統打壓保送重排策略
簡單復讀機LR如何成為推薦系統精排之鋒?
召回粗排精排-級聯漏斗(上)
召回粗排精排-級聯漏斗(下)
推薦系統精排:看阿里媽媽再試線性模型
推薦精排之鋒:FM的一小步,泛化的一大步
推薦中使用FNN/PNN/ONN/NFM優化特征交叉
聊聊推薦系統的高階特征交叉問題
真正的高階特征交叉:xDeepFM與DCN-V2
GBDT是如何成為推薦系統頂級工具人的?
DNN與推薦兩大門派,一念神魔,功不唐捐
再論推薦特征與embedding生成
后臺回復關鍵詞【入群】
加入賣萌屋NLP/IR/Rec與求職討論群
后臺回復關鍵詞【頂會】
獲取ACL、CIKM等各大頂會論文集!
?
[1]Deep Interest Network for Click-Through Rate Prediction,KDD,2018 https://arxiv.org/pdf/1706.06978.pdf
[2]https://github.com/zhougr1993/DeepInterestNetwork/blob/9765f96202f849e59ff260c8b46931a0ddf01d77/din/model.py#L200
[4]Deep Interest Evolution Network for Click-Through Rate Prediction,AAAI,2019 https://arxiv.org/pdf/1809.03672.pdf
總結
以上是生活随笔為你收集整理的DIN+DIEN,机器学习唯一指定涨点技Attention的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 号外号外,第一届沙雕项目竞赛,这些项目以
- 下一篇: NeurIPS'20 | 通过文本压缩,