机器之心专栏
作者:雪湖科技 梅碧峰
在这篇文章里你能够了解到广告引荐算法 Wide and deep 模型的相关常识和建立办法,还能了解到模型优化和点评的办法。我还为你预备了将模型布置到 FPGA 上做硬件加速的办法,期望对你有协助。阅览这篇文章你或许需求 20 分钟的时刻。
早上起床翻开音乐 APP,会有今日歌单为你引荐一些歌曲。地铁上闲来无事,刷一刷抖音等短视频,让单调的韶光变得风趣。睡前翻开购物 APP,看一看今日是不是有新品上架。不知不觉咱们现已习惯了这些 APP,不知道咱们有没有留意到为什么这些 APP 这么懂你,知道你喜爱听什么音乐,喜爱看什么类型的短视频,喜爱什么样的产品?
图 1:某美食 APP 的引荐页面
这些 APP 都会有类似「猜你喜爱」这类栏目。在运用时会惊叹「它怎样直到我喜爱这个」,当然,也会有「我怎样或许喜爱这个」的吐槽。其实这些推送都是由机器学习建立的引荐体系猜测的成果。今日就介绍一下引荐体系中的重要成员 CTR 预估模型,下面先让咱们对 CTR 预估模型有一个开始知道。
先了解两个名词
CTR(Click-Through-Rate)点击率,它是在必定时刻内点击量/曝光量*100%,意味着投进了 A 条广告有 A*CTR 条被点击了。
ECPM(earning cost per mille)每 1000 次曝光带来收入。ECPM=1000*CTR*单条广告点击价格。
看个比方:
广告 A:点击率 4%,每个曝光 1 元钱,广告 B:点击率 1%,每个曝光 5 元钱。假设你要投进 1000 条广告,你会选择广告 A,仍是广告 B?直观上来看,广告 A 的点击率高,当然选择投进广告 A。
那么:ECPM=1000*CTR*点击出价:
ECPM(A)=1000*4%*1=40
ECPM(B)=1000*1%*5=50
可是从 ECPM 方针来看的话广告 B 带来的收益会更高,这便是广告竞拍的要害核算规矩。
咱们能够看到 CTR 是为广告排序用的,关于核算 ECPM 来说,只需 CTR 是不知道的,只需精确得出 CTR 值就能够了。因而 CTR 预估也是广告竞拍体系的要害方针。广告体系的 CTR 预估在具体的数值上比引荐体系要求更高,比方引荐体系或许只需求知道 A 的 CTR 比 B 大就能够排序了。
而广告因为不是直接用 CTR 进行排序,还加上了出价,因而广告体系不只要知道 A 的 CTR 比 B 大,并且还需求知道 A 的 CTR 比 B 的 CTR 大多少。
那么再看一个比方:
假如广告 A:点击率是 5%,广告 B:点击率也是 5%,点击价格也相同,该选择广告 A 仍是广告 B?点击率相同,点击价格也相同,得出 ECPM 也相同,该怎样选择投进广告 A 仍是 B 呢?
此刻就能够依据广告特色做针对性引荐,针对不同的人群,做适宜的引荐。例如:广告 A 是包,广告 B 是游戏,可做针对性引荐。即:针对女人这一集体投进广告 A、针对男人这一集体投进方告 B,这样则会进步总广告收益率。
CTR 模型是怎样得出成果的呢?
咱们能够依据经历判别决议广告点击率的特色:广告行业、用户年纪、用户性别等。由此可分为三类特色:
user:年纪、性别、收入、爱好、作业等。
ad items:类别、价格、构思、有用等。
others:时刻、投进方位、投进频率、当时热门等。
这些决议特色在 CTR 预估模型中都叫做特征,而 CTR 预估模型中有一重要进程「特征工程」,将能影响点击率的特征找到并进行处理,比方把特征变成 0 和 1 的二值化、把接连的特征离散化、把特征滑润化、向量化。
这样 CTR 模型适当所以许多特征(x)的一个函数,CTR=f(x1,x2,x3,x4,x5...),输入历史数据练习,不断调整参数(超参数),模型依据输入的数据不断更新参数(权重),终究到迭代很屡次,参数(权重)几乎不改变。当输入新的数据,就会猜测该数据的成果,也便是点击率了。
那么有没有很猎奇怎么建立并练习出一个好的 CTR 预估模型呢?
一、模型迭代进程
引荐体系这一场景常用的两大分类:CF-based(协同过滤)、Content-based(依据内容的引荐)。
协同过滤 (collaborative ltering) 便是指依据用户的引荐,用户 A 和 B 比较类似,那么 A 喜爱的 B 也或许喜爱。依据内容引荐是指物品 item1 和 item2 比较类似,那么喜爱 item1 的用户八成也喜爱 item2。
关于接下来的模型无论是传统的机器学习仍是结合如今炽热的深度学习模型都会针对场景需求构建特征建模。
1.1、LR
所谓引荐也就离不开 Rank 这一问题,怎么讲不同的特征组经过一个表达式核算出分数的凹凸并排序是引荐的核心问题。经过线性回归的办法找到一组满意这一规矩的参数,公式如下:
再经过 sigmoid 函数将输出映射到(0,1)之间,得出二分类概率值。
LR 模型一直是 CTR 预估的 benchmark 模型,原理通俗易懂、可解释性强。可是当特征与特征之间、特征与方针之间存在非线性联络时,模型作用就会大打折扣。因而模型十分依靠人们依据经历提取、构建特征。
别的,LR 模型不能处理组合特征,例如:年纪和性别的组合,不同年纪段不同性别对方针的偏心程度会不相同,可是模型无法主动发掘这一隐含信息,依靠人工依据经历组合特征。这也直接使得它表达才能受限,基本上只能处理线性可分或近似线性可分的问题。
为了让线性模型能够学习到原始特征与拟合方针之间的非线性联络,一般需求对原始特征做一些非线性转化。常用的转化办法包含:接连特征离散化、向量化、特征之间的穿插等。稍后会介绍为什么这样处理。
1.2、MLR
它适当于聚类+LR 的办法。将 X 聚成 m 类,之后把每个类独自练习一个 LR。MLR 相较于 LR 有更好的非线性表达才能,是 LR 的一种拓宽。
咱们知道 softmax 的公下:
将 x 进行聚类,即得拓宽之后的模型公式:
当聚类数目 m=1 时,退化为 LR。m 越大,模型的拟合才能越强,m 依据具体练习数据散布来设置。
图 2 MLR 模型结构
可是 MLR 与 LR 相同,相同需求人工特征工程处理,因为方针函数对错凸函数(易堕入部分最优解),需求预练习,否则或许会不收敛,得不到好的模型。
1.3、LR+GBDT
望文生义 LR 模型和 GBDT 模型组合。GBDT 可做回归与分类,这个看自己的需求。在 CTR 预估这一使命中要运用的是回归树而非决策树。梯度进步也便是朝着梯度下降的方向上建树,经过不断更新弱分类器,得到强分类器的进程。
每一子树都是学习之前树的定论和的残差,经过最小化 log 丢失函数找到最精确的分支,直到一切叶子节点的值仅有,或许到达树的深度到达预设值。假如某叶子节点上的值不仅有,核算平均值作为猜测值输出。
LR+GBDT:
Facebook 首先提出用 GBDT 模型处理 LR 模型的组合特征问题。特征工程分为两部分,一部分特征经过 GBDT 模型练习,把每颗树的叶子节点作为新特征,参加原始特征中,再用 LR 得到终究的模型。
GBDT 模型能够学习高阶非线性特征组合,对应树的一条途径(用叶子节点来表明)。一般用 GBDT 模型练习接连值特征、值空间不大(value 品种较少)的特征,空间很大的特征在 LR 模型中练习。这样就能把高阶特征进行组合,一起又能使用线性模型处理大规模稀少特征。
图 3 LR+GBDT 模型结构图
1.4、LR+DNN(Wide&Deep)
先回想一下咱们学习的进程。从出世年代,不断学习历史常识,经过回忆到达见多识广的作用。然后经过历史常识泛化 (generalize) 到之前没见过的。可是泛化的成果不必定都精确。回忆 (memorization) 又能够批改泛化的规矩 (generalized rules),作为特别去处理。这便是经过 Memorization 和 Generalization 的学习办法。
引荐体系需求处理两个问题:
回忆才能: 比方经过历史数据知道「喜爱吃水煮鱼」的也人「喜爱吃回锅肉」,当输入为「喜爱吃水煮鱼」,推出「喜爱吃回锅肉」
泛化才能: 揣度在历史数据中从未见过的景象,「喜爱吃水煮鱼」,「喜爱吃回锅肉」,推出喜爱吃川菜,然后引荐出其他川菜
可是,模型遍及都存在两个问题:
倾向于提取低阶或许高阶的组合特征,不能一起提取这两品种型的特征。
需求专业的范畴常识来做特征工程。
线性模型结合深度神经网络为什么叫做 wide and deep 呢?
无论是线性模型、梯度下降树、因子分化机模型,都是经过不断学习历史数据特征,来习惯新的数据,猜测出新数据的体现。这阐明模型要具有一个基本特征回忆才能,也便是 wide 部分。
可是当输入一些之前没有学习过的数据,此刻模型体现却不优异,不能依据历史数据,有机组合,推出新的正确认论。此刻单单依靠回忆才能是不行的。深度学习却能够构建多层隐层经过 FC(全衔接)的办法发掘到特征与特征之间的深度躲藏的信息,来进步模型的泛化才能,也便是 deep 部分。将这两部分的输出经过逻辑回归,得出猜测类别。
图 4 Wide & Deep 模型结构图
它混合了一个线性模型(Wide part)和 Deep 模型 (Deep part)。这两部分模型需求不同的输入,而 Wide part 部分的输入,仍旧依靠人工特征工程。本质上是线性模型 (左面部分, Wide model) 和 DNN 的交融 (右边部分,Deep Model)。
关于历史数据特征确保必定的回忆才能,关于新的数据特征具有推理泛化才能。较大地进步了猜测的精确率,这也是一次斗胆的测验,在引荐体系中引进深度学习,在之后的 CTR 模型开展中大多也都是依照此规划思路进行的。
1.5、数据处理
CTR 预估数据特色:
输入中包含类别型和接连型数据。类别型数据需求 one-hot(独热编码), 接连型数据能够先离散化再 one-hot,也能够直接保存原值。
维度十分高,特征值特别多。
数据十分稀少。如:city 包含各种不同的当地。
特征依照 Field 分组。如:city、brand、category 等都归于一个 Field,或许将这些 Field 拆分为多个 Fidld。
正负样本不均衡。点击率一般都比较小,许多负样本存在。
怎么高效的提取这些组合特征?CTR 预估要点在于学习组合特征。留意,组合特征包含二阶、三阶乃至更高阶的,杂乱的特征,网络不太简单学习、表达。一般做法是人工设置相关常识,进行特征工程。可是这样做会十分消耗人力,别的人工引进常识也不能做到全面。
1.6、模型建立
以 Wide and Deep 为例,介绍网络的建立。在 tensorflow.estimator 下有构建好的 API,下面将扼要介绍怎么运用它。
Wide 中不断说到这样一种改换用来生成组合特征:
tf.feature_column.categorical_column_with_vocabulary_list(file)()。知道一切的不同取值,并且取值不多。能够经过 list 或许 file 的办法,列出需求练习的 value。
tf.feature_column.categorical_column_with_hash_bucket(),不知道一切不同取值,或许取值多。经过 hash 的办法,生成对应的 hash_size 个值,可是或许会呈现哈希抵触的问题,一般不会发生什么影响。
tf.feature_column.numeric_column(),对 number 类型的数据进行直接映射。一般会对 number 类型 feature 做归一化,规范化。
tf.feature_column.bucketized_column(),分桶离散化结构为 sparse 特征。这种做法的长处是模型可解释高,完成快速高效,特征重要度易于剖析。特征分区间之后,每个区间上方针(y)的散布或许是不同的,然后每个区间对应的新特征在模型练习完毕后都能具有独立的权重系数。
特征离散化适当于把线性函数变成了分段线性函数,然后引进了非线性结构。比方不同年纪段的用户的行为形式或许是不同的,可是并不意味着年纪越大就对拟合方针(比方,点击率)的奉献越大,因而直接把年纪作为特征值练习就不适宜。而把年纪分段(分桶处理)后,模型就能够学习到不同年纪段的用户的不同偏好形式。
tf.feature_column.indicator_column(),离散类型数据转化查找,将类别型数据进行 one-hot,稀少变量转化为稠密变量。
离散化的其他优点还包含对数据中的噪音有更好的鲁棒性(异常值也落在一个区分区间,异常值自身的巨细不会过度影响模型猜测成果);离散化还使得模型愈加安稳,特征值自身的细小改变(只需还落在本来的区分区间)不会引起模型猜测值的改变。
tf.feature_column.crossed_column(),构建穿插类别,将两个或许两个以上的 features 依据 hash 值拼接,对 hash_key(穿插类别数)取余。特征穿插是另一种常用的引进非线性性的特征工程办法。
一般 CTR 预估涉及到用户、物品、上下文等几方面的特征,有时某个单个 feature 对方针断定的影响会较小,而多品种型的 features 组合在一起就能够对方针的断定发生较大的影响。比方 user 的性别和 item 的类别穿插就能够描写例如「女人偏心女装」,「男性喜爱男装」的常识。穿插类别能够把范畴常识(先验常识)融入模型。
Deep 部分,经过 build_columns(), 得到可分别得到 wide 和 deep 部分,经过 tf.estimator.DNNLinearCombinedClassifier(),可设置躲藏层层数,节点数,优化办法(dnn 中 Adagrad,linear 中 Ftrl),dropout,BN,激活函数等。将 linear 和 dnn 衔接起来。将点击率设置为 lebel1,从经历实测作用上说,理论原因这儿就不赘述了。
将练习数据序列化为 protobuf 格局,加速 io 时刻,设置 batch_size、epoch 等参数就能够练习模型了。
二、模型优化
关于不同数据,选用不同的 features,不同的数据整理办法,模型作用也会有不同,经过测验集验证模型点评方针,关于 CTR 预估模型来说,AUC 是要害方针(稍后介绍)。一起监测查准(precision),查全率(recall),确认模型需求优化的方向,关于正负不均衡状况还能够加巨细样本的权重系数。
一般来说,AUC 方针能够到达 0.7-0.8。当 AUC 在这个规模时,假如精确率较低,阐明模型作用还有待进步,能够调整躲藏层数目(3-5)层和节点数(2**n,具体看自己的 features 输出维度),构建组合特征,构建穿插特征。学习率可设置一个略微大点的初始值,然后设置逐步衰减的学习率,加速收敛。优化手法千变万化,把握其本质,在尽或许学习到更多的特征性防止过拟合。具体优化优化办法由模型的体现来决议。
三、模型点评
AUC(Area under Curve):Roc 曲线下的面积,介于 0.5 和 1 之间。AUC 作为数值能够直观的点评分类器的好坏,值越大越好。
直观了解便是:AUC 是一个概率值,当你随机选择一个正样本以及负样本,当时的分类算法依据核算得到的 Score 值将这个正样本排在负样本前面的概率便是 AUC 值,AUC 值越大,当时分类算法越有或许将正样本排在负样本前面,然后能够更好地分类。
下表是经过调整后,不同算法完成的模型作用比照表:
图 5 模型作用比照表
不断优化后得出几个模型的不同作用,将每一次广告曝光依照猜测的 CTR 从小到大排序,能够依据猜测的 CTR 值依据 ECPM 公式,依照单位曝光量核算出预估的 ECPM 和实在的 ECMP 进行比较,就能够知道预估的 CTR 值是否可靠了。
正确预估 CTR 是为了把真正高 CTR 的广告挑出并展现出来么,过错地预估——把高的 CTR 轻视或把低的 CTR 高估都会让高的 ECPM 不会排在最前面。在实践的实践进程中,CTR 猜测正确一般 ECPM、CTR、收入这些方针一般都会涨。
四、模型布置
一般关于 AI 算法模型都是经过 GPU 服务器布置模型,可是关于引荐体系类算法逻辑核算较多,在速度上反而没有优势,布置本钱也比较高,经济性很差。所以大都经过 CPU 云服务器布置,可是速度又不行抱负。那么有没有别的一种或许?
答案是必定的,能够经过 FPGA+CPU 的办法,大型引荐体系的上线都是经过云端布置,一起用在线和离线办法更新模型。雪湖科技 FPGA 开发团队把以 Wide and Deep 为根底网络的模型移植到阿里云 FPGA 服务器 F3(FPGA:VU9P)上,用户能够经过镜像文件布置。模型精度丢失可控制在千分之一。
相较于 CPU 服务器,FPGA 服务器的吞吐量进步了 3~5 倍。当模型更新时,经过雪湖科技供给的东西可直接载入模型参数,可做到一键式更新模型参数。
五、CTR 模型开展
Wide&Deep 尽管作用很好,可是跟着算法的不断迭代依据 Wide&Deep 模型思维,有许多新的模型被开发出来,基本思维是用 FM、FFM 替代 LR 部分,经过串联或许并联的办法与 DNN 部分组合成新的模型,例如 FNN,PNN,DeepFM,DeepFFM,AFM,DeepCross 等等,雪湖科技公司也致力于将一切 CTR 预估模型都完美兼容,在确保精度的前提下,增大吞吐量。后边的文章中会针对这些模型做具体介绍,敬请重视。
作者介绍:本文作者为雪湖科技算法工程师梅碧峰,现担任人工智能算法开发。在 AI 算法范畴作业超越 5 年,喜爱戴着 Sony 降噪耳机静心研讨各类算法模型。抱负主义的实际作业者,致力于用算法解放人工,完成 1+1>2 的问题。
雪湖科技是一家专心于人工智能和 FPGA 使用开发的企业,特别擅长于在使用 FPGA 对各类 AI 算法做硬件加速,能够供给各类依据 FPGA 的规范神经网络加速器和定制化开发。
本文为机器之心专栏,转载请联络原作者取得授权。
------------------------------------------------