NLP模型集锦----pynlp
github 地址?
目錄
1、Introduction
2、Our Model
2.1 CTR
2.1.1 Models List
2.1.2 Convolutional Click Prediction Model
2.1.2?Factorization-supported Neural Network
2.1.3?Product-based Neural Network
2.1.4?Wide & Deep
2.1.4?DeepFM
2.1.5?Piece-wise Linear Model
2.1.6 Deep & Cross Network
2.1.7?Attentional Factorization Machine
2.1.8?Neural Factorization Machine
2.1.9?xDeepFM
2.1.10?AutoInt
? ? ? ? ?2.1.11?Deep Interest Network
2.1.12??Deep Interest Evolution Network
2.1.13?NFFM
2.1.14?FGCNN
2.1.15?Deep Session Interest Network
2.1.16?FiBiNET
2.1.17?DSTN
2.2?NLU
2.2.1 模型介紹與實現:Joint Model (Intent+Slot)
2.3?TextSimilarity
2.3.1??模型介紹:深度學習之文本相似度Paper總結
2.3.2? 模型實現說明:github
2.4?Sequence labeling
2.4.1 介紹
2.4.2? 模型實現
2.5?Text classification
2.5.1 介紹
2.5.2? 模型實現
2.6?NLG
1、Introduction
pynlp是包含CTR、NLP、NLG、文本相似度、文本序列標注、文本分類等模型的一個Tensorflow實現。
2、Our Model
2.1 CTR
2.1.1 Models List
| Convolutional Click Prediction Model | [CIKM 2015]A Convolutional Click Prediction Model |
| Factorization-supported Neural Network | [ECIR 2016]Deep Learning over Multi-field Categorical Data: A Case Study on User Response Prediction |
| Product-based Neural Network | [ICDM 2016]Product-based neural networks for user response prediction |
| Wide & Deep | [DLRS 2016]Wide & Deep Learning for Recommender Systems |
| DeepFM | [IJCAI 2017]DeepFM: A Factorization-Machine based Neural Network for CTR Prediction |
| Piece-wise Linear Model | [arxiv 2017]Learning Piece-wise Linear Models from Large Scale Data for Ad Click Prediction |
| Deep & Cross Network | [ADKDD 2017]Deep & Cross Network for Ad Click Predictions |
| Attentional Factorization Machine | [IJCAI 2017]Attentional Factorization Machines: Learning the Weight of Feature Interactions via Attention Networks |
| Neural Factorization Machine | [SIGIR 2017]Neural Factorization Machines for Sparse Predictive Analytics |
| xDeepFM | [KDD 2018]xDeepFM: Combining Explicit and Implicit Feature Interactions for Recommender Systems |
| AutoInt | [arxiv 2018]AutoInt: Automatic Feature Interaction Learning via Self-Attentive Neural Networks |
| Deep Interest Network | [KDD 2018]Deep Interest Network for Click-Through Rate Prediction |
| Deep Interest Evolution Network | [AAAI 2019]Deep Interest Evolution Network for Click-Through Rate Prediction |
| NFFM | [arxiv 2019]Operation-aware Neural Networks for User Response Prediction |
| FGCNN | [WWW 2019]Feature Generation by Convolutional Neural Network for Click-Through Rate Prediction |
| Deep Session Interest Network | [IJCAI 2019]Deep Session Interest Network for Click-Through Rate Prediction |
| FiBiNET | [RecSys 2019]FiBiNET: Combining Feature Importance and Bilinear feature Interaction for Click-Through Rate Prediction |
| DSTN | Deep Spatio-Temporal Neural Networks for Click-Through Rate Prediction |
?
2.1.2 Convolutional Click Prediction Model
模型結構
主要思想
通過一個(width, 1)的kernel進行對特征的embedding矩陣進行二維卷積,其中width表示的每次對連續的width個特征進行卷積運算,之后使用一個Flexible pooling機制進行池化操作進行特征聚合和壓縮表示,堆疊若干層后將得到特征矩陣作為MLP的輸入,得到最終的預測結果。
這里解釋兩個問題
1.為什么強調是連續的width個特征進行卷積
我們都知道CNN之所以在CV領域大放異彩是由于其具有如下特性
-
參數共享
? ? ? ?通常一個特征檢測子(如邊緣檢測)在圖像某一部位有用也在其他部位生效。
- 稀疏連接
? ? ? ?每一層的輸出只依賴于前一層一小部分的輸入
在NLP任務中由于語句天然存在前后依賴關系,所以使用CNN能獲得一定的特征表達,那么在CTR任務中使用CNN能獲得特征提取的功能嗎?
答案是能,但是效果可能沒有那么好,問題就出在卷積是對連續的width個特征進行計算,這導致了我們輸入特征的順序發生變化就會引起結果的變化,而在CTR任務中,我們的特征輸入是沒有順序的。
這相當于我們給了一個先驗在里面,就是連續的width個特征進行組合更具有意義。
雖然我們可以使用類似空洞卷積的思想增加感受野來使得卷積計算的時候跨越多個特征,但是這仍然具有一定的隨機性。
所以使用CNN進行CTR任務的特征提取的一個難點就在于其計算的是局部特征組合,無法有效捕捉全局組合特征。
2.Flexible pooliong是什么?
其實就是Max Pooling,只不過每次沿某一維度取p個最大的,不是1個最大的。
p的取值根據當前池化層數和總層數自適應計算,其中i是當前層數,l是總層數
2.1.2?Factorization-supported Neural Network
2.1.2.1 、摘要:
預測用戶回應(user response),例如CTR、CVR(轉化率)在網頁搜索、個性化推薦、在在線廣告起著至關重要的作用;不同于圖像和音頻領域,網頁空間的輸入特征通常是離散和類別型的,并且依賴性也基本未知;原來要預測用戶響應:線性模型(欠擬合)或手工設計高階交互特征(計算量大);文章提出通過DNN來自動學習有效的類別特征交互模式,為了使DNN有效工作,利用三個特征轉換方法:FM(factorisation machines)、RBM(限制波爾茲曼機)、DAE(降噪自編碼器);
2.1.2.2、介紹
一堆balabala,就是講線性模型不能有效的學習出不明顯的模式;FM和GBDT雖然能做特征組合,但是不能利用全部不同特征的組合;許多模型需要依靠特征工程和手工設計特征,并且大多數模型是淺層結構,泛化性能不好;
然后文章提出深度學習在圖像、文本等的廣泛應用,可以學習出局部特征并進而學習出高階特征篩。但是對于CTR問題,存在多個領域并且都是類別特征(如城市、設備類型、廣告類型),他們的局部依賴性是未知的,通過DNN來學習特征表示是很有前景的;文中提出方法Factorisation Machine supported Neural Network (FNN) 和 Sampling-based Neural Network (SNN)。 其中FNN通過監督學習Embedding并用FM來將稀疏特征變成Dense特征,減少維度;SNN通過負采樣方式,基于RBM或者DAE。
2.1.2.3、DNNs for CTR Estimation given Categorical Features
如圖所示是一個4層的FNN結構:
輸入類別特征是field-wise 的One-hot編碼形式,只有一個值為1,其他為0;
2.1.2.4、Factorisation-machine supported Neural Networks (FNN)
2.1.2.5、Sampling-based Neural Networks (SNN)
基于采樣的NN如下圖所示:
SNN和FNN不同的地方在于最底層是不一樣的,FNN是基于FM,而SNN是全連接網絡,使用sigmoid函數,但由于輸入是稀疏的,所以直接訓練效果不行,使用上圖右邊所示的兩種方法:基于采樣的RBM和基于采樣的DAE。
2.1.3?Product-based Neural Network
PNN,全稱為Product-based Neural Network,認為在embedding輸入到MLP之后學習的交叉特征表達并不充分,提出了一種product layer的思想,既基于乘法的運算來體現特征交叉的DNN網絡結構,如下圖:
按照論文的思路,從上往下來看這個網絡結構:
輸出層
輸出層很簡單,將上一層的網絡輸出通過一個全鏈接層,經過sigmoid函數轉換后映射到(0,1)的區間中,得到我們的點擊率的預測值:
?
l2層
根據l1層的輸出,經一個全鏈接層 ,并使用relu進行激活,得到我們l2的輸出結果:
?
l1層
l1層的輸出由如下的公式計算:
重點馬上就要來了,我們可以看到在得到l1層輸出時,我們輸入了三部分,分別是lz,lp 和 b1,b1是我們的偏置項,這里可以先不管。lz和lp的計算就是PNN的精華所在了。我們慢慢道來:
Product Layer
product思想來源于,在ctr預估中,認為特征之間的關系更多是一種and“且”的關系,而非add"或”的關系。例如,性別為男且喜歡游戲的人群,比起性別男和喜歡游戲的人群,前者的組合比后者更能體現特征交叉的意義。
product layer可以分成兩個部分,一部分是線性部分lz,一部分是非線性部分lp。二者的形式如下:
在這里,我們要使用到論文中所定義的一種運算方式,其實就是矩陣的點乘:
我們先繼續介紹網絡結構,有關Product Layer的更詳細的介紹,我們在下一章中介紹。
?
Embedding Layer
Embedding Layer跟DeepFM中相同,將每一個field的特征轉換成同樣長度的向量,這里用f來表示。
損失函數
損失函數使用交叉熵:
?
?
2.1.3.1、Product Layer詳細介紹
前面提到了,product layer可以分成兩個部分,一部分是線性部分lz,一部分是非線性部分lp。它們同維度,其具體形式如下:
?
看上面的公式,我們首先需要知道z和p,這都是由我們的embedding層得到的,其中z是線性信號向量,因此我們直接用embedding層得到:
論文中使用的等號加一個三角形,其實就是相等的意思,可以認為z就是embedding層的復制。
對于p來說,這里需要一個公式進行映射:
不同的g的選擇使得我們有了兩種PNN的計算方法,一種叫做Inner PNN,簡稱IPNN,一種叫做Outer PNN,簡稱OPNN。
接下來,我們分別來具體介紹這兩種形式的PNN模型,由于涉及到復雜度的分析,所以我們這里先定義Embedding的大小為M,field的大小為N,而lz和lp的長度為D1。
?
2.1.3.2?IPNN
IPNN中p的計算方式如下,即使用內積來代表pij:
所以,pij其實是一個數,得到一個pij的時間復雜度為M,p的大小為N*N,因此計算得到p的時間復雜度為N*N*M。而再由p得到lp的時間復雜度是N*N*D1。因此 對于IPNN來說,總的時間復雜度為N*N(D1+M)。文章對這一結構進行了優化,可以看到,我們的p是一個對稱矩陣,因此我們的權重也可以是一個對稱矩陣,對稱矩陣就可以進行如下的分解:
因此:
因此:
?
2.1.3.3?OPNN
OPNN中p的計算方式如下:
此時pij為M*M的矩陣,計算一個pij的時間復雜度為M*M,而p是N*N*M*M的矩陣,因此計算p的事件復雜度為N*N*M*M。從而計算lp的時間復雜度變為D1 * N*N*M*M。這個顯然代價很高的。為了減少復雜度,論文使用了疊加的思想,它重新定義了p矩陣:
通過元素相乘的疊加,也就是先疊加N個field的Embedding向量,然后做乘法,可以大幅減少時間復雜度,定義p為:
這里計算p的時間復雜度變為了D1*M*(M+N)
?
2.1.3.4.Discussion
和FNN相比,PNN多了一個product層,和FM相比,PNN多了隱層,并且輸出不是簡單的疊加;在訓練部分,可以單獨訓練FNN或者FM部分作為初始化,然后BP算法應用整個網絡,那么至少效果不會差于FNN和FM;
2.1.4?Wide & Deep
2.1.4.1 背景
Wide and deep 模型是 TensorFlow 在 2016 年 6 月左右發布的一類用于分類和回歸的模型,并應用到了 Google Play 的應用推薦中。wide and deep 模型的核心思想是結合線性模型的記憶能力(memorization)和 DNN 模型的泛化能力(generalization),在訓練過程中同時優化 2 個模型的參數,從而達到整體模型的預測能力最優。
記憶(memorization)即從歷史數據中發現item或者特征之間的相關性。
泛化(generalization)即相關性的傳遞,發現在歷史數據中很少或者沒有出現的新的特征組合。
2.1.4.2?原理
- ?網絡結構
?
可以認為:WideDeep = LR + DNN
-
推薦系統
?
流程:
論文主要講排序的部分,排序時使用到的特征:
2.1.4.3The Wide Component
wide部分就是LR,LR的輸入特征包括了原始特征和交叉特征;
交叉特征的定義:
?
?
在論文中,當x_i = 1 x_j = 1 其他值都是 0 時,就添加一個交叉特征 1 ,由于輸入的x是one-hot類型,交叉特征可以理解為任意兩個特征的乘積。
2.1.4.4The Deep Component
Deep部分就是一個MLP,隱藏層的激活函數使用了ReLUs = max(0, a)。MLP的輸入包括了連續的特征和 embedding特征,對于每個field embedding特征采樣隨機初始化的方式。
2.1.4.5 joint training
?
joint training指同時訓練Wide模型和Deep模型,并將兩個模型的結果的加權作為最終的預測結果:
?
?
在論文實驗中,訓練部分,Wide使用Follow-the-regularized-learder(FTRL)+L1正則, Deep使用了AdaGrad。
2.1.4?DeepFM
2.1.4.1、背景
特征組合的挑戰
對于一個基于CTR預估的推薦系統,最重要的是學習到用戶點擊行為背后隱含的特征組合。在不同的推薦場景中,低階組合特征或者高階組合特征可能都會對最終的CTR產生影響。
之前介紹的因子分解機(Factorization Machines, FM)通過對于每一維特征的隱變量內積來提取特征組合。最終的結果也非常好。但是,雖然理論上來講FM可以對高階特征組合進行建模,但實際上因為計算復雜度的原因一般都只用到了二階特征組合。
那么對于高階的特征組合來說,我們很自然的想法,通過多層的神經網絡即DNN去解決。
DNN的局限
下面的圖片來自于張俊林教授在AI大會上所使用的PPT。
我們之前也介紹過了,對于離散特征的處理,我們使用的是將特征轉換成為one-hot的形式,但是將One-hot類型的特征輸入到DNN中,會導致網絡參數太多:
如何解決這個問題呢,類似于FFM中的思想,將特征分為不同的field:
再加兩層的全鏈接層,讓Dense Vector進行組合,那么高階特征的組合就出來了
但是低階和高階特征組合隱含地體現在隱藏層中,如果我們希望把低階特征組合單獨建模,然后融合高階特征組合。
即將DNN與FM進行一個合理的融合:
二者的融合總的來說有兩種形式,一是串行結構,二是并行結構
而我們今天要講到的DeepFM,就是并行結構中的一種典型代表。
2.1.4.2、DeepFM模型
我們先來看一下DeepFM的模型結構:
DeepFM包含兩部分:神經網絡部分與因子分解機部分,分別負責低階特征的提取和高階特征的提取。這兩部分共享同樣的輸入。DeepFM的預測結果可以寫為:
FM部分
FM部分的詳細結構如下:
FM部分是一個因子分解機。關于因子分解機可以參閱文章[Rendle, 2010] Steffen Rendle. Factorization machines. In ICDM, 2010.。因為引入了隱變量的原因,對于幾乎不出現或者很少出現的隱變量,FM也可以很好的學習。
FM的輸出公式為:
深度部分
深度部分是一個前饋神經網絡。與圖像或者語音這類輸入不同,圖像語音的輸入一般是連續而且密集的,然而用于CTR的輸入一般是及其稀疏的。因此需要重新設計網絡結構。具體實現中為,在第一層隱含層之前,引入一個嵌入層來完成將輸入向量壓縮到低維稠密向量。
嵌入層(embedding layer)的結構如上圖所示。當前網絡結構有兩個有趣的特性,1)盡管不同field的輸入長度不同,但是embedding之后向量的長度均為K。2)在FM里得到的隱變量Vik現在作為了嵌入層網絡的權重。
這里的第二點如何理解呢,假設我們的k=5,首先,對于輸入的一條記錄,同一個field 只有一個位置是1,那么在由輸入得到dense vector的過程中,輸入層只有一個神經元起作用,得到的dense vector其實就是輸入層到embedding層該神經元相連的五條線的權重,即vi1,vi2,vi3,vi4,vi5。這五個值組合起來就是我們在FM中所提到的Vi。在FM部分和DNN部分,這一塊是共享權重的,對同一個特征來說,得到的Vi是相同的。
有關模型具體如何操作,我們可以通過代碼來進一步加深認識。
2.1.4.3、相關知識
我們先來講兩個代碼中會用到的相關知識吧,代碼是參考的github上星數最多的DeepFM實現代碼。
Gini Normalization
代碼中將CTR預估問題設定為一個二分類問題,繪制了Gini Normalization來評價不同模型的效果。這個是什么東西,不太懂,百度了很多,發現了一個比較通俗易懂的介紹。
假設我們有下面兩組結果,分別表示預測值和實際值:
predictions = [0.9, 0.3, 0.8, 0.75, 0.65, 0.6, 0.78, 0.7, 0.05, 0.4, 0.4, 0.05, 0.5, 0.1, 0.1]
actual = [1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]
然后我們將預測值按照從小到大排列,并根據索引序對實際值進行排序:
SortedActualValues[0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 1, 1]
然后,我們可以畫出如下的圖片:
接下來我們將數據Normalization到0,1之間。并畫出45度線。
橙色區域的面積,就是我們得到的Normalization的Gini系數。
這里,由于我們是將預測概率從小到大排的,所以我們希望實際值中的0盡可能出現在前面,因此Normalization的Gini系數越大,分類效果越好。
embedding_lookup
在tensorflow中有個embedding_lookup函數,我們可以直接根據一個序號來得到一個詞或者一個特征的embedding值,那么他內部其實是包含一個網絡結構的,如下圖所示:
假設我們想要找到2的embedding值,這個值其實是輸入層第二個神經元與embedding層連線的權重值。
之前有大佬跟我探討word2vec輸入的問題,現在也算是有個比較明確的答案,輸入其實就是one-hot Embedding,而word2vec要學習的是new Embedding。
2.1.5?Piece-wise Linear Model
2.5.1.1、算法介紹
現階段各CTR預估算法的不足
我們這里的現階段,不是指的今時今日,而是阿里剛剛公開此算法的時間,大概就是去年的三四月份吧。
業界常用的CTR預估算法的不足如下表所示:
| 邏輯回歸 | 使用了Sigmoid函數將函數值映射到0~1區間作為CTR的預估值。LR這種線性模型很容易并行化,處理上億條訓練樣本不是問題。 | 線性模型的學習能力有限,需要引入大量的領域知識來人工設計特征以及特征之間的交叉組合來間接補充算法的非線性學習能力,非常消耗人力和機器資源,遷移性不夠友好。 |
| Kernel方法 | 將低維特征映射到高維特征空間 | 復雜度太高而不易實現 |
| 樹模型 | 如Facebook的GBDT+LR算法,有效地解決了LR模型的特征組合問題 | 是對歷史行為的記憶,缺乏推廣性,樹模型只能學習到歷史數據中的特定規則,對于新規則缺乏推廣性 |
| FM模型 | 自動學習高階屬性的權值,不用通過人工的方式選取特征來做交叉 | FM模型只能擬合特定的非線性模式,常用的就是二階FM |
| 深度神經網絡 | 使用神經網絡擬合數據之間的高階非線性關系,非線性擬合能力足夠強 | 適合數據規律的、具備推廣性的網絡結構業界依然在探索中,尤其是要做到端到端規模化上線,這里面的技術挑戰依然很大 |
那么挑戰來了,如何設計算法從大規模數據中挖掘出具有推廣性的非線性模式?
MLR算法
2011-2012年期間,阿里媽媽資深專家蓋坤創新性地提出了MLR(mixed logistic regression)算法,引領了廣告領域CTR預估算法的全新升級。MLR算法創新地提出并實現了直接在原始空間學習特征之間的非線性關系,基于數據自動發掘可推廣的模式,相比于人工來說效率和精度均有了大幅提升。
MLR可以看做是對LR的一個自然推廣,它采用分而治之的思路,用分片線性的模式來擬合高維空間的非線性分類面,其形式化表達如下:
其中u是聚類參數,決定了空間的劃分,w是分類參數,決定空間內的預測。這里面超參數分片數m可以較好地平衡模型的擬合與推廣能力。當m=1時MLR就退化為普通的LR,m越大模型的擬合能力越強,但是模型參數規模隨m線性增長,相應所需的訓練樣本也隨之增長。因此實際應用中m需要根據實際情況進行選擇。例如,在阿里的場景中,m一般選擇為12。下圖中MLR模型用4個分片可以完美地擬合出數據中的菱形分類面。
在實際中,MLR算法常用的形式如下,使用softmax作為分片函數:
在這種情況下,MLR模型可以看作是一個FOE model:
關于損失函數的設計,阿里采用了 neg-likelihood loss function以及L1,L2正則,形式如下:
由于加入了正則項,MLR算法變的不再是平滑的凸函數,梯度下降法不再適用,因此模型參數的更新使用LBFGS和OWLQN的結合,具體的優化細節大家可以參考論文(https://arxiv.org/pdf/1704.05194.pdf).
MLR算法適合于工業級的大規模稀疏數據場景問題,如廣告CTR預估。背后的優勢體現在兩個方面:
端到端的非線性學習:從模型端自動挖掘數據中蘊藏的非線性模式,省去了大量的人工特征設計,這 使得MLR算法可以端到端地完成訓練,在不同場景中的遷移和應用非常輕松。
稀疏性:MLR在建模時引入了L1和L2,1范數正則,可以使得最終訓練出來的模型具有較高的稀疏度, 模型的學習和在線預測性能更好。當然,這也對算法的優化求解帶來了巨大的挑戰。
2.1.6 Deep & Cross Network
背景
探索具有預測能力的組合特征對提高CTR模型的性能十分重要,這也是大量人工特征工程存在的原因。但是數據高維稀疏(大量離散特征one-hot之后)的性質,對特征探索帶來了巨大挑戰,進而限制了許多大型系統只能使用線性模型(比如邏輯回歸)。線性模型簡單易理解并且容易擴展,但是表達能力有限,對模型表達能力有巨大作用的組合特征通常需要人工不斷的探索。深度學習的成功激發了大量針對它的表達能力的理論分析,研究顯示給定足夠多隱藏層或者隱藏單元,DNN能夠在特定平滑假設下以任意的精度逼近任意函數。實踐中大多數函數并不是任意的,所以DNN能夠利用可行的參數量達到很好的效果。DNN憑借Embedding向量以及非線性激活函數能夠學習高階的特征組合,并且殘差網絡的成功使得我們能夠訓練很深的網絡。
相關工作
由于數據集規模和維度的急劇增加,為了避免針對特定任務的大規模特征工程,涌現了很多方法,這些方法主要是基于Embedding和神經網絡技術。
- FM將稀疏特征映射到低維稠密向量上,通過向量內積學習特征組合,也就是通過隱向量的內積來建模組合特征。
- FFM在FM的基礎上引入Field概念,允許每個特征學習多個向量,針對不同的Field使用不同的隱向量。
- DNN依靠神經網絡強大的學習能力,能夠自動的學習特征組合,但是它隱式的學習了所有的特征組合,這對于模型效果和學習效率可能是不利的。
遺憾的是FM和FFM的淺層結構限制了它們的表達能力(兩者都是針對低階的特征組合進行建模),也有將FM擴展到高階的方法,但是這些方法擁有大量的參數產生了額外的計算開銷。Kaggle競賽中,很多取勝的方法中人工構造的組合特征都是低階的,并且是顯性(具有明確意義)高效的。而DNN學習到的都是高度非線性的高階組合特征,含義難以解釋。是否有一種模型能夠學習有限階數的特征組合,并且高效可理解呢?本文提出的DCN就是一種。W&D也是這種思想,組合特征作為線性模型的輸入,同時訓練線性模型和DNN,但是該模型的效果取決于組合特征的選擇。
主要貢獻
交叉網絡是個多層網絡,能夠有效的學習特定階數的特征組合,特征組合的最高階數取決于網絡層數。通過聯合(jointly)訓練交叉網絡和DNN,DCN保留了DNN捕獲復雜特征組合的能力。DCN不需要人工特征工程,而且相對于DNN來說增加的復雜度也是微乎其微。實驗表明DCN在模型準確度和內存使用方面具有優勢,需要比DNN少一個數量級的參數。
- 支持稀疏、稠密輸入,能夠高效的學習特定階數限制下的特征組合以及高階非線性特征組合,并且不需要人工特征工程,擁有較低的計算開銷;
- 交叉網絡簡單有效,特征組合的最高階數取決于網絡層數,網絡中包含了1價到特定階數的所有項的組合并且它們的系數不同;
- 節省內存并且易于實現,擁有比DNN低的logloss,而且參數量少了近一個數量級。
核心思想
Embedding和Stacking層
模型的輸入大部分是類別特征,這種特征通常會進行one-hot編碼,這就導致了特征空間是高維稀疏的(比如ID特征經過one-hot編碼之后)。為了降低維度,通常會利用Embedding技術將這些二值特征轉變成實值的稠密向量(Embedding向量)。Embedding過程用到的參數矩陣會和網絡中的其它參數一塊進行優化。最后將這些Embedding向量和經過歸一化的稠密特征組合(stack)到一起作為網絡的輸入。
?
X0=[XTembed,1,…,XTembed,k,XTdense]X0=[Xembed,1T,…,Xembed,kT,XdenseT]
交叉網絡(Cross Network)
DCN主要有以下幾點貢獻:
- 提出一種新型的交叉網絡結構,可以用來提取交叉組合特征,并不需要人為設計的特征工程;
- 這種網絡結構足夠簡單同時也很有效,可以獲得隨網絡層數增加而增加的多項式階(polynomial degree)交叉特征;
- 十分節約內存(依賴于正確地實現),并且易于使用;
- 實驗結果表明,DCN相比于其他模型有更出色的效果,與DNN模型相比,較少的參數卻取得了較好的效果。
2.1.7?Attentional Factorization Machine
2.1.7.1、摘要:
提出一個Attentional FM,Attention模型+因子分解機,其通過Attention學習到特征交叉的權重。因為很顯然不是所有的二階特征交互的重要性都是一樣的,如何通過機器自動的從中學習到這些重要性是這篇論文解決的最重要的問題,
比如:作者舉了一個例子,在句子"US continues taking a leading role on foreign payment transparency"中,除了"foreign payment transparency",其它句子明顯與財經新聞無關,它們之間的交叉作用可認為對主題預測是一種噪音。
2.1.7.2、FM
2.1.7.3、注意力機制
AFM模型架構:
?
?
2.1.8?Neural Factorization Machine
NFM(Neural?Factorization?Machines)?又是在?FM?上的一個改進工作,出發點是?FM?通過隱向量可以對完成一個很好的特征組合工作,并且還解決了稀疏的問題,但是?FM?對于它對于?non-linear?和higher-order?特征交叉能力不足,而?NFM?則是結合了?FM?和?NN?來彌補這個不足。模型框架如下(圖里沒畫一階的回歸):
2.1.9?xDeepFM
2.1.9.1 Compressed Interaction Network
為了實現自動學習顯式的高階特征交互,同時使得交互發生在向量級上,文中首先提出了一種新的名為壓縮交互網絡(Compressed Interaction Network,簡稱CIN)的神經模型。在CIN中,隱向量是一個單元對象,因此我們將輸入的原特征和神經網絡中的隱層都分別組織成一個矩陣,記為X0和Xk。CIN中每一層的神經元都是根據前一層的隱層以及原特征向量推算而來,其計算公式如下:
其中點乘的部分計算如下:
我們來解釋一下上面的過程,第k層隱層含有H_k條神經元向量。隱層的計算可以分成兩個步驟:(1)根據前一層隱層的狀態Xk和原特征矩陣X0,計算出一個中間結果Z^k+1,它是一個三維的張量,如下圖所示:
在這個中間結果上,我們用Hk+1個尺寸為m*Hk的卷積核生成下一層隱層的狀態,該過程如圖2所示。這一操作與計算機視覺中最流行的卷積神經網絡大體是一致的,唯一的區別在于卷積核的設計。CIN中一個神經元相關的接受域是垂直于特征維度D的整個平面,而CNN中的接受域是當前神經元周圍的局部小范圍區域,因此CIN中經過卷積操作得到的特征圖(Feature Map)是一個向量,而不是一個矩陣。
如果你覺得原文中的圖不夠清楚的話,希望下圖可以幫助你理解整個過程:
CIN的宏觀框架可以總結為下圖:
可以看出,它的特點是,最終學習出的特征交互的階數是由網絡的層數決定的,每一層隱層都通過一個池化操作連接到輸出層,從而保證了輸出單元可以見到不同階數的特征交互模式。同時不難看出,CIN的結構與循環神經網絡RNN是很類似的,即每一層的狀態是由前一層隱層的值與一個額外的輸入數據計算所得。不同的是,CIN中不同層的參數是不一樣的,而在RNN中是相同的;RNN中每次額外的輸入數據是不一樣的,而CIN中額外的輸入數據是固定的,始終是X^0。
可以看到,CIN是通過(vector-wise)來學習特征之間的交互的,還有一個問題,就是它為什么是顯式的進行學習?我們先從X1來開始看,X1的第h個神經元向量可以表示成:
進一步,X^2的第h個神經元向量可以表示成:
最后,第k層的第h個神經元向量可以表示成:
因此,我們能夠通過上面的式子對特征交互的形式進行一個很好的表示,它是顯式的學習特征交叉。
2.1.9.2 xDeepFM
將CIN與線性回歸單元、全連接神經網絡單元組合在一起,得到最終的模型并命名為極深因子分解機xDeepFM,其結構如下圖:
集成的CIN和DNN兩個模塊能夠幫助模型同時以顯式和隱式的方式學習高階的特征交互,而集成的線性模塊和深度神經模塊也讓模型兼具記憶與泛化的學習能力。值得一提的是,為了提高模型的通用性,xDeepFM中不同的模塊共享相同的輸入數據。而在具體的應用場景下,不同的模塊也可以接入各自不同的輸入數據,例如,線性模塊中依舊可以接入很多根據先驗知識提取的交叉特征來提高記憶能力,而在CIN或者DNN中,為了減少模型的計算復雜度,可以只導入一部分稀疏的特征子集。
2.1.9.3 Tensorflow充電
在介紹xDeepFM的代碼之前,我們先來進行充電,學習幾個tf的函數以及xDeepFM關鍵過程的實現。
tf.split
首先我們要實現第一步:
?
如何將兩個二維的矩陣,相乘得到一個三維的矩陣?我們首先來看一下tf.split函數的原理:
tf.split(value,num_or_size_splits,axis=0,num=None,name='split' )其中,value傳入的就是需要切割的張量,axis是切割的維度,根據num_or_size_splits的不同形式,有兩種切割方式:
好了,從實際需求出發,我們來體驗一下,假設我們的batch為2,embedding的size是3,field數量為4。我們先來生成兩個這樣的tensor(假設X^k的field也是4 ):
arr1 = tf.convert_to_tensor(np.arange(1,25).reshape(2,4,3),dtype=tf.int32) arr2 = tf.convert_to_tensor(np.arange(1,25).reshape(2,4,3),dtype=tf.int32)生成的矩陣如下:
在經過CIN的第一步之后,我們目標的矩陣大小應該是2(batch) * 3(embedding Dimension) * 4(X^k的field數) * 4(X^0的field數)。如果只考慮batch中第一條數據的話,應該形成的是 1 * 3 * 4 * 4的矩陣。忽略第0維,想像成一個長寬為4,高為3的長方體,長方體橫向切割,第一個橫截面對應的數字應該如下:
那么想要做到這樣的結果,我們首先按輸入數據的axis=2進行split:
split_arr1 = tf.split(arr1,[1,1,1],2) split_arr2 = tf.split(arr2,[1,1,1],2) print(split_arr1) print(sess.run(split_arr1)) print(sess.run(split_arr2))分割后的結果如下:
通過結果我們可以看到,我們現在對每一條數據,得到了3個4 * 1的tensor,可以理解為此時的tensor大小為 3(embedding Dimension) * 2(batch) * 4(X^k 或X^0的field數) * 1。
此時我們進行矩陣相乘:
res = tf.matmul(split_arr1,split_arr2,transpose_b=True)這里我理解的,tensorflow對3維及以上矩陣相乘時,矩陣相乘只發生在最后兩維。也就是說,3 * 2 * 4 * 1 和 3 * 2 * 1 * 4的矩陣相乘,最終的結果是3 * 2 * 4 * 4。我們來看看結果:
可以看到,不僅矩陣的形狀跟我們預想的一樣,同時結果也跟我們預想的一樣。
最后,我們只需要進行transpose操作,把batch轉換到第0維就可以啦。
res = tf.transpose(res,perm=[1,0,2,3])這樣,CIN中的第一步就大功告成了,明白了這一步如何用tensorflow實現,那么代碼你也就能夠順其自然的看懂啦!
這一塊完整的代碼如下:
import tensorflow as tf import numpy as nparr1 = tf.convert_to_tensor(np.arange(1,25).reshape(2,4,3),dtype=tf.int32) arr2 = tf.convert_to_tensor(np.arange(1,25).reshape(2,4,3),dtype=tf.int32)with tf.Session() as sess:sess.run(tf.global_variables_initializer())split_arr1 = tf.split(arr1,[1,1,1],2)split_arr2 = tf.split(arr2,[1,1,1],2)print(split_arr1)print(sess.run(split_arr1))print(sess.run(split_arr2))res = tf.matmul(split_arr1,split_arr2,transpose_b=True)print(sess.run(res))res = tf.transpose(res,perm=[1,0,2,3])print(sess.run(res))2.1.10?AutoInt
2.1.10.1 簡介
這篇論文提出使用multi-head self attention(類似Transformer里的那個) 機制來進行自動特征交叉學習以提升CTR預測任務的精度。
廢話不多說,先看下主要結構。典型的四段式深度學習CTR模型結構:輸入,嵌入,特征提取,輸出。這里我們重點看下嵌入和特征提取部分
?
核心結構
輸入和嵌入
輸入和嵌入層結構
針對類別特征,通過embedding方式轉換為低維稠密向量??其中,??是特征組?對應的嵌入字典(嵌入矩陣),??是特征組特征的獨熱編碼表示向量(通常出于節省空間的考慮,只存儲非零特征對應的索引)
對于連續特征有,??其中??是一個嵌入向量,??是一個標量值
通常在CTR任務中我們對連續值特征的處理方式有三種:
本文采取的是第三種方式,具體這三種方式孰優孰劣,要在具體場景具體任務下大家自己去驗證了~
從實現的角度看第三種是比較便捷的。
InteractingLayer(交互層)
交互層使用多頭注意力機制將特征投射到多個子空間中,在不同的子空間中可以捕獲不同的特征交互模式。通過交互層的堆疊,可以捕獲更高階的交互模式。
下面展示在特定子空間??下,對于特征組??下的特征??,交互層是如何計算與其相關的交互特征??的
?
假設有??個注意力子空間,將每個子空間下的結果進行拼接,得到特征??最終的結果表示 :?
我們可以選擇使用殘差網絡保留一些原始特征的信息留給下一層繼續學習
最后,將每個特征的結果拼接,計算最終的輸出值
?
一層交互層捕獲的階數有限,通過堆疊若干交互層可以捕獲高階交互,提升注意力空間向量維度和提高子空間個數均能提升模型的表達能力。該模型也可以聯合傳統的MLP進行聯合訓練進一步提升表達能力。
我不想看數學,我想看代碼:OK
下面就是核心代碼啦,可以看到其實很短。 我們使用tensorflow進行實現的時候,可以充分利用矩陣運算的特性來簡化實現。
先說明一些定義,fieldsize為特征組的個數,embedding_size為嵌入層單個特征的嵌入維度,att_embedding_size為注意力空間下隱向量的長度,head_num為注意力空間的個數,use_res為一個布爾變量,表示是否使用殘差連接。
首先假設輸入inputs的shape為(batch_size,field_size,embedding_size),四個投影矩陣??的shape均為(embedding_size, att_embedding_size * head_num)
2. 為了同時在不同的子空間下計算特征相似度,需要先進行一些變換
querys = tf.stack(tf.split(querys, self.head_num, axis=2)) # (head_num,batch_size,field_size,att_embedding_size) keys = tf.stack(tf.split(keys, self.head_num, axis=2)) values = tf.stack(tf.split(values, self.head_num, axis=2))3. 計算相似度及歸一化注意力分布
inner_product = tf.matmul(querys, keys, transpose_b=True) # (head_num,batch_size,field_size,field_size) normalized_att_scores = tf.nn.softmax(inner_product)4. 計算加權和
result = tf.matmul(normalized_att_scores, values) # (head_num,batch_size,field_size,att_embedding_size)5. 將不同子空間下的結果進行拼接
result = tf.concat(tf.split(result, self.head_num, ), axis=-1) result = tf.squeeze(result, axis=0)# (batch_size,field_size,att_embedding_size*head_num)6. 使用殘差連接保留原始信息,
if use_res:result += tf.tensordot(inputs, self.w_res, axes=(-1, 0)) result = tf.nn.relu(result)# (batch_size,field_size,att_embedding_size*head_num)我不想看代碼,我想直接拿來用:沒問題
首先確保你的python版本>=3.4,然后pip install deepctr, 再去下載一下demo數據?然后直接運行下面的代碼吧!
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? criteo sample
import pandas as pd from sklearn.metrics import log_loss, roc_auc_score from sklearn.model_selection import train_test_split from sklearn.preprocessing import LabelEncoder, MinMaxScalerfrom deepctr.models import AutoInt from deepctr.inputs import SparseFeat, DenseFeat,get_fixlen_feature_namesif __name__ == "__main__":data = pd.read_csv('./criteo_sample.txt')sparse_features = ['C' + str(i) for i in range(1, 27)]dense_features = ['I' + str(i) for i in range(1, 14)]data[sparse_features] = data[sparse_features].fillna('-1', )data[dense_features] = data[dense_features].fillna(0, )target = ['label']# 1.Label Encoding for sparse features,and do simple Transformation for dense featuresfor feat in sparse_features:lbe = LabelEncoder()data[feat] = lbe.fit_transform(data[feat])mms = MinMaxScaler(feature_range=(0, 1))data[dense_features] = mms.fit_transform(data[dense_features])# 2.count #unique features for each sparse field,and record dense feature field namefixlen_feature_columns = [SparseFeat(feat, data[feat].nunique())for feat in sparse_features] + [DenseFeat(feat, 1,)for feat in dense_features]dnn_feature_columns = fixlen_feature_columnslinear_feature_columns = fixlen_feature_columnsfixlen_feature_names = get_fixlen_feature_names(linear_feature_columns + dnn_feature_columns)# 3.generate input data for modeltrain, test = train_test_split(data, test_size=0.2)train_model_input = [train[name] for name in fixlen_feature_names]test_model_input = [test[name] for name in fixlen_feature_names]# 4.Define Model,train,predict and evaluatemodel = AutoInt( dnn_feature_columns, task='binary')model.compile("adam", "binary_crossentropy",metrics=['binary_crossentropy'], )history = model.fit(train_model_input, train[target].values,batch_size=256, epochs=10, verbose=2, validation_split=0.2, )pred_ans = model.predict(test_model_input, batch_size=256)print("test LogLoss", round(log_loss(test[target].values, pred_ans), 4))print("test AUC", round(roc_auc_score(test[target].values, pred_ans), 4))2.1.11?Deep Interest Network
2.1.11.1 背景
經典MLP不能充分利用結構化數據,本文提出的DIN可以(1)使用興趣分布代表用戶多樣化的興趣(不同用戶對不同商品有興趣)(2)與attention機制一樣,根據ad局部激活用戶興趣相關的興趣(用戶有很多興趣,最后導致購買的是小部分興趣,attention機制就是保留并激活這部分興趣)。
?
2.1.11.2 評價指標
按照user聚合樣本,累加每個user組的sum(shows*AUC)/sum(shows)。paper說實驗表明GAUC比AUC準確穩定。
?
2.1.11.3 DIN算法
?
?? ??? ?左邊是基礎模型,也是實驗的對照組,paper介紹大部分線上模型使用的是左面的base model。user和ad的特征做one_hot編碼,為了定長采用池化層,網絡結構是全連接的MLP。
?? ?? ? 右邊是DIN,不同是為了處理上述兩個數據結構,輸入層增加了激活單元。
2.1.11.4 激活函數
激活函數g如下所示。
?
其中,vi代表用戶的行為編碼id,vu代表用戶的興趣編碼id,va代表ad的編碼id,wi代表對于某個候選廣告,attention機制中行為id對總體興趣編碼id的貢獻度。
?? ?? ? 激活函數采用本文提出的Dice,如下yi所示。
?
其中,pi和 mini batch數據的期望和方差,如下所示。
? ? ?? ?Dice激活函數的優點是根據minibatch的期望方差自適應調整校正點,而Relu采用硬校正點0。
?? ?? ? 對照組的PRelu(又叫leaky Relu)激活函數如下所示。
?
2.1.11.5 正則化
優化方法梯度下降法,如下所示。
?
其中,Ii如下所示。
2.1.11.6 架構實現
實現基于XDL平臺,分為三部分:分布式特征編碼層,本地后臺(Tensorflow)和溝通機制(MPI)。如下圖所示。
2.1.11.7 實驗結果
1)特征編碼:聚類效果明顯,而且紅色的CTR最高,DIN模型能夠正確的辨別商品是否符合用戶的興趣,如下圖所示。
?
2)局部激活效果:與候選廣告越相關的行為的attention分數越高,如下圖所示。
?
?
3)正則化效果:DIN效果最好,如下圖所示。
?
?
?
4)與基礎MLP模型相比:DIN最佳,如下圖所示。
?
?
2.1.11.8 model網絡搭建
# -- 嵌入層 start ---ic = tf.gather(cate_list, self.i) # [B]i_emb = tf.concat(values=[tf.nn.embedding_lookup(item_emb_w, self.i), # [B ,hidden_units // 2]tf.nn.embedding_lookup(cate_emb_w, ic), # [B ,hidden_units // 2] = [B, H // 2]], axis=1) # [B ,H]i_b = tf.gather(item_b, self.i)hc = tf.gather(cate_list, self.hist_i) # [B , T]h_emb = tf.concat([ # 在shape【0,1,2】某一個維度上連接tf.nn.embedding_lookup(item_emb_w, self.hist_i), # [B, T, hidden_units // 2]tf.nn.embedding_lookup(cate_emb_w, hc), # [B, T, hidden_units // 2]], axis=2) # [B, T, H]# -- 嵌入層 end ---# -- attention start ---hist = attention(i_emb, h_emb, self.sl)# [B, 1, H]# -- attention end ---hist = tf.layers.batch_normalization(inputs=hist)hist = tf.reshape(hist, [-1, hidden_units]) # [B, hidden_units]hist = tf.layers.dense(hist, hidden_units)# [B, hidden_units]u_emb = hist# -- fcn begin -------# -- 訓練集全連接層 開始 -------din_i = tf.concat([u_emb, i_emb], axis=-1)din_i = tf.layers.batch_normalization(inputs=din_i, name='b1')d_layer_1_i = tf.layers.dense(din_i, 80, activation=tf.nn.sigmoid, name='f1') # 全連接層 [B, 80]# if u want try dice change sigmoid to None and add dice layer like following two lines. You can also find model_dice.py in this folder.# d_layer_1_i = tf.layers.dense(din_i, 80, activation=None, name='f1')# d_layer_1_i = dice(d_layer_1_i, name='dice_1_i')d_layer_2_i = tf.layers.dense(d_layer_1_i, 40, activation=tf.nn.sigmoid, name='f2')# d_layer_2_i = dice(d_layer_2_i, name='dice_2_i')d_layer_3_i = tf.layers.dense(d_layer_2_i, 1, activation=None, name='f3')d_layer_3_i = tf.reshape(d_layer_3_i, [-1]) # 展開成行向量self.logits = i_b + d_layer_3_i?
?
?
?
?
?
?
?
2.1.12??Deep Interest Evolution Network
2.1.12.1 背景
在大多數非搜索電商場景下,用戶并不會實時表達目前的興趣偏好。因此通過設計模型來捕獲用戶的動態變化的興趣,是提升CTR預估效果的關鍵。阿里之前的DIN模型將用戶的歷史行為來表示用戶的興趣,并強調了用戶興趣的多樣性和動態變化性,因此通過attention-based model來捕獲和目標物品相關的興趣。雖然DIN模型將用戶的歷史行為來表示興趣,但存在兩個缺點:
1)用戶的興趣是不斷進化的,而DIN抽取的用戶興趣之間是獨立無關聯的,沒有捕獲到興趣的動態進化性
2)通過用戶的顯式的行為來表達用戶隱含的興趣,這一準確性無法得到保證。
基于以上兩點,阿里提出了深度興趣演化網絡DIEN來CTR預估的性能。DIEN模型的主要貢獻點在于:
1)模型關注電商系統中興趣演化的過程,并提出了新的網絡結果來建模興趣進化的過程,這個模型能夠更精確的表達用戶興趣,同時帶來更高的CTR預估準確率。
2)設計了興趣抽取層,并通過計算一個輔助loss,來提升興趣表達的準確性。
3)設計了興趣進化層,來更加準確的表達用戶興趣的動態變化性。
接下來,我們來一起看一下DIEN模型的原理。
2.1.12.2 DIEN模型原理
- ?模型總體結構
我們先來對比一下DIN和DIEN的結構。
DIN的模型結構如下:
?
DIEN的模型結構如下:
?
可以看到,DIN和DIEN的最底層都是Embedding Layer,User profile, target AD和context feature的處理方式是一致的。不同的是,DIEN將user behavior組織成了序列數據的形式,并把簡單的使用外積完成的activation unit變成了一個attention-based GRU網絡。
2.1.12.3 興趣抽取層Interest Extractor Layer
興趣抽取層Interest Extractor Layer的主要目標是從embedding數據中提取出interest。但一個用戶在某一時間的interest不僅與當前的behavior有關,也與之前的behavior相關,所以作者們使用GRU單元來提取interest。GRU單元的表達式如下:
GRU表達式
這里我們可以認為ht是提取出的用戶興趣,但是這個地方興趣是否表示的合理呢?文中別出心裁的增加了一個輔助loss,來提升興趣表達的準確性:
這里,作者設計了一個二分類模型來計算興趣抽取的準確性,我們將用戶下一時刻真實的行為e(t+1)作為正例,負采樣得到的行為作為負例e(t+1)',分別與抽取出的興趣h(t)結合輸入到設計的輔助網絡中,得到預測結果,并通過logloss計算一個輔助的損失:
2.1.12.4 興趣進化層Interest Evolution Layer
興趣進化層Interest Evolution Layer的主要目標是刻畫用戶興趣的進化過程。舉個簡單的例子:
以用戶對衣服的interest為例,隨著季節和時尚風潮的不斷變化,用戶的interest也會不斷變化。這種變化會直接影響用戶的點擊決策。建模用戶興趣的進化過程有兩方面的好處:
1)追蹤用戶的interest可以使我們學習final interest的表達時包含更多的歷史信息。
2)可以根據interest的變化趨勢更好地進行CTR預測。
而interest在變化過程中遵循如下規律:
1)interest drift:用戶在某一段時間的interest會有一定的集中性。比如用戶可能在一段時間內不斷買書,在另一段時間內不斷買衣服。
2)interest individual:一種interest有自己的發展趨勢,不同種類的interest之間很少相互影響,例如買書和買衣服的interest基本互不相關。
為了利用這兩個時序特征,我們需要再增加一層GRU的變種,并加上attention機制以找到與target AD相關的interest。
attention的計算方式如下:
而Attention和GRU結合起來的機制有很多,文中介紹了一下三種:
GRU with attentional input (AIGRU)
這種方式將attention直接作用于輸入,無需修改GRU的結構:
Attention based GRU(AGRU)
這種方式需要修改GRU的結構,此時hidden state的輸出變為:
GRU with attentional update gate (AUGRU)
這種方式需要修改GRU的結構,此時hidden state的輸出變為:
2.1.13?NFFM
NFFM結構
2.1.14?FGCNN
文章的主要貢獻點有2個:
使用重組層進行特征生成緩解了CCPM中CNN無法有效捕獲全局組合特征的問題
FGCNN作為一種特征生成方法,可以和任意模型進行組合
模型結構
分組嵌入
由于原始特征既要作為后續模型的輸入,又要作為FGCNN模塊的輸入,所以原始特征的embedding向量可能會遇到梯度耦合的問題。
這里對于FGCNN模塊使用一套獨立的embedding向量,避免梯度耦合的問題。
卷積層和池化層
卷積和池化和CCPM類似,池化層使用的是普通的Max Pooling。
重組層
拼接層
經過若干重組后,將重組后生成的特征拼接上原始的特征作為新的輸入,后面可以使用各種其他的方法,如LR,FM,DeepFM等。
?
2.1.15?Deep Session Interest Network
2.1.15.1 背景
從用戶行為中呢,我們發現,在每個會話中的行為是相近的,而在不同會話之間差別是很大的,如下圖的例子:
這里會話的劃分和airbnb一樣,首先將用戶的點擊行為按照時間排序,判斷每兩個行為之間的時間間隔,前后的時間間隔大于30min,就進行切分。可以看上圖,第一個session中,用戶查看的都是跟褲子相關的物品,第二個session中,查看的是戒指相關的物品,第三個則是上衣相關。
基于此,阿里提出了深度會話興趣網絡Deep Session Interest Network,來建模用戶這種跟會話密切相關的行為。接下來,我們就來介紹模型的結構。
2.1.15.2、模型結構
Base Model
Base Model就是一個全連接神經網絡,其輸入的特征的主要分為三部分,用戶特征,待推薦物品特征,用戶歷史行為序列特征。用戶特征如性別、城市、用戶ID等等,待推薦物品特征包含商家ID、品牌ID等等,用戶歷史行為序列特征主要是用戶最近點擊的物品ID序列。
這些特征會通過Embedding層轉換為對應的embedding,拼接后輸入到多層全連接中,并使用logloss指導模型的訓練。
DSIN
DSIN模型的總體框架如下圖:
DSIN在全連接層之前,分成了兩部分,左邊的那一部分,將用戶特征和物品特征轉換對應的向量表示,這部分主要是一個embedding層,就不再過多的描述。右邊的那一部分主要是對用戶行為序列進行處理,從下到上分為四層:
1)序列切分層session division layer
2)會話興趣抽取層session interest extractor layer
3)會話間興趣交互層session interest interacting layer
4)會話興趣激活層session interest acti- vating layer
接下來,我們主要介紹這4層。
Session Division Layer
這一層將用戶的行文進行切分,首先將用戶的點擊行為按照時間排序,判斷每兩個行為之間的時間間隔,前后的時間間隔大于30min,就進行切分。
切分后,我們可以將用戶的行為序列S轉換成會話序列Q。第k個會話Qk=[b1;b2;...;bi;...;bT],其中,T是會話的長度,bi是會話中第i個行為,是一個d維的embedding向量。所以Qk是T * d的。而Q,則是K * T * d的
Session Interest Extractor Layer
這里對每個session,使用transformer對每個會話的行為進行處理。有關Transformer的內容,可以參考文章https://mp.weixin.qq.com/s/RLxWevVWHXgX-UcoxDS70w。
在Transformer中,對輸入的序列會進行Positional Encoding。Positional Encoding對序列中每個物品,以及每個物品對應的Embedding的每個位置,進行了處理,如下:
但在我們這里不一樣了,我們同時會輸入多個會話序列,所以還需要對每個會話添加一個Positional Encoding。在DSIN中,這種對位置的處理,稱為Bias Encoding,它分為三塊:
BE是K * T * d的,和Q的形狀一樣。BE(k,t,c)是第k個session中,第t個物品的嵌入向量的第c個位置的偏置項,也就是說,每個會話、會話中的每個物品有偏置項外,每個物品對應的embedding的每個位置,都加入了偏置項。所以加入偏置項后,Q變為:
隨后,是對每個會話中的序列通過Transformer進行處理:
這里的過程和Transformer的Encoding的block處理是一樣的,不再贅述。感興趣的同學可以看一下上文提到的文章。
這樣,經過Transformer處理之后,每個Session是得到的結果仍然是T * d,隨后,我們經過一個avg pooling操作,將每個session興趣轉換成一個d維向量。
這樣,Ik就代表第k個session對應的興趣向量。
?Session Interest Interacting Layer
用戶的會話興趣,是有序列關系在里面的,這種關系,我們通過一個雙向LSTM(bi-LSTM)來處理:
每個時刻的hidden state計算如下
相加的兩項分別是前向傳播和反向傳播對應的t時刻的hidden state。這里得到的隱藏層狀態Ht,我們可以認為是混合了上下文信息的會話興趣。
Session Interest Activating Layer
用戶的會話興趣與目標物品越相近,那么應該賦予更大的權重,這里使用注意力機制來刻畫這種相關性:
這里XI是帶推薦物品向量。
同樣,混合了上下文信息的會話興趣,也進行同樣的處理:
后面的話,就是把四部分的向量:用戶特征向量、待推薦物品向量、會話興趣加權向量UI、帶上下文信息的會話興趣加權向量UH進行橫向拼接,輸入到全連接層中,得到輸出。
2.1.16?FiBiNET
2.1.16.1 簡介
文章指出當前的許多通過特征組合進行CTR預估的工作主要使用特征向量的內積或哈達瑪積來計算交叉特征,這種方法忽略了特征本身的重要程度。提出通過使用Squeeze-Excitation network (SENET) 結構動態學習特征的重要性以及使用一個雙線性函數來更好的建模交叉特征。
2.1.16.2 模型結構
整體結構
圖中可以看到相比于我們熟悉的基于深度學習的CTR預估模型,主要增加了SENET Layer和Bilinear-Interaction Layer兩個結構。下面就針對這兩個結構進行簡單的說明。
SENET Layer
Squeeze
Excitation
Re-Weight
Bilinear-Interaction
傳統的特征交叉方式廣泛采用了內積(fm,ffm等)和哈達瑪積(AFM,NFM等)。而這兩種方式在稀疏數據上很難有效對特征交叉進行建模。
文章提出結合內積和哈達瑪積并引入一個額外的參數矩陣W WW來學習特征交叉,
Field-All Type
Field-Each Type
Filed-Interaction Type
Combination Layer
2.1.17?DSTN
2.1.17.1 背景
CTR預估問題在廣告領域十分重要,吸引了工業界和學術界學者的研究。之前我們也介紹過許多比較成功的方法,如LR、FM、Wide & Deep、DeepFM等。
但上述的方法,存在一個共同的問題,即當我們要預估對一個廣告的點擊概率時,只考慮該廣告的信息,而忽略了其他廣告可能帶來的影響。如用戶歷史點擊或者曝光未點擊的廣告、當前上下文已經推薦過的廣告等。因此,將這些廣告作為輔助信息,加入到模型中,也許可以提升CTR預估的準確性。
總結一下,輔助廣告總共有三種類型:上下文廣告、用戶點擊過的廣告、用戶未點擊的廣告,如下圖所示:
這里還是想強調一下上下文廣告這個概念,之前的模型可能一次計算所有廣告的點擊率,然后按點擊率進行排序,取top-K進行展示。但這里我們把一次推薦K個廣告過程看作K個單次推薦的過程集合。先推薦第一個位置的廣告,再推薦第二個位置的廣告,,依次類推。在推薦第三個廣告時,推薦的第一個廣告和第二個廣告便是我們這里所說的上下文廣告。
為了將這些信息加入到模型中,必須要注意以下幾點:
1)每種類型的輔助廣告數量可能相差很多,模型必須適應這些所有可能的情況。
2)輔助的廣告信息可能與目標廣告是不相關的,因此,模型需要具備提取有效信息,而過濾無用信息的能力。舉例來說,用戶點擊過的廣告可能有咖啡廣告、服裝廣告和汽車廣告,當目標廣告是咖啡相關的廣告時,過往點擊中咖啡相關的廣告可能是起比較大作用的信息。
3)不同類型的輔助廣告信息,有時候起到的作用可能是不同的,模型需要能夠有能力對此進行判別。
總的來說,就是模型需要有能力有效處理和融合各方面的信息。
本文提出了DSTN(Deep Spatio-Temporal neural Networks)模型來處理和融合各種輔助廣告信息,下一節,咱們就來介紹一下模型的結構。
2.1.17.2 模型架構
這里講了三種不同的DSTN的架構,分別是DSTN - Pooling Model、DSTN - Self-Attention Model和DSTN - Interactive Attention Model。但這三種模型的Embedding部分是同樣的,所以咱們先講Embedding層,再分別介紹幾種模型的結構。
Embedding Layer
Embedding Layer的結構如下:
可以看到,輸入有四部分信息,分別是目標廣告的信息、上下文廣告信息、點擊廣告信息、曝光未點擊廣告信息。目標廣告信息包括用戶特征、query特征(如果是搜索場景的話)、目標廣告特征;上下文廣告信息包括上下文廣告特征;用戶點擊過和未點擊過的廣告信息包括廣告特征以及對應的query特征。
這些特征可以歸為三類:
單值離散特征:如用戶ID、廣告ID等,這類特征直接轉換為對應的Embedding。
多值離散特征:如廣告的標題,經過分詞之后會包含多個詞,每個詞在轉換為對應的Embedding之后,再經過sum pooling的方式轉換為單個向量。
連續特征:對于連續特征如年齡,這里會進行分桶操作轉換為離散值,然后再轉換為對應的Embedding。
不同的特征轉換成對應的Embedding之后,進行拼接操作,如目標廣告信息中,會將用戶ID、用戶年齡、廣告ID、廣告名稱等等對應的Embedding進行拼接;上下文廣告信息中的每一個廣告,會將廣告ID和廣告名稱對應的Embedding進行拼接等等。
最終,對目標廣告信息會得到一個t維的vector,計作xt;對于上下文廣告信息,我們會得到nc個c維的vector,每一個計作xci;對于點擊廣告序列,我們會得到nl個l維的vector,每一個計作xlj;對于未點擊序列,會得到nu個u維的vector,每個計作xuq。
介紹完了Embedding,接下來介紹幾種不同的上層結構。
DSTN - Pooling Model
第一種結構稱為DSTN - Pooling Model,其模型結構如下:
這種方式就是對上下文廣告序列、點擊廣告序列和未點擊廣告序列中的vector進行簡單的sum-pooling,轉換為一個vector:
然后各部分進行拼接,經過全連接神經網絡之后,在輸出層經過一個sigmoid轉換為點擊的概率:
損失函數的話選擇logloss:
這種方式,實現比較簡單,但是存在一定的缺點,當對應一個廣告位置,有多個候選目標廣告時,只有目標廣告信息xt發生變化,其他信息都沒有發生變化,這說明我們添加的輔助廣告信息僅僅是一個靜態信息。同時,由于使用了sum-pooling的方式,一些有用的信息可能會被噪聲所覆蓋。舉例來說,如果目標廣告是咖啡相關的, 點擊序列中有一個咖啡相關的廣告,有10個服飾相關的廣告,那么這個咖啡相關廣告的信息很容易被忽略。
?DSTN - Self-Attention Model
對于sum-pooling帶來的缺陷,文中提出了第二種結構,稱為DSTN - Self-Attention Model,這里的Self-Attention是針對每一種特定的輔助廣告信息的,也就是說,上下文廣告之間進行Self-Attention,點擊廣告序列之間進行Self-Attention等等。
如果是上下文廣告之間進行Self-Attention,其最終輸出為:
通過公式可以看出,這里并不是我們所熟知的Transformer里面的self-attention,第一次看也沒注意,第二次細看才發現,所以有時候盡管名字一樣,但內容也許千差萬別。
這里的self-attention的含義是,將每一個廣告對應的embedding vector輸入到一個f中,得到一個標量輸出βci,這里的f可以是一個多層全連接神經網絡。然后通過softmax歸一化到0-1之間,得到每一個廣告的權重aci,隨后基于權重進行加權求和。
使用self-attention的好處是可以對序列中的不同廣告賦予不同的權重,能夠在一定程度上解決sum-pooling的問題,但其仍然存在一定的缺陷。首先,self-attention中計算的權重,沒有考慮target ad的信息,也就是說,針對不同的target ad,其attention權重保持不變。其次,歸一化后的權重aci,其求和是等于1的,這樣,當所有的廣告都與目標廣告關系不大時,部分廣告的權重由于歸一化也會變得很大。最后,每種類型的輔助廣告的數量也是會產生影響的,但由于對權重進行了歸一化,這個信息相當于也丟失了。
DSTN - Interactive Attention Model
因此,再針對上面的不足,提出了DSTN - Interactive Attention Model。其模型結構如下:
相對于self-attention,這里的權重aci沒有經過歸一化,其計算過程加入了目標廣告的信息,計算公式如下:
這樣,針對不同的目標廣告,不同類型的輔助廣告信息的權重會不斷變化,同時權重也沒有進行歸一化,避免了歸一化帶來的種種問題。
2.1.17.3 實驗結果
論文對比了多種模型的實驗結果:
2.1.17.4 模型部署
看論文的時候,比較關心的一點就是模型的性能問題,因為模型中的一部分輸入是上下文廣告信息,更準確的前面推薦的廣告的信息。假設我們有5個廣告位需要推薦,比較容易想到的做法過程如下:
1、得到所有的候選廣告集,并得到對應的特征,此時的上下文廣告信息為空。
2、模型計算所有廣告的點擊概率。
3、選擇點擊率最高的一個廣告。隨后把這個廣告加入到上下文廣告信息中。
4、對于剩下的廣告,再計算所有廣告的點擊概率。
5、重復第3步和第4步,直到得到5個展示的廣告。
我們通過第2步得到了第一個位置的廣告,重復執行3和4步4次得到剩下4個位置的廣告。
這么做無疑是十分耗時的,線上性能難以保證。因此,文中提到了一種折中的做法,每次從候選集中選擇2-3個廣告。其示意圖如下:
2.1.17.5 總結
感覺本文還是有一定借鑒意義的,最主要的是在推薦過程中考慮推薦結果之間的相互關系,這么做的話個人感覺可以消除點擊率預估中的坑位偏置。因為如果上下文信息有兩個廣告的話,模型會感知到這是對第三個坑位的廣告進行推薦。同時上下文信息的加入,在一定程度上也能提升推薦結果的多樣性,避免太多同質信息推薦出來。
2.2?NLU
2.2.1 模型介紹與實現:Joint Model (Intent+Slot)
2.3?TextSimilarity
2.3.1??模型介紹:深度學習之文本相似度Paper總結
2.3.2? 模型實現說明:github
2.4?Sequence labeling
2.4.1 介紹
2.4.1.1?一篇BiLSTM-CRF原理通俗易懂的文章
2.4.1.2??中文命名實體識別
2.4.1.3??BiGRU-Attention實體識別
2.4.1.4??IDCNN-CRF命名實體識別
2.4.1.5??BERT中文實戰---命名實體識別
2.4.2? 模型實現
2.5?Text classification
2.5.1 介紹
一文讀懂深度學習文本分類方法
2.5.2? 模型實現
地址
2.6?NLG
? ? ?待補充。。。
如果你喜歡我們所做的事情,歡迎加入我們!
?
?
總結
以上是生活随笔為你收集整理的NLP模型集锦----pynlp的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 教学论文计算机,计算机教学论文
- 下一篇: System32下文件说明