分享嘉宾:闫文昌 58同城 算法架构师

编辑整理:GYH

出品平台:DataFunTalk、AI启蒙者

导读: 58同镇是58同城进军下沉市场最重要的战略性业务,58同镇推荐系统面向下沉市场用户群,以Feed流方式提供基于地域分发的多品类信息融合推荐。本次分享重点聚焦58本地版APP首页Feed流推荐场景,从架构设计、特征Pipeline、召回算法、排序算法等方面为大家展开介绍,并总结实践中的一些心得。

01 背景介绍

1. 同镇业务

同镇是58集团进军下沉市场最重要的战略性新业务。下沉市场的概念也一直是近年来的热点话题,而同镇实际面向的是更为下沉的县域和乡镇市场。目前在全国布有一万多个乡镇站点,覆盖31个省份,年服务超过1亿用户。同镇利用站长的私域流量和58本地版APP的公域流量,可以触达千万级的乡镇人群,致力于打造最大的乡镇信息服务平台,为下沉市场用户提供精准的本地化信息服务。

2. 下沉市场的人在哪里?有什么特点?

这里引用同镇去年11月份发布的一份关于下沉市场的调研数据,帮助大家对下沉市场有一个简单的直观认识:

  • 目前,全国县域人口达8.1亿,占全国总人口比重为61.8%;
  • 77.26%已成家有子女,有两个及以上子女占比41.94%;
  • 年龄集中在20-50岁,其中31-40岁青年人居多;
  • 主要分布在山东、河北、河南、广东、江苏等人口大省及经济发达省份;
  • 从学历上来看,90%以上用户学历在大专及以下,初中学历者占比最高,达到38.12%,其次是高中和中专学历用户,占比为35.22%;
  • 职业方面:从事职业种类繁多,其中,15.89%的用户在家务农,15.21%是个体工商户,27.17%在私企或其他类型企业工作,7.61%的用户在机关及事业单位就职。

接下来从收入、消费、和行为习惯方面看一下:

  • 75.67%月均收入在5000元以下,58.23%拥有乘用车,41.04%有房无贷;
  • 使用手机价位集中在1000-3000元,使用手机品牌前三位是OPPO、华为、vivo;
  • 平均每天使用手机5.39小时,月均网购5.8次,63.4%的用户偏爱线上购物;平均拥有7个以上常用手机App,社交软件必不可少;
  • 64%的用户用手机刷短视频、浏览新闻资讯、使用社交软件。

总的来说,下沉市场用户由于生活压力小、房价便宜,虽然挣得钱不多,但可支配收入并不低,生活幸福感显著高出一线城市。并且,工作生活节奏比较慢,每天的闲暇时间超过6小时,娱乐相对比较少。总体印象是生活幸福、闲暇时间多。

3. 同镇推荐场景

了解了下沉市场,我们看一下同镇是如何利用推荐技术来服务下沉市场用户的。同镇智能推荐,主要面向下沉市场用户群,以Feed流方式提供基于地域分发的多品类信息融合推荐,内容涵盖新闻资讯、招聘、房产、汽车和交友等品类信息。目前同镇推荐流量已经覆盖58本地版APP主要列表的推荐场景,包括首页Feed、好工作、头条tab、好房子、交友、交友动态等等。

本次分享主要聚焦58本地版APP首页Feed推荐场景为大家展开介绍。同镇首页Feed推荐内容源,主要包括新闻资讯和分类信息两大类:

  • 新闻资讯分为文本类、图文类和视频类,来源包括站长发布的本地资讯、合作渠道内容和抓取内容等等。
  • 分类信息主要是58同镇各分类业务的帖子数据 ( 包括招聘、房产、汽车、交友等 )。

目前,首页推荐下发内容中,新闻资讯占比90%,其他分类信息一共占比不到10%,主要是以引流帖的形式存在。

4. 同镇首页Feed推荐的特点及挑战

首页Feed,主要以本地新闻资讯内容为主,连接了内容生产者和消费者,承载着58本地版APP引流、转化和体验落地的价值使命,对用户持续增长、高效转化和长期留存有着非常重要的作用。简单说,通过首页Feed推荐的内容吸引力和体验,增加用户的留存和粘性,最终通过分类信息来实现流量变现。

首页Feed推荐的特点具体包括哪些?我们又是通过哪些方式来实现的呢?

总结起来,主要包括:本地化特色、时效性和热点、转化和体验、内容生态。

① 本地化特色:

  • 同镇资讯内容的本地化是指以县域内容为主,优先展示县域内容,如果数量不够,会向上级地域市、省来扩。
  • 召回策略按县、市、省三级地域分层分级召回,对应的服务逻辑层也按地域分层处理。
  • 地域特征会作为强特征参与召回和Rank模型的过滤和排序计算,来保证内容的本地化特色。

② 时效性+热点:

新闻资讯的时效性和热点话题很重要,我们主要通过四个方面来实现:

  • 资讯内容实时入库、文本标签特征实时提取;
  • 实时特征pipeline,保证模型实时训练和更新;
  • 地域热点实时召回,确保实时热点内容的及时展示;
  • 我们设计了一套时效性赛马策略,保障了新内容的及时展示,对新内容给予基础曝光量的前提下,实行优胜劣汰,低转化内容会很快退池,优质内容会及时转化为热点,目的就是让新内容从冷启动状态更快的进入赛道,参与竞争、筛选和分发。

③ 转化+体验:

提升转化和用户体验,是推荐系统的核心目标,具体表现为:

  • 通过精准画像+实时推荐来实现内容的个性化精准匹配和实时行为预测。
  • 通过算法模型来进行用户行为的深度挖掘和点击率预估。
  • 同时关注短期指标与长期指标、用户指标与生态指标的平衡和共同提升,确保最终的综合收益和体验。

④ 内容生态:

首页Feed推荐除了提升转化,还要承担起内容生态的建设。我们的工作:

  • 通过低俗、低质模型来进行内容方面的治理,确保内容本身的质量。
  • 在策略和模型方面会给予优质正向内容更多的流量。这同时对用户和内容供给也是一种正向引导,最终形成了内容生产方和消费方的良性互动。

02 同镇推荐系统整体架构

同镇推荐系统整体架构,主要包括:基础数据层、数据计算层、算法策略层、逻辑层和应用层。

架构特点:

  • 基于业务数据、日志数据和标签数据
  • 综合应用机器学习、深度学习和NLP为用户做召回和点击率预估
  • 支持各品类信息topN推荐结果的融合再排序

架构优势:

  • 采用解耦合的分层分模块设计方式
  • 统一的数据层和特征pipeline
  • 召回和排序模型支持灵活组合和扩展
  • 整体支持AB测系统的无缝集成和动态配置

接下来为大家进行详细的介绍:

03 数据&特征

业界流传这样一句话:

“数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已。”

由此可见,数据和特征是重中之重,我们的数据主要包括业务数据、行为日志和标签数据。用户行为数据主要来源于埋点日志,分为显性反馈和隐性反馈两种。原始数据经过清洗、样本采样、特征组合、特征离散等特征工程的处理,最终形成训练样本并作为模型的input。

目前用到的特征数据主要包括用户特征、内容特征、交叉特征和上下文特征:

  • 用户特征:主要包括用户基础属性、统计类特征、兴趣画像和历史行为等
  • 内容特征:主要包括PV、CTR等统计特征,还有文本标签类的特征,以及内容的来源、发布者等
  • 交叉特征:主要是用户与内容之间的交互特征,包括是否点击、对内容喜好度、点击浏览时长、是否点赞/评论/分享等
  • 上下文特征:主要是访问时间、地域、机型、session等

1. 文本标签构建

因为首页Feed推荐主要是本地新闻资讯,所以,内容标签对推荐的作用非常重要。

① 语义特征

文本标签的构建:

我们全面引入Bert ( 采用Google原生12层的Transformer x768维的中文预训练模型 ),并且针对新闻资讯场景,对Bert加入千万级新闻语料做了定制化训练,使其更适合场景的需要。Bert,其实是一种双向Transformer的Encoder。模型的主要创新点都在pre-train预训练方法上。

什么是预训练?举个例子,假设我们有大量的维基百科数据,我们可以预先用这部分巨量的数据来训练一个泛化能力很强的模型,当我们需要在特定场景使用时,例如做文本相似度计算,只需要简单的修改一些输出层,再用我们自己的数据进行增量训练,对权重进行细微的调整,就可以直接应用。预训练的好处在于在特定场景使用时不需要用大量的语料来进行训练,节约资源和时间效率,bert就是这样的一个泛化能力较强的预训练模型。

同镇的场景主要是内容分类预测和标签提取。

内容分类:

从这个结构图上可以看到,对一级、二级分类预测,我们整体是基于层级分类的方法,采用pretrained-BERT+position_embedding_dnn的方案,基于bert输出的句柄向量结果,通过log_softmax激活函数做多分类处理。也就是说通过log_softmax函数将多个神经元的输出映射到 (0,1) 区间内,可以看成概率来理解,从而来进行多分类。

二级类处理上,为了防止层级错乱 ( 一二级分类存在层级关系 ),我们引入了一级类cate1的position_embedding向量特征参与二级类预测任务的计算 ( Cate1 position embedding会和二级类的bert embedding向量相乘取结果,然后做为DNN的输入,主要是屏蔽掉了别的一级类下名称相似的二级类 ),准确率也相对提升了5%。

低俗内容识别:

和内容分类模型类似,这里使用的是多分类预测模型,我们采用pretrained-Bert+DNN的方式,主要鉴别暴恐、涉黄、涉政、广告等类型的内容 ( 其实是一个5分类问题 ),我们的识别准确率是92%。

最后采用这些方式之前,我们也对比尝试了不同的优化方案,后面效果数据环节再给大家详细介绍。

② 隐语义特征

关键实体识别:

这一块主要是为了识别文本中具有能代表全文主旨的关键命名实体。我们采用的是BERT+BiLSTM+CRF的方案,这也是目前被用的比较多的一种方式。

  • 结合这个结构图,可以看到,这里的Bert充当固定的embedding层,输出整个句子的embedding词向量,给双向LSTM做为输入进行训练。
  • BiLSTM层的输出是每个词的所有标签的各自得分,相当于每个词映射到标签的发射概率。
  • CRF层的作用主要是对识别句子中开始单词的标签类型以及格式做限制,比如什么样的标注是合理的,什么样的是不合理的。也就是说,LSTM考虑的是输入序列的上下文信息,而CRF还可以考虑tag之间的依赖关系信息。

低质模型:

低质模型的实现可以认为是一种网络结构的创新,低质内容的判别,主要引入了困惑度概念,困惑度是一种评判概率模型或概率分布预测的衡量指标,可以用于评价模型好坏,也是目前NLP方面用来衡量语言概率模型优劣的常用方法。它主要是通过无监督的预训练模型,计算语句的困惑度,结合实际场景设定对应阈值来对低质内容做处理。在解决内容语法、语义层面的质量问题上,这种方案适用面广、计算效率和准确率比较高。

另外,这里还引入了窗口的概念,因为PPL的计算跟文本的长度有关,文本中如果有一两个字不该出现,反而出现了,整体就会被拉平均。比如100个字里面有一个错的和10个字里面有一个错的,影响是不一样的。我们目前的滑动窗口设置的是15个字,窗口内计算它的PPL,然后求出最大的作为整句话的PPL,这个值越大,表明整个句子越不符合常规。目前我们低质内容识别准确率达到95%,效果上还是不错的。

Topic主题模型:

简单说下,我们目前采用的Bert+Kmeans,一个创新点是采用Bert来代替传统的Embedding方式,之前的方式大多是采用TF-idf或者onehot编码方式,很少采用bert。我们目前是100个topic,对比LDA主题标签模型 ( baseline ) 线上效果提升6%。

③ 内容分类和实体识别效果数据

接下来看一下内容分类和实体识别迭代优化的效果数据。

资讯内容分类:

我们一共是26个一级分类,163个二级分类,采用20万标注样本进行训练。

从上面的表格中可以看到,整个迭代优化过程,我们最早Baseline采用了word2vec+BiLSTM方式,一级类预测准确率为80.4%,二级类准确率在61.2%,预测耗时是15.7ms。

由于word2vec模型最大的缺点,是在歧义词的处理上效果比较差,比如“苹果”,可以是吃的水果、也可以是苹果公司、电影《苹果》,在word2vec模型只要一个向量,无论前后文是什么,但是在bert里面可以是不同的向量,可以很好的处理这种分类问题。所以后来引入Bert后,整个一级类和二级类准确率都有了10%以上的提升,但是预测耗时也比之前增加了50+ms。

之后我们又对二级类的预测做了一些改进,我们把一级类的分类结果经过类似onehot方式编码后传递给二级类,加入二级类的输入提供给DNN进行训练,使二级类的准确率提升了将近5%,达到80.1%。

最后,在不改变网络结构的同时,我们对Bert做了定制化训练,加入了千万量级的新闻资讯语料做增量训练,由于跟原生Bert训练语料不在一个数量级上,可能只会影响最后一两层的模型参数,但是对我们的模型准确率却有2%左右的提升。

关键实体识别:

关键实体识别模型 ( NER ),我们采用了15万的标注样本做训练。

从上面表格中可以看到,我们Baseline采用了word2vec+双向LSTM+CRF的方式,F1是0.731,预测耗时平均312ms。

我们后来引入了bert,初始长度为512,先后引入了两种网络结构,一个是CNN的变种IDCNN,另一个是双向的LSTM,效果上可以看到采用LSTM的效果比IDCNN要平均提升4%,F1值达到了0.896,但是它有一个问题,就是预测耗时也增加了很多(平均增加400+ms),一是因为Bert本身的响应时间就不是特别短,另外主要是LSTM本身是串行的,它的每一个cell都要等待前一个cell的结果,所以响应时间比IDCNN慢很多,而且失败率也很高。

后来,我们决定采用LSTM,并重点解决耗时长和失败率的问题。由于是新闻资讯的语料,我们希望采用Bert的最大输入长度512,我们知道Bert的核心组件Transformer的计算速度跟输入长度的平方是成正比的,所以我们将输入拆分成128的输入,最后将结果进行拼接,整体效果上跟512的输入是差不多的,但是预测耗时和失败率却有大幅的降低。目前线上是采用的最后这种方式,后面还会采用别的方案继续做尝试和优化。

2. 如何全方位刻画用户?

要做好推荐,很重要的一方面是要刻画好用户的特征,所以用户画像的构建很重要。目前同镇的用户画像标签体系主要包括用户基础属性和用户行为属性两大类,目前一共230+个维度标签。整个画像标签整体结构,包括原始数据、事实标签、模型标签和预测标签。主要是用户性别、年龄、职业等静态属性,还有类似于品类偏好、活跃度、流失概率等通过统计或预测模型构建的动态属性标签。画像标签在推荐上目前主要用在画像召回和用户兴趣建模这两方面,标签计算分为离线和实时两种方式。

用户兴趣画像标签计算:

主要是基于用户最近点击、分享、收藏过的内容数据,利用提取到的文本标签及权重值,不同行为类型赋予不同权重,并且针对短、中、长期画像分别做了时间指数衰减的处理。具体就不细说了,感兴趣的可以看下。

3. 特征生产Pipeline实现

特征生产pipeline整体上包括特征构建和在线的特征应用两部分。具体流程大概是:

首先通过hive和kafka接入不同数据源 ( 主要包括解析后的日志数据、内容数据等 ),然后通过Flink/Spark做特征统计和特征抽取等ETL处理,以及部分文本标签会通过模型实时提取,然后得到预处理后的特征数据,接下来特征数据会以两种方式来处理:

  • 离线构建,这部分会将预处理后的特征数据落到hive/hdfs,主要是给离线模型训练使用。同时,特征数据经过Spark离线任务定期处理后,会通过特征推送的方式,以序列化的k-V结构存入缓存数据库。
  • 实时构建,会将预处理后的实时特征经过Kafka进行推送,然后通过Flink实时处理后,以预定义的KV结构同步到缓存数据库 ( Redis、Wtable ),供线上模块实时加载。

04 核心处理流程

简单说一下同镇推荐系统的核心处理流程,方便后面召回和排序模型的介绍。

整体处理流程分两部分:offline模块和online模块。

  • offline模块:主要是样本生成、特征构建和模型训练三部分,主要就是对基础数据ETL处理后生成训练样本,然后提取特征做为input数据提供给模型做训练,并最终生成模型结果供线上调用。
  • online模块:包括召回、排序和重排三个环节。

我们主要是基于用户请求和相关信息,通过规则策略和模型策略做内容召回,然后通过Rank模型做点击率预估,最后经过逻辑控制层的处理后,给线上做展示。

1. 内容召回 ( Recall )

召回和粗排阶段,是推荐系统的重要环节。同镇推荐的召回策略属于多路召回,分离线召回和实时召回两种,目前除了CF、Attention、DeepFM等离线召回模型外,其他召回策略 ( 热点类、实时画像类等 ) 基本都是实时计算的方式。目前我们用的多路召回策略,类型上主要包括这么几种:

  • 画像精准召回:目前用的有实时画像、短期画像、中期和长期画像。
  • 内容相关性召回:主要是通过word2vector、TF-IDF构建的内容词向量来计算内容相似度,做内容相似召回。
  • 机器学习、深度学习召回:目前主要用的是协同过滤、Attention和deepFM深度召回。
  • 地域热点召回:主要用了县、市、省三级地域热点以及全国热点,时间上分天粒度和小时粒度两种。
  • 时效性策略召回:目前主要用的县、市两级的时效性赛马策略,也是分天粒度和小时粒度两种计算方式 ( 主要是针对新内容的一个处理机制,前面的环节也具体说过了 )。
  • 其他召回:主要就是冷启动 ( Bandit ) 和兴趣冷启动召回这些。

① 基于用户聚类的协同过滤算法改进

针对算法模型类的召回策略,主要说一下基于用户聚类的协同过滤算法的改进。

协同过滤,应该是大家最常用的一种算法,它体现的其实就是"物以类聚,人以群分"的思想。它主要是基于对用户历史行为数据的挖掘来发现用户的偏好,并预测用户可能喜欢的内容并进行推荐。我们主要是基于原生协同过滤算法做了一些改进:

由于新闻资讯的推荐场景,用户的兴趣点可能会有多个,所以一个向量不足以表达用户的所有兴趣点,普通的协同过滤如ALS,最终只学习出一个用户向量。我们主要是基于用户的点击数据进行聚类,来提取用户的多兴趣点向量,再和候选文章的向量做相似度计算得到最终的topN结果。

具体实现上,可以通过流程图来看一下:

  • 首先,基于用户的行为日志数据,通过ETL处理来提取用户的行为偏好样本。这里我们把用户的曝光时长较长的,还有用户点击,评论过的数据进行按照一定的 session 进行截断,过滤掉大于200条记录的数据。
  • 然后,把这样的数据喂给word2vector来训练出文章的Embedding向量。Word2Vector调参方面,我们采用的是skip-gram模型,开启10个线程,词向量维数设置的是200,训练窗口大小设置为5,采样率设置为1e-5,采样率的设置主要是为了惩罚热门内容的推荐,越小对热门内容惩罚越大。
  • 然后,对用户点击过的文章利用Kmeans来进行聚类(聚类数目为10),把聚类中心作为用户的兴趣向量。
  • 最后,利用聚类后的向量基于FAISS向量检索平台和候选文章向量做Cosine计算,然后加入时间和平均浏览时长等权重来计算打分,最终输出topN排序结果。

这里说下,余弦相似度计算的一个小的优化点:

由于原始的计算方式是基于向量每一维度做的计算 ( 可以看这个公式 ),性能就比较慢,为了能够进行向量的批量矩阵计算,我们需要把公式中的分母去掉,这里是通过转换为单位化向量来计算的 ( 我们都知道,单位化向量 = 向量/向量的模,单位化向量的模是1 ),所以最终余弦相似度=单位化向量A ( 点乘 ) 单位化向量B,因此我们就可以进行批量矩阵计算了。目前一些离线计算场景是用的这种方式,实时召回中的稠密向量计算目前都是基于FAISS平台来进行的。

协同过滤召回,这一块整体比较简单,只是我们在中间做了一些优化改进,还有计算上用了一些取巧的方式。

② 效果数据

  • 效果对比之前ALS算法 ( Baseline ),训练速度提升近4倍
  • 离线指标F1从0.71->0.74
  • 上线后,平均点击位置比ALS提升3个,召回策略本身的线上CTR提升了一倍,人均点击和平均浏览时长也都有了一定的提升

③ 线上状态

目前,整个训练样本是7天内有点击的用户 ( 300万 ),总的行为记录约1600万 ( 点击、收藏 ),训练一次大约1小时。

2. 排序模型 ( Rank ) 演进过程

同镇推荐Rank模型,从2019年4月初上线第一版至今,前后主要经历了五个阶段:

  • 规则排序策略:最开始采用规则排序,一是快速上线,二是建立Baseline。主要基于时间、地域、行为转化数据等进行权重计算,并综合打分后输出排序结果。
  • 树模型+线性模型:积累了一定的行为数据之后,5月初上线了第一版的算法模型排序 ( 树模型+线性模型 ),先后对比采用了GBDT和XGBoost两种,并最终采用了后者,也属行业主流方案。
  • 深度排序模型:随着用户量增加,训练样本不断增多,在大量数据集下深度学习模型相对于传统机器学习更具优势,所以我们采用了XDeepFM深度排序模型。
  • 融合排序模型:由于XGB+LR和XdeepFM两种模型,对特征组合学习具有不同的方式,且在实际表现中XGB+LR更倾向于热点召回,而XdeepFM更倾向于算法模型召回,两者结合后表现更为均衡稳定,所以我们采用了两种融合的方式来做了改进和优化。
  • 深度+Online Learning:19年底,我们上线了Online Learning,针对用户实时行为数据,做模型实时训练和更新,这也是目前线上的版本。

① 树模型+线性模型排序 ( XGBoost+LR )

先说一下XGBoost+LR ,这个属于比较主流的点击率预估方面的算法组合。

这种融合方法用于分类或者回归的思想最早由facebook在广告ctr预测中提出。

  • LR:大家都比较熟悉,广告点击率预估、推荐系统等场景涉及到的特征通常都是高维、稀疏的,并且样本量巨大,通常会采用速度较快的LR,然而LR算法学习能力有限,因此要想得到好的预测结果,需要前期做大量的特征工程,需要花费大量精力去筛选特征、做特征处理,即便这样,最终的效果提升也可能非常有限。
  • 树模型算法:天然具有特征筛选的功能,通过熵、信息增益、基尼指数等方法,在每次分裂时选取最优的分裂节点。因此,当树模型训练完之后,从根节点到叶子节点都是筛选出来的局部最优特征。于是很自然的想法就是,通过树模型的特征筛选功能,筛选一些局部最优的特征组合,然后将组合特征输入到LR算法,这样就可以提升LR的拟合能力。
  • XGBoost:是一种梯度提升的树集成模型,XGBoost本质上还是一个GBDT,两者都属于boosting方法,只是XGBoost把速度和效率发挥到极致,不仅能对样本采样,还能对特征采样,而且加入了正则项来防止过拟合,而且对代价函数进行了二阶泰勒展开,能同时使用一阶和二阶导数。XGBoost也是需要将多棵树的得分累加得到最终的预测得分 ( 也就是说每一次迭代,都在现有树的基础上,增加一棵树去拟合前面树的预测结果与真实值之间的残差 )。
  • XGB+LR模型结构:相对比较简单,原始输入特征包括三方面:用户特征、内容特征、交叉特征。基于原始特征输入,先用XGBoost模型进行训练得到树的叶子节点 ( 新的交叉特征组合 ),最后把这些新交叉特征加入原有特征中,一起喂给LR模型去训练。

特征处理:

  • 对一些连续型特征 ( ctr、类别偏好、地域偏好 ) 做了归一化处理。
  • 另外,就是对离散型特征 ( 登录时间、召回源、兴趣画像标签 ) 和内容分类特征做了onehot编码。
  • 然后,还通过统计分析方式构建了一些用户和内容的交叉特征。
  • 最后,对正负样本进行随机采样,正负样本比例为1:1。

模型调参:

  • XGBoost:主要是学习率、树深度、最大节点数量、样本采样率、特征采样率、正则化参数等。
  • LR:迭代次数,L1/L2正则化参数这些。
  • 通过网格搜索、交叉验证以auc为目标寻找最优参数。

目前离线训练的样本量:7天内用户行为数据 ( 千万级训练样本 ), 模型一天更新一次。

② 深度排序模型XDeepFM

接下来重点说一下深度排序模型XDeepFM在同镇推荐中的具体应用。

XDeepFM模型:是在DeepFM基础上做了优化改进,跟DCN网络相比的话,由于DCN中特征交叉发生在bit级 ( 元素级 ),而实际特征中有很多多值离散特征,因此引入xdeepfm使特征交叉发生在特征向量级,并且加入了lr层,使模型具有更好的特征组合能力和稳定性。

XDeepFM模型结构,主要包括:特征输入层、embedding层、网络结构层 ( 共享embedding向量 )、输出单元这几部分。

  • 特征输入:目前采用的大概近40个原始特征。特征的处理上:针对时间、性别、分类等离散特征做了one-hot编码,对userid和itemid做了唯一自增id的生成,另外基于行为数据构建了一部分人工交叉特征。
  • embedding层:主要是为每一个field ( one-hot编码后特征 ) 学习一个隐向量 ( 每个隐向量都固定维度 ),因为一个field可能包含多个编码 ( 主要是多值离散特征,例如:分类、topic和与其相关的一些兴趣画像标签 ),所以每一个field就包含多个隐向量。对于一个样本,若field中只有一个隐向量出现,那么这个特征的隐向量就作为field的隐向量,若有多个隐向量出现,则多个的和作为field的隐向量。
  • 网络结构层:主要包括三部分:Linear ( 线性模型,我们采用的LR )、CIN ( 压缩交叉网络 )、DNN ( 全连接的深度神经网络 )。

主要说一下CIN,这也是XDeepFM的一个重要改进,与deepFM中的FM模型不同的是,FM只实现了二阶特征交互,而CIN实现了有限阶特征交叉,即可以通过网络参数实现任意阶的特征交叉,所以优势明显。

这里有两组重要的概念,顺便说一下,一是元素级 ( bit-wise ) 和向量级 ( vector-wise ) 特征交互,二是隐式和显式特征交互。

  • 元素级和向量级:通俗点说,就是看交互权重计算是参与了向量相乘中元素维度间的计算,还是向量间的计算。
  • 隐式和显式:主要看两个特征在经过一系列变换后,如果可以表示成一个权重因子w* (x1*x2)的形式,就可以认为是显式特征交互,否则的话,是隐式特征交互。

XDeepFM模型的优势:

  • 主要是集成的CIN和DNN两个模块能够帮助模型同时以显式和隐式的方式学习高阶的特征交互;
  • 而集成的线性模块和深度神经模块也让模型兼具记忆与泛化的学习能力。
  • 在具体的应用场景下,不同的模块也可以接入各自不同的输入数据,例如,线性模块中依旧可以接入很多根据先验知识提取的交叉特征来提高记忆能力,而在CIN或者DNN中,为了减少模型的计算复杂度,可以只导入一部分稀疏的特征子集。

模型调参:

  • embedding大小,32,64等
  • DNN结构层数及每层神经元个数等
  • CIN结构层数
  • 学习率、激活函数、优化器等

③ Online Learning处理流程

基于业务需要和优化需求,我们19年底上线了online Learning,针对用户实时行为进行在线学习,并实时更新模型,实时预测用户偏好。大致处理流程:

  • 首先,离线训练BaseModel ( 目前是3天定期训练一次 ),主要是初始化上线时供server端ranking使用,后期离线模型训练后会定期更新模型参数。
  • 其次,通过实时收集用户行为日志,构造模型训练样本。
  • 最后,将实时构建的训练样本喂给模型训练,训练完模型后加载到onlineModel,并最终更新给sever端在线调用。

Id映射编码处理:

由于样本中的userID和itemID本身为离散型编码 ( 有的还是非数字类型 ),所以需把userID、ItemID编码为连续型数据,当有新的user或item时,需要以+1自增的方式分配新的唯一ID。

这样做:一是为了实现ID编码维度动态维护,降低编码空间。二是有利于online实时增量的样本处理和训练。另外,ID定期重新编码,可以提升训练效率 ( 因为可以定期清理流失用户的id数据 )。

Online Learning优点:

主要是能实时收集用户的行为反馈数据,达到分钟级别的模型训练和更新,并且提供准实时的用户兴趣预测,提升了线上的整体转化和用户体验。

④ Rank模型优化效果数据

我们看一下Rank模型经过几个阶段迭代优化的效果数据:

  • 最初我们对比采用了GBDT+LR 和 XGB+LR两种组合方式,XGBoost相比GBDT在模型上做了改进和优化,不论是精度还是效率上都有了提升,从效果数据上,也可以看到auc和召回率指标都有一定的提升,线上点击率也提升了5.5%。
  • 后来我们采用深度排序模型,先后对比采用了DeepFM和升级版的XDeepFM,鉴于XDeepFM在特征处理和模型上都做了改进,最终我们采用XDeepFM后,相比XGBoost,Auc和召回率都有了一定的提升,线上AB测效果CTR也提升了大概6%。
  • 由于树模型和深度模型对不同召回源的效果差异,我们上线了两组模型的融合,离线评测指标和线上效果都有不同程度的提升。
  • 近期我们上线了Online Learning,由于对用户特征实时提取和实时训练,对比离线训练方式,线上AB测效果CTR和人均点击都相对提升了6%。

3. 融合及逻辑控制 ( Rerank )

同镇推荐的重排阶段细分的话大概包括两部分:一是品类融合模型,二是逻辑控制层。

品类融合:

目前主要是基于规则策略加简单的预估模型来实现的。通过融合计算表达式可以看出,最终topN的输出由两类内容组成,一是本地资讯,二是分类信息,两者通过权重因子W来控制,也支持相对位置的设置。品类信息topN的输出,则需要经过两步处理,一是多品类坑位竞争,二是单品类预估排序的输出。

  • 多品类坑位竞争,则主要是通过概率权重P ( 流量控制因子 ) 和品类偏好模型的打分来实现的,两者乘积做为每个分类参与竞争的一个最终打分,最后取分数最高的品类做为展示品类。
  • 单品类预估排序,这个实现上大概分两类,对于主要品类我们采用的算法模型来实现,其他次要品类目前用的规则策略来排序的。

由于目前首页Feed推荐的内容占比90%都是新闻资讯,刨去固定广告位,其他品类下发很少,所以这一块我们目前还没有用到太复杂的算法模型 ( 比如:目前有一些Listwise的重排算法,包括RNN或者Transformer之类的,这些考虑时序性的一些模型,目前还没用到 ),后续会考虑增加异构信息融合方面的模型来进行优化。

逻辑控制层:

主要是对整体的流量控制和规则策略的支持,比如,对某些类型内容下发量的调配,打散去重,还可以通过不同类型内容的穿插,来解决部分多样性问题。另外更多的是对运营规则和商业价值方面的支持,也是主要在这一层来实现的。

4. 推荐效果评估

为保证线上推荐效果客观、准确的得到评估,也为了满足推荐各模块长期优化的诉求,我们搭建了ABTest实验平台。

  • 支持线上各模块的流量正交切分实验,目前支持按照UV或PV两种方式分流。
  • 目前我们所有模型和策略的优化都要经过AB测评估,而且严格坚持下来之后,感觉这个很有必要,因为只有客观准确的评估数据,才能得到正确结论,更好的指导后续的优化,不至于走弯路。

5. 推荐效果

自2019年4月上线第一版,召回、排序模型和推荐策略经过近一年的分阶段优化,对比第一版 ( Baseline ),目前核心效果指标:CTR相对提升>220% ( x%->y% ),人均点击相对提升170% ( x->y ),首页Feed的次日留存提升92% ( 新老用户:x%->y% )。

这是首页feed从上线以来的一个CTR趋势图,整体趋势的变化也是随着模型和策略的优化而逐步提升的,从图上可以看出,变化还是很明显的。PS:这中间也有内容方面和UI方面的优化,对提升也有不小的帮助。

05 总结及展望

1. 几点心得:

推荐系统的本质就是匹配用户的兴趣和内容的特征。

围绕这个核心,我们在本地化资讯内容推荐方面一直在不断的探索,不断摸爬滚打,其中也踩过不少坑,但是也积累了一些经验和收获,总结来说:

① 数据驱动,深入理解业务及目标

推荐系统的目标是为了解决业务问题,那怎么能将留存、转化、体验等业务目标与算法目标充分结合,这需要对业务场景和业务数据进行充分理解和分析,以数据来驱动和指导策略的优化。同镇推荐效果能够持续获得提升,很大程度上得益于我们整个过程严格依据数据来进行决策,通过数据现象挖掘问题的本质,对症下药,不断进行改进和优化。

② 数据是重中之重,特征是关键

我们都知道,数据和特征决定了算法模型的上限,所以保证好的算法输入十分重要。我们在做推荐的过程中,也是始终把特征工程方面的优化放在重要的位置,包括内容侧文本标签提取和用户画像的构建,而且实践证明这些对模型都有着不错的收益。

③ 召回环节很重要,需沉淀和反复打磨

召回内容的优劣直接决定和影响着Rank和最终的排序效果,根据经验数据评估,整个召回的影响在所有推荐环节中能占到大概40%左右,分量还是很重的。我们对召回策略的数据指标也做了细粒度的日常监控和分析,各策略经过一段时期的不断打磨、沉淀和积累,这一块对整体效果的贡献还是比较大的。

④ 注重细节,做好记录,多Review,多做问题抽象

做推荐容易,做好推荐难。尤其推荐效果的优化是个功夫活,不是简单的上几个预测算法跑一下就完了,更多的是后期效果的优化。由于整个推荐涉及的环节很多,每一处改动都可能影响整体的效果,尤其一些模型的优化,线下评价指标挺好,但是上线后效果并不理想,因为影响因素很多。实际中我们内部维护了一个上线List,所有模型和策略,每一次的更新都会记录。这样可以方便后期结合AB测数据来分析和做历史回溯。所以,要注重细节积累,多review,多做问题抽象,挖掘问题的根源,才能找到最优的解决办法。

2. 未来规划

最后,简单说下同镇Feed推荐未来的大致规划:

① 多目标优化模型全面落地

多目标优化这一块,其实我们目前已经基本完成了开发和调试,正在开始做AB测。

为什么考虑上多目标优化?因为通过我们前期的实践发现啊,不同的优化目标可能存在互相拉后腿的现象,而多目标优化能够平衡不同目标的相互影响,尽量能够做到同步上涨。目前我们的方案是借鉴了阿里的ESMM模型的思路,让模型在整个样本空间建模,而不像传统CTR预估那样只在点击样本空间建模。

② 深度挖掘用户意图,加深内容理解,扩充更多维度特征

推荐的核心是要对用户的兴趣进行建模和预测,所以用户画像标签很重要,后续会继续挖掘和扩充,另外,需要进一步通过NLP技术来加强文本内容挖掘,加强内容理解。并最终为算法提供更多更好的输入。

③ 要探索新的网络结构,增加新的深度学习、强化学习算法模型

我们目前用的算法模型主要还是侧重对点击率、转化率等短期指标的优化,长期目标比如用户体验或者用户活跃留存等指标,一般不太好直接优化,而强化学习模型比较容易对长期收益目标来进行建模。另外,后续也会尝试一些近两年比较热的这种GNN算法(图神经网络)来做优化。

④ 会继续扩充完善内容标签体系,逐步构建同镇知识图谱

我们未来会继续加强内容侧