阿里近幾年公開的推薦領(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ù)交流群喲歼狼!