為什么要用深度學(xué)習(xí)來做個(gè)性化推薦 CTR 預(yù)估
深度學(xué)習(xí)應(yīng)該這一兩年計(jì)算機(jī)圈子里最熱的一個(gè)詞了。基于深度學(xué)習(xí),工程師們在圖像,語音,NLP等領(lǐng)域都取得了令人振奮的進(jìn)展。而深度學(xué)習(xí)本身也在不斷的探索和發(fā)展中,其潛力的極限目前還沒有被看到。
當(dāng)然,深度學(xué)習(xí)也不是***的,比如有很多問題的特征是易于提取的,我們可以直接使用SVM, 決策樹的算法來取得很好的結(jié)果。而深度學(xué)習(xí)并不能提供太多的幫助。還有一些問題,我們并沒有足夠數(shù)量的數(shù)據(jù),我們也很難通過深度學(xué)習(xí)算法來得到可用的模型。此外,有些問題對(duì)計(jì)算資源和時(shí)間的要求比較嚴(yán)苛,在深度學(xué)習(xí)小型化沒有取得突破性進(jìn)展的時(shí)候,它們也不是***方法。
判斷一個(gè)項(xiàng)目適不適合上深度學(xué)習(xí)的正確姿勢
( 圖片來源 : 深度學(xué)習(xí)防騙指南 )
反過來說,雖然目前深度學(xué)習(xí)在個(gè)性化推薦,計(jì)算廣告領(lǐng)域上還沒有很大的突破,但是我認(rèn)為推薦系統(tǒng)有很大概率會(huì)是深度學(xué)習(xí)的最重要的應(yīng)用場景之一。理由有以下幾個(gè)方面:
現(xiàn)在的推薦系統(tǒng)都要面對(duì)海量的數(shù)據(jù),要提取上萬乃至上億維的特征。而深度學(xué)習(xí)本身就是一個(gè)很好的表示學(xué)習(xí)的框架,從海量的數(shù)據(jù)中學(xué)習(xí)到人類無法提取的特征組合,是其擅長的事情。
( 圖片來源 : 深度學(xué)習(xí)防騙指南 )
數(shù)據(jù)和特征決定了機(jī)器學(xué)習(xí)的上限,而模型和算法只是逼近這個(gè)上限而已?,F(xiàn)有的推薦系統(tǒng)依賴于特征工程的效果。而特征工程建立在不斷的深入理解問題和獲取額外的數(shù)據(jù)源上。然而根據(jù)數(shù)據(jù)人能抽象出來的特征總類很有限,新數(shù)據(jù)源和新特征的獲得會(huì)越來越難。隨著人工特征工程的深入,投入的人力和時(shí)間越來越長,得到的新特征對(duì)系統(tǒng)的提升卻越來越少。這個(gè)時(shí)候,使用深度學(xué)習(xí)來做特征表達(dá),在成本上也許是一個(gè)更好的選擇。
圖:IBM Watson系統(tǒng)的精度提升曲線??梢钥吹揭婚_始的時(shí)候結(jié)果提升的特別快,后面一點(diǎn)點(diǎn)的提升都要付出很大的努力,
因此我們基于Tensorflow在某個(gè)業(yè)務(wù)上做了DNN的嘗試,跑通了整個(gè)流程,積累了一些經(jīng)驗(yàn)。也比原有LR的模型在線上有了20%多的提升。希望這些代碼也可以幫助各位同學(xué)快速的在自己的業(yè)務(wù)上實(shí)現(xiàn)一套深度模型的框架。
圖: DNN在CTR預(yù)估的一般框架
一般來說,我們可以先選擇一個(gè)比較簡單的框架來跑通整個(gè)流程,然后再慢慢增加模型的復(fù)雜度。通常我們可以選用下圖的框架,把我們用到的數(shù)據(jù)分為兩類:連續(xù)的,和離散的特征。
對(duì)于連續(xù)的特征,需要做一些歸一化;對(duì)于離散的特征,則一般要做一個(gè)Embedding,把一個(gè)離散的特征轉(zhuǎn)成一個(gè)N維的向量。這個(gè)向量的長度一般來說是和該向量的取值空間成正比的。這個(gè)embedding的過程可以用FM來實(shí)現(xiàn)。 在我們的代碼里,是通過Tensorflow自動(dòng)embedding_column實(shí)現(xiàn)的。
所以把用戶數(shù)據(jù)和推薦的物品數(shù)據(jù)放一起分成兩類,然后把embedded之后的離散特征 和 連續(xù)特征組合在一起,作為神經(jīng)網(wǎng)絡(luò)的輸入,輸出就是[0,1] 是否點(diǎn)擊。這里面我們就直接調(diào)用tensorflow的DNNClassifier。這個(gè)網(wǎng)絡(luò)可以設(shè)計(jì)層數(shù),每層的大小,dropout, 激活函數(shù),學(xué)習(xí)率等等。
- opt = tf.train.AdamOptimizer(learning_rate=0.01,
- beta1=0.9,
- beta2=0.999) # default 0.001 0.9 0.999
- m = tf.contrib.learn.DNNClassifier(model_dir=model_dir,
- feature_columns=deep_columns,
- hidden_units=[1024, 512, 256],
- optimizer = opt,
- activation_fn=tf.nn.relu, # default
- dropout=0.05 )
所以后面就是一個(gè)不斷調(diào)參的過程,當(dāng)然這個(gè)調(diào)參也是有一些技巧。網(wǎng)上有很多,在這里就不一一來說了。
深度學(xué)習(xí)調(diào)參師
( 圖片來源 : 深度學(xué)習(xí)防騙指南 )
總的來說,深度學(xué)習(xí)沒有那么神秘,它是一個(gè)很有效的工具。在個(gè)性化推薦上應(yīng)該已經(jīng)有很多團(tuán)隊(duì)進(jìn)行了很多嘗試。在這里,我們給出了一個(gè)簡單和有效的基于Tensorflow的實(shí)現(xiàn)方式,也希望可以幫助一些想要嘗試深度學(xué)習(xí)的一些團(tuán)隊(duì)。
原文鏈接:https://cloud.tencent.com/community/article/603674
作者:蘇博覽
【本文是51CTO專欄作者“騰訊云技術(shù)社區(qū)”的原創(chuàng)稿件,轉(zhuǎn)載請通過51CTO聯(lián)系原作者獲取授權(quán)】