1. 程式人生 > >推薦系統遇上深度學習(六)--PNN模型理論和實踐

推薦系統遇上深度學習(六)--PNN模型理論和實踐

全文共2621字,21張圖,預計閱讀時間15分鐘。

原理

PNN,全稱為Product-based Neural Network,認為在embedding輸入到MLP之後學習的交叉特徵表達並不充分,提出了一種product layer的思想,既基於乘法的運算來體現體徵交叉的DNN網路結構,如下圖:

640?wx_fmt=jpeg

按照論文的思路,我們也從上往下來看這個網路結構:

輸出層

輸出層很簡單,將上一層的網路輸出通過一個全連結層,經過sigmoid函式轉換後對映到(0,1)的區間中,得到我們的點選率的預測值。

l2層

根據l1層的輸出,經一個全連結層 ,並使用relu進行啟用,得到我們l2的輸出結果:

640?wx_fmt=png

l1層

l1層的輸出由如下的公式計算:

640?wx_fmt=png

重點馬上就要來了,我們可以看到在得到l1層輸出時,我們輸入了三部分,分別是lz,lp 和 b1,b1是我們的偏置項,這裡可以先不管。lz和lp的計算就是PNN的精華所在了。我們慢慢道來

product Layer

product思想來源於,在ctr預估中,認為特徵之間的關係更多是一種and“且”的關係,而非add"加”的關係。例如,性別為男且喜歡遊戲的人群,比起性別男和喜歡遊戲的人群,前者的組合比後者更能體現特徵交叉的意義。

product layer可以分成兩個部分,一部分是線性部分lz,一部分是非線性部分lp。二者的形式如下:

640?wx_fmt=png

在這裡,我們要使用到論文中所定義的一種運算方式,其實就是矩陣的點乘啦:

640?wx_fmt=png

我們先繼續介紹網路結構,有關Product Layer的更詳細的介紹,我們在下一章中介紹。

Embedding Layer

Embedding Layer跟DeepFM中相同,將每一個field的特徵轉換成同樣長度的向量,這裡用f來表示。

640?wx_fmt=png

損失函式

使用和邏輯迴歸同樣的損失函式,如下:

640?wx_fmt=png

Product Layer 詳細介紹

前面提到了,product layer可以分成兩個部分,一部分是線性部分lz,一部分是非線性部分lp。

640?wx_fmt=png

看上面的公式,我們首先需要知道z和p,這都是由我們的embedding層得到的,其中z是線性訊號向量,因此我們直接用embedding層得到:

640?wx_fmt=png

論文中使用的等號加一個三角形,其實就是相等的意思,你可以認為z就是embedding層的複製。

對於p來說,這裡需要一個公式進行對映:

640?wx_fmt=png

640?wx_fmt=png

不同的g的選擇使得我們有了兩種PNN的計算方法,一種叫做Inner PNN,簡稱IPNN,一種叫做Outer PNN,簡稱OPNN。

接下來,我們分別來具體介紹這兩種形式的PNN模型,由於涉及到複雜度的分析,所以我們這裡先定義Embedding的大小為M,field的大小為N,而lz和lp的長度為D1。

IPNN

IPNN的示意圖如下:

640?wx_fmt=jpeg

IPNN中p的計算方式如下,即使用內積來代表pij:

640?wx_fmt=png

所以,pij其實是一個數,得到一個pij的時間複雜度為M,p的大小為N*N,因此計算得到p的時間複雜度為N*N*M。而再由p得到lp的時間複雜度是N*N*D1。因此 對於IPNN來說,總的時間複雜度為N*N(D1+M)。文章對這一結構進行了優化,可以看到,我們的p是一個對稱矩陣,因此我們的權重也可以是一個對稱矩陣,對稱矩陣就可以進行如下的分解:

640?wx_fmt=png

因此:

640?wx_fmt=png

640?wx_fmt=png

因此:

640?wx_fmt=png

