导航菜单

拼音表-360展现广告召回体系的算法实践

文章作者:王华呈 360 资深算法工程师

编辑整理:杨辉之

内容来历:爱奇艺技能沙龙

出品社区:DataFun

注:欢迎转载,转载请在留言区内留言。

导读:跟着展现广告事务数据量的日益增加,360展现广告召回系统也随之也进行不断晋级改善。本次介绍首要从召回系统演进的视点详细论述工程实践中的算法运用、技能难点以及处理方案。首要分红三块:榜首个是360展现广告的大致介绍,第二个是全体架构介绍,第三个便是今日的主题召回模块的演进头绪。

▌1. 展现广告介绍

1.1 展现广告事务介绍


展现广告首要是在RTB程序化购买框架下运转的,首要有媒体方,比方新浪、搜狐等市面上的各大媒体,咱们都现已接入。媒体在一次曝光发生之前会把这次曝光发送给Ad Exchange(ADX)模块进行拍卖,360的ADX渠道叫360 Max。ADX渠道将该曝光发送给多个竞价渠道DSP,DSP来决议是否对该次曝光进行竞价,360的DSP渠道叫360点睛DSP。广告主们会针对自己的需求设置广告投进战略,DSP渠道会从广告主设置的广告投进库中依据该次曝光的特征匹配出适宜的构思(广告)候选集回来给ADX。一般要求DSP的呼应时刻为100ms左右,除掉网络传输耗时,留给DSP模型的时刻只要几十毫秒,其中心各个模块的时刻就更少。ADX从接收到的一切候选会集挑选出价最高的广告进行曝光。

1.2 常见展现广告


现在在360场景下首要有这几种广告类型,榜首种类型是广告侧边栏,包含详细投进广告的详情页。第二种类型是全体的开屏广告,首要是品牌广告。第三种类型是在信息流场景下,将广告嵌入新闻上下文中且与文章内容办法保持一致。

▌2. 展现广告全体架构介绍


全体架构流程:

流量从ADX发送给DSP端,DSP拿到流量之后交给检索召回模块,咱们叫Ad Search模块,Ad Search模块分为两个部分,一个是Ad Search Root模块,对流量进行辨认,判别其为哪种类型的流量,比方keyword流量、信息流流量、banner流量,然后交给不同等级的Ad Search Leaf模块对广告进行召回,选出相匹配的广告开端候选集,该模块便是咱们今日的主题。然后将选出的广告开端候选集交给Ad Selector模块进行精排,即对广拼音表-360展现广告召回体系的算法实践告的CTR或许CVR预估,进行打分,选出top K个广告回来给DSP Server。一起DSP Server会将点击、曝光、后续的日志写入kafka,并进行日志落地,日志落地后会进入后续的ETL离线流程,用于后续粗排、点击率等模型生成练习样本运用,另一部实时数据日志数据流会通过反作弊模块后过一遍ctr预估的online learning和实时曝光反应的online feedback。

▌3. 召回模块的演进头绪

3.1 检索召回模块


Ad Search Leaf召回模块展开来首要分三个阶段,召回、过滤和粗排。召回模块接收到DSP给流量恳求中包含了用户信息和上下文信息。广告主设置的广告投进存在Ad Meta db中,然后建成相关的广告索引(Ad index),投进更新后才会实时更新这个索引。RTDB首要存储用户标签数据,标签数据一部分是通过恳求中带的用户信息和上下文信息进行用户标签的实时更新,另一部分是通过线下离线全量更新。召回模块便是结合这两头选出开端的广告候选集,然后进入过滤模块(正排模块),过滤办法首要包含依据规矩、是非名单、广告主预算pacing过滤。终究进入粗排模块,对初选的广告候选集按点评函数模型进行打分,但没有精排模块那么杂乱,相对比较简单,比方最开端依据中心特征的LR模型,后续晋级过依据特征穿插的FFM模型。

3.2 召回通路


接下来讲一下在咱们检索召回中一些通路,咱们是进行多路召回的,其中有三种类型,榜首种是上下文、第二种是用户行为、第三种是当时正在做的深度召回。

上下文召回有这几种类型,榜首种是依据图片的,在内容页场景下,一个明星穿了哪件衣服,依据这件衣服投进哪件产品,做法是将图片向量化,核算广告产品与图片向量的类似度进行召回。第二种是依据标题的,首要是依据文本NLP相关模型进行召回。第三种是依据lbs的,广告主本身设定某个标签区域进行投进,在该区域内进行标签匹配召回,归于布尔召回。

用户行为召回有这几种类型,榜首种是依据爱好的,依据用户前史行为树立用户画像,打上爱好标签,进行布尔召回。第二种是依据Query的,运用用户的query前史行为,进行NLP相关模型进行召回,与依据标题的办法类似。第三种是依据拜访行为,运用广告主回传的用户产品行为,选用Item CF、ALS、Neural MF等模型进行召回。

