2.1-特征提取

8/2/2021

image.png

# 为什么说深度学习使用特征工程是过时的这种观点是错误的?

这种观点认为,深度神经网络(Deep Neural Network, DNN)的功能超级强大,是一个万能函数模拟器,只要层数足够多,DNN能够模拟模型的输入与输出之间的任何复杂的函数关系。既然”特征工程"也相当于施加在原始数据上的转换函数,自然也在DNN的模拟范畴之内。这样一来,在前深度学习时代那些让算法工程师费尽心思、绞尽脑汁的手动、显式的特征工程方法就都可以光荣下岗了,被DNN的自动化、隐式特征工程所取代。

但这种论调是荒谬的。 一是因为它的基础,即"DNN是万能函数模拟器",已经被越来越多的实践证明是站不住脚的。Deep Cross Network的作者在她的论文里,就直接指出了DNN有时候连简单的二阶、三阶特征交叉都模拟不好。所以DNN的"火力"没有吹得那么强,没经加工的原始食材扔进去,一样可能做不熟。造成神话破灭的一个原因就是,所谓的"万能函数模拟"只是一种理论,而现实训练中的种种问题,比如梯度消失、梯度爆炸、不同特征受训机会不均衡等,都会影响DNN的性能发挥。

二是因为DNN的"自动化特征工程"也不是无代价的。比如,接下来我们会讲到,阿里的DIN模型[2]能够从用户行为序列中挖掘出用户的短期兴趣,SIM模型能够从中挖掘出用户的长期兴趣。既然如此,那么未来是不是没必要再对用户的历史行为做任何特征工程了,把一堆用户交互(e.g.,观看、购买、点赞、转发)过的物料ID直接扔进DIN+SIM不就行了,省时省力,效果也好?答案是否定的。 DIN中的Attention、SIM中的搜索,都属于比较复杂的计算,更要命的是它们的耗时与候选集规模成正比。做做候选集只有几百个物料的精排倒还可以,但这让候选集成千上万的粗排和召回,情何以堪?难道不用DIN+SIM就不能刻画用户的长短期兴趣了吗?可以使用特征工程的一些技巧将计算压力从线上转移到线下,离线挖掘出用户的长短期兴趣,供召回、粗排环节的在线训练与预测使用。

image.png

# 请举例说明一下物料自身的属性有哪些?

物料自身的属性是最简单、直接的信息,是物料入库的时候就能够获取到的信息。

  • 在视频推荐场景下,视频的作者、作者等级、作者粉丝数、投稿栏目、视频标题与简介、上传时间、时长、清晰度等信息,都属于物料属性。
  • 在电商场景下,商品标题与简介、封面图片、所属商铺、商铺等级、品牌、价格、折扣、物料方式、上架时间等信息,都属于物料属性。

# 为什么说物料的唯一标识ItemId也是重要的特征?它作为一个类别特征,特征空间膨胀,模型可以学好?

首先,模型无须理解Item ID那串字符的含义,只要记住就好。比如,模型通过学习历史数据,发现来了一个数码爱好者,只要一推iPhone 13 (A2634) 5G手机午夜色128GB 这个商品,点击率和购买率就非常高。因此,那些销量好的商品的ltem ID本身就是非常强的信号,模型只需要把它牢牢记住,就能取得不错的效果。 ltem ID作为一个类别特征,的确是高维、稀疏的,如果傻傻用One Hot Encoding[4]来描述的话, -个几十万长的向量中,只有一个位置是1,其他地方都是0。如果训练数据比较少,的确没必要拿来当特征,反正也学不出来。但是对互联网于大厂来讲,最不缺的就是训练数据,这时将ltem ID当成特征,还是非常有必要的,能够在物料侧提供最个性化的信息,

# 请简要说明一下物料的类别标签体系是什么样的?