從而得到:

640?wx_fmt=png

可以看到,我們的權重只需要D1 * N就可以了,時間複雜度也變為了D1*M*N。

OPNN

OPNN的示意圖如下:

640?wx_fmt=jpeg

OPNN中p的計算方式如下:

640?wx_fmt=png

此時pij為M*M的矩陣,計算一個pij的時間複雜度為M*M,而p是N*N*M*M的矩陣,因此計算p的事件複雜度為N*N*M*M。從而計算lp的時間複雜度變為D1 * N*N*M*M。這個顯然代價很高的。為了減少負責度,論文使用了疊加的思想,它重新定義了p矩陣:

640?wx_fmt=png

這裡計算p的時間複雜度變為了D1*M*(M+N)

程式碼實戰

終於到了激動人心的程式碼實戰環節了,一直想找一個實現比較好的程式碼,找來找去tensorflow沒有什麼合適的,倒是pytorch有一個不錯的。沒辦法,只能自己來實現啦,因此本文的程式碼嚴格根據論文得到,有不對的的地方或者改進之處還望大家多多指正。

本文的github地址為:
https://github.com/princewen/tensorflow_practice/tree/master/Basic-PNN-Demo.

本文的程式碼根據之前DeepFM的程式碼進行改進,我們只介紹模型的實現部分,其他資料處理的細節大家可以參考我的github上的程式碼.

模型輸入

模型的輸入主要有下面幾個部分:

self.feat_index = tf.placeholder(tf.int32,
                         shape=[None,None],
                         name='feat_index')
self.feat_value = tf.placeholder(tf.float32,
                       shape=[None,None],
                       name='feat_value')

self.label = tf.placeholder(tf.float32,shape=[None,1],name='label')
self.dropout_keep_deep = tf.placeholder(tf.float32,shape=[None],name='dropout_deep_deep')

feat_index是特徵的一個序號,主要用於通過embedding_lookup選擇我們的embedding。feat_value是對應的特徵值,如果是離散特徵的話,就是1,如果不是離散特徵的話,就保留原來的特徵值。label是實際值。還定義了dropout來防止過擬合。

權重構建

權重由四部分構成,首先是embedding層的權重,然後是product層的權重,有線性訊號權重,還有平方訊號權重,根據IPNN和OPNN分別定義。最後是Deep Layer各層的權重以及輸出層的權重。

對線性訊號權重來說,大小為D1 * N * M
對平方訊號權重來說,IPNN 的大小為D1 * N,OPNN為D1 * M * M。

def _initialize_weights(self):
weights = dict()

#embeddings
weights['feature_embeddings'] = tf.Variable(
tf.random_normal([self.feature_size,self.embedding_size],0.0,0.01),
name='feature_embeddings')
weights['feature_bias'] = tf.Variable(tf.random_normal([self.feature_size,1],0.0,1.0),name='feature_bias')
#Product Layers
if self.use_inner:
weights['product-quadratic-inner'] = tf.Variable(tf.random_normal([self.deep_init_size,self.field_size],0.0,0.01))
else:
weights['product-quadratic-outer'] = tf.Variable(
    tf.random_normal([self.deep_init_size, self.embedding_size,self.embedding_size], 0.00.01))
weights['product-linear'] = tf.Variable(tf.random_normal([self.deep_init_size,self.field_size,self.embedding_size],0.0,0.01))
weights['product-bias'] = tf.Variable(tf.random_normal([self.deep_init_size,],0,0,1.0))
#deep layers
num_layer = len(self.deep_layers)
input_size = self.deep_init_size
glorot = np.sqrt(2.0/(input_size + self.deep_layers[0]))