终究一种召回通路是深度召回,首要是把user profile、媒体特性、上下文特性等特征结合起来进入深度模型中进行召回,接下来会详细介绍下这个是怎样做的。

3.3 依据文本的召回


上面讲的标题和query召回首要是文本召回,包含几种,榜首种是精准匹配,有彻底匹配和依据ngram的TF-IDF提取中心词匹配,归于比较简单的办法。第二种是含糊匹配,有word2vec和DSSM语义化模型,将文本语义向量化,然后按向量化检索召回。第三种是广泛匹配,是把语义化向量聚类成多个标签,然后按标签召回。

3.4 召回模块演进


咱们的召回模块演进首要是分红三个阶段,榜首种是布尔召回,方才介绍的信息标签类型和lbs都是依据这种。第二种是向量检索召回,运用深度学习模型将广告、用户等信息都映射为向量,然后进行向量检索召回。第三种是咱们现在在做的依据深度树的匹配。三个阶段是由浅入深的进程,接下来咱们顺次介绍这三个阶段。

3.5 布尔召回


布尔召回在前期检索中都会用到的,咱们的办法是依据树+维度bitMap分组+哈希表。广告主设置定向组合,比方拜访某些网站的人群、有特定爱好的人群等其他各种定向组合。而恳求中会带有用户拼音表-360展现广告召回体系的算法实践标签,问题就变成了怎样找到与用户标签匹配的定向组合广告?布尔召回实质便是依据倒排索引的布尔运算,所以关键在于倒排索引怎样构建?构建的办法有两个层级,榜首层索引是将广告主的投进装备进行分化分组,每一个组为一个conjunction,一个广告投进会对应多个conjunction,这样就能够树立conjunction到广告投进的倒排索引。第二层索引在于依据用户标签找到对应的conjunction,咱们的标签是一个int64类型的整数,高八位的某些bit位会做一些标识,来差异这个标签归于哪种类型,拿到用户的标签做位运算,找到bitMap分组的conjunction list。然后到依据每个conjunction到榜首层取出对应的广告主调集,终究核算每个调集的交并,得到终究召回的广告候选集。

在实践运用中布尔召回有一些问题,比方倒排表有部分conjunction对应的广告调集很长(>1w),检索功能很差,咱们的实践处理方案是在布尔表达式中做一个转化,比方将先并后交的布尔运算改拼音表-360展现广告召回体系的算法实践为先交后并的布尔运算,能极大优化检索的功能。

3.6 向量化召回

咱们在实践向量化召回中有两种类型,榜首种是类似于前期YouTube DNN,把用户变成一个向量,把item也变成一个向量,终究做一个向量类似度检索。第二种是用户相关前史内容变成一个向量,再进行向量类似度检索。两种类型都是依据两个向量的类似度进行检索,得到item候选集。


实践中咱们挑选的是微软提出的依据深度语义检索模型(DSSM),该模型的输入是一组相关的Query和Document,以及两个与Query不相关的Documents,然后别离dense为embedding向量,再通过NN网络,再做softmax打分,得到三个分数,练习方针便是是相关的Document分数尽可能高,不相关的Documents尽可能低。中心的NN层能够有多个挑选,能够为多层FC,也能够类似textcnn那样为CNN+FC,或许为RNN。


在通过模型向量化之后就涉及到向量索引该怎样挑选?下面介绍下常见的几种。榜首种为LSH(部分灵敏哈希)索引,办法便是依据多个哈希函数进行分桶,比较耗内存。第二种为faiss提出的IVF Flat,办法是构建由聚类中心向量构成的倒排表,针对输入向量,先找到聚类中心向量,再依据KNN办法进行检索,这种类型是保存精度的,作用跟直接暴力检索十分挨近,但功能有很大的进步。第三种为IVF PQ,也是依据倒排,与IVF Flat差异在于在向量上做了有损压缩或PC降维,优点在于省内存,可是带来了实践检索精度的丢掉。这三种能够依据实践事务场景进行挑选。


3.7 深度树召回


上面讲的布尔召回和向量化召回都有必定的缺陷,比方布尔召回的有些conjunction的候选列表十分长,简单遇到功能瓶颈。向量检索会局限于模型的向量表达是否精确,并且向量空间有限。这儿参阅了阿里妈妈提出的深度树匹配(TDM)模型,深度树匹配能处理全量检索的功能问题和模型精度问题。怎样构建一个深度检索树呢?在广告场景下选取的是依据ecpm(千次曝光预期收益)最大堆办法,最大堆树下当时层最优Top K孩子节点的父亲必定归于上层父节点的最优Top K,这样就能够从根节点逐层递归向下挑选Top K直至叶子层,一起极大进步检索速度。为了简洁起见,咱们构建树的办法是二叉树,则检索Top K的时刻杂乱度是2KlogN,N为item个数,且跟着N的增加,比较暴力全量检索的功能进步更为显着。


