推薦系統(tǒng)遇上深度學(xué)習(xí)(十七)--探秘阿里之MLR算法淺析及實(shí)現(xiàn)

阿里近幾年公開的推薦領(lǐng)域算法可真不少端铛,既有傳統(tǒng)領(lǐng)域的探索如MLR算法蠢涝,還有深度學(xué)習(xí)領(lǐng)域的探索如entire -space multi-task model爆存,Deep Interest Network等株扛,同時跟清華大學(xué)合作展開了強(qiáng)化學(xué)習(xí)領(lǐng)域的探索养距,提出了MARDPG算法诉探。從本篇開始,我們就一起來探秘這些算法棍厌。這里肾胯,我們只是大體了解一下每一個算法的思路,對于數(shù)學(xué)部分的介紹耘纱,我們不會過多的涉及敬肚。

1、算法介紹

現(xiàn)階段各CTR預(yù)估算法的不足
我們這里的現(xiàn)階段束析,不是指的今時今日艳馒,而是阿里剛剛公開此算法的時間,大概就是去年的三四月份吧员寇。

業(yè)界常用的CTR預(yù)估算法的不足如下表所示:

方法 簡介 不足
邏輯回歸 使用了Sigmoid函數(shù)將函數(shù)值映射到0~1區(qū)間作為CTR的預(yù)估值弄慰。LR這種線性模型很容易并行化,處理上億條訓(xùn)練樣本不是問題蝶锋。 線性模型的學(xué)習(xí)能力有限陆爽,需要引入大量的領(lǐng)域知識來人工設(shè)計(jì)特征以及特征之間的交叉組合來間接補(bǔ)充算法的非線性學(xué)習(xí)能力,非常消耗人力和機(jī)器資源扳缕,遷移性不夠友好墓陈。
Kernel方法 將低維特征映射到高維特征空間 復(fù)雜度太高而不易實(shí)現(xiàn)
樹模型 如Facebook的GBDT+LR算法恶守,有效地解決了LR模型的特征組合問題 是對歷史行為的記憶,缺乏推廣性贡必,樹模型只能學(xué)習(xí)到歷史數(shù)據(jù)中的特定規(guī)則兔港,對于新規(guī)則缺乏推廣性
FM模型 自動學(xué)習(xí)高階屬性的權(quán)值,不用通過人工的方式選取特征來做交叉 FM模型只能擬合特定的非線性模式仔拟,常用的就是二階FM
深度神經(jīng)網(wǎng)絡(luò) 使用神經(jīng)網(wǎng)絡(luò)擬合數(shù)據(jù)之間的高階非線性關(guān)系衫樊,非線性擬合能力足夠強(qiáng) 適合數(shù)據(jù)規(guī)律的、具備推廣性的網(wǎng)絡(luò)結(jié)構(gòu)業(yè)界依然在探索中利花,尤其是要做到端到端規(guī)目瞥蓿化上線,這里面的技術(shù)挑戰(zhàn)依然很大

那么挑戰(zhàn)來了炒事,如何設(shè)計(jì)算法從大規(guī)模數(shù)據(jù)中挖掘出具有推廣性的非線性模式臀栈?

MLR算法

2011-2012年期間,阿里媽媽資深專家蓋坤創(chuàng)新性地提出了MLR(mixed logistic regression)算法挠乳,引領(lǐng)了廣告領(lǐng)域CTR預(yù)估算法的全新升級权薯。MLR算法創(chuàng)新地提出并實(shí)現(xiàn)了直接在原始空間學(xué)習(xí)特征之間的非線性關(guān)系,基于數(shù)據(jù)自動發(fā)掘可推廣的模式睡扬,相比于人工來說效率和精度均有了大幅提升盟蚣。

MLR可以看做是對LR的一個自然推廣,它采用分而治之的思路卖怜,用分片線性的模式來擬合高維空間的非線性分類面屎开,其形式化表達(dá)如下:

其中u是聚類參數(shù),決定了空間的劃分马靠,w是分類參數(shù)奄抽,決定空間內(nèi)的預(yù)測。這里面超參數(shù)分片數(shù)m可以較好地平衡模型的擬合與推廣能力甩鳄。當(dāng)m=1時MLR就退化為普通的LR逞度,m越大模型的擬合能力越強(qiáng),但是模型參數(shù)規(guī)模隨m線性增長娩贷,相應(yīng)所需的訓(xùn)練樣本也隨之增長第晰。因此實(shí)際應(yīng)用中m需要根據(jù)實(shí)際情況進(jìn)行選擇锁孟。例如彬祖,在阿里的場景中,m一般選擇為12品抽。下圖中MLR模型用4個分片可以完美地?cái)M合出數(shù)據(jù)中的菱形分類面储笑。