weights['layer_0'] = tf.Variable(
np.random.normal(loc=0,scale=glorot,size=(input_size,self.deep_layers[0])),dtype=np.float32
)
weights['bias_0'] = tf.Variable(
np.random.normal(loc=0,scale=glorot,size=(1,self.deep_layers[0])),dtype=np.float32
)
for i in range(1,num_layer):
glorot = np.sqrt(2.0 / (self.deep_layers[i - 1] + self.deep_layers[i]))
weights["layer_%d" % i] = tf.Variable(
    np.random.normal(loc=0, scale=glorot, size=(self.deep_layers[i - 1], self.deep_layers[i])),
    dtype=np.float32)  # layers[i-1] * layers[i]
weights["bias_%d" % i] = tf.Variable(
    np.random.normal(loc=0, scale=glorot, size=(1self.deep_layers[i])),
    dtype=np.float32)  # 1 * layer[i]


glorot = np.sqrt(2.0/(input_size + 1))
weights['output'] = tf.Variable(np.random.normal(loc=0,scale=glorot,size=(self.deep_layers[-1],1)),dtype=np.float32)
weights['output_bias'] = tf.Variable(tf.constant(0.01),dtype=np.float32)


return weights
Embedding Layer

這個部分很簡單啦,是根據feat_index選擇對應的weights['feature_embeddings']中的embedding值,然後再與對應的feat_value相乘就可以了:

# Embeddings
self.embeddings = tf.nn.embedding_lookup(self.weights['feature_embeddings'],self.feat_index) # N * F * K
feat_value = tf.reshape(self.feat_value,shape=[-1,self.field_size,1])
self.embeddings = tf.multiply(self.embeddings,feat_value) # N * F * K
Product Layer

根據之前的介紹,我們分別計算線性訊號向量,二次訊號向量,以及偏置項,三者相加同時經過relu啟用得到深度網路部分的輸入。

# Linear Singal
linear_output = []
for i in range(self.deep_init_size):
linear_output.append(tf.reshape(
tf.reduce_sum(tf.multiply(self.embeddings,self.weights['product-linear'][i]),axis=[1,2]),shape=(-1,1)))# N * 1