深度树模型的大致结构如上图所示,分为两部分,左面是流量端,包含用户profile特征(如标签、cookie前史行为、频次等)和上下文特征(如媒体广告位特点、是非名单、时刻特性等)。首要把这两种特征dense化变成embedding,再做特征穿插组合,在咱们场景下特征拼音表-360展现广告召回体系的算法实践穿插选用的是IPNN办法,然后再通过FC+BN的多层NN网络,终究转化为Search端的embedding,线上处理时,左面这个流程每次恳求都会核算。右边是候选集端,是一颗检索树,叶节点就包含了广告投进信息,包含尺度、类目、职业等广告主设置的定向信息,叶节点和父节点实质都是同一维度的embedding,都会进入FC+BN层,构成与Search端embedding相同维度的Tree Leaf和Parent embedding。左右两头的embedding做穿插+concat操作进入FC+BN层,终究得到一个分数,与样本label按穿插熵丢失进行练习。全体的模型架构便是这样。


那咱们要怎样预备这颗树模型的样本呢?有两部分,别离为leaf样本和parent样本,关于leaf节点,选取精排模型输出的虚拟曝光Top3作为正例。负例包含两部分,榜首部分是在正例叶子节点同层,随机选取其他叶子节点作为负例,第二部分是挑选粗排阶段的一些负分item标识为负例。关于父节点,依据ecpm最大堆原理,将正例向上回溯的一切父节点都标记为正例,同层随机标记为负例。全体的样本规划是用了7天的采样曝光样本,大概在5000千万左右。


接下来咱们该怎样生成这颗树呢?咱们这儿有两种办法,榜首种办法便是随机生成,将item随机放到叶结点上,当然也能够依据标签系统手动把附近的item放在同一个父节点下,依据随机深度树练习一轮,将叶子结点的embedding导出来,然后聚类,这样就能够依据聚类的成果从头生成一颗树,然后再去练习,一向迭代到方针改变不大。第二种办法便是自下而上组成树,先当这颗树不存在,只练习每个叶子结点的embedding,然后依据叶子结点的embedding向上聚类回溯成一颗树(kmeans或许依据曝光频次来聚类),接着就能够与榜首种办法相同一向迭代直到方针改变不大。


咱们终究挑选办法是第二种办法,榜首步便是先练习叶子,把叶子embedding导出来,然后聚类生成一颗树,依据这颗树结构从头练习叶子结点和父节点的embedding,得到终究上线的模型。


接着咱们来讲一下这个模型的loss,咱们的方针是去拟合曝光,所以loss由两部分组成,榜首部分是穿插熵丢失,去拟合对应的样本是否曝光。第二部分是triplet loss,意义是叶子节点中正样本之间间隔尽可能附近,而与负样本之间的间隔尽可能远,来束缚叶子间隔。榜首部分loss考虑的是拟合曝光,并没有考虑点击,所以能够把实践用户点击的样本进行加权,把即曝光又点击的样本侧重考虑,表现重要性。


线上怎样检索呢?由于咱们是依据最大堆的,所以选用的依据beam search的办法,便是逐层往下的检索,每一层都保存K个节点并往下扩展。


实践线上投进是有改变的,广告主会新增一些投进,关于这种新增投进怎样添加到这颗树中呢?比方新增一个item,咱们会依据练习好的模型把item对应特征转化为embedding,然后把之前练习的叶子节点的embedding set拿出来,然后做一个类似度检索,得到item embedding最挨近的叶子节点37,将该新item参加这个叶子节点37的list中去(线上练习时,叶子节点实践是一个cluster,一个列表,并不是一个单一的节点)。

▌4. 功能优化


终究提一下咱们在实践中做的一些功能优化作业,首要介绍两方面:

榜首方面是在检索阶段,针对树的最上几层,会依据Top K的巨细,进行跳层(父节点个数

第二方面是练习阶段,由于咱们是依据tensorflow构建模型的,所以有常见的几种优化办法,比方防止运用feed dict,运用dataset这种高阶能够并行化的api。一起能够运用Timeline Profile等东西剖析功能瓶颈,进行针对性的优化。针对python GIL的缺陷,将高频调用的python function运用c++完成进行调用,并在调用前将GIL release掉,防止锁带来的功能影响。

▌参阅资料:

1. Learning Tree-based Deep Model for Recommender Systems

https://arxiv.org/abs/1801.02294

2. 微软DSSM项目地址:

https://www.microsoft.c更om/en-us/research/project/dssm/

二维码