上期介紹了3篇阿里的論文:推薦系統(tǒng)(八):阿里電商推薦算法論文導(dǎo)讀(上),本期將繼續(xù)介紹纳胧。
4. Learning Piece-wise Linear Models from Large Scale Data for Ad Click Prediction
4.1 算法介紹
當(dāng)前業(yè)界常用的CTR預(yù)估方法与倡、簡(jiǎn)介及其不足如下:
方法 | 簡(jiǎn)介 | 不足 |
---|---|---|
邏輯回歸 | 使用了Sigmoid函數(shù)將函數(shù)值映射到0~1區(qū)間作為CTR的預(yù)估值。LR這種線(xiàn)性模型很容易并行化焙矛,處理上億條訓(xùn)練樣本不是問(wèn)題垛吗。 | 線(xiàn)性模型的學(xué)習(xí)能力有限,需要引入大量的領(lǐng)域知識(shí)來(lái)人工設(shè)計(jì)特征以及特征之間的交叉組合來(lái)間接補(bǔ)充算法的非線(xiàn)性學(xué)習(xí)能力叠艳,非常消耗人力和機(jī)器資源奶陈,遷移性不夠友好。 |
Kernel方法 | 將低維特征映射到高維特征空間 | 復(fù)雜度太高而不易實(shí)現(xiàn) |
樹(shù)模型 | 如Facebook的GBDT+LR算法附较,有效地解決了LR模型的特征組合問(wèn)題 | 是對(duì)歷史行為的記憶吃粒,缺乏推廣性,樹(shù)模型只能學(xué)習(xí)到歷史數(shù)據(jù)中的特定規(guī)則翅睛,對(duì)于新規(guī)則缺乏推廣性 |
FM模型 | 自動(dòng)學(xué)習(xí)高階屬性的權(quán)值声搁,不用通過(guò)人工的方式選取特征來(lái)做交叉 | FM模型只能擬合特定的非線(xiàn)性模式黑竞,常用的就是二階FM |
深度神經(jīng)網(wǎng)絡(luò) | 使用神經(jīng)網(wǎng)絡(luò)擬合數(shù)據(jù)之間的高階非線(xiàn)性關(guān)系,非線(xiàn)性擬合能力足夠強(qiáng) | 適合數(shù)據(jù)規(guī)律的疏旨、具備推廣性的網(wǎng)絡(luò)結(jié)構(gòu)業(yè)界依然在探索中很魂,尤其是要做到端到端規(guī)模化上線(xiàn)檐涝,這里面的技術(shù)挑戰(zhàn)依然很大 |
2011-2012年期間遏匆,阿里媽媽資深專(zhuān)家蓋坤創(chuàng)新性地提出了MLR(mixed logistic regression)算法,引領(lǐng)了廣告領(lǐng)域CTR預(yù)估算法的全新升級(jí)谁榜。MLR算法創(chuàng)造地提出并實(shí)現(xiàn)了直接在原始空間學(xué)習(xí)特征之間的非線(xiàn)性關(guān)系幅聘,基于數(shù)據(jù)自動(dòng)發(fā)掘可推廣的模式,相比于人工來(lái)說(shuō)效率和精度均有了大幅提升窃植。
MLR可以看做是對(duì)LR的一個(gè)自然推廣帝蒿,它采用分而治之的思路,用分片線(xiàn)性的模式來(lái)擬合高維空間的非線(xiàn)性分類(lèi)面巷怜,其形式化表達(dá)如下:
其中是聚類(lèi)參數(shù)葛超,
決定了空間的劃分,
是分類(lèi)參數(shù)延塑,
決定空間內(nèi)的預(yù)測(cè)绣张。超參數(shù)分片數(shù)m可以較好地平衡模型的擬合與推廣能力。當(dāng)m=1時(shí)MLR就退化為普通的LR关带,m越大模型的擬合能力越強(qiáng)侥涵,但是模型參數(shù)規(guī)模隨m線(xiàn)性增長(zhǎng),相應(yīng)所需的訓(xùn)練樣本也隨之增長(zhǎng)宋雏。
在實(shí)際中芜飘,MLR算法常用的形式如下,使用softmax作為分片函數(shù):
在此情況下好芭,MLR模型可以看作一個(gè)FOE模型:
采用負(fù)似然(neg-likelihood)損失函數(shù):
由于加入了正則項(xiàng)燃箭,MLR算法變的不再是平滑的凸函數(shù)冲呢,梯度下降法不再適用舍败,因此模型參數(shù)的更新使用LBFGS和OWLQN的結(jié)合。
MLR算法適合于工業(yè)級(jí)的大規(guī)模稀疏數(shù)據(jù)場(chǎng)景問(wèn)題敬拓,如廣告CTR預(yù)估邻薯。背后的優(yōu)勢(shì)體現(xiàn)在兩個(gè)方面:
端到端的非線(xiàn)性學(xué)習(xí):從模型端自動(dòng)挖掘數(shù)據(jù)中蘊(yùn)藏的非線(xiàn)性模式,省去了大量的人工特征設(shè)計(jì)乘凸,這 使得MLR算法可以端到端地完成訓(xùn)練厕诡,在不同場(chǎng)景中的遷移和應(yīng)用非常輕松。
稀疏性:MLR在建模時(shí)引入了L1和L2,1范數(shù)正則营勤,可以使得最終訓(xùn)練出來(lái)的模型具有較高的稀疏度灵嫌, 模型的學(xué)習(xí)和在線(xiàn)預(yù)測(cè)性能更好壹罚。當(dāng)然,這也對(duì)算法的優(yōu)化求解帶來(lái)了巨大的挑戰(zhàn)寿羞。
4.2 算法實(shí)踐
采用如下數(shù)據(jù)猖凛,預(yù)測(cè)一個(gè)人一年內(nèi)是否能掙到50K的錢(qián),完整代碼如下:
import tensorflow as tf
from sklearn.metrics import roc_auc_score
import pandas as pd
import numpy as np
from sklearn.preprocessing import StandardScaler
import matplotlib.pyplot as plt
def MLR(train_x, train_y, test_x, test_y):
x = tf.placeholder(tf.float32, shape=[None, 108])
y = tf.placeholder(tf.float32, shape=[None])
m = 2
learning_rate = 0.3
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')
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)
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)
result = []
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
for epoch in range(0, 10000):
f_dict = {x:train_x, y:train_y}
_, cost_, predict_ = sess.run([train_op, cost, pred], feed_dict=f_dict)
auc = roc_auc_score(train_y, predict_)
if epoch % 100 == 0:
f_dict = {x:test_x, y:test_y}
_, cost_, predict_test = sess.run([train_op, cost, pred], feed_dict=f_dict)
test_auc = roc_auc_score(test_y, predict_test)
print('%d cost:%f, train_auc:%f test_auc:%f' % (epoch, cost_, auc, test_auc))
result.append([epoch,auc,test_auc])
pd.DataFrame(result, columns=['epoch','train_auc', 'test_auc']).to_csv("data/lr.csv")
plt.plot(np.array(result)[:,0], np.array(result)[:,1],label='train_auc')
plt.plot(np.array(result)[:,0],np.array(result)[:,2],label='test_auc')
plt.xlabel('epoch')
plt.ylabel('auc')
plt.grid()
plt.legend(['train_auc', 'test_auc'], loc = 'best')
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)
train_data = all_data[all_data['type']==1].drop(['type'],axis=1)
test_data = all_data[all_data['type']==2].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:
train_data[col] = StandardScaler().fit_transform(train_data[[col]])
test_data[col] = StandardScaler().fit_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)
if __name__ == '__main__':
MLR(train_x, train_y, test_x, test_y)
訓(xùn)練個(gè)測(cè)試過(guò)程中的AUC曲線(xiàn)變化如下:
5. Deep Interest Network for Click-Through Rate Prediction
5.1 背景與原理
深度學(xué)習(xí)在CTR預(yù)估領(lǐng)域已經(jīng)有了廣泛的應(yīng)用绪穆,常見(jiàn)的算法比如Wide&Deep辨泳,DeepFM等。這些方法一般的思路是:通過(guò)Embedding層玖院,將高維離散特征轉(zhuǎn)換為固定長(zhǎng)度的連續(xù)特征菠红,然后通過(guò)多個(gè)全聯(lián)接層,最后通過(guò)一個(gè)sigmoid函數(shù)轉(zhuǎn)化為0-1值难菌,代表點(diǎn)擊的概率试溯。即Sparse Features -> Embedding Vector -> MLPs -> Sigmoid -> Output.
這種方法的優(yōu)點(diǎn)在于:通過(guò)神經(jīng)網(wǎng)絡(luò)可以擬合高階的非線(xiàn)性關(guān)系,同時(shí)減少了人工特征的工作量郊酒。
阿里研究者在線(xiàn)上數(shù)據(jù)中發(fā)現(xiàn)用戶(hù)行為有兩個(gè)特征:
Diversity:用戶(hù)在瀏覽電商網(wǎng)站過(guò)程中顯示出的興趣是多樣的耍共。
Local activation:由于用戶(hù)興趣的多樣性,只有部分歷史數(shù)據(jù)會(huì)影響到當(dāng)次推薦的物品是否被點(diǎn)擊猎塞,而不是所有的歷史記錄试读。
這兩種特性是密不可分的。針對(duì)上面提到的用戶(hù)行為中存在的兩種特性荠耽,阿里將其運(yùn)用于自身的推薦系統(tǒng)中钩骇,推出了深度興趣網(wǎng)路DIN,整體框架如下:
整個(gè)過(guò)程可以描述為:
1)檢查用戶(hù)歷史行為數(shù)據(jù)铝量;
2)mactching產(chǎn)生候選ads倘屹;
3)ranking計(jì)算每個(gè)候選ads的概率并排序;
4)記錄用戶(hù)在當(dāng)前展示廣告下的反應(yīng)慢叨,作為label纽匙。
本文特征分為4個(gè)部分:用戶(hù)特征,用戶(hù)行為特征拍谐,廣告特征烛缔,上下文特征,具體如下:
以下為基本模型與DIN模型的比較轩拨,Base Model首先把one-hot或multi-hot特征轉(zhuǎn)換為特定長(zhǎng)度的embedding践瓷,作為模型的輸入,然后經(jīng)過(guò)一個(gè)DNN的part亡蓉,得到最終的預(yù)估值晕翠。特別地,針對(duì)multi-hot的特征砍濒,做了一次element-wise+的操作淋肾,這里其實(shí)就是sum-pooling硫麻,這樣,不管特征中有多少個(gè)非0值樊卓,經(jīng)過(guò)轉(zhuǎn)換之后的長(zhǎng)度都是一樣的庶香!
Base Model有一個(gè)很大的問(wèn)題,它對(duì)用戶(hù)的歷史行為是同等對(duì)待的简识,沒(méi)有做任何處理赶掖,這顯然是不合理的。一個(gè)很顯然的例子七扰,離現(xiàn)在越近的行為奢赂,越能反映你當(dāng)前的興趣。因此颈走,對(duì)用戶(hù)歷史行為基于Attention機(jī)制進(jìn)行一個(gè)加權(quán)膳灶,這就是深度興趣網(wǎng)絡(luò)(Deep Interest Network)。
Attention機(jī)制簡(jiǎn)單的理解就是立由,針對(duì)不同的廣告轧钓,用戶(hù)歷史行為與該廣告的權(quán)重是不同的。這里的權(quán)重锐膜,就是Attention機(jī)制即上圖中的Activation Unit所需要學(xué)習(xí)的毕箍。
在加入Activation Unit之后,用戶(hù)的興趣表示計(jì)算如下:
其中道盏,表示behavior id
的嵌入向量而柑,比如good_id,shop_id等。
是所有behavior ids的加權(quán)和荷逞,表示的是用戶(hù)興趣媒咳;
是候選廣告的嵌入向量;
是候選廣告影響著每個(gè)behavior id的權(quán)重种远,也就是Local Activation涩澡。
通過(guò)Activation Unit計(jì)算得出,這一塊用函數(shù)去擬合坠敷,表示為
妙同。
模型使用的評(píng)價(jià)指標(biāo)是GAUC,計(jì)算公式如下:
6. Deep Interest Evolution Network for Click-Through Rate Prediction
6.1 背景與算法
DIN模型將用戶(hù)的歷史行為來(lái)表示興趣常拓,但存在兩個(gè)缺點(diǎn):
1)用戶(hù)的興趣是不斷進(jìn)化的渐溶,而DIN抽取的用戶(hù)興趣之間是獨(dú)立無(wú)關(guān)聯(lián)的辉浦,沒(méi)有捕獲到興趣的動(dòng)態(tài)進(jìn)化性弄抬。
2)通過(guò)用戶(hù)的顯式的行為來(lái)表達(dá)用戶(hù)隱含的興趣,這一準(zhǔn)確性無(wú)法得到保證宪郊。
基于以上兩點(diǎn)掂恕,阿里提出了深度興趣演化網(wǎng)絡(luò)DIEN來(lái)CTR預(yù)估的性能拖陆。DIEN模型的主要貢獻(xiàn)點(diǎn)在于:
1)關(guān)注電商系統(tǒng)興趣演化過(guò)程,提出新的網(wǎng)絡(luò)結(jié)構(gòu)以建模興趣進(jìn)化過(guò)程懊亡,該模型能更精確地表達(dá)用戶(hù)興趣和提高CTR預(yù)估率依啰。
2)設(shè)計(jì)興趣抽取層,通過(guò)計(jì)算一個(gè)輔助loss店枣,以提升興趣表達(dá)的準(zhǔn)確性速警;
3)設(shè)計(jì)興趣進(jìn)化層,以更加準(zhǔn)確表達(dá)用戶(hù)興趣的動(dòng)態(tài)變化性鸯两。
DIEN的模型結(jié)構(gòu)如下:
與DIN相比闷旧,可以看到,DIN和DIEN的最底層都是Embedding Layer钧唐,User profile忙灼, target AD和context feature的處理方式是一致的。不同的是钝侠,DIEN將user behavior組織成了序列數(shù)據(jù)的形式该园,并把簡(jiǎn)單的使用外積完成的activation unit變成了一個(gè)attention-based GRU網(wǎng)絡(luò)。
興趣抽取層(Interest Extractor Layer)
興趣抽取層Interest Extractor Layer的主要目標(biāo)是從embedding數(shù)據(jù)中提取出interest帅韧。但一個(gè)用戶(hù)在某一時(shí)間的interest不僅與當(dāng)前的behavior有關(guān)里初,也與之前的behavior相關(guān),所以作者們使用GRU單元來(lái)提取interest忽舟。GRU單元的表達(dá)式如下:
其中表示提取出的用戶(hù)興趣斥难,為說(shuō)明興趣表達(dá)的合理性,采用輔助loss帘饶。設(shè)計(jì)了一個(gè)二分類(lèi)模型來(lái)計(jì)算興趣抽取的準(zhǔn)確性哑诊,我們將用戶(hù)下一時(shí)刻真實(shí)的行為
作為正例,負(fù)采樣得到的行為作為負(fù)例
及刻,分別與抽取出的興趣
結(jié)合輸入到設(shè)計(jì)的輔助網(wǎng)絡(luò)中镀裤,得到預(yù)測(cè)結(jié)果,并通過(guò)logloss計(jì)算一個(gè)輔助的損失:
興趣進(jìn)化層(Interest Evolution Layer)
興趣進(jìn)化層的主要目標(biāo)是刻畫(huà)用戶(hù)興趣的進(jìn)化過(guò)程。舉個(gè)簡(jiǎn)單的例子:以用戶(hù)對(duì)衣服的interest為例颗搂,隨著季節(jié)和時(shí)尚風(fēng)潮的不斷變化担猛,用戶(hù)的interest也會(huì)不斷變化。這種變化會(huì)直接影響用戶(hù)的點(diǎn)擊決策。建模用戶(hù)興趣的進(jìn)化過(guò)程有兩方面的好處:
1)追蹤用戶(hù)的interest可以使我們學(xué)習(xí)final interest的表達(dá)時(shí)包含更多的歷史信息傅联。
2)可以根據(jù)interest的變化趨勢(shì)更好地進(jìn)行CTR預(yù)測(cè)先改。
而interest在變化過(guò)程中遵循如下規(guī)律:
1)interest drift:用戶(hù)在某一段時(shí)間的interest會(huì)有一定的集中性。比如用戶(hù)可能在一段時(shí)間內(nèi)不斷買(mǎi)書(shū)蒸走,在另一段時(shí)間內(nèi)不斷買(mǎi)衣服仇奶。
2)interest individual:一種interest有自己的發(fā)展趨勢(shì),不同種類(lèi)的interest之間很少相互影響比驻,例如買(mǎi)書(shū)和買(mǎi)衣服的interest基本互不相關(guān)该溯。
為了利用這兩個(gè)時(shí)序特征,我們需要再增加一層GRU的變種别惦,并加上attention機(jī)制以找到與target AD相關(guān)的interest朗伶。
attention的計(jì)算方式如下:
而Attention和GRU結(jié)合起來(lái)的機(jī)制有很多,文中介紹了一下三種:
GRU with attentional input (AIGRU): 這種方式將attention直接作用于輸入步咪,無(wú)需修改GRU的結(jié)構(gòu):
Attention based GRU(AGRU): 這種方式需要修改GRU的結(jié)構(gòu)论皆,此時(shí)hidden state的輸出變?yōu)椋?br>
GRU with attentional update gate (AUGRU): 這種方式需要修改GRU的結(jié)構(gòu),此時(shí)hidden state的輸出變?yōu)?
參考資料
[1] http://www.reibang.com/p/627fc0d755b2
[2] http://www.reibang.com/p/647669169f98
[3] http://www.reibang.com/p/73b6f5d00f46
試上超然臺(tái)上看猾漫,半壕春水一城花点晴。煙雨暗千家∶踔埽——蘇軾《望江南·超然臺(tái)作》