写点什么

深度学习新技术在搜狗搜索广告中的深化应用

作者:DataFun社区

  • 2019-03-06
  • 本文字数:13613 字

    阅读完需:约 45 分钟

深度学习新技术在搜狗搜索广告中的深化应用

大家好,我是来自搜狗搜索广告应用策略研究组的舒鹏,目前主要负责搜索广告算法研究工作,今天的题目是深度学习新技术在搜狗搜索广告中的深化应用。深度学习技术已经出现很多年,它在各个场景中都有应用,本次演讲的重点是在特定的一些任务方向,在我们觉得比较合适的一些任务上的典型使用方法,而不是关于深度学习本身的基础算法。



本次演讲的内容主要分为几个部分:第一个部分是搜索广告的背景知识;然后我们会挑两个比较典型的场景来讲述一下它的大概应用,一个是自动化创意,这个大家可能会比较陌生,我待会再讲解什么叫创意以及什么叫自动化创意;另一个典型场景是点击率预估,前两位老师都讲了很多关于这方面的内容,我主要介绍一下我们搜狗在搜索广告点击率预估模型上的整个演化过程,给大家提供一个参考,最后是我的一些思考。

1. 搜索广告背景知识

这个是我们搜狗搜索广告的一个典型流程。首先我们在查询之前一般都会有一个信息需求,你想了解某些东西或者想查证一些知识,然后你才会用搜索引擎来进行一个搜索的行为,它一般来说是以查询词的形式来体现你的搜索意图,现在也会有一些语音搜索,或者说图片搜索产品,但这种基于文本的查询仍然是一个主要形态。我们的客户会觉得,他既然提交了一个查询请求,那么可能就会有商业意图。所谓商业意图,就是指这个行为本身是有商业价值的,它不单单是说用户的购买倾向,也可能会是其它的一些形式,比如说下载倾向,或者说咨询倾向都可以称为商业意图。当有了这个商业意图之后,我们会进行后续的一系列处理。跟信息流广告或其他类型广告不同,搜索广告客户通过关键词来表达投放诉求,比如一个卖蛋糕和鲜花的客户,就会买些关键词,蛋糕购买或者鲜花速递,通过这些词来表达诉求,这样就会形成广告库,所有客户所有广告的结构化集合。有了广告库,第一步是要从中选出哪些客户的投放诉求跟当前的查询需求匹配,一般称为广告召回。然后我们会做一个点击率预估,用来评价具体的投放诉求对当前查询的吸引程度,基于它来做后续的排序和计费,并对最终结果进行渲染展示。用户可能会感兴趣并点击浏览,我们会把整个过程用日志完整记录下来,用于后续优化。在这个过程中,我们会贯穿一个思想,自动化,不是指单纯利用机器完成整个拍卖过程,而是如何把客户表达投放诉求、用户表达查询意图,以及两者的匹配做成一个完整的自动化流程,尽量减少人工干预。大家可以想一下广告的本质是什么,就是收取客户费用帮他达成一定目的。搜索广告客户是通过关键词的一个个投放来表达不同诉求,本身是一种很复杂的业务形态,有很多问题需要研究,为此专门成立了 SEM 这个学科。对于一些中小广告主或者说资源不是很充足的客户来说,他没有精力去维护优化这么庞大的投放系统,更需要广告平台来帮他做一些加快投放效率的工作,我们称之为自动化,后续会进行详细的介绍。



这是搜索广告技术和机制理论上涉及到一些东西:首先是自然语言理解,这个大家应该都能想到,用户提交一个查询请求,到底想表现什么意图。语言本身是一个高度精炼的表述,有很多歧义:比如搜“苹果”,可能是指水果,也可能是手机;还有一个典型 case,mac,可能是笔记本,对吧,也可能是一款口红。我们需要知道查询本身的意图是什么,解决这个问题的基石就是自然语言理解。后续很多种任务,都以它做为基础。然后会对用户查询做一个深入的分析,对客户需求也会做很多分析,就会形成我们的检索和推荐系统,来解决很多实际问题:比如刚才提到的广告召回、点击率预估、相关性、badcase 过滤、排序机制以及自动化创意等。当然,在技术层面之外,搜索广告的市场份额主要来自商业模式的创新,也就是竞价博弈机制:一个东西大家都想要,那到底给谁?我们通过竞价博弈机制来解决:客户通过价格来表达他对这个用户查询的渴望程度,然后系统会据此并结合广告质量来综合排序,达到平台、用户、客户三方利益的平衡点。用户得到比较优质且免费的搜索服务,客户得到推广效果,平台获得收入进而优化系统以提供更好的服务。总之,搜索广告会涉及客户竞价行为的研究、用户体验的分析保证、点击转化效果的评价、博弈机制的设计,这些会对检索和推荐系统提供整体指导。

2. 典型任务:自动化创意

如果大家真实投放过广告,可能会知道搜索广告和信息流广告的投放模式完全不同,着眼点不同,要求也不一样。总体来讲,搜索广告体系非常复杂,我们今天时间有限,只是讲其中一两个比较典型的任务,例如自动化创意,我们先拿它来给大家来做一个深入的阐述。这个自动化创意就是刚才提到的,如何帮助客户提高他的投放效率,同时帮助我们提高广告质量,达到一个双方共赢的最大化收益。