在實(shí)際中,MLR算法常用的形式如下圆恤,使用softmax作為分片函數(shù):

在這種情況下突倍,MLR模型可以看作是一個FOE model:

關(guān)于損失函數(shù)的設(shè)計(jì),阿里采用了 neg-likelihood loss function以及L1,L2正則羽历,形式如下:

由于加入了正則項(xiàng)焊虏,MLR算法變的不再是平滑的凸函數(shù),梯度下降法不再適用秕磷,因此模型參數(shù)的更新使用LBFGS和OWLQN的結(jié)合诵闭,具體的優(yōu)化細(xì)節(jié)大家可以參考論文(https://arxiv.org/pdf/1704.05194.pdf).

MLR算法適合于工業(yè)級的大規(guī)模稀疏數(shù)據(jù)場景問題,如廣告CTR預(yù)估澎嚣。背后的優(yōu)勢體現(xiàn)在兩個方面:
端到端的非線性學(xué)習(xí):從模型端自動挖掘數(shù)據(jù)中蘊(yùn)藏的非線性模式疏尿,省去了大量的人工特征設(shè)計(jì),這 使得MLR算法可以端到端地完成訓(xùn)練易桃,在不同場景中的遷移和應(yīng)用非常輕松褥琐。
稀疏性:MLR在建模時引入了L1和L2,1范數(shù)正則,可以使得最終訓(xùn)練出來的模型具有較高的稀疏度晤郑, 模型的學(xué)習(xí)和在線預(yù)測性能更好敌呈。當(dāng)然,這也對算法的優(yōu)化求解帶來了巨大的挑戰(zhàn)贩汉。

2驱富、算法簡單實(shí)現(xiàn)

我們這里只是簡單實(shí)現(xiàn)一個tensorflow版本的MLR模型,通過代碼來了解一下模型的思想匹舞。

代碼的github地址為:https://github.com/princewen/tensorflow_practice/tree/master/recommendation/Basic-MLR-Demo

所使用的數(shù)據(jù)下載地址為:http://archive.ics.uci.edu/ml/datasets/Adult褐鸥,該數(shù)據(jù)是一個二分類的數(shù)據(jù),所預(yù)測的任務(wù)是判斷一個人是否能夠一年掙到50K的錢赐稽,數(shù)據(jù)介紹如下:

數(shù)據(jù)處理

數(shù)據(jù)中存在連續(xù)特征和離散特征叫榕,所以我們先要對數(shù)據(jù)進(jìn)行一個簡單的處理,處理包括將離散特征轉(zhuǎn)換為one-hot以及對連續(xù)特征進(jìn)行標(biāo)準(zhǔn)化姊舵。有一個需要注意的地方晰绎,訓(xùn)練集和測試集中離散特征出現(xiàn)的個數(shù)可能不一樣,因此需要先將數(shù)據(jù)合并括丁,然后轉(zhuǎn)換成one-hot荞下,最后再分開,代碼如下史飞。

import pandas as pd
from sklearn.preprocessing import StandardScaler

def get_data():
    train_data = pd.read_table("data/adult.data.txt",header=None,delimiter=',')
    test_data = pd.read_table("data/adult.test.txt",header=None,delimiter=',')

    all_columns = ['age','workclass','fnlwgt','education','education-num',
                        'marital-status','occupation','relationship','race','sex',
                        'capital-gain','capital-loss','hours-per-week','native-country','label','type']

    continus_columns = ['age','fnlwgt','education-num','capital-gain','capital-loss','hours-per-week']
    dummy_columns = ['workclass','education','marital-status','occupation','relationship','race','sex','native-country']

    train_data['type'] = 1
    test_data['type'] = 2

    all_data = pd.concat([train_data,test_data],axis=0)
    all_data.columns = all_columns

    all_data = pd.get_dummies(all_data,columns=dummy_columns)
    test_data = all_data[all_data['type']==2].drop(['type'],axis=1)
    train_data = all_data[all_data['type']==1].drop(['type'],axis=1)

    train_data['label'] = train_data['label'].map(lambda x: 1 if x.strip() == '>50K' else 0)
    test_data['label'] = test_data['label'].map(lambda x: 1 if x.strip() == '>50K.' else 0)

    for col in continus_columns:
        ss = StandardScaler()
        train_data[col] = ss.fit_transform(train_data[[col]])
        test_data[col] = ss.transform(test_data[[col]])

    train_y = train_data['label']
    train_x = train_data.drop(['label'],axis=1)
    test_y = test_data['label']
    test_x = test_data.drop(['label'],axis=1)

    return train_x,train_y,test_x,test_y

數(shù)據(jù)處理完后尖昏,特征的維度是108維。

MLR的實(shí)現(xiàn)

MLR的實(shí)現(xiàn)需要兩組參數(shù)构资,分別是聚類參數(shù)和分類參數(shù):

u = tf.Variable(tf.random_normal([108,m],0.0,0.5),name='u')
w = tf.Variable(tf.random_normal([108,m],0.0,0.5),name='w')

隨后抽诉,我們要計(jì)算我們的預(yù)估值:

U = tf.matmul(x,u)
p1 = tf.nn.softmax(U)

W = tf.matmul(x,w)
p2 = tf.nn.sigmoid(W)

pred = tf.reduce_sum(tf.multiply(p1,p2),1)

損失函數(shù)我們剛才介紹過了,在tensorflow中吐绵,我們選擇FtrlOptimizer作為優(yōu)化器迹淌,可以給我們的損失函數(shù)加上正則項(xiàng):

cost1=tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=pred, labels=y))
cost=tf.add_n([cost1])
train_op = tf.train.FtrlOptimizer(learning_rate).minimize(cost)

