浪潮之巔-深度學習在推薦系統中的應用(深度學習推薦系統學習筆記)

1 深度學習推薦模型的演化關係圖

2 AutoRec-單隱層神經網絡推薦模型

將自編碼器的思想同協同過濾結合,是一種單隱層神經網絡推薦模型。

2.1 AutoRec模型的基本原理

利用協同過濾中的共現矩陣,完成物品向量或者用戶向量的自編碼,再利用自編碼的結果得到用戶對物品的預估評分,進而進行推薦排序。

自編碼器:

\boldsymbol{r}是數據向量,將\boldsymbol{r}作爲輸入,通過自編碼器是得到的輸出向量儘可能接近其本身\boldsymbol{r}。設自編碼器的重建函數爲h(\boldsymbol{r};\theta),則自編碼器的目標函數:

        \min_\theta\sum_{\boldsymbol{r} \in S}||\boldsymbol{r}-h(\boldsymbol{r};\theta)||_2^2 \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ (1)

其中,S是所有數據向量的集合

AutoRec解決的問題是構建一個重建函數h(\boldsymbol{r};\theta),是所有該重建函數生成的評分向量與原評分向量的平方殘差和最小,如(1)式所示,此後還要經過評分預估排序的過程才能得到最終的推薦列表。

2.2 AutoRec模型的結構

          

輸入層:原始評分向量\boldsymbol{r},中間層:k(k \ll m)維單隱層,輸出層:多分類層。重建函數如式(2),其中f和g是激活函數:

        h(\boldsymbol{r};\theta) = f(\boldsymbol{W} \cdot g(\boldsymbol{V}\cdot \boldsymbol{\boldsymbol{r}} + \mu) + b) \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ (2)