物料的静态画像,是指不依赖用户反馈,只通过分析物料内容就能获得物料的类别、标签等信息。简单来说,就是回答"物料是什么"的问题,一般通过内容理解来得到物料的静态画像。

  • 一级分类:是一个Field, 比如"体育、“"电影、“音乐"、“历史、“军事等是其中的Feature。也可以表示成一个列表 (List)。 比如一篇娱乐报道,可能既属于"电影"类别,同时也属于"音乐"类别,所以它的二级分类Field可以表示成["电影"、“音乐”]这样的List。
  • 二级分类:比如"体育"又可以细分为”足球"、篮球”等子类别;“军事"又可以细分为"一战"、“二战”、"战机"、"战舰"等子类别。
  • 标签:更细粒度地刻画物料的某个方面。比如篮球类别下又可以包含"NBA"、乔丹"等标签;"战机"类别别下又可以包含"歼20"、"F-16'等标签。标签没必要从属于某一具体类别,比如某个明星的名字作为标签,既可能打在”电影"类别的文章上,也可能打在"音乐"类别的文章上。

另外,内容理解算法一般不会直接判断一个物料属于哪个类别或标签,而是给出它从属某个类别或标签的概率。因此,我们可以将这个概率与类别、标签一起加入画像,用映射表"(Map)来表示。比如{”电影”:0.9,"音乐":0.3},表示打标算法有90%的信心认为这篇文章是在讲电影,只有30%的信心认为这篇文章在讲音乐。在特征中引入置信度能够给模型提供额外信息,有助于模型做判断。

# 基于内容提取Embedding这种打标方法有什么好处?

直接打标签的方法,往往是利用CNN或BERT之类的模型,从一篇文章、一个视频中提炼出几个标签,其结果是超级稀疏的。试想一下,整个标签空间可能有几万个标签,而一篇文章往往只含有其中的两三个。 随着深度学习的发展,另一种从物料内容中提取信息的思路是,同样还是用CNN或BERT模型,这回拿模型的某一层的输出,当成物料特征,喂入上层模型。尽管这个向量不如那几个标签好理解,但是它有32位或64位那么长,里面蕴含的信息要比几个标签丰富一些。

# 如何构造物料的动态画像呢?举例说明。

物料的动态画像,指它们的后验统计数据,反映了物料的受欢迎程度,是物料侧最最重要的特征。 物料的动态画像可以从以下两个维度来进行刻画:

  • 时间粒度:全生命周期、过去一周、过去1天、过去1小时...
  • 统计对象:CTR、平均播放进度、平均消费时长、排名...

通过以上两个维度的组合,我们可以构造出一批统计指标作为物料的动态画像,比如:

  • 文章A在过去6小时的CTR
  • 视频B在过去1天的平均播放时长
  • 商品C在过去1个月的销售额

# 为什么说,用物料的后验消费数据做召回存在“幸存者偏差”?能将这些消费数据用于排序吗?

需要辩证地看待这些后验统计数据。 一方面,它们肯定是有偏的,一个物料的后验指标好,只能说明推荐系统把它推荐给了对的人,并不意味着把它推给任何人都能取得这么好的效果,这里面存在着“幸存者偏差”。 另一方面,如果这些后验指标参与精排,“幸存者偏差”的影响还不至于那么严重,毕竟交给精排模型的物料都已经通过了召回、粗排两环节的筛选,多多少少是和当前用户相关的,它们之前的后验指标还是有参考意义。

# 使用物料的后验消费数据做召回,会放大“马太效应”,对新物料不友好,如何缓解?

利用物料的后验统计数据做特征,多少有些纵容马太效应,不利于新物料的冷启。后验指标好的物料会被排得更靠前,获得更多曝光与点击的机会,后验指标会更好,形成正向循环;而新物料的后验指标不好甚至没有,排名靠后而较少获得曝光机会,后验指标迟迟得不到改善,形成负向循环。

# 如何通过用户行为反向对物料进行打标?请举例说明。

推荐系统构造特征的一般流程,都是先有物料画像,再将用户消费过的物料的标签积累在用户身上,就形成用户画像。反向打标是把以上流程逆转过来,将消费过某个物料的用户身上的标签,传递积累到这个物料身上,丰富物料画像。 比如一篇关于某足球明星八卦绯闻的文章,由于该球星的名字出现频繁,NL P算法可能会给它打上“体育"标签。但是后验数据显示,带"体育标签的用户不太喜欢这篇文章,反而带"娱乐"标签的用户更喜欢,显然这篇文章也应该被打上"娱乐"的标签。类似的,给物料打上诸如"文青喜欢的电影榜第3名"、或者"数码迷最喜欢的手机"这样的反向标签,都包含了非常重要的信息,能够帮助提升模型性能。