隨后河绽,我們就可以進(jìn)行試驗(yàn)了。

實(shí)驗(yàn)結(jié)果
本文對比了在當(dāng)前給出的數(shù)據(jù)集下唉窃,m=5耙饰,10,15纹份,25 以及l(fā)r算法的效果榔幸,結(jié)果如下:

可以看到,lr的效果是最好的矮嫉,隨著m的增加削咆,模型的效果越來越差。當(dāng)然蠢笋,這并不能說明mlr效果不如lr好拨齐,只是我們的數(shù)據(jù)實(shí)在是太少了,哈哈昨寞。

參考文獻(xiàn)

1瞻惋、https://mp.weixin.qq.com/s?__biz=MzIzOTU0NTQ0MA==&mid=2247485097&idx=1&sn=6dbc197e67e8a2ba3ee78786b13d894d&scene=21#wechat_redirect
2、Learning Piece-wise Linear Models
from Large Scale Data for Ad Click Prediction

歡迎關(guān)注個人公眾號:小小挖掘機(jī)

添加微信sxw2251援岩,可以拉你進(jìn)入小小挖掘機(jī)技術(shù)交流群喲歼狼!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市享怀,隨后出現(xiàn)的幾起案子羽峰,更是在濱河造成了極大的恐慌,老刑警劉巖添瓷,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件梅屉,死亡現(xiàn)場離奇詭異,居然都是意外死亡鳞贷,警方通過查閱死者的電腦和手機(jī)坯汤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來搀愧,“玉大人惰聂,你說我怎么就攤上這事≡凵福” “怎么了搓幌?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長眷蚓。 經(jīng)常有香客問我鼻种,道長反番,這世上最難降的妖魔是什么沙热? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任叉钥,我火速辦了婚禮,結(jié)果婚禮上篙贸,老公的妹妹穿的比我還像新娘投队。我一直安慰自己,他們只是感情好爵川,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布敷鸦。 她就那樣靜靜地躺著,像睡著了一般寝贡。 火紅的嫁衣襯著肌膚如雪扒披。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天圃泡,我揣著相機(jī)與錄音碟案,去河邊找鬼。 笑死颇蜡,一個胖子當(dāng)著我的面吹牛价说,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播风秤,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼鳖目,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了缤弦?” 一聲冷哼從身側(cè)響起领迈,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎碍沐,沒想到半個月后惦费,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡抢韭,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年薪贫,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片刻恭。...
    茶點(diǎn)故事閱讀 40,133評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡瞧省,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出鳍贾,到底是詐尸還是另有隱情鞍匾,我是刑警寧澤,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布骑科,位于F島的核電站橡淑,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏咆爽。R本人自食惡果不足惜梁棠,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一置森、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧符糊,春花似錦凫海、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至模闲,卻和暖如春建瘫,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背尸折。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工暖混, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人翁授。 一個月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓拣播,卻偏偏與公主長得像,于是被迫代替她去往敵國和親收擦。 傳聞我的和親對象是個殘疾皇子贮配,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,077評論 2 355