本教程源代碼目錄在book/recommender_system, 初次使用請參考PaddlePaddle安裝教程。
在網(wǎng)絡(luò)技術(shù)不斷發(fā)展和電子商務(wù)規(guī)模不斷擴(kuò)大的背景下,商品數(shù)量和種類快速增長,用戶需要花費(fèi)大量時間才能找到自己想買的商品,這就是信息超載問題。為了解決這個難題,推薦系統(tǒng)(Recommender System)應(yīng)運(yùn)而生。
個性化推薦系統(tǒng)是信息過濾系統(tǒng)(Information Filtering System)的子集,它可以用在很多領(lǐng)域,如電影、音樂、電商和 Feed 流推薦等。推薦系統(tǒng)通過分析、挖掘用戶行為,發(fā)現(xiàn)用戶的個性化需求與興趣特點,將用戶可能感興趣的信息或商品推薦給用戶。與搜索引擎不同,推薦系統(tǒng)不需要用戶準(zhǔn)確地描述出自己的需求,而是根據(jù)分析歷史行為建模,主動提供滿足用戶興趣和需求的信息。
傳統(tǒng)的推薦系統(tǒng)方法主要有:
1.協(xié)同過濾推薦(Collaborative Filtering Recommendation):該方法收集分析用戶歷史行為、活動、偏好,計算一個用戶與其他用戶的相似度,利用目標(biāo)用戶的相似用戶對商品評價的加權(quán)評價值,來預(yù)測目標(biāo)用戶對特定商品的喜好程度。優(yōu)點是可以給用戶推薦未瀏覽過的新產(chǎn)品;缺點是對于沒有任何行為的新用戶存在冷啟動的問題,同時也存在用戶與商品之間的交互數(shù)據(jù)不夠多造成的稀疏問題,會導(dǎo)致模型難以找到相近用戶。
2.基于內(nèi)容過濾推薦[1](Content-based Filtering Recommendation):該方法利用商品的內(nèi)容描述,抽象出有意義的特征,通過計算用戶的興趣和商品描述之間的相似度,來給用戶做推薦。優(yōu)點是簡單直接,不需要依據(jù)其他用戶對商品的評價,而是通過商品屬性進(jìn)行商品相似度度量,從而推薦給用戶所感興趣商品的相似商品;缺點是對于沒有任何行為的新用戶同樣存在冷啟動的問題。
3.組合推薦[2](Hybrid Recommendation):運(yùn)用不同的輸入和技術(shù)共同進(jìn)行推薦,以彌補(bǔ)各自推薦技術(shù)的缺點。
其中協(xié)同過濾是應(yīng)用最廣泛的技術(shù)之一,它又可以分為多個子類:基于用戶 (User-Based)的推薦[3] 、基于物品(Item-Based)的推薦[4]、基于社交網(wǎng)絡(luò)關(guān)系(Social-Based)的推薦[5]、基于模型(Model-based)的推薦等。1994年明尼蘇達(dá)大學(xué)推出的GroupLens系統(tǒng)[3]一般被認(rèn)為是推薦系統(tǒng)成為一個相對獨(dú)立的研究方向的標(biāo)志。該系統(tǒng)首次提出了基于協(xié)同過濾來完成推薦任務(wù)的思想,此后,基于該模型的協(xié)同過濾推薦引領(lǐng)了推薦系統(tǒng)十幾年的發(fā)展方向。
深度學(xué)習(xí)具有優(yōu)秀的自動提取特征的能力,能夠?qū)W習(xí)多層次的抽象特征表示,并對異質(zhì)或跨域的內(nèi)容信息進(jìn)行學(xué)習(xí),可以一定程度上處理推薦系統(tǒng)冷啟動問題[6]。本教程主要介紹個性化推薦的深度學(xué)習(xí)模型,以及如何使用PaddlePaddle實現(xiàn)模型。
我們使用包含用戶信息、電影信息與電影評分的數(shù)據(jù)集作為個性化推薦的應(yīng)用場景。當(dāng)我們訓(xùn)練好模型后,只需要輸入對應(yīng)的用戶ID和電影ID,就可以得出一個匹配的分?jǐn)?shù)(范圍[0,5],分?jǐn)?shù)越高視為興趣越大),然后根據(jù)所有電影的推薦得分排序,推薦給用戶可能感興趣的電影。
Input movie_id: 1962
Input user_id: 1
Prediction Score is 4.25
本章中,我們首先介紹YouTube的視頻推薦系統(tǒng)[7],然后介紹我們實現(xiàn)的融合推薦模型。
YouTube是世界上最大的視頻上傳、分享和發(fā)現(xiàn)網(wǎng)站,YouTube推薦系統(tǒng)為超過10億用戶從不斷增長的視頻庫中推薦個性化的內(nèi)容。整個系統(tǒng)由兩個神經(jīng)網(wǎng)絡(luò)組成:候選生成網(wǎng)絡(luò)和排序網(wǎng)絡(luò)。候選生成網(wǎng)絡(luò)從百萬量級的視頻庫中生成上百個候選,排序網(wǎng)絡(luò)對候選進(jìn)行打分排序,輸出排名最高的數(shù)十個結(jié)果。系統(tǒng)結(jié)構(gòu)如圖1所示:
http://wiki.jikexueyuan.com/project/deep-learning/images/05-01.png" alt="png" />
圖1. YouTube 推薦系統(tǒng)結(jié)構(gòu)
候選生成網(wǎng)絡(luò)將推薦問題建模為一個類別數(shù)極大的多類分類問題:對于一個Youtube用戶,使用其觀看歷史(視頻ID)、搜索詞記錄(search tokens)、人口學(xué)信息(如地理位置、用戶登錄設(shè)備)、二值特征(如性別,是否登錄)和連續(xù)特征(如用戶年齡)等,對視頻庫中所有視頻進(jìn)行多分類,得到每一類別的分類結(jié)果(即每一個視頻的推薦概率),最終輸出概率較高的幾百個視頻。
首先,將觀看歷史及搜索詞記錄這類歷史信息,映射為向量后取平均值得到定長表示;同時,輸入人口學(xué)特征以優(yōu)化新用戶的推薦效果,并將二值特征和連續(xù)特征歸一化處理到[0, 1]范圍。接下來,將所有特征表示拼接為一個向量,并輸入給非線形多層感知器(MLP,詳見識別數(shù)字教程)處理。最后,訓(xùn)練時將MLP的輸出給softmax做分類,預(yù)測時計算用戶的綜合特征(MLP的輸出)與所有視頻的相似度,取得分最高的$k$個作為候選生成網(wǎng)絡(luò)的篩選結(jié)果。圖2顯示了候選生成網(wǎng)絡(luò)結(jié)構(gòu)。
http://wiki.jikexueyuan.com/project/deep-learning/images/05-02.png" alt="png" />
圖2. 候選生成網(wǎng)絡(luò)結(jié)構(gòu)
對于一個用戶$U$,預(yù)測此刻用戶要觀看的視頻$\omega$為視頻$i$的概率公式為:
$$P(\omega=i|u)=\frac{e^{v_{i}u}}{\sum_{j \in V}e^{v_{j}u}}$$
其中$u$為用戶$U$的特征表示,$V$為視頻庫集合,$v_i$為視頻庫中第$i$個視頻的特征表示。$u$和$v_i$為長度相等的向量,兩者點積可以通過全連接層實現(xiàn)。
考慮到softmax分類的類別數(shù)非常多,為了保證一定的計算效率:1)訓(xùn)練階段,使用負(fù)樣本類別采樣將實際計算的類別數(shù)縮小至數(shù)千;2)推薦(預(yù)測)階段,忽略softmax的歸一化計算(不影響結(jié)果),將類別打分問題簡化為點積(dot product)空間中的最近鄰(nearest neighbor)搜索問題,取與$u$最近的$k$個視頻作為生成的候選。
排序網(wǎng)絡(luò)的結(jié)構(gòu)類似于候選生成網(wǎng)絡(luò),但是它的目標(biāo)是對候選進(jìn)行更細(xì)致的打分排序。和傳統(tǒng)廣告排序中的特征抽取方法類似,這里也構(gòu)造了大量的用于視頻排序的相關(guān)特征(如視頻 ID、上次觀看時間等)。這些特征的處理方式和候選生成網(wǎng)絡(luò)類似,不同之處是排序網(wǎng)絡(luò)的頂部是一個加權(quán)邏輯回歸(weighted logistic regression),它對所有候選視頻進(jìn)行打分,從高到底排序后將分?jǐn)?shù)較高的一些視頻返回給用戶。
本節(jié)會使卷積神經(jīng)網(wǎng)絡(luò)(Convolutional Neural Networks)來學(xué)習(xí)電影名稱的表示。下面會依次介紹文本卷積神經(jīng)網(wǎng)絡(luò)以及融合推薦模型。
卷積神經(jīng)網(wǎng)絡(luò)經(jīng)常用來處理具有類似網(wǎng)格拓?fù)浣Y(jié)構(gòu)(grid-like topology)的數(shù)據(jù)。例如,圖像可以視為二維網(wǎng)格的像素點,自然語言可以視為一維的詞序列。卷積神經(jīng)網(wǎng)絡(luò)可以提取多種局部特征,并對其進(jìn)行組合抽象得到更高級的特征表示。實驗表明,卷積神經(jīng)網(wǎng)絡(luò)能高效地對圖像及文本問題進(jìn)行建模處理。
卷積神經(jīng)網(wǎng)絡(luò)主要由卷積(convolution)和池化(pooling)操作構(gòu)成,其應(yīng)用及組合方式靈活多變,種類繁多。本小結(jié)我們以如圖3所示的網(wǎng)絡(luò)進(jìn)行講解:
http://wiki.jikexueyuan.com/project/deep-learning/images/05-03.png" alt="png" />
圖3. 卷積神經(jīng)網(wǎng)絡(luò)文本分類模型
假設(shè)待處理句子的長度為$n$,其中第$i$個詞的詞向量(word embedding)為$x_i\in\mathbb{R}^k$,$k$為維度大小。
首先,進(jìn)行詞向量的拼接操作:將每$h$個詞拼接起來形成一個大小為$h$的詞窗口,記為$x_{i:i+h-1}$,它表示詞序列$x_{i},x_{i+1},\ldots,x_{i+h-1}$的拼接,其中,$i$表示詞窗口中第一個詞在整個句子中的位置,取值范圍從$1$到$n-h+1$,$x_{i:i+h-1}\in\mathbb{R}^{hk}$。
其次,進(jìn)行卷積操作:把卷積核(kernel)$w\in\mathbb{R}^{hk}$應(yīng)用于包含$h$個詞的窗口$x_{i:i+h-1}$,得到特征$c_i=f(w\cdot x_{i:i+h-1}+b)$,其中$b\in\mathbb{R}$為偏置項(bias),$f$為非線性激活函數(shù),如$sigmoid$。將卷積核應(yīng)用于句子中所有的詞窗口${x_{1:h},x_{2:h+1},\ldots,x_{n-h+1:n}}$,產(chǎn)生一個特征圖(feature map):
$$c=[c_1,c_2,\ldots,c_{n-h+1}], c \in \mathbb{R}^{n-h+1}$$
接下來,對特征圖采用時間維度上的最大池化(max pooling over time)操作得到此卷積核對應(yīng)的整句話的特征$\hat c$,它是特征圖中所有元素的最大值:
$$\hat c=max(c)$$
在融合推薦模型的電影推薦系統(tǒng)中:
首先,使用用戶特征和電影特征作為神經(jīng)網(wǎng)絡(luò)的輸入,其中:
用戶特征融合了四個屬性信息,分別是用戶ID、性別、職業(yè)和年齡。
電影特征融合了三個屬性信息,分別是電影ID、電影類型ID和電影名稱。
對用戶特征,將用戶ID映射為維度大小為256的向量表示,輸入全連接層,并對其他三個屬性也做類似的處理。然后將四個屬性的特征表示分別全連接并相加。
對電影特征,將電影ID以類似用戶ID的方式進(jìn)行處理,電影類型ID以向量的形式直接輸入全連接層,電影名稱用文本卷積神經(jīng)網(wǎng)絡(luò)得到其定長向量表示。然后將三個屬性的特征表示分別全連接并相加。
得到用戶和電影的向量表示后,計算二者的余弦相似度作為推薦系統(tǒng)的打分。最后,用該相似度打分和用戶真實打分的差異的平方作為該回歸模型的損失函數(shù)。
http://wiki.jikexueyuan.com/project/deep-learning/images/05-04.png" alt="png" />
圖4. 融合推薦模型
我們以 MovieLens 百萬數(shù)據(jù)集(ml-1m)為例進(jìn)行介紹。ml-1m 數(shù)據(jù)集包含了 6,000 位用戶對 4,000 部電影的 1,000,000 條評價(評分范圍 1~5 分,均為整數(shù)),由 GroupLens Research 實驗室搜集整理。
Paddle在API中提供了自動加載數(shù)據(jù)的模塊。數(shù)據(jù)模塊為 paddle.dataset.movielens
import paddle.v2 as paddle
paddle.init(use_gpu=False)
# Run this block to show dataset's documentation
# help(paddle.dataset.movielens)
在原始數(shù)據(jù)中包含電影的特征數(shù)據(jù),用戶的特征數(shù)據(jù),和用戶對電影的評分。
例如,其中某一個電影特征為:
movie_info = paddle.dataset.movielens.movie_info()
print movie_info.values()[0]
<MovieInfo id(1), title(Toy Story ), categories(['Animation', "Children's", 'Comedy'])>
這表示,電影的id是1,標(biāo)題是《Toy Story》,該電影被分為到三個類別中。這三個類別是動畫,兒童,喜劇。
user_info = paddle.dataset.movielens.user_info()
print user_info.values()[0]
<UserInfo id(1), gender(F), age(1), job(10)>
這表示,該用戶ID是1,女性,年齡比18歲還年輕。職業(yè)ID是10。
其中,年齡使用下列分布
1: "Under 18"
18: "18-24"
25: "25-34"
35: "35-44"
45: "45-49"
50: "50-55"
56: "56+"
職業(yè)是從下面幾種選項里面選則得出:
0: "other" or not specified
1: "academic/educator"
2: "artist"
3: "clerical/admin"
4: "college/grad student"
5: "customer service"
6: "doctor/health care"
7: "executive/managerial"
8: "farmer"
9: "homemaker"
10: "K-12 student"
11: "lawyer"
12: "programmer"
13: "retired"
14: "sales/marketing"
15: "scientist"
16: "self-employed"
17: "technician/engineer"
18: "tradesman/craftsman"
19: "unemployed"
20: "writer"
而對于每一條訓(xùn)練/測試數(shù)據(jù),均為 <用戶特征> + <電影特征> + 評分。
例如,我們獲得第一條訓(xùn)練數(shù)據(jù):
train_set_creator = paddle.dataset.movielens.train()
train_sample = next(train_set_creator())
uid = train_sample[0]
mov_id = train_sample[len(user_info[uid].value())]
print "User %s rates Movie %s with Score %s"%(user_info[uid], movie_info[mov_id], train_sample[-1])
User <UserInfo id(1), gender(F), age(1), job(10)> rates Movie <MovieInfo id(1193), title(One Flew Over the Cuckoo's Nest ), categories(['Drama'])> with Score [5.0]
即用戶1對電影1193的評價為5分。
下面我們開始根據(jù)輸入數(shù)據(jù)的形式配置模型。
uid = paddle.layer.data(
name='user_id',
type=paddle.data_type.integer_value(
paddle.dataset.movielens.max_user_id() + 1))
usr_emb = paddle.layer.embedding(input=uid, size=32)
usr_fc = paddle.layer.fc(input=usr_emb, size=32)
usr_gender_id = paddle.layer.data(
name='gender_id', type=paddle.data_type.integer_value(2))
usr_gender_emb = paddle.layer.embedding(input=usr_gender_id, size=16)
usr_gender_fc = paddle.layer.fc(input=usr_gender_emb, size=16)
usr_age_id = paddle.layer.data(
name='age_id',
type=paddle.data_type.integer_value(
len(paddle.dataset.movielens.age_table)))
usr_age_emb = paddle.layer.embedding(input=usr_age_id, size=16)
usr_age_fc = paddle.layer.fc(input=usr_age_emb, size=16)
usr_job_id = paddle.layer.data(
name='job_id',
type=paddle.data_type.integer_value(
paddle.dataset.movielens.max_job_id() + 1))
usr_job_emb = paddle.layer.embedding(input=usr_job_id, size=16)
usr_job_fc = paddle.layer.fc(input=usr_job_emb, size=16)
如上述代碼所示,對于每個用戶,我們輸入4維特征。其中包括user_id,gender_id,age_id,job_id。這幾維特征均是簡單的整數(shù)值。為了后續(xù)神經(jīng)網(wǎng)絡(luò)處理這些特征方便,我們借鑒NLP中的語言模型,將這幾維離散的整數(shù)值,變換成embedding取出。分別形成usr_emb, usr_gender_emb, usr_age_emb, usr_job_emb。
usr_combined_features = paddle.layer.fc(
input=[usr_fc, usr_gender_fc, usr_age_fc, usr_job_fc],
size=200,
act=paddle.activation.Tanh())
然后,我們對于所有的用戶特征,均輸入到一個全連接層(fc)中。將所有特征融合為一個200維度的特征。
進(jìn)而,我們對每一個電影特征做類似的變換,網(wǎng)絡(luò)配置為:
mov_id = paddle.layer.data(
name='movie_id',
type=paddle.data_type.integer_value(
paddle.dataset.movielens.max_movie_id() + 1))
mov_emb = paddle.layer.embedding(input=mov_id, size=32)
mov_fc = paddle.layer.fc(input=mov_emb, size=32)
mov_categories = paddle.layer.data(
name='category_id',
type=paddle.data_type.sparse_binary_vector(
len(paddle.dataset.movielens.movie_categories())))
mov_categories_hidden = paddle.layer.fc(input=mov_categories, size=32)
movie_title_dict = paddle.dataset.movielens.get_movie_title_dict()
mov_title_id = paddle.layer.data(
name='movie_title',
type=paddle.data_type.integer_value_sequence(len(movie_title_dict)))
mov_title_emb = paddle.layer.embedding(input=mov_title_id, size=32)
mov_title_conv = paddle.networks.sequence_conv_pool(
input=mov_title_emb, hidden_size=32, context_len=3)
mov_combined_features = paddle.layer.fc(
input=[mov_fc, mov_categories_hidden, mov_title_conv],
size=200,
act=paddle.activation.Tanh())
電影ID和電影類型分別映射到其對應(yīng)的特征隱層。對于電影標(biāo)題名稱(title),一個ID序列表示的詞語序列,在輸入卷積層后,將得到每個時間窗口的特征(序列特征),然后通過在時間維度降采樣得到固定維度的特征,整個過程在sequence_conv_pool實現(xiàn)。
最后再將電影的特征融合進(jìn)mov_combined_features中。
inference = paddle.layer.cos_sim(a=usr_combined_features, b=mov_combined_features, size=1, scale=5)
進(jìn)而,我們使用余弦相似度計算用戶特征與電影特征的相似性。并將這個相似性擬合(回歸)到用戶評分上。
cost = paddle.layer.mse_cost(
input=inference,
label=paddle.layer.data(
name='score', type=paddle.data_type.dense_vector(1)))
至此,我們的優(yōu)化目標(biāo)就是這個網(wǎng)絡(luò)配置中的cost了。
神經(jīng)網(wǎng)絡(luò)的模型,我們可以簡單的理解為網(wǎng)絡(luò)拓樸結(jié)構(gòu)+參數(shù)。之前一節(jié),我們定義出了優(yōu)化目標(biāo)cost。這個cost即為網(wǎng)絡(luò)模型的拓?fù)浣Y(jié)構(gòu)。我們開始訓(xùn)練模型,需要先定義出參數(shù)。定義方法為:
parameters = paddle.parameters.create(cost)
[INFO 2017-03-06 17:12:13,284 networks.py:1472] The input order is [user_id, gender_id, age_id, job_id, movie_id, category_id, movie_title, score]
[INFO 2017-03-06 17:12:13,287 networks.py:1478] The output order is [__mse_cost_0__]
parameters是模型的所有參數(shù)集合。他是一個python的dict。我們可以查看到這個網(wǎng)絡(luò)中的所有參數(shù)名稱。因為之前定義模型的時候,我們沒有指定參數(shù)名稱,這里參數(shù)名稱是自動生成的。當(dāng)然,我們也可以指定每一個參數(shù)名稱,方便日后維護(hù)。
print parameters.keys()
[u'___fc_layer_2__.wbias', u'___fc_layer_2__.w2', u'___embedding_layer_3__.w0', u'___embedding_layer_5__.w0', u'___embedding_layer_2__.w0', u'___embedding_layer_1__.w0', u'___fc_layer_1__.wbias', u'___fc_layer_0__.wbias', u'___fc_layer_1__.w0', u'___fc_layer_0__.w2', u'___fc_layer_0__.w3', u'___fc_layer_0__.w0', u'___fc_layer_0__.w1', u'___fc_layer_2__.w1', u'___fc_layer_2__.w0', u'___embedding_layer_4__.w0', u'___sequence_conv_pool_0___conv_fc.w0', u'___embedding_layer_0__.w0', u'___sequence_conv_pool_0___conv_fc.wbias']
下面,我們根據(jù)網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)和模型參數(shù)來構(gòu)造出一個本地訓(xùn)練(trainer)。在構(gòu)造本地訓(xùn)練的時候,我們還需要指定這個訓(xùn)練的優(yōu)化方法。這里我們使用Adam來作為優(yōu)化算法。
trainer = paddle.trainer.SGD(cost=cost, parameters=parameters,
update_equation=paddle.optimizer.Adam(learning_rate=1e-4))
[INFO 2017-03-06 17:12:13,378 networks.py:1472] The input order is [user_id, gender_id, age_id, job_id, movie_id, category_id, movie_title, score]
[INFO 2017-03-06 17:12:13,379 networks.py:1478] The output order is [__mse_cost_0__]
下面我們開始訓(xùn)練過程。
我們直接使用Paddle提供的數(shù)據(jù)集讀取程序。paddle.dataset.movielens.train()和paddle.dataset.movielens.test()分別做訓(xùn)練和預(yù)測數(shù)據(jù)集。并且通過feeding來指定每一個數(shù)據(jù)和data_layer的對應(yīng)關(guān)系。
例如,這里的feeding表示的是,對于數(shù)據(jù)層 user_id,使用了reader中每一條數(shù)據(jù)的第0個元素。gender_id數(shù)據(jù)層使用了第1個元素。以此類推。
feeding = {
'user_id': 0,
'gender_id': 1,
'age_id': 2,
'job_id': 3,
'movie_id': 4,
'category_id': 5,
'movie_title': 6,
'score': 7
}
訓(xùn)練過程是完全自動的。我們可以使用event_handler與event_handler_plot來觀察訓(xùn)練過程,或進(jìn)行測試等。這里我們在event_handler_plot里面繪制了訓(xùn)練誤差曲線和測試誤差曲線。并且保存了模型。
def event_handler(event):
if isinstance(event, paddle.event.EndIteration):
if event.batch_id % 100 == 0:
print "Pass %d Batch %d Cost %.2f" % (
event.pass_id, event.batch_id, event.cost)
from paddle.v2.plot import Ploter
train_title = "Train cost"
test_title = "Test cost"
cost_ploter = Ploter(train_title, test_title)
step = 0
def event_handler_plot(event):
global step
if isinstance(event, paddle.event.EndIteration):
if step % 10 == 0: # every 10 batches, record a train cost
cost_ploter.append(train_title, step, event.cost)
if step % 1000 == 0: # every 1000 batches, record a test cost
result = trainer.test(
reader=paddle.batch(
paddle.dataset.movielens.test(), batch_size=256),
feeding=feeding)
cost_ploter.append(test_title, step, result.cost)
if step % 100 == 0: # every 100 batches, update cost plot
cost_ploter.plot()
step += 1
trainer.train(
reader=paddle.batch(
paddle.reader.shuffle(
paddle.dataset.movielens.train(), buf_size=8192),
batch_size=256),
event_handler=event_handler_plot,
feeding=feeding,
num_passes=2)
http://wiki.jikexueyuan.com/project/deep-learning/images/05-05.png" alt="png" />
在訓(xùn)練了幾輪以后,您可以對模型進(jìn)行推斷。我們可以使用任意一個用戶ID和電影ID,來預(yù)測該用戶對該電影的評分。示例程序為:
import copy
user_id = 234
movie_id = 345
user = user_info[user_id]
movie = movie_info[movie_id]
feature = user.value() + movie.value()
infer_dict = copy.copy(feeding)
del infer_dict['score']
prediction = paddle.infer(inference, parameters=parameters, input=[feature], feeding=infer_dict)
score = (prediction[0][0] + 5.0) / 2
print "[Predict] User %d Rating Movie %d With Score %.2f"%(user_id, movie_id, score)
[INFO 2017-03-06 17:17:08,132 networks.py:1472] The input order is [user_id, gender_id, age_id, job_id, movie_id, category_id, movie_title]
[INFO 2017-03-06 17:17:08,134 networks.py:1478] The output order is [__cos_sim_0__]
[Predict] User 234 Rating Movie 345 With Score 4.16
本章介紹了傳統(tǒng)的推薦系統(tǒng)方法和YouTube的深度神經(jīng)網(wǎng)絡(luò)推薦系統(tǒng),并以電影推薦為例,使用PaddlePaddle訓(xùn)練了一個個性化推薦神經(jīng)網(wǎng)絡(luò)模型。推薦系統(tǒng)幾乎涵蓋了電商系統(tǒng)、社交網(wǎng)絡(luò)、廣告推薦、搜索引擎等領(lǐng)域的方方面面,而在圖像處理、自然語言處理等領(lǐng)域已經(jīng)發(fā)揮重要作用的深度學(xué)習(xí)技術(shù),也將會在推薦系統(tǒng)領(lǐng)域大放異彩。

本教程 由 PaddlePaddle 創(chuàng)作,采用 知識共享 署名-相同方式共享 4.0 國際 許可協(xié)議進(jìn)行許可。