这是自动化创意的一个基本流程。我先解释一下什么叫创意:创意这个名词很早就出现了,不知道大家看没看过一部美剧,广告狂人,讲的是 20 世纪 60 年代美国广告行业的发展过程。这部美剧主要涉及电视广告,把一个点子或者说一种想法称为一个创意,就是指如何把投放目的融合到行为当中并展现出来。拿搜索广告来讲,创意就是广告本身的文案,标题怎么写,描述怎么写,配什么图片,配什么子链,目的都是为了带来更多的流量,让用户对商家经营的业务提前有更多的了解,形成更高效的转化。右图是广告示例,但这个图不是客户原始广告的模样。一个普通广告,一般只有一行标题、一行描述和显示链接等信息,蛋糕图片和下方三行子链都是没有的,这是系统自动做的配置:哪些素材跟当前广告比较匹配,系统会自动配上去。具体怎么做呢?大体上分为四步:首先,要想做这个工作,必须得有素材来源,所谓来源,就是指候选创意集合,有一些比较好的图片、或比较好的文本片段、子链,才能做后续的优化工作。那这个候选创意集合怎么来的呢?大概会有两种方式:一个是创意挖掘,现在有的东西把它找过来,会有些来源,包括从客户着陆页网站来挖掘,以及从客户行为或用户行为层面来获取;还有一个,创意生成,就是创造一些之前没有的素材,让系统自动写出一些比较符合当前意图的描述或者片段,这种方式大家应该也听过,比如让机器来自动写一些诗歌,谱一些曲子,或者画一些漫画,有一些技术已经在应用,我们也会用到这个系统里去。有了来源之后,我们会做第二步,匹配,所谓匹配就是指创意候选集非常多的情况下,哪些跟当前广告是比较相关的。会涉及两个问题:一个是短文本相关性,就是这两者是不是一回事,短文本相关性非常重要,语言本身非常复杂,而且有歧义的存在,所以通常来讲,机器很难判断出来两者到底是不是相关,需要有些特定的算法来解决这个问题;其次是图文匹配,就是图片和文字到底是否匹配。匹配之后呢?我们会有样式优选,这个样式优选怎么做?假设当前有很多创意,最终选哪种样式的创意?这个任务跟创意匹配不太一样,创新匹配是说样式确定的情况下,如何选择创意片段。样式优选是指,前一步确定完之后,多种样式可以出,最终选择哪种样式。这些工作做完之后会做一个创新展示,就是素材的组装渲染,达到右图这样一个效果。这个图片跟我们当前线上的不太一致,国家法规已经不允许使用这种灰色字样的标记,此处仅为示例,用来说明总体的流程。


下面会对各个步骤分别阐述。



第一个是创意来源,刚才讲创意来源有两大类:创意挖掘,创意生成。对于创意挖掘,列了三项,都有丰富的内涵:一个是用户行为分析,搜索引擎每天都会收到大量查询,因为国内常用的搜索引擎并不多,也就三四家的样子,每天的查询量一般都是在亿这个数量级之上,这么多用户的行为是有高度价值的,我们如何从这里面做一些挖掘,这就是用户行为分析;其次,落地页分析,就是客户的投放网站分析,比如客户买了一个词叫“鲜花快递”,那对应的落地页中通常来讲是有相关内容的,不会是卖车的,不然对客户来讲也达不到预期的效果,所以落地页中肯定会有一些内容跟鲜花速递这个词是匹配的,可以以此做一个来源;最后是购买行为分析,同一个业务很多时候不止一个商家来做,会有多个厂家同时做一块业务,他们的关键词购买既有竞争关系也有关联关系,如何利用这种行为数据来做一个拆解,获得我们想要的东西,这就是购买行为分析。然后再讲创意生成,创意生成最近这些年才比较流行,其实很多年前就有类似的事情,例如 MSRA 做了一个对联生成系统,你出上联我出下联,这个实际上也是一种基于生成式思想的产品。只是原来用的不是深度学习,深度学习流行了之后,就会有很多种方式来做这件事情:典型的比如 GAN,这也是前几年刚出现的;还有一些基于 seq2seq 的翻译模型;CVAE 也是生成式模式的一种变种。这几种方法的目标就是基于给定物料形成一种模式,而后根据输入来动态的定制化结果。我们最近提出了一个基于 CVAE 的升级版框架,可用于关键词拓展,大概可分为左半部分和右半部分:左边可以看作传统 seq2seq 的一种改进,一个编码器加注意力机制加持的 decoder;右边这块呢,我们希望这个系统具备一些在限定领域生成相关内容的功能,这里面有几个关键点,一个是限定领域,一个是相关。同时我们又不希望输出和输入完全一样,还是以“鲜花速递”为例,如果输出的结果还是“鲜花速递”,对我们是没有价值的,这两个是一样的、重叠的,我们希望能得到一些类似“蛋糕”这样的结果,一般来说送鲜花可能过生日,用户可能有购买蛋糕的需求,所以我们需要有些变化,但又不能变化太多,这就涉及到一些度的控制,这个系统里的一些模块就是做这个事情,比如 Domain Classifiier 就是表达这个诉求的一个分类器,“生成的结果,是不是属于同样的一个域”,最后还会用强化学习的思想,也就是 Reward Estimator 来做这个工作,来评价生成结果的离散程度,生成结果的集中度越低,我认为效果可能越好,因为后边还会有相似性来保证结果里面到底有哪些合格哪些不好。这个项目的相关工作,我们今年写了篇论文,刚投到 WWW2019 会议上,从效果上来看,相比传统的 seq2seq 效果要更好一些。