self.lz = tf.concat(linear_output,axis=1# N * init_deep_size

# Quardatic Singal
quadratic_output = []
if self.use_inner:
for i in range(self.deep_init_size):
theta = tf.multiply(self.embeddings,tf.reshape(self.weights['product-quadratic-inner'][i],(1,-1,1))) # N * F * K
quadratic_output.append(tf.reshape(tf.norm(tf.reduce_sum(theta,axis=1),axis=1),shape=(-1,1))) # N * 1

else:
embedding_sum = tf.reduce_sum(self.embeddings,axis=1)
p = tf.matmul(tf.expand_dims(embedding_sum,2),tf.expand_dims(embedding_sum,1)) # N * K * K
for i in range(self.deep_init_size):
theta = tf.multiply(p,tf.expand_dims(self.weights['product-quadratic-outer'][i],0)) # N * K * K
quadratic_output.append(tf.reshape(tf.reduce_sum(theta,axis=[1,2]),shape=(-1,1))) # N * 1

self.lp = tf.concat(quadratic_output,axis=1# N * init_deep_size

self.y_deep = tf.nn.relu(tf.add(tf.add(self.lz, self.lp), self.weights['product-bias']))
self.y_deep = tf.nn.dropout(self.y_deep, self.dropout_keep_deep[0])
Deep Part

論文中的Deep Part實際上只有一層,不過我們可以隨意設定,最後得到輸出:

剩下的程式碼就不介紹啦!


好啦,本文只是提供一個引子,有關PNN的知識大家可以更多的進行學習呦。

參考文獻

1 、https://zhuanlan.zhihu.com/p/33177517


2、https://cloud.tencent.com/developer/article/1104673?fromSource=waitui


3、https://arxiv.org/abs/1611.00144

原文連結:https://mp.weixin.qq.com/s/-WEGvWfsJGbWkQS0FbWZhQ

查閱更為簡潔方便的分類文章以及最新的課程、產品資訊,請移步至全新呈現的“LeadAI學院官網”:

www.leadai.org

請關注人工智慧LeadAI公眾號,檢視更多專業文章

640?wx_fmt=jpeg

大家都在看

640.png?

相關推薦

推薦系統深度學習()--PNN模型理論實踐

全文共2621字,21張圖,預計閱讀時間15分鐘。原理PNN,全稱為Product-based

推薦系統深度學習(二)--FFM模型理論實踐

全文共1979字,6張圖,預計閱讀時間12分鐘。FFM理論在CTR預估中,經常會遇到one-ho

推薦系統深度學習(三)--DeepFM模型理論實踐

1、背景特徵組合的挑戰對於一個基於CTR預估的推薦系統,最重要的是學習到使用者點選行為背後隱含的特徵組合。在不同的推薦場景中,低階組合特徵或者高階組合特徵可能都會對最終的CTR產生影響。之前介紹的因子分解機(Factorization Machines, FM)通過對於每一維特徵的隱變數內積來提取特徵組合。最

推薦系統深度學習(一)--FM模型理論實踐

全文共2503字,15張圖,預計閱讀時間15分鐘。FM背景在計算廣告和推薦系統中,CTR預估(c

推薦系統深度學習(十)--詳解推薦系統中的常用評測指標

最近閱讀論文的過程中,發現推薦系統中的評價指標真的是五花八門,今天我們就來系統的總結一下,這些指標有的適用於二分類問題,有的適用於對推薦列表topk的評價。1、精確率、召回率、F1值我們首先來看一下混淆矩陣,對於二分類問題,真實的樣本標籤有兩類,我們學習器預測的類別有兩類,那麼根據二者的類別組合可以劃分為四組

推薦系統深度學習

參考記錄: 推薦系統遇上深度學習(一)–FM模型理論和實踐: https://cloud.tencent.com/developer/article/1099532 推薦系統遇上深度學習(二)–FM模型理論和實踐: https://cloud.tencent.com

推薦系統深度學習(十)--GBDT+LR融合方案實戰

寫在前面的話 GBDT和LR的融合在廣告點選率預估中算是發展比較早的演算法,為什麼會在這裡寫這麼一篇呢?本來想嘗試寫一下阿里的深度興趣網路(Deep Interest Network),發現阿里之前還有一個演算法MLR,然後去查詢相關的資料,裡面提及了樹模型也就是GBD

推薦系統深度學習(二十二):DeepFM升級版XDeepFM模型強勢來襲!

今天我們要學習的模型是xDeepFM模型,論文地址為:https://arxiv.org/abs/1803.05170。文中包含我個人的一些理解,如有不對的地方,歡迎大家指正!廢話不多說,我們進入正題! 1、引言 對於預測性的系統來說,特徵工程起到了至關重要的作用。特徵工

推薦系統深度學習(十)--GBDT+LR融合方案實戰--解決特徵組合問題

歡迎關注天善智慧,我們是專注於商業智慧BI,人工智慧AI,大資料分析與挖掘領域的垂直社群,學習,問答、求職一站式搞定! 對商業智慧BI、大資料分析挖掘、機器學習,python,R等資料領域感興趣的同學加微信:tsaiedu,並註明訊息來源,邀請你進入資料愛好者交

推薦系統深度學習(二十)--貝葉斯個性化排序(BPR)演算法原理及實戰

原創:石曉文 小小挖掘機 2018-06-29推薦系統遇上深度學習系列:排序推薦演算法大體上可以分為三類,第一類排序演算法類別是點對方法(Pointwise Approach),這類演算法將排序問題被轉化為分類、迴歸之類的問題,並使用現有分類、迴歸等方法進行實現。第二類排序演算法是成對

推薦系統深度學習(十二)--推薦系統中的EE問題及基本Bandit演算法

1、推薦系統中的EE問題Exploration and Exploitation(EE問題,探索與開發)是計算廣告和推薦系統裡常見的一個問題,為什麼會有EE問題?簡單來說,是為了平衡推薦系統的準確性和多樣性。EE問題中的Exploitation就是:對使用者比較確定的興趣,當然要利用開採迎合,好比說已經掙到的

推薦系統深度學習(十八)--探祕阿里之深度興趣網路(DIN)淺析及實現

阿里近幾年公開的推薦領域演算法有許多,既有傳統領域的探索如MLR演算法,還有深度學習領域的探索如entire -space multi-task model,Deep Interest Network等,同時跟清華大學合作展開了強化學習領域的探索,提出了MARDPG演算法。上一篇,我們介紹了MLR演算法,通過

推薦系統深度學習(十九)--探祕阿里之完整空間多工模型ESSM

歡迎關注天善智慧,我們是專注於商業智慧BI,人工智慧AI,大資料分析與挖掘領域的垂直社群,學習,問答、求職一站式搞定! 對商業智慧BI、大資料分析挖掘、機器學習,python,R等資料領域感興趣的同學加微信:tsaiedu,並註明訊息來源,邀請你進入資料愛好者交流群,資料愛好者們都

推薦系統深度學習(五)--Deep&Cross Network模型理論實踐

1、原理Deep&Cross Network模型我們下面將簡稱DCN模型:一個DCN模型從嵌入和堆積層開始,接著是一個交叉網路和一個與之平行的深度網路,之後是最後的組合層,它結合了兩個網路的輸出。完整的網路模型如圖:嵌入和堆疊層我們考慮具有離散和連續特徵的輸入資料。在網路規模推薦系統中,如CTR預測,

推薦系統深度學習

原文: Deep Learning Meets Recommendation Systems Published by Wann-Jiun Ma at ** January 24, 2017 Contributed by Wann-Jiun

推薦系統深度學習(四)--多值離散特徵的embedding解決方案

1、背景在本系列第三篇文章中,在處理DeepFM資料時,由於每一個離散特徵只有一個取值,因此我們在處理的過程中,將原始資料處理成了兩個檔案,一個記錄特徵的索引,一個記錄了特徵的值,而每一列,則代表一個離散特徵。但假如,我們某一個離散特徵有多個取值呢?舉個例子來說,每個人喜歡的NBA球隊,有的人可能喜歡火箭和湖

推薦系統深度學習(十四)--強化學習推薦系統的強強聯合

之前學習了強化學習的一些內容以及推薦系統的一些內容,二者能否聯絡起來呢!今天閱讀了一篇論文,題目叫《DRN: A Deep Reinforcement Learning Framework for News Recommendation》。該論文便是深度強化學習和推薦系統的一個結合,也算是提供了一個利用強化學

推薦系統深度學習(五)--Deep&Cross Network模型理論實踐

歡迎關注天善智慧,我們是專注於商業智慧BI,人工智慧AI,大資料分析與挖掘領域的垂直社群,學習,問答、求職一站式搞定! 對商業智慧BI、大資料分析挖掘、機器學習,python,R等資料領域感興趣的同學加微信:tsaiedu,並註明訊息來源,邀請你進入資料愛好者交流群,資料愛好者們都

推薦系統深度學習(二十)-貝葉斯個性化排序演算法原理及實戰

排序推薦演算法大體上可以分為三類,第一類排序演算法類別是點對方法(Pointwise Approach),這類演算法將排序問題被轉化為分類、迴歸之類的問題,並使用現有分類、迴歸等方法進行實現。第二類排序演算法是成對方法(Pairwise Approach),在序列方法中

機器學習-推薦系統中基於深度學習的混合協同過濾模型

  近些年,深度學習在語音識別、影象處理、自然語言處理等領域都取得了很大的突破與成就。相對來說,深度學習在推薦系統領域的研究與應用還處於早期階段。 攜程在深度學習與推薦系統結合的領域也進行了相關的研究與應用,並在國際人工智慧頂級會議AAAI 2017上發表了相應的研究成果《A Hy