目標函數,加入L2正則化

         \min_\theta\sum_{i=1}^m ||\boldsymbol{r}^{(i)}-h(\boldsymbol{r}^{(i)};\theta)||_2^2 + \frac{\lambda}{2}(||\boldsymbol{W}||_F^2 + (||\boldsymbol{V}||_F^2 ) \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ (3)

AutoRec模型是一個非常標準的三層神經網絡,訓練利用梯度反向傳播即可。

2.3 基於AutoRec模型的推薦過程

當輸入物品i的評分向量\boldsymbol{r}^{(i)}時,模型的輸出向量h(\boldsymbol{r}^{(i)};\theta)就是所有用戶對物品i的評分預測,其中第u維就是用戶u對物品i的預測\hat{R}_{ui}

       \hat{R}_{ui}=(h(\boldsymbol{r}^{(i)};\hat{\theta}))_u \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ (4)

通過遍歷輸入物品向量就可以得到用戶u對所有物品的評分預測,進而依據評分預測進行排序得到推薦列表。

同協同過濾,AutoRec也分爲基於物品的AutoRec(I-AutoRec)和基於用戶的AutoRec(U-AutoRec),U-AutoRec是將用戶的評分向量作爲輸入數據,在生成推薦列表的時候,U-AutoRec相比I-AutoRec優點是隻需要輸入一次目標用戶的用戶向量,而I-AutoRec需要遍歷整個物品評分向量;缺點是用戶向量的稀疏性可能會影響模型效果。

2.4 AutoRec模型的特點和侷限性

優點:從神經網絡角度出發,使用一個單隱層的AutoEncoder泛化用戶或物品評分,具有一定的泛化能力和表達能力

缺點:比較簡單,表達能力相對欠缺

在模型結構上,該模型和後來的詞向量模型(Word2vec)完全一致,但優化目標和訓練方法有所不同。

3 Deep Crossing模型-經典的深度學習架構

Deep Crossing模型完整的解決了從特徵工程、稀疏向量稠密化、多層神經網絡進行優化目標擬合等一系列深度學習在推薦系統中的應用問題。

3.1 Deep Crossing模型的網絡結構

爲完成端到端的訓練Deep Crossing模型要在其內部解決如下問題:

  1. 離散類特徵編碼後過於稀疏,不利於直接輸入神經網絡進行訓練,如何解決稀疏特徵向量稠密化的問題
  2. 如何解決特徵自動交叉的問題
  3. 如何在輸出層中打成問題設定的優化目標

通過加入embedding層將稀疏特徵轉化爲低維稠密特徵,用stacking layer,或者叫做concat layer將分段的特徵向量連接起來,再通過多層神經網絡完成特徵的組合、轉換,最終用scoring layer完成CTR的計算。跟經典DNN有所不同的是,Deep crossing採用的multilayer perceptron是由殘差網絡組成的。

       preview

Embedding層:將稀疏的類別性特徵轉換成稠密的Embedding向量,以經典的全連接層結構爲主。通常,Embedding向量的維度應該遠小於原始稀疏特徵向量。這裏Feature #2世紀代表了數值型特徵,可以看到,數值型特徵不需要經過Embedding層,直接進入了Stacking層。

Stacking層:Stacking層(堆疊層)的作用比較簡單,是把不同的Embedding特徵和數值型特徵拼接在一起,也被稱爲連接(concatenate)層。

Multiple Residual Units層:主要結構時多層感知機,相比標準的多層感知機爲基本單元的神經網絡,Deep Crossing模型採用了多層殘差網絡(Multi-Layer Residual Network)作爲MLP的具體實現。通過多層殘差網絡對特徵向量各個維度進行充分的 交叉組合。

Scoring層:Scoring層作爲輸出層,就是爲了擬合優化目標,對CTR預估這類二分類問題,Scoring層往往使用的是邏輯迴歸模型,對於圖像等多分類問題,Scoring層往往採用softmax模型。

殘差神經網絡:

殘差神經網絡是由殘差單元組成的神經網絡。與傳統感知機不同,殘差單元的特點主要有:

  1. 輸入經過一層以ReLu爲激活函數的全連接層後再經過一層全連接層,生成輸出向量
  2. 輸入可以通過一個短路通路直接與輸出向量進行元素加(element-wise plus)操作,生成最終的輸出向量。

這樣的結構下,殘差單元中的兩層ReLu網絡其實擬合的是輸出和輸入之間的殘差(\boldsymbol{x}^o-\boldsymbol{x}^i)。

主要解決兩個問題:

  1. 神經網絡是不是越深越好?深度加深後,容易產生過擬合,在殘差網絡中,由於有輸入向量段路的存在,很多時候可以越過兩層ReLu網絡,減少過擬合現象發生。
  2. 當神經網絡過深時,往往存在嚴重的梯度消失現象,梯度消失現象是指在梯度反向傳播的過程中,越靠近輸入端,梯度的幅度越小,參數收斂的速度越慢。爲了解決這個問題,殘差單元使用ReLu激活函數取代了原來的sigmoid函數,此外,輸入向量短路相當於直接把梯度毫無變化的傳遞到下一層,也使殘差網絡的收斂速度更快。

3.2 Deep Crossing模型對特徵交叉方法的革命

採用了“Embedding+多層神經網絡”。相比之前的FM、FFM模型只具備二階特徵交叉的能力,Deep Crossing模型可以通過調整神經網絡的深度進行特徵之間的“深度交叉”。

4 NeuralCF模型-CF與深度學習的結合

4.1 從深度學習的視角重新審視矩陣分解模型

若將矩陣分解層的用戶隱向量和物品隱向量看作是一種Embedding方法,最終的“Scoring層”就是將用戶隱向量和物品隱向量進行內積操作後得到的“相似度”,這裏的相似度就是對評分的預測。在實際應用中,往往發現模型容易欠擬合,主要原因是MF的模型結構相對簡單,尤其“Scoring層”,無法對優化目標進行有效的擬合。

        

4.2 NeuralCF模型的結構

      

NeuralCF用“多層神經網絡+輸出層”的結構替代了MF中簡單的內積操作,優點如下:1、讓用戶向量和物品向量左更充分的交叉;2、引入更多的非線性特徵。

事實上,用戶向量和物品向量的互操作層可以被任意的互操作形式所替代,即所謂的廣義矩陣分解模型(Generalized Matrix Factorization)。爲了讓向量在各維度上進行更充分的交叉,可以通過“元素積”(element-wise product,長度相同的兩個向量按元素乘得到新的同維度的向量)進行交互,再通過邏輯迴歸等輸出層擬合最終預測目標,當然還有別的交互方式。GMF,它應用了一個線性內核來模擬潛在的特徵交互;MLP,使用非線性內核從數據中學習交互函數

     

其中GMF層和MLP層是兩個子網絡,即GMF和MLP可以學習獨立的嵌入,也即MLP的用戶、物品向量的維度可以和GMF的用戶、物品的維度可以不相同,其中GMF的輸入MF模型得到的是用戶隱向量和物品隱向量。

softmax

給定一個n維向量,softmax函數將其映射維一個概率分佈,標準的softmax函數\sigma: \mathbb{R}^n \rightarrow \mathbb{R}^n由下面的公式定義:

        \sigma(\boldsymbol{X})_i =\frac{exp(x_i)}{\sum_{j=1}^nexp(x_j)}, \ i=1, \cdots,n \ and\ \boldsymbol{X}=[x_1,\cdots,x_n]^T \in \boldsymbol{R}^n

softmax解決了從一個原始的n維向量,向一個n維的概率分佈映射的問題。在多分類中,設n是類別數,模型期望預測的就是某個樣本在n個分類上的概率。若用深度學習模型進行建模,輸出層是由n個神經單元組成的,再輔以softmax激活函數,在最後的輸出中得到最終的多分類概率分佈。

        

在分類問題中,softmax函數往往和交叉熵損失函數配套使用(因爲softmax函數把分類輸出標準化成了多個分類的概率分佈,而交叉熵正好刻畫了預測分類和真實結果之間的相似度):

         Loss_{Cross Entropy}= -\sum_iy_iln(\sigma(\boldsymbol{x})_i)

softmax函數的導數:

          \frac{\partial \sigma(\boldsymbol{x})_i}{\partial x_j} = \left\{\begin{aligned} &\sigma(\boldsymbol{x})_i(1-\sigma(\boldsymbol{x})_j),\ i=j \\ &-\sigma(\boldsymbol{x})_i\sigma(\boldsymbol{x})_j,\ i \neq j \end{aligned} \right.

基於鏈式法則,交叉熵函數到softmax函數第j維輸入x_j的導數形式爲:

         \frac{\partial Loss}{\partial x_j} = \frac{\partial Loss}{\partial \sigma(\boldsymbol{x})}\cdot \frac{\sigma(\boldsymbol{x})}{\partial x_j}

多分類,真實值只有一個維度是1,其餘維度都是0,假設第k維是1,即y_k= 1,則交叉熵損失函數可以簡化爲:
         Loss_{Cross Entropy}= -\sum_iy_iln(\sigma(\boldsymbol{x})_i) =-y_k \cdot ln(\sigma(\boldsymbol{x})_k) = -ln(\sigma(\boldsymbol{x})_k)

        \frac{\partial Loss}{\partial x_j} = \frac{\partial (-ln(\sigma( \boldsymbol{x})_k))}{\partial \sigma(\boldsymbol{x})_k}\cdot \frac{\partial \sigma(\boldsymbol{x})_k}{\partial x_j}= -\frac{1}{\sigma(\boldsymbol{x})_k} \cdot \frac{\sigma(\boldsymbol{x})_k}{\partial x_j} = \left\{\begin{aligned} &\sigma(\boldsymbol{x})_j-1,\ j=k \\ &\sigma(\boldsymbol{x})_j,\ j \neq k \end{aligned} \right.

4.3 NeuralCF模型的優勢和侷限性

優點:對於用戶向量和物品向量這倆Embedding層可以自由的選擇不同互操作層的拼接。

缺點:基於協同過濾的思想,沒有引入更多其他類型的特徵

5 PNN模型-加強特徵交叉能力

5.1 PNN模型的網絡架構

        

與Deep Crossing模型相比,PNN模型在輸入、Embedding層、多層神經網絡,以及最終的輸出層部分並沒有結構上的不同。唯一的區別在於PNN模型用乘積層(Product Layer)代替了Deep Crossing模型中的Stacking層,即不同特徵的Embedding向量不再是簡單的拼接,而是利用Product操作進行兩兩交互。

5.2 Product層的多種特徵交叉方式(外積部分還是沒懂,待學習)

PNN 模型對於深度學習結構的創新主要在於乘積層的引入。具體地說,PNN 模型的乘積層由線性內積操作部分(圖中乘積層的 z 部分,對各特徵向量進行線性拼接)和乘積外積(outer product) 操作部分(圖中乘積層的 p 部分)組成。其中,乘積特徵交叉部分又分爲無論是內積操作和還是外積 操作,使用內積操作的PNN模型被稱爲IPNN(Inner Product-based Neural Network),使用外積操作的PNN被稱爲OPNN(Outer Product-based Neural Network)。

首先看z部分,這一塊是線性部分,其實就相當與把Embedding層的特徵拿過來,組成一個向量即可。
z=concat([emb1,emb2..,embn],axis=1),形如(bs,fs*emb)的張量

IPNN

IPNN就是實現兩個向量的點乘,得到的是一個數。思路就是將所有特徵的embedding表示兩兩相乘,可以得到一個長度爲pairs = n * (n - 1) /2的向量。內積操作就是經典的向量內積運算設輸入特徵向量分別爲\boldsymbol{f}_i,\boldsymbol{f}_j,特徵的內積操作,若設特徵數爲n,則這樣兩兩交叉得到pairs = n * (n - 1) /2個值,即填入p中的元素形如(bs,pairs),正好可以和z部分進行concat:

        g_{inner}(\boldsymbol{f}_i,\boldsymbol{f}_j)= <\boldsymbol{f}_i, \boldsymbol{f}_j> \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ (5)

之前還不太明白兩兩交互的實現,後來在網上找到了實現,mark一下,https://github.com/Hirosora/LightCTR/blob/master/models/PNN.py

https://blog.csdn.net/qq_18293213/article/details/90262378。假設batch_size=3,特徵數fs=5,Embedding維度vec=8,現在解釋一下下面這段程序,其中inputs是一個列表,列表的長度5(特徵的個數),其中每一個元素都是一個形如(bs,vec)的特徵的張量,然後rows和cols相同位置的值是列表中要做兩兩交叉的特徵的下標,下面給出rows和cols的值,可以看出此處是5 * (5 - 1) / 2 =10對。

len(rows) = 10, rows = [0, 0, 0, 0, 1, 1, 1, 2, 2, 3]
len(cols) = 10, cols = [1, 2, 3, 4, 2, 3, 4, 3, 4, 4]

p和q是分別按照rows和cols中的下標取出的對應的inputs中的特徵的張量在axis=1上的堆疊,即pairs個形如(bs,vec)的張量在axis=1上的堆疊,得到形如(bs,pairs,vec) 的張量,p和q同位置的元素按元素乘,在對vec這一維度reduce_sum,其實就是兩兩內積的一種實現方式。

p = Tensor("model/inner_product/stack:0", shape=(3, 10, 8), dtype=float32)
q = Tensor("model/inner_product/stack_1:0", shape=(3, 10, 8), dtype=float32)
inner_product = Tensor("inner_product/Sum:0", shape=(None, 10), dtype=float32)
    def call(self, inputs, **kwargs):

        rows = list()
        cols = list()
        for i in range(len(inputs)):
            for j in range(i + 1, len(inputs)):
                rows.append(i)
                cols.append(j)

        # [batch_size, pairs_num, embedding_size]
        print("len(rows) = {}, rows = {}".format(len(rows), rows))
        print("len(cols) = {}, cols = {}".format(len(cols), cols))
        print("len(inputs), inputs[0].shape = {}".format(len(inputs), inputs[0].shape))
        p = tf.stack([inputs[i] for i in rows], axis=1)
        q = tf.stack([inputs[j] for j in cols], axis=1)
        print("p = {}".format(p))
        print("q = {}".format(q))

        if self.require_logit:
            inner_product = tf.reduce_sum(p * q, axis=-1, keepdims=False)
        else:
            inner_product = tf.keras.layers.Flatten()(p * q)
        print("inner_product = {}".format(inner_product))
        return inner_product

 

OPNN

兩個向量內積得到的是一個數,故內積操作可以得到形如(bs,pairs)的張量,但是兩個向量外積是同維度的向量,故外積操作得到形如(bs,pairs,vec)的張量,不容易進行concat,計算量也比較大,OPNN做了簡化。

5.3 PNN模型的優點和缺點

優點:特徵Embedding向量之間的交叉方式是多樣的

缺點:實踐中,會對外積操作做一系列簡化;對所有特徵無差別的交叉忽略了原始特徵向量中包含的有價值的信息。

6 Wide & Deep 模型 - 記憶能力和泛化能力的綜合

Wide部分主要作用是讓模型具備較強的“記憶能力”;Deep部分的主要作用是讓模型具有“泛化能力”。

6.1 模型的記憶能力與泛化能力

“記憶能力”:模型直接學習並利用歷史數據中的物品或者強特徵的“共現頻率”的能力。一般來說,協同過濾、邏輯迴歸等簡單模型具有較強的“記憶能力”。這類模型結構簡單,沒有過多的特徵交叉,原始數據往往可以直接影響推薦結果,產生類似於”若點擊過A則推薦B“這類規則式的推薦,相當於模型直接記住了歷史數據的分佈特點,並利用這些記憶進行推薦。多層神經網絡特徵會被多層處理,不斷與其他特徵交叉,使得模型對原始強特徵的記憶反而不如簡單模型。

“泛化能力”:模型傳遞特徵的相關性,以及發覺稀疏甚至從未出現過的稀有特徵與最終標籤相關性的能力。矩陣分解比協同過濾的泛化能力強,因爲MF引入了隱向量,使得數據稀少的用戶或者物品也能生成隱向量,從而獲得由數據支撐的推薦得分,這就是典型的將全局數據傳遞到稀有物品上,從而提高泛化能力。再如,深度神經網絡通過特徵次組合,可以發掘數據中潛在的模式,即使非常稀疏的特徵向量輸入,也能得到較穩定平滑的推薦概率。

6.2 Wide & Deep 模型結構

          

單層的Wide部分擅長處理大量稀疏的id類特徵;Deep部分利用神經網絡強大的表達能力,進行深層的特徵交叉,挖掘藏在特徵背後的數據模式。

          

圖(3-14)是Google Play的推薦團隊用的詳細結構,Wide部分的輸入僅僅是以安裝應用和曝光應用兩類特徵,其中已安裝應用代表用戶歷史行爲,而曝光應用代表當前的待推薦應用,選擇這兩類特徵的原因是充分發揮Wide部分記憶能力強的優勢,簡單模型善於記憶用戶行爲特徵中的信息,並依據此類信息直接影響推薦結果。

6.3 Wide&Deep模型的進化-Deep&Cross模型

          

Deep&Cross模型主要思路是使用Cross網絡代替了原來的Wide部分。Cross部分是爲了增加特徵之間的交互力度,使用多層交叉層對輸入向量進行特徵交叉,設第l層交叉層的輸出向量是\boldsymbol{x}_l,則第l+1層的輸出向量:

            \boldsymbol{x}_{l+1} = \boldsymbol{x}_0\boldsymbol{x}_l^T\boldsymbol{w}_l+\boldsymbol{b}_l+\boldsymbol{x}_0 \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ (5)

可以看到,交叉層操作的二階部分非常類似PNN模型中的外積操作,在此基礎上增加了外積操作的權重向量\boldsymbol{w}_l,以及原輸入向量\boldsymbol{x}_l和偏置向量\boldsymbol{b}_l,其中\boldsymbol{x}_0\boldsymbol{x}_l^T的結果是一個矩陣,通過與\boldsymbol{w}_l的矩陣乘法得到一個向量。

          

舉個🌰

         \begin{aligned}\boldsymbol{x}_1&= \boldsymbol{x}_0\boldsymbol{x}_0^T\boldsymbol{w}_0 + \boldsymbol{x}_0 \\ &= \begin{bmatrix} x_{0,1}\\ x_{0,2}\end{bmatrix} \begin{bmatrix} x_{0,1} & x_{0,2}\end{bmatrix} \begin{bmatrix} w_{0,1}\\ w_{0,2}\end{bmatrix} + \begin{bmatrix} x_{0,1}\\ x_{0,2}\end{bmatrix} \\ &= \begin{bmatrix} w_{0,1}x_{0,1}^2 + w_{0,2}x_{0,1}x_{0,2} + x_{0,1}\\ w_{0,1}x_{0,2}x_{0,1}+ w_{0,2}x_{0,2}^2+ x_{0,2}\end{bmatrix} \\ \end{aligned}

        \begin{aligned} \boldsymbol{x}_2 &= \boldsymbol{x}_0\boldsymbol{x}_1^T\boldsymbol{w}_1 + \boldsymbol{x}_1 \\ &=\begin{bmatrix} x_{0,1}\\ x_{0,2}\end{bmatrix} \begin{bmatrix} x_{1,1} & x_{1,2}\end{bmatrix} \begin{bmatrix} w_{0,1}\\ w_{0,2}\end{bmatrix} + \begin{bmatrix} x_{1,1}\\ x_{1,2}\end{bmatrix} \\ &= \begin{bmatrix} w_{1,1}x_{0,1}x_{1,1} + w_{1,2}x_{0,1}x_{1,2} + x_{1,1}\\ w_{1,1}x_{0,2}x_{1,1}+ w_{1,2}x_{0,2}x_{1,2}+ x_{1,2}\end{bmatrix} \\ &= \begin{bmatrix} w_{0,1}w_{1,1}x_{0,1}^3 +(w_{0,2}w_{1,1}+w_{0,1}w_{1,2})x_{0,1}^2x_{0,2}+w_{0,2}w_{1,2}x_{0,1}x_{0,2} ^2 + (w_{0,1}+w_{1,1})x_{0,1}^2 + (w_{0,2}+w_{1,2})x_{0,1}x_{0,2}+x_{0,1} \\ w_{0,1}w_{1,1}x_{0,1}^2x_{0,2} + (w_{0,2}w_{1,1}+w_{0,1}w_{1,2})x_{0,1}x_{0,2}^2+w_{0,2}w_{1,2}x_{0,2}^3+(w_{0,1}+w_{1,1})x_{0,1}x_{0,2}+(w_{0,2}+w_{1,2})x_{0,2}^2 +x_{0,2} \end{bmatrix} \end{aligned}

可以看出特徵交叉的感覺,但是交叉層在增加參數方面還是比較剋制的,每一層僅增加了一個n維(輸入向量的維度)的權重向量\boldsymbol{w}_l,並且每一層均保留了原始 輸入向量,所以輸出與輸入之間的變化不會太明顯。

6.4 Wide&Deep模型的影響力

  1. 抓住了業務問題的本質,能融合傳統模型的記憶能力和深度神經網絡的泛化能力
  2. 模型結構並不複雜。

7 FM與深度學習模型的結合

 

 

 

 

 

 

 

 

 

 

 

未完待續

 

 

 

 

 

 

 

 

 

 

 

 

 

參考 :深度學習推薦系統,王喆

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