创意挖掘是指如何从海量信息中挑出有价值的东西,这里选一个场景来介绍, “Session 切分”,用户行为分析的一个子任务。做过搜索的同学对这个估计比较熟悉,所谓 Session 切分是指,一个用户在一定时间之内,在搜索框中连续输入并提交了多次查询,这些查询本身可能会有一定关联性,如何识别这种关联性。比如说用户先搜了“王者荣耀”,接下来搜了“李白”,这个李白肯定不是写诗那个李白对吧?更可能指的是游戏中的一个英雄,两个查询词就会形成一定的关联性。这个信息是用户输入的,价值非常高,可以让我们的系统不断更新,由于这是用户自发的行为,会把很多新的东西或者说用户以为的东西提交到系统中,相当于有了一个源源不断的素材库。那如何做这个工作,把这个 Session 切分开,怎么判断这个用户前后的搜索是相关的呢?还拿刚才那个例子,有多种可能:用户是个小学生在刚玩游戏的时候先搜个游戏的介绍,突然间被妈妈叫去写作业了,他需要找一下诗人的相关介绍;还是说用户是一个刚下班的码农,先搜个游戏,然后又想查看其中一个角色的介绍。这些都需要做一个切分,也就是 Session 切分,来评价前后两次输入是否关联。传统的方法会基于一些特征构建模型来进行分类,我们提出了一种基于 LSTM 和 Attention 机制的 Session 切分方式,会考虑这个用户的连续输入,用 LSTM 网络生成一个编码,再利用 Attention 做隐向量的权重分派,对应最终的一个 label,就是说这两个输入是不是一回事要不要做区分,模型训练完之后就可以帮我们来做 Session 切分的工作。当时取的效果还不错,比传统方法有几个点的提升,相关内容已经发表在 2018 年的 SIGIR 会议上,是一篇 poster,大家如果感兴趣可以去看一下。虽然只是用来做用户行为分析,但有了高质量的片段,以及哪些相关,或者说哪些相似,我们就可以用来做广告召回,做相关性,都会有一些应用。



接下来讲文本相关性,前面主要是做了创意生成,必须得有机制来保证这个内容是符合我们预期的,这里面都会牵涉到一点,文本相关性计算。文本相关性计算属于信息检索领域最基本的一个课题,大家可以看一看,涉及的研究文献还是非常多的。它的发展也经历了好多阶段:最早的一个阶段,字符串匹配,在经典的数据挖掘类书籍中多半都有介绍,比如 TF-IDF、BM25 以及后续的一些升级等典型检索算法。例如基于广告库的字符串赋权算法,根据样本库可以得到每个分词片段的权重,来了两个 query 之后,可以对两者做一个匹配,如果匹配的权重高,相关度就高,权重低,相关度就低,可以得到得分,据此进行排序,定义阈值之后就会得到一个相关性算法。但这个算法是有缺陷的,只是基于字面的匹配,例如“英雄联盟”和“LOL”,肯定算不出来,认为相关性是零,但其实是同一个游戏。第二阶段就是语义匹配,会有些 topic model 的主题模型,比如 LDA,或者统计翻译、同义模板归一化,还有实体识别来做这个工作,就能解决前面的一些问题,但这样也不能做到百分之百全覆盖。然后就是意图匹配,基于用户行为数据,比如每天的检索总共好几亿次或者上 10 亿次,每个查询都会有后续的一系列点击行为,两个不同的 query,如果点击的网页列表非常相似,这两个 query 是不是一回事,可以采用二部图挖掘或者 SVD++来挖掘这种关联关系,这是意图匹配。第四阶段就是深度学习,自从深度学习出来之后,这个方向就非常火,而且看起来也很酷,大家干的事情都差不多,从网上下一个模型然后跑一下,跑通之后换成这个数据灌一下,然后看结果对不对,如果对就上线,不对就换个模型再试一次,或者把参数调一调。虽然描述一下是这样子,但实际上大家还是需要有一些理解。也不是说深度学习出来之后传统方法就没有意义,它照样是有作用的,典型的深度学习算法效率一般比较低,如果任务本身是一个 QPS 非常高,计算复杂度非常高的场景,可能会需要有一些比较简单的方法来做一些初级的筛选,包括刚才提到的字符串匹配,这个功能现在还是很有用,只不过需要对它做一些新技术的加持,而不是直接把它抛弃。如果单纯的靠深度学习可能好多任务还是解决不了,或者解决的不够好。具体到这里面涉及到的几个技术, seq2seq 及神经机器翻译,基于一个素材库,在已经有语料的情况下,如何构建一个模型框架,基于数据训练出一些表达网络,而后进行 query 的描述,或者其他内容的描述,然后进行一个匹配计算。



这是我们 16 年发表的一篇论文,提出了一种不需要分词的问答系统匹配算法。早些时候,做中文文本相似性计算,或者检索相关的任务,都需要先做一个分词,需要先将 query 切分成若干 term 片段,然后再对 term 进行后续操作。这样会有一些问题,比如典型的 word2vec 算法,对于中文语料库来讲,分完词之后, term 粒度至少在百万量级才够用,而每个 termID 可能会对应一个 50 维或 100 维的向量,这样会导致单纯向量文件就有两三个 G 这么大,内存开销会比较大,那么有没有好一些的办法?其实这个思想已经大规模的在用了,不知道大家有没有试过。深度学习特别好的一点,就在于不需要特别繁琐的过程,端到端,特别简单粗暴。具体到这个任务,中文也好英文也好,直接把 query 输入进去,对每个字母、每个数字、每一个标点符号,或者每个汉字,都直接基于向量查表的方式来进行学习,只要模型或者网络设计的足够好,那么对单个字符也能学习到不错的一种结果。有了这个结果之后呢,就可以进行后续的一些计算,常用汉字,高中毕业或初中毕业需掌握的水平,可能也就 2000 个字,加上一些比较难的字,生僻的字,也不会超过 1 万个,这样一个大概 1 万行 50 列或一百列的矩阵就能把这个信息保存下来,后续再做一些文本相关性计算时,可以结合字符的权重来做 query 的编码,进行后续的任务,这样内存消耗就可以降下来。当时的结论,相比原来需要分词的算法,效果上来讲应该是基本持平,但是可以降低内存,还能降低算法流程的复杂度。原来可能需要分词,然后做后面的操作,假如分词本身做了一个升级,后面很多东西都需要变,但如果采用这种方式的话,就可以把这部分绕过去,流程得到简化,故障就会减少,这是它的一个意义所在。这个成果当时发表在 CIKM 上,是一篇短文。



这页 ppt 主要讲图文匹配,非常典型的算法,大家应该都用过,我也就不多讲了。


然后就是样式优选,流程比较复杂,大家如果不做广告,可能不太理解是做什么的,我稍微解释一下。我们任何一种算法要上线,必须得跟实际的业务场景进行结合,对于搜索广告来讲,它的场景非常典型,位置很有限,按主管部门规定,一个页面当中广告的占比不能超过 30%。同时有很多种样式,我们的产品会做很多的设计,每个样式有不同的特点,比如说有些样式独占,同一个页面最多出一次,有些样式只能出在首条。在这种业务限制下,我们如何设计一种机制,选出最佳的广告组合。这个流程是一个基于贪心的设计,本质上来讲,先选首条,再选后续的结果。理论上应该把所有组合都把它给列出来,挨个计算,选择最优的,但这种方式在线上不可用,计算资源消耗非常高。假设你的 QPS 或一天流量在几个亿这个规模,每次一个 query 过来,可能会召回上百条广告,每天就有百亿以上的计算,所以说不允许采用太过复杂的方式。大家如何能够设计出一种非常清晰的描述,在做什么事情之前要想清楚到底要干什么,只有这样,后面才能做好,而不是说单纯的为了上线,或者单纯的上一个算法。



上面讲的任务场景很多,跟相关性、召回触发、文本生成都有关系,那么关键点在哪?我理解关键点就是数据,前两位老师应该也都强调过,我根据他们说的稍微作一点补充。我理解数据一般有两个维度,一个是规模,一个是质量,这两个维度通常不可兼得,规模大了之后质量一般会下降,或者质量高规模一般不会太大。比如说我们现在想要一些文本相关的数据,可能需要找众包或者自己招劳务做标注,不知道大家是不是了解这个价格,通常来讲如果任务稍微复杂一点,一条标注就需要两毛钱甚至一块钱,还是很贵的。比如 100 万条样本,其实是一个比较小的数据集,却需要很多资金才能完成,尤其有些时候很难证明数据规模上去之后算法一定会好,那怎么去申请这个预算。所以大家首先要搞清楚到底有哪些数据,要积极寻找当前产品的关联数据,你做广告,那么用户行为能不能用到,虽然是做商业的,但用户产品的行为我能不能用到,客户购买行为能不能用到,要找一些跟现有数据源不太一样的东西,这个其实就是盘点可用的数据资产;然后需要积累更长时间的数据,有效利用,这是数据规模。还有数据质量,数据质量是指两方面:一方面是如何在低质量数据下做一些比较高效的算法,其实就是需要探索一些基于大规模无标签数据的有效算法,数据规模上去之后,即使有些噪音,但规模大也能缓解这些问题。在文本相关性算法中有个 DSSM 模型,应用非常广泛,也有很多改进,利用 query 和 title 之间的偏序关系进行训练,模型设计并不复杂,但之所以有好的效果,就因为可以利用大量无标签偏序样本。例如一天网页查询有十个亿,平均页面点击率百分之百,就有十亿条点击。而点击了的 title 和没有点击的 title,就能构造成一对偏序样本,可简单认为点击的要比不点击的好,一天就有十亿条样本,再加入一些随机负样本,就会更多,积累几天,可能就在百亿规模以上。即使我的算法框架不是很复杂,也可以做到比较好的效果。我们一定要想一下,看当前有哪些比较好的还没有利用的数据想办法利用上。另外,单纯靠这一点,很多问题解决不来,例如一些典型的场景,像品牌词识别,需要知道客户填的物料中哪些是品牌词,然后识别出来,才能去除,或者做一些变换,给其他客户来用,这种问题一般高度依赖人的经验,或者说需要补充一些知识库来解决疑难杂症。如果发现模型训练之后效果很不好,特别在一些典型 case 上效果不好,那就可以考虑加一些针对性的样本,可能就会得到改善,这个是数据质量。


3. 典型任务:CTR 评估

前面讲的是自动化创意方向,对于搜索广告来讲,自动化创意这个方向我理解非常重要,其他厂商应该也在做,效果都很好,可以让客户从繁重的工作中解脱出来,那么他就有精力去干别的事情,没准加点预算就可以把收入做上去。接下来再讲一个典型任务,点击率预估。



点击率预估前两个老师都讲了,有些地方我会讲得快一些。这是一个大概的模式,大家应该也都了解,我们首先要有 data,一般来自于查询日志和点击日志;然后构建一些特征,可能会有好多类,比如查询的特征、广告的特征或者匹配的特征;基于这个来进行模型的训练,包括线性和非线性的;然后进行线上部署,线上的流程其实跟线下基本一致,也包括特征抽取、点击率预估和排序,大概这几个模块。



搜狗搜索广告经过了很长时间的演化,最早的点击率预估模型,主要基于 liblinear,大概是 08 年一个台湾老师提出的,有些同学可能比较清楚,这个工具包当时还是非常好用的,后来才有了 LR 模型的大规模应用。包括特征工程,以及 FTRL、FM 等 LR 模型的变种。到现在为止,LR 还是非常有效的,因为它非常简单,就是一个线性模型,原理和公式,一般人看两遍基本上都能看懂,不像深度学习,大家看完不知道它说的是什么。接着大家继续探索,就有了非线性模型,包括 GBDT、 DNN 以及一些级联融合模型, LR+GBDT 或 LR+DNN。最后是深度融合模型,包括 Wide&Deep 和 NFM 这些。上面提到的我们都尝试过,或者说在线上上线过,逐步迭代。



这页我会挑重要的介绍一下。一个是级联融合模型,刚才罗老师也讲过,怎么做模型融合,我介绍的是搜狗线上的一个模块,如何把这个想法在线上实现。这里的关键点是 ModelFeature 的概念,就是把模型本身当成一个特征。这页 PPT 是 LR 和 DNN 的级联融合,分 online 和 offline 两部分:比如 offline 的时候,有 PV、Click 和 Session,形成 Sample,也就是样本,经过 FeatureMaker 也就是特征抽取,会形成两类,一类是 one-hot 这种离散特征,然后做 LR Train 得到 LR Model,LR Model 反过来会把它的结果也就是模型特征放到里边,包括 ctr 的特征和模型中间结果,经过 DNN Train 得到 DNN Model,部署到线上。


这时候就有两个模型, DNN 和 LR。在线上我们的工作也类似,前端收到流量进行召回,然后到 QS ,也就是排序 Server,首先抽取 OneCase,也就是一个样本,然后会得到离散特征,并进入特征池,可以做一个查表, 通过 CTR Table 得到 COEC 特征,就会得到 DNN ModelFeature 的输入,而后把结果和 LR 回馈的结果结合作为最后的 CTR 输出。如此就可以通过配置项灵活上线,包括两个模型各个权重多少,那么就会得到一个最终的结果。这种方式能够保证灵活上线。



接下来讲 wide&deep 模型,刚才讲的 LR+DNN 模型应该是 16 年左右推到线上,wide&deep 是 17 年,也就是去年的工作。这个模型是 16 年谷歌应用商店推出来的,用来做 APP 检索排序。这个模型大家很喜欢,我觉得主要是因为名字起的特别好,wide 这个是宽,就是说广度非常大,deep 就深,就是说深不可测,大家一般都喜欢一个人了解的又多又深,这个名字一听就懂,所以我觉得这个模型很流行,名字起了很大作用。具体到搜狗搜索广告来说,我们用的是 Mxnet 的实验框架,不知道有没有人熟悉,这是亚马逊主推的一个框架,是中国一个同学在博士生期间写的。现在大家可能主要用的是 Tensorflow,我说一下当时选 MxNet 的理由, 16 年我们在做 DNN 模型上线时,面临一个问题,模型怎么去训练,搜索广告本身跟展示广告不太一样,特征空间会大一些,因为涉及很多文本特征,会有大量特征来表述查询词和广告 keyword,以及一些交叉特征和匹配特征。 如果特征规模非常大,同时样本量也非常大,一天可能有数亿样本,一般用 60 天或 90 天的数据,而且每天都要更新,就会涉及到训练效率的问题。 16 年解决大规模样本训练时,也想过 TensorFlow,但是它刚发布,用的时候,会发现很多问题,数据加载不了,或者训练完退出不了,我们就在 TensorFlow 的官网上发个帖问一下,有没有碰到类似的问题,后面就会有一些回帖,说也碰到同样的问题,但没有解答,这是当时的一些情况。所以我们后来就用了 MxNet,它的实现方式相对简单一些, TensorFlow 大家现在用的很多,但对底层体系其实是没有更多了解的,比如日志打印,调试时想往里面加代码, TensorFlow 用起来不是很方便,因为需要基于 google 的那套日志体系,至少当时是这样子,但 MxNet 就会好很多,这是我们当时选择它的理由。16 年的时候我们把 LR+DNN 上到线上,效率还可以,拿了十几台 GPU 机器联合起来,大概几个小时能跑出来几十亿样本上的结果,到去年我们做 Wide&Deep 的时候,因为惯性,或者说 17 年的时候 TensorFlow 也还没准备好,我们就也用了 MxNet。


推一个新模型上线,是比较复杂的一个过程,尤其是比较大的模型改造,牵涉很多工作:比如怎么保证模型的稳定性,上线的正确性,以及训练的时效性,至少每天更新,或者说一定时间范围满足这个条件。在上线之前,我们用 TensorFlow 也做过一版实验,它的价值还是很大的,我们可以在一个小的样本集比如千万、5000 万或者 1000 万这个样本集上试一下,看 Wide&Deep 模型的效果,因为有开源实现直接调库就能做这个事情。TensorFlow 上的小样本实验表明,相比 LR+DNN 融合模型,wide&deep 在 AUC 上是涨的,做这个事情是有价值的,接下来要考虑怎么进一步解决大样本训练的问题。用 MxNet 有几个关键点:第一,原生系统只支持稠密特征,也就是浮点值,深度学习涉及的向量基本上每位都是有值的,是稠密的,MxNet 是基于这种情况来设计的,而搜索广告有很多文本类特征都是离散的,量非常大又很稀疏,所以需要把 MxNet 改造一下来支持 Sparse Tensor,这是第一步的工作,不做这个后面是没法继续的;第二是需要深度定制 Embedding 层,原来的 DNN 模型不用做 Embedding 的工作,线下已经做好了,利用 word2vec 进行融合,或者 COEC 这种特征直接放进去,就没 Embedding 这层,但 Wide&Deep 却会牵扯到 MxNet 的 Embedding 层效率是不是够的问题,需要对它进行定制来提高训练速度;第三,原本 parameter server 的参数更新是在 CPU 中,会牵扯到 CPU 和 GPU 的数据交换,非常浪费时间,所以我们挪一下位置,放到 GPU 里来减少中间开销;第四,这一点一般人不会碰到,不知道大家用的服务器网卡都是什么配置?通常来讲都是千兆或者万兆网卡,其实还有非常好的网络设备,就是 IB 卡,速度能达到 56Gb 每秒,这是官方标称的,我也测过,能达到类似的水平,比万兆网卡还要快 5 倍左右。网络规模上去之后,参数量非常大,训练过程中需要不断进行参数的交换,如果网速太慢,会导致训练效率很低,所以我们就用了 IB 卡,满足了这个需求。一开始我们在训练的时候发现网卡经常是满负荷的状态,导致训练一直不充分,效率非常慢,训练一小批数据就需要十个小时甚至更长,达不到我们的要求,当时本来想跟运维提个申请,把网卡升级一下,运维那边答复网卡不太好换,又找了更资深的同事来问,发现我们还有更厉害的 IB 卡,改了一个 ip 之后,训练速度比原来提高了十倍。所以大家在做事情时可以思维发散一些,很多时候不是必须通过算法优化来解决问题,有时候换一下机器,或者买一个设备,解决更快,总之需要有一些想法,来解决实际中的一些问题;最后一点,我们需要进行优化算法的选择和参数的调优,加大 embedding 维度,使训练更充分。这五点做完之后呢,还会面临一些问题,拿十二台 512G 内存的机器来训练,只能加载 30 天的数据,这时内存就满了,该怎么办?可能就需要流式加载,配合 Hadoop 来不断的从网络获取数据,读入内存,然后交换数据这么一个过程,来解决多天数据训练时内存不足的问题。这几个问题都解决掉之后,最后能达到一个效果,在百亿规模样本、十亿特征空间的情况下,能够在 5 到 8 个小时内训练一个模型,推到线上供我们使用,上线之后效果还是很不错的。



那么如何评价一个模型效果的好坏呢?刚才罗老师也讲到了,我再补充一下自己的看法。第一个就是 AUC,搞模型的应该都比较熟悉,这个 AUC 应该是涨了就好,跌了就不好。可能会有些经验说法,比如 AUC 只要提升三个千分点以上,那么上线一定是有效果的,但前提是做的正确的情况下。再一个就是上线收益,做广告的都知道,只要有钱赚好多事情都好办,比如你跟老板说能涨收入,那么机器也能给你,人员也能给你,所以说最关键的评价指标就是上线收益,上线之后是好是坏。但是,一般是人和机器投入了,工作做完了才会上线。可能最后发现效果不行,原来跟老板说上线涨 5%,结果上线之后持平或者下跌,这时我该怎么办?线下线上会有不一致的问题,首先需要怀疑的就是上线到底是正确还是错误的,这个非常重要,当初设计的一些目的在线上到底有没有被正确地实现,简单来说就是有没有 bug,这是第一点;第二点就是 Survival Bias 的问题,这个问题比较典型,还拿搜索广告举一下例子,线下训练的样本都是在线上展示过的广告,对吧?展示过的广告本身就有些特殊,一次查询最终可能只有三个位置能够展示,而候选集可能在几百上千或者上万个,能够展示就说明它是比较优秀的,要不然也不会展示,所以在线下的时候,我们碰到的都是筛选之后的数据,但上线之后呢?候选集不再是这些比较好的,需要面临最原始的那几千条广告,会有很多问题之前是没碰到过的,对吧?这会导致效果出现问题,其实就是特征泛化性,到底能不能把很多问题都考虑到,在很多场景都能用,而不是只针对小批量数据。另外就是特征的覆盖率,一个特征在线下能覆盖 80%的样本,到线上能不能覆盖这么多?考虑这几件事情,才能进一步分析上完线之后是好还是坏,跟预期是不是一致。这几个点里面,一般来说后两种情况的理论分析比较常见,但实际上来说,还是需要先确认有没有 bug,这个是最重要的一点,做对了其实比做的更炫要重要一些。这是模型效果的评估。



然后是模型这块我们目前的现状和计划。我们已经实现了 Wide&Deep 模型的全流量上线而且收益比较好。但受限于线上计算资源,模型复杂度是受限的。接下来我们打算做线上服务拆分,用低功耗 GPU 来加速,刚才也强调过,当你黔驴技穷的时候就换机器。好机器一定会比之前效果要好一些,计算速度更快,就可以支持更复杂的网络,尝试更高级的模型,比如 NFM 来提升我们的特征组合能力。这是关于模型的现状和计划。

4. 若干思考

上面的两部分,就是深度学习的两个典型应用场景,一个是自动化创意,一个是点击率预估,跟大家都简单介绍了一下,最后讲一下我的思考。



大家在工作中通常会面临一些选择,要不要做探索。一般来说,新技术肯定有它的用处,大家需要做仔细的筛选。解决问题一般有一些思路或者倾向,一种是把模型变得更宽更深更复杂,做自动交叉,注意力机制,或者强化学习,这些都是概念,但到底能否起效,大家可以从宏观上来想一下。有些项目在做之前就有一个大概的感觉,能不能用最简单的逻辑来解释你做的事情:如果简单逻辑能说明方法有效,那么最终多半来说比较有效;如果逻辑链条很长,那就说明依赖的条件非常多,而这些条件不见得像你想的那么可靠,结果可能不一定好。所以大家可以多从宏观上想一下事情,在做优先级调配的时候,先做那些一看就涨收入的项目,而不是说把一个复杂技术用进去,它就能得到提升,需要用其它的方式来证明我们的思路是正确的。给大家举个例子,18 年的 www 上淘宝发了篇文章,用强化学习来做训练,实现 GMV 的增长。手淘里面有两种搜索,一个是全局搜索,就是在手淘首页上直接进行搜索,是全站的搜索,再一个是进入商家之后,在商家内部的搜索,比如进入服装店铺在服装店内部的搜索结果。原来的时候,这两个搜索是分开的,两个模型本身独立,训练过程独立,这篇论文用强化学习的思想把两个数据源打通,两个模型同时训练,内外两个搜索系统能进行连通,这个想法上线之后,得出一个实验效果, GMV 涨了 1 到 2 个百分点,就这么大的体量而言,提升是非常可观的。大家可能需要思考一个问题,这里的提升来自于强化学习的有多少?把数据源打通这件事情的贡献大,还是引入新算法的贡献大,一般来说写文章要有一个新的想法,才好被大家接受。实际项目中还是要有一些思考,直接把数据源打通,用一些简单的方式来做,还是用复杂方法来做。复杂方法就意味着不可控,更容易产生 bug。


还有一点,大家有没有考虑过,实际工作中面临很多任务需要处理,理论上限是什么?假设我尽了全力,用最优秀的人最好的机器来做,它可能达到一个什么效果?现在效果如何,中间有个偏差,这个偏差是我们能够努力来改变的。一般来说突破不了上限,那该怎么办呢?能不能换一种别的方式来做?广告一般有预算分配的问题,可以设计一个算法来做平滑,保证客户预算利用的更充分。这是技术层面的问题,有没有别的方式,比如帮运营和业务做一些更好的报表,让他们找客户提一下预算,后面这种方式的效果可能更好,对吧,我们直接把上限提高,而不只是逼近上限。


最后一点,暴力计算是否可行?广告系统里有个召回模块,之所以存在的意义,就是做一个初筛,从大量候选集中提前选出一些比较好的,来减少后续模块的压力。如果我的场景里可以把所有的候选集都算一遍,是不是就不需要召回模块了?比如某些小 APP 的开屏广告,一个请求来了之后,如果候选集就几百个广告,那还要不要做召回?其实可以不用做,直接把这几百个广告和当前用户挨个计算,选择预估点击率最高的,这样没准也能达到很好的效果。总之,大家在实际工作中可以多一些宏观层面的思考,而不是单纯局限于算法方面的优化或者新算法的引入,最后达到的效果可能会更好一些。


我今天讲的基本上就这些内容,感谢大家的聆听。


作者介绍



舒鹏,搜狗专家研究员。硕士毕业于清华大学计算机系,2010 年开始接触广告算法,目前在搜狗负责搜索广告的策略研究工作,对于搜索广告中涉及的相关核心技术有着深入理解。推动深度学习等新技术应用于搜狗搜索广告的线上业务,取得较好成效,并带领团队在国际顶级会议上发表相关论文多篇。


本文来自舒鹏在 DataFun 社区的演讲,由 DataFun 编辑整理。


公众号推荐:

2024 年 1 月,InfoQ 研究中心重磅发布《大语言模型综合能力测评报告 2024》,揭示了 10 个大模型在语义理解、文学创作、知识问答等领域的卓越表现。ChatGPT-4、文心一言等领先模型在编程、逻辑推理等方面展现出惊人的进步,预示着大模型将在 2024 年迎来更广泛的应用和创新。关注公众号「AI 前线」,回复「大模型报告」免费获取电子版研究报告。

AI 前线公众号
2019-03-06 08:004693

评论

发布
暂无评论
发现更多内容

不是吧阿sir!System,java面试问项目中遇到的技术难点

Java 程序员 后端

丹丹学妹哭着对我说:学长,JVM如何实现动态类型语言支持的呢

Java 程序员 后端

为什么分布式一定要有Redis?,java面试逻辑题三个开关三盏灯

Java 程序员 后端

互联网寒冬下!疫情又遭滑铁卢!从裁员到斩获新offer我经历了什么

Java 程序员 后端

为什么要谨慎使用Arrays-asList、ArrayList的subList?

Java 程序员 后端

二十不惑的年纪,竟4面拿下字节跳动offer,我简直走了,jdk和jre区别面试题

Java 程序员 后端

二面余额宝(交叉面),mybatis功能架构

Java 程序员 后端

为什么阿里巴巴不建议在for循环中使用”+,java编程技术开发题库和答案

Java 程序员 后端

为了你们不错过金三银四,我真是操碎了心!RabbitMQ面试真题来了

Java 程序员 后端

明道云在保险经纪公司中的应用场景例举

明道云

为了进大厂,我深扒了阿里字节等大厂面经,总结了50道必考题

Java 程序员 后端

为什么建议大家使用 Linux 开发?爽(外加七个感叹号,java高级编程实训总结

Java 程序员 后端

二叉树的各种算法面试题及答案解析,linux基础教程第二版pdf

Java 程序员 后端

不是吧阿sir,你这业务太熟了吧,震惊面试官第八年,献给真心想学Java的打工人

Java 程序员 后端

世界顶级SQL技术专家呕心沥血半年才整理出这份:SQL优化核心思想笔记,手慢无

Java 程序员 后端

15个问题自查真的了解java编译优化吗

华为云开发者联盟

Java 编译 对象 语义 符号表

不能错过的分布式ID生成器(Leaf-),积累总结

Java 程序员 后端

世界顶级Linux技术大神,耗时一年力作1300页Linux开发实战

Java 程序员 后端

业务中台的困境、及可能的解,java基础笔试题判断题

Java 程序员 后端

五分钟带你了解Seata分布式事务,java基础菜鸟教程txt

Java 程序员 后端

两年Java开发经验,混迹“中浩科技,java全套百度云视频

Java 程序员 后端

为什么大公司要使用微服务?(建议收藏),java基础案例教程第二版答案

Java 程序员 后端

为什么说简历很重要?怎么才能写出一份完美的简历?这篇文章你值得拥有

Java 程序员 后端

两道面试题,带你解析Java类加载机制,零基础也能看得懂

Java 程序员 后端

九年程序员生涯,我的一些经验教训,offer来了java面试百度云版

Java 程序员 后端

互联网架构“高并发”到底怎么玩,用Elasticsearch搞定日均1亿订单查询

Java 程序员 后端

不是吧工作3年你都不知道这份超详细JVM内存结构,怎么涨薪?(1)

Java 程序员 后端

不是吧工作3年你都不知道这份超详细JVM内存结构,怎么涨薪?

Java 程序员 后端

两年半,50W的offer,三本,springboot运行原理生命周期

Java 程序员 后端

不是吧阿sir,你这计算机网络也太熟了,震惊面试官一整年

Java 程序员 后端

五位阿里大牛联手撰写的《深入浅出Java多线程》,java开发视频直播

Java 程序员 后端

深度学习新技术在搜狗搜索广告中的深化应用_AI&大模型_InfoQ精选文章