# 谈谈用户的静态画像特征在推荐系统中起的作用?

静态画像特征诸如性别、年龄、职业、籍贯、用户安装APP列表等信息,主要通过产品设计获取,即如何在守法合规的前提下使用户心甘情愿地分享个人信息。 但这些信息实质上对推荐算法的作用并不大,纯属食之无味,弃之可惜"的鸡肋。对于老用户,他们丰富的历史行为已经足够反映他们的兴趣爱好,自然轮不上人口属性等静态画像发挥重要使用。对于没啥历史行为的新用户,既然主力信息来源失效,很多人都寄希望于通过知道用户的性别、年龄、安装了哪些APP等信息猜测出用户的兴趣爱好,进而进行个性化推荐。但是效果并不明显。有两方面原因:

  • 如果新老用户共用一个模型,比如精排,因为老用户贡献的样本多,从而主导了训练过程,导致训练出来的模型不会重视静态画像等对新用户友好的特征。
  • 如果新用户使用单独模型,比如我们可以基于静态画像单独为新用户添加一路召回,但是由于新用户的行为少,噪声多,我们又没有足够、可靠的数据训练出对新用户有效的模型。

# 为什么说用户唯一标识UserId是一个重要的特征?它存在什么缺点?

UserId提供了用户侧最细粒度的个性化信息。 缺点:

  • 首先,UserID的取值要覆盖上亿用户,使特征空间膨胀得厉害。好在现代大型推荐系统都引入了Parameter Server分布式存储模型参数,User ID增加了一些参数量,问题倒是不大。
  • 其次,UserID的功效也是因人而异。活跃用户贡献的样本多,足以将他们的UserID对应的模型参数(e.g.,一阶权重或Embedding)训练好。但是对于那些不活跃用户甚至新用户,他们的行为有限,贡献不了几条样本,他们的User ID对模型效果就纯属"打酱油"了。由于互联网大厂的主打APP的存量老用户居多,行为丰富,能够提供足够的训练数据,因此在大厂的实践中还是非常喜欢拿UserID当特征的。

# 如何提取用户的动态画像?

用户的动态画像就是从用户的历史行为中提取出来的他的兴趣爱好。说它是动态的,是因为相比于稳定的人口属性信息,这部分信息变化频繁,能够及时反映出用户的兴趣迁移。

最简单直接的动态画像就是,将用户一段时间内用户交互过的物料的ItemID按时间顺序组成的集合。将这个集合扔进模型,让模型自动从中提取出用户兴趣。最简单的提取方式无非就是将每个Item ID先Embedding,再把多个Embedding聚合(也称"池化",Pooling,比如采用加和或平均)成一个向量,这个向量就是用户兴趣的抽象表达。更复杂一点,可以像DIN[2]或SIM[3]那样在Pooling时引入Attention机制,根据候选物料的不同,模型从相同的行为序列中提取出不同的用户兴趣向量,做到"千物千面"。

# 把用户行为序列直接扔进模型的方法的优缺点是什么?可以怎么改进?

将用户行为序列直接扔进模型的作法: 优点:简单直接,无需过多的特征处理工作。 缺点:抽取用户兴趣与CTR建模合为一体,都必须在线上完成。特别是在使用DIN或SIM这种强大但复杂"的模型提取兴趣时,耗时与"序列长度x候选集规模"成正比。所以,当我们希望从历史更久远、长度更长的行为序列中提取用户兴趣,或者将其应用于召回、粗排等候选集规模很大的场景,这种作法根本就无法满足在线预测与训练的实时性要求。另外,这种作法抽取出来的用户兴趣是抽象的向量,解释性很差。

为克服以上缺点,我们可以将"提取用户兴趣与CTR建模解耦,将提取兴趣的工作从线上转移到线下,通过Hadoop/Spark这样的大数据平台,从用户行为历史提取各类统计指标来描述用户兴趣,并且灌到数据库中。在线预测与训练时,只需要根据User ID去数据库中查询相应指标即可,耗时极少。由于计算主要发生在时间充裕的离线环境,我们在统计用户兴趣的时候,可以使用更复杂的算法,回溯更长的历史,关联更多的数据源, 这种"离线抽取,在线查询的抽取方法,其优缺点与"在线抽取"正好相反: 优点:线上获取用户兴趣,只是一个查询操作,耗时低,非常适用于召回、粗排这种候选集庞大的任务。另外,用户兴趣是用各种统计指标来表示,相比于抽象的向量,简单直白,易于理解,而且也能够为运营、用户增长等非算法团队提供帮助。 缺点:抽取出来的兴趣不会随候选物料而改变,针对性不强,无法做到"千物千面”。另外,兴趣抽取主要靠离线定时进行,不能像在线模式那样及时捕捉到用户的兴趣迁移。

# 如何用一种不重不漏的维度展开方法来反映用户的兴趣?

可以从以下6个维度展开,做到不重不漏:

  • 用户粒度,可以是单个用户,也可以是一群用户。针对一个用户群体的统计,有利于新用户冷启。
  • 时间粒度,比如最近的100次曝光,再比如过去1小时、1周、1月。
  • 物料属性,比如视频的一二级类别、标签、作者,再比如商品的分类、品牌、店铺、价位。
  • 动作类型,可以是正向的,比如点击、点赞、转发等,也可以是负向的,比如忽略、点踩。
  • 统计对象,比如次数、时长、金额等。
  • 统计方法,比如加和、求平均、计算各种比例等。

通过以上6个维度的交叉,可以构造出一系列的统计指标来反映用户在各个时间跨度、各个维度上的兴趣爱好: image.png

# 特征交叉有哪几种方式?

手动对特征进行交叉,在深度学习时代仍然是很重要的手段,通过特征交叉,将样本映射至高维空间,从而增加模型的非线性能力,提升模型的预测效果。 在具体交叉方式上,又有做"笛卡尔积"与做"内积"两种方式。 笛卡尔交叉就是将两个Field内的Feature两两组合,组成一个新的Field。比如用户感兴趣的电影类别有 {"动作片"、"科幻片"} ,而当前候选物料的标签是{"施瓦辛格"、"终结者"、"机器人"},这两个Field做笛卡尔交叉的结果就是{"动作片+施瓦辛格","动作片+终结者","动作片+机器人","科幻片+施瓦辛格","科幻片+终结者","科幻片+机器人"},显然"动作片+施瓦辛格"、"科幻片+机器人"都是非常强烈的信号,有助于模型判断用户与物料间的匹配程度。 另一种特征交叉的方法是做点积,即选定一个画像维度(比如标签、分类),将用户在这个维度上的兴趣,和物料在这个维度上的属性,想像成两个稀疏向量,这两个向量做点积结果反映出用户和物料在这个画像维度上的匹配程度。点积结果越大,说明用户与候选物料在这个维度上越匹配。 比如用户感兴趣的标签是Tagsuser={"坦克":0.8,"足球":0.4,"二战":0.6,"台球":-0.3},每个标签后面的数字表示用户对这个标签的喜爱程度,可以拿用户在这个标签上的后验指标来表示。而当前候选物料的标签是Tagsiem=("坦克":1,"二战":0.5,"一战":0.8}。将T'agsuser与是Tagstem做点积,也就是将共同标签对应的分数相乘再相加,结果是1.3,表示用户与当前候选物料在"标签"这个维度上的匹配程度。 https://zhuanlan.zhihu.com/p/565644934 (opens new window)

# 请解释一下什么是bias特征?你能举出哪些bias特征的例子?

众所周知,推荐模型是根据用户的曝光点击记录训练出来的。这其中蕴含的前提假设是,我们认为点击与否反映了用户的真实兴趣爱好,但是严格来讲,以上假设并不成立。具体实践中,我们无法做到让所有候选物料在一个绝对公平的环境中供用户挑选,这也就意味着用户的选择并非完全出于他的兴趣爱好,用户点击的未必是他喜欢的,没点击的也不代表用户就一定不喜欢。这种不可避免地引入的不公平因素就叫作"偏差"(Bias)。 推荐系统中最常见的是”位置偏差"(Position Bias),如图所示。 image.png 图2-2中视频1和2,都是用户喜欢的,并且占据了靠前的醒目位置。用户注意到了它们,并通过点击给出了正面反馈。视频4是一个体育视频,其实也是用户喜欢的,如果用户看到了,是一定会点击的。但是由于视频4的曝光位置太偏,落在了用户的视线之外,所以未发生点击,训练时会被当成负样本,显示用户不喜欢视频4。这就是由"位置偏差"引发的用户兴趣与反馈之间的脱节。这种偏差会误导模型,因为模型看到视频4的负样本时,可不知道它是由于位置太偏造成的,反而会猜测这名用户可能不喜欢"体育"这个类别,未来减少给他推荐"体育"类视频,从而降低了用户体验。

# 如何解决位置偏差的问题?

一种方法是从数据入手,比如更加严格地定义正负样本。比如有一种Above Click的作法规定,只有在点击物料上方的未点击物料,才能被纳入训练数据当成负样本。图中视频2和4都未被点击。根据Above Click规则,由于视频3是最下边一条被点击的视频,视频2被认为是真正被用户看到了却未点击,说明用户真心不喜欢视频2,应该当成一条负样本。而视频4的未点击可能是因为未被用户看到,谨慎起见,就不被参模型训练了。 image.png

另一种解决方法就是从模型入手。前面讲到了,模型之所以被误导,是因为它不知道这个负样本是由于偏差造成的,还是由于其他别的原因。纠正的方法就是将偏差因素当成特征也喂进模型,使模型有足够多的信息来给用户反馈找出合理解释。

# bias特征怎样接入模型?能否和其他正常特征一起喂入DNN底层?为什么?

"曝光位置"在训练时倒是能够拿得到,但是在线预测时,“曝光位置”是模型预测的”果",怎么可能作为"因"喂入模型呢? 对于以上这种”本末倒置”的问题,我们的解决方案是,在预测时,将所有候选物料的曝光位置一律填写成0,也就是假设所有候选物料都展示在最醒目的位置上,让模型根据其他因素给候选物料打分,并根据打分形成最终真实的展示顺序。像0号展示位置"这种因为预测时拿不到而统一填充的特征值,我们称它们为"伪特征值”。 但为什么在预测时要将所有展示位置填成0,填成1或2不行吗?如果不行的话,岂不是选择不同的"伪特征值,排序结果也会发生变化?那就说明排序过程深受一个未知因素的影响,听着都不靠谱。 这就牵扯到另外一个重要问题,就是这个Dummy Feature应该加在模型的什么位置上?答案是:Dummy Feature只能通过一个线性层加入模型,绝对不能和其他正常特征一起喂入DNN,如图所示。只有这样接入,才能保证预测时无论"伪特征值"的取值如何,都不会改变排序结果。 image.png 简单分析其中的原因,按照图2-4,最终打分:

  • DNN是推荐模型的深层网络部分
  • u和t表示来自用户与候选物料的真实特征
  • w是负责接入偏差特征的线性层的权重
  • b代表偏差特征向量,这个例子中只有"展示位置"一个值。训练的时候,b取真实的展示位置。预测的时候,b统一填成某个"伪特征值".

如果按照图2-4那样接入"偏差特征",排序结果能够满足公式(2-2),即无论"伪特征值"取多少,都不影响我们得到真实排序,

  • DNN是推荐模型的深层网络,w是负责接入偏差特征的线性层的权重。
  • u代表用户的真实特征,t1和t2代表两个候选物料的真实特征。
  • b1和b2表示给偏差特征,先后使用两个不同的"伪特征值"。
  • SORT代表排序函数。
  • 表示只基于真实特征的排序结果,也是我们希望得到的排序结果。

反之,如果将偏差特征和其他真实特征一同喂入DNN,则排序结果满足公式。 这是因为DNN的高度非线性,使"伪特征值"与真实特征值产生深度交叉,预测时采用不同的"伪特征值",将产生完全不同的排序结果。这就使排序结果严重依赖于一个在预测时的未知因素,是绝不可用的。

# 除了位置偏差,还有哪些偏差呢?

除了“位置偏差",Youtube还发现视频的"年龄"(当前时间减去上传时间)也会造成偏差。推荐模型会用视频的各种后验消费指标(比如点击率、人均观看时长等)来衡量物料的受欢迎程度。上传早的视频有足够长的时间来积累人气,所以后验指标更好,模型排名更高,;反之,新上传的视频还没有积累起好看的后验数据,模型排名较低,不利于新视频的冷启动。为了减轻这一偏差,Youtube在训练时将视频年龄作为偏差特征喂入模型,而在预测时统一设置成0。