推荐系统遇上深度学习(十七)-探秘阿里之MLR算法浅析及实现

LCNews 2023-06-10 15:19:06
作者:石晓文 Python爱好者社区专栏作者个人公众号:小小挖掘机博客专栏:wenwen

阿里近几年公开的推荐领域算法可真不少,既有传统领域的探索如MLR算法,还有深度学习领域的探索如entire -space multi-task model,Deep Interest Network等,同时跟清华大学合作展开了强化学习领域的探索,提出了MARDPG算法。从本篇开始,我们就一起来探秘这些算法。这里,我们只是大体了解一下每一个算法的思路,对于数学部分的介绍,我们不会过多的涉及。

1、算法介绍

现阶段各CTR预估算法的不足我们这里的现阶段,不是指的今时今日,而是阿里刚刚公开此算法的时间,大概就是去年的三四月份吧。

业界常用的CTR预估算法的不足如下表所示:

那么挑战来了,如何设计算法从大规模数据中挖掘出具有推广性的非线性模式?

MLR算法

2011-2012年期间,阿里妈妈资深专家盖坤创新性地提出了MLR(mixed logistic regression)算法,引领了广告领域CTR预估算法的全新升级。MLR算法创新地提出并实现了直接在原始空间学习特征之间的非线性关系,基于数据自动发掘可推广的模式,相比于人工来说效率和精度均有了大幅提升。

MLR可以看做是对LR的一个自然推广,它采用分而治之的思路,用分片线性的模式来拟合高维空间的非线性分类面,其形式化表达如下:

其中u是聚类参数,决定了空间的划分,w是分类参数,决定空间内的预测。这里面超参数分片数m可以较好地平衡模型的拟合与推广能力。当m=1时MLR就退化为普通的LR,m越大模型的拟合能力越强,但是模型参数规模随m线性增长,相应所需的训练样本也随之增长。因此实际应用中m需要根据实际情况进行选择。例如,在阿里的场景中,m一般选择为12。下图中MLR模型用4个分片可以完美地拟合出数据中的菱形分类面。

在实际中,MLR算法常用的形式如下,使用softmax作为分片函数:

在这种情况下,MLR模型可以看作是一个FOE model:

关于损失函数的设计,阿里采用了 neg-likelihood loss function以及L1,L2正则,形式如下:

MLR算法适合于工业级的大规模稀疏数据场景问题,如广告CTR预估。背后的优势体现在两个方面:端到端的非线性学习:从模型端自动挖掘数据中蕴藏的非线性模式,省去了大量的人工特征设计,这 使得MLR算法可以端到端地完成训练,在不同场景中的迁移和应用非常轻松。稀疏性:MLR在建模时引入了L1和L2,1范数正则,可以使得最终训练出来的模型具有较高的稀疏度, 模型的学习和在线预测性能更好。当然,这也对算法的优化求解带来了巨大的挑战。

2、算法简单实现

我们这里只是简单实现一个tensorflow版本的MLR模型,通过代码来了解一下模型的思想。

所使用的数据下载地址为:http://archive.ics.uci.edu/ml/datasets/Adult,该数据是一个二分类的数据,所预测的任务是判断一个人是否能够一年挣到50K的钱,数据介绍如下:

数据处理

import pandas as pdfrom sklearn.preprocessing import StandardScalerdef 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

每一个HTML文档中,都有一个不可或缺的标签:<head>,在几乎所有的HTML文档里, 我们都可以看到类似下面这段代码:

html{color:#000;overflow-y:scroll;overflow:-moz-scrollbars}
body,button,input,select,textarea{font-size:12px;font-family:Arial,sans-serif}
h1,h2,h3,h4,h5,h6{font-size:100%}
em{font-style:normal}
small{font-size:12px}
ol,ul{list-style:none}
a{text-decoration:none}
a:hover{text-decoration:underline}
legend{color:#000}
fieldset,img{border:0}
button,input,select,textarea{font-size:100%}
table{border-collapse:collapse;border-spacing:0}
img{-ms-interpolation-mode:bicubic}
textarea{resize:vertical}
.left{float:left}
.right{float:right}
.overflow{overflow:hidden}
.hide{display:none}
.block{display:block}
.inline{display:inline}
.error{color:red;font-size:12px}
button,label{cursor:pointer}
.clearfix:after{content:'\20';display:block;height:0;clear:both}
.clearfix{zoom:1}
.clear{clear:both;height:0;line-height:0;font-size:0;visibility:hidden;overflow:hidden}
.wordwrap{word-break:break-all;word-wrap:break-word}
.s-yahei{font-family:arial,'Microsoft Yahei','微软雅黑'}
pre.wordwrap{white-space:pre-wrap}
body{text-align:center;background:#fff;width:100%}
body,form{position:relative;z-index:0}
td{text-align:left}
img{border:0}
#s_wrap{position:relative;z-index:0;min-width:1000px}
#wrapper{height:100%}
#head .s-ps-islite{_padding-bottom:370px}
#head_wrapper.s-ps-islite{padding-bottom:370px}#head_wrapper.s-ps-islite #s_lm_wrap{bottom:298px;background:0 0!important;filter:none!important}#head_wrapper.s-ps-islite .s_form{position:relative;z-index:1}#head_wrapper.s-ps-islite .fm{position:absolute;bottom:0}#head_wrapper.s-ps-islite .s-p-top{position:absolute;bottom:40px;width:100%;height:181px}#head_wrapper.s-ps-islite #s_lg_img,#head_wrapper.s-ps-islite#s_lg_img_aging,#head_wrapper.s-ps-islite #s_lg_img_new{position:static;margin:33px auto 0 auto}.s_lm_hide{display:none!important}#head_wrapper.s-down #s_lm_wrap{display:none}.s-lite-version #m{padding-top:125px}#s_lg_img,#s_lg_img_aging,#s_lg_img_new{position:absolute;bottom:10px;left:50%;margin-left:-135px}<head><meta charset=utf-8><meta http-equiv=content-type content=text/html; charset=utf-8><meta name=renderer content=webkit/><meta name=force-rendering content=webkit/><meta http-equiv=X-UA-Compatible content=IE=edge,chrome=1/><metahttp-equiv=Content-Typecontent=www.czjy.cn;charset=gb2312><meta name=viewport content=width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no></head>.s-ps-sug table{width:100%;background:#fff;cursor:default}.s-ps-sug td{color:#000;font:14px arial;height:25px;line-height:25px;padding:0 8px}.s-ps-sug td b{color:#000}.s-ps-sug .mo{background:#ebebeb;cursor:pointer}.s-ps-sug .ml{background:#fff}.s-ps-sug td.sug_storage{color:#7a77c8}.s-ps-sug td.sug_storage b{color:#7a77c8}.s-ps-sug .sug_del{font-size:12px;color:#666;text-decoration:underline;float:right;cursor:pointer;display:none}.s-ps-sug .sug_del{font-size:12px;color:#666;text-decoration:underline;float:right;cursor:pointer;display:none}.s-ps-sug .mo .sug_del{display:block}
.s-ps-sug .sug_ala{border-bottom:1px solid #e6e6e6}

head标签作为一个容器,主要包含了用于描述 HTML 文档自身信息(元数据)的标签,这些标签一般不会在页面中被显示出来。

...全文
205 回复 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

14,413

社区成员

发帖
与我相关
我的任务
社区描述
开发者离不开的主题就是数据,此社区包含大数据、数据科学、人工智能、前后端开发等内容。只要你会和数据打交道,那就请加入吧! ------落地生根,长成参天大树
社区管理员
  • 橙子园
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

社区希望广大博主积极加入进来,将自己的文章同步到本社区,增加更多的曝光量!

试试用AI创作助手写篇文章吧