看到知乎上的一个问题“如何向深度学习模型中加入先验知识?”,觉得这是一个很好的问题,恰好自己在这方面有一些心得,今天拿出来和大家聊一聊。

说这个问题有趣,是因为提问者一定是对DNN的“智能”程度不满意了:DNN不是号称自己“万能函数模拟器”吗?这么明显不过的pattern, dnn怎么就学不到呢?一天到晚地出bad case,在产品运营小mm眼中的高大上形象正一点点在崩塌,唉,恨铁不成钢。

我们能够发现的pattern和bad case,就是“先验知识”。用人类的“先验知识”提升模型质量,这个问题还是太大了。本文还是只聚焦于我的老本行“推荐领域”,再聚焦于其中的两个具体问题:

  • 特征就是重要的先验知识。但是有时我们自认为加入了一个非常重要的特征,但是模型效果却没有提升。很有可能是你加的位置不对。第一个话题,就讨论如何将“先验重要”的特征加到合适的位置。

  • 第二个问题关注的是,在多任务推荐场景下,如果某个目标训练不好,我们如何利用先验知识替它找个帮手。

先验重要的特征要加到合适的位置

设计特征,是将先验知识注入模型的重要手段。别听什么“深度学习不需要特征工程”鬼话+屁话+外行话,“garbage in, garbage out”才是我们搞算法应该信奉的金科玉律。

但是很多时候,我们会陷入一种尴尬的场景:绞尽脑汁地设计了特征,费劲巴拉地打通了上下游数据链路,爆肝费神地将数据回溯好,加入模型训练一看,离线指标稳稳不动如山,顿时气也泄了三分。

唉,多么熟悉的场景,又多么痛的领悟!造成这种情况的原因有很多,我来谈其中一个原因,就是,如果你的“先验”的确成立的话,那么这个重要特征没发挥作用的原因,很可能是你没把他放到合适的位置上

之前,我们都非常迷信DNN的表达能力,吹捧它是“万能函数模拟器”。但是近年来,很多研究表明,DNN没传说地那么强,正如DCN作者在论文中所宣称的那样,“People generally consider DNNs as universal function approximators, that could potentially learn all kinds of feature interactions. However, recent studies found that DNNs are inefficient to even approximately model 2nd or 3rd-order feature crosses.”。正因如此,如果你先重要的特征加到DNN底部,层层向上传递,恐怕再重要的信息到达顶部时,也不剩下多少了。另外,推荐系统中,DNN的底层往往是若干特征embedding的拼接,动辄几千维是小意思,这时你再新加入一个特征32维embedding,“泯然众人矣”,恐怕也不会太奇怪

那么“先验”重要的特征到底要加到哪里才能发挥作用呢?根据业界和我个人的经验,一是要加得浅,二是让它们充当其他特征的裁判。

重要特征加得浅

其实这种思路并不新鲜,就是经典的Wide & Deep,。wide侧就是一个LR,或者条件再放宽一些,就是一个非常浅的小dnn,加入wide侧的特征离最终目标也近,避免自dnn底部层层传递带来的信息损失,更有机会将我们的先验知识贯彻到“顶”

公式容易写,问题是哪些特征要进wide侧,哪些特征要进deep侧?在我之前的文章《看Google如何实现Wide & Deep模型》就指出过,wide侧负责记忆,因此要将“根据人工经验、业务背景,将我们认为(i.e.,先验)有价值的、显而易见的特征及特征组合,喂入Wide侧”。具体在推荐领域,比如:

  • 特征及特征对上的统计数据,e.g., <男性,20~30岁,内容标签是‘二战’>上的点击率、分享率、平均时长等;

  • 我们已经发现了(i.e., 先验)非常明显的用户分层,比如登录用户 vs. 未登录用户、不同国家的用户、......,用户行为完全不同。为了提升模型对“用户是否登录”、“用户地域”这样强bias特征的敏感度,这些特征也加入wide侧。

  • 与用户分层类似,在multi-domain的推荐场景下(比如:首页推荐与猜你喜欢,混合训练),淘宝的STAR《One Model to Serve All: Star Topology Adaptive Recommender for Multi-Domain CTR Prediction》也是将domain-id这样的强bias特征,喂入一个非常简单的dnn,得到的logit再叠加到主模型的logit上,算是wide&deep的一个变种。文中还强调,“the auxiliary network is much simpler ...... The simple architecture makes the domain features directly influence the final prediction”

重要特征当裁判

对于一些强bias特征(e.g., 用户是否登录、用户所在国家),除了将它们加浅一些,离loss近一些,还有一种方法能够增强它们的作用,避免其信息在dnn中被损失掉,就是采用SENet或LHUC(Learn Hidden Unit Contribution)这样的结构。

  • 强bias特征作为LHUC的输入,经过sigmiod激活函数后,输出是一个N维度向量,N是所有field的个数

  • N维向量就是各field的重要性,将其按位乘到各field的embedding上,起到增强或削弱的作用

  • 加权后的各field embedding再拼接起来,喂入上层DNN

这种结构,将一些先验认为重要的强bias的特征,放到裁判的位置,决定其他特征的重要性。比如,如果产品设计不允许未登录用户转发或评论,那么显然“用户未登录”这个特征值,就“应该”(suppose)将转发、评论相关特征的权重置为0,因为它们不能代表用户的真实意图。

这样做,相比于将所有特征“一视同仁”、一古脑地喂入DNN最底层等候上层dnn筛选,更能发挥重要特征的作用,将“先验知识”(e.g., 产品设计限制)深入贯彻。

题外话:交叉统计特征是重要先验

对于推荐模型,一个重要话题,就是特征之间的交叉(推荐五环中的第4环),引无数推荐打工人竞折腰

  • DNN是高阶隐式交叉,就像个黑盒,交叉成什么样了?我也不知道

  • FM和DCN,都是指定维度的显式交叉。

以上两种交叉其实描述的都是特征之间的共现,比如“用户是男性,同时,候选商品是篮球”,被业界研究得比较多。但是还有一类交叉,我感觉是业界谈论得比较少的,但是也是最能直接体现“先验知识”的,就是交叉特征上的统计数据,比如<男性,20~30岁,内容标签是‘二战’>上的点击率、分享率、平均时长。

但是使用这样的统计特征,有两大难点:

  • 泛化能力差。统计特征只能涵盖样本中经常出现的特征组合,对于罕见的特征组合,假设<男性,口红>,要么统计结果不置信,要么干脆在样本中就从未出现过。

  • 存储量巨大,需要存储任意两个特征值组合对应的统计数据。

为了更好地利用“统计特征”这一先验知识,阿里妈妈在SIGIR 21《Explicit Semantic Cross Feature Learning via Pre-trained Graph Neural Networks for CTR Prediction》一文中提出了用预训练来解决以上难题的思路:

  • 预训练一个模型,输入两个特征,输出这一对特征组合上预估的xtr

  • 预训练的时候用了GNN

    • 顶点就是样本中出现过的categorical feature,样本中常见共现特征之间建立边,边上的值就是这一对儿特征离线统计出的xtr

    • 按照link prediction的方式来训练GNN

阿里这种Pre-trained Cross Feature Learning的好处在于,用“预测”代替了“存储”,从而节省了存储量,而且对于不常见、甚至未出现过的特征组合也能够给出统计特征。感兴趣的同学可以下来原文阅读。

先验知识帮稀疏目标找帮手

多任务已经成为推荐系统的标配,以内容推荐为例,我们推荐出的内容,不仅要让用户点击,点击之后还要尽可能多地消费时长,还要鼓励用户转评赞,并上传自己制作的内容。卷卷的互联网人从来不做选择,我们都要!!!

多目标之间往往存在依赖关系(e.g., 先点击,再转化),从而导致消费链路靠后的环节,正样本稀疏,训练困难。所以,需要将信息从链路先前的环节,向链路靠后的环节迁移

多目标之间的信息迁移,自然有MMOE、PLE这样的“全自动”方案,但是和其他dnn结构一样,它们也有“黑盒化”的缺点,也不知道它们实现的迁移是否符合我们的常识。因此,利用先验知识制订多目标之间的显式信息迁移规则,也就成了题中应用之义。

显式信息迁移的典型就是阿里的ESMM模型。pCTCVR=pCTR*pCVR。CTR任务的数据更多,预测精度更高,会给CTCVR的预测任务以提示。

将这种思路泛化之,“拿链路前端环节的输出,作为链路后端环节的输入”,也就成了“利用先验知识显式制订信息迁移规则”的典型手法。前端环节本来就会对后端环节施加重大影响,而且前端环节的训练数据丰富,它的隐层输出,将会对数据稀疏的后端环节的训练,带来极大帮助。不过,需要注意的是,在将前端环节的输出作为后端环节的输入之前,往往要先stop-gradient,防止后端稀疏环节反而将训练好的前端隐层带偏。

结论

DNN的表达能力没有传说中那么强,因此在DNN训练过程中注入人工先验知识,还是非常有必要的。本文聚焦于推荐领域,介绍了两类注入先验知识的方法:

  • 特征是将先验知识注入模型的重要手段。但是为了能让这些先验重要的特征发挥作用,需要将它们加到浅层网络,或者作为判断其他特征重要性的裁判,而非一古脑地和其他特征混杂一起加到DNN底层。另外,文中还指明,交叉特征对儿上的统计数据是非常重要的先验知识,值得深入研究并使用之。

  • 在多任务推荐场景下利用先验知识显式地设计信息迁移规则,将信息由链路前端、数据丰富的环节向链路后端、数据稀疏的环节迁移,从而提升稀疏目标的训练质量,有时能够获得比MMoE、PLE这种隐式、自动信息迁移更好的效果。

- END -

更多搜索/推荐/NLP顶会论文解读

Recsys'21 | 基于Transformers的行为序列建模

Recsys'21 | 浅谈推荐系统如何在NLP的肩膀上前进

WSDM'22 | 特征交互新路线, 阿里 Co-action Network论文解读

KDD'21 | 揭秘Facebook升级版语义搜索技术

KDD'21| 淘宝搜索中语义向量检索技术

SIGIR'21|SGL基于图自监督学习的推荐系统

KDD'19| ConcepT 腾讯如何打造概念标签体系?

KDD'20| Facebook语义向量召回之ANN检索

MM'19 | MMGCN 面向短视频推荐的多模态图神经网络

CIKM'19| LambdaLoss | Google排序学习优化框架

ICML'19 | 基于分离式表征的图神经网络调研

AAAI 2020 | MA-GNN 记忆增强的图神经网络序列推荐方法

SIGIR2020| GCE-GNN基于全局上下文增强的图神经网络序列推荐方法

给推荐系统加入先验知识的方法总结相关推荐

  1. 如何将先验知识注入推荐模型

    看到知乎上的一个问题"如何向深度学习模型中加入先验知识?",觉得这是一个很好的问题,恰好自己在这方面有一些心得,今天拿出来和大家聊一聊. 说这个问题有趣,是因为提问者一定是对DNN ...

  2. 基于图卷积网络的测量与先验知识相结合的故障诊断方法

    目录 Graph Convolutional Network-Based Method for Fault Diagnosis Using a Hybrid of Measurement and Pr ...

  3. matlab hough算法车牌识别,一种利用Hough变换和先验知识的车牌识别新方法

    随着交通管理系统的日趋现代化,车牌自动识别系统成为智能交通系统的重要组成部分.通过对当前车牌识别的基本原理和主要方法的研究,分析比较各种识别方法的优缺点,针对车牌定位.字符分割和字符识别,本文提出一套 ...

  4. 从0到1详解推荐系统的基础知识与整体框架

    猜你喜欢 0.淘宝首页猜你喜欢推荐建模实践 1.[免费下载]2022年6月份热门报告 2.[实践]小红书推荐中台实践 3.微信视频号实时推荐技术架构分享 4.对比学习在宽狩推荐系统中的应用实践 5.微 ...

  5. 目标检测中的知识蒸馏方法

    目标检测中的知识蒸馏方法 知识蒸馏 (Knowledge Distillation KD) 是模型压缩(轻量化)的一种有效的解决方案,这种方法可以使轻量级的学生模型获得繁琐的教师模型中的知识.知识蒸馏 ...

  6. 【知识图谱】 | 《知识图谱——方法、实践与应用》阅读笔记

    <知识图谱--方法.实践与应用>的阅读笔记 知识图谱--方法.实践与应用 第1章 知识图谱概述 1.1 什么是知识图谱 1.2 知识图谱的发展历史 1.3 知识图谱的价值 1.4 国内外典 ...

  7. 综述:如何给模型加入先验知识

    点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 作者丨Billy Z@知乎(已授权) 来源丨https://zhua ...

  8. 首个中文多项选择阅读理解数据集:BERT最好成绩只有68%,86%问题需要先验知识...

    赖可 发自 亚龙湾移动凹非寺 量子位 报道 | 公众号 QbitAI 横扫一众基准测试的BERT等NLP模型,好像没那么强了. 因为它们遇到了一个中文数据集. 康奈尔大学留学生发布了第一个自由形式的中 ...

  9. 不使用先验知识与复杂训练策略,从头训练二值神经网络!

    选自 arxiv 作者:Joseph Bethge.Marvin Bornstein.Adrian Loy.Haojin Yang.Christoph Meinel 机器之心编译 参与:张玺.路 来自 ...

  10. 谷歌发布TensorFlow 1.4与TensorFlow Lattice:利用先验知识提升模型准确度 搜狐科技 10-12 15:29 选自:Google Research Blog 参与:李泽南、

    谷歌发布TensorFlow 1.4与TensorFlow Lattice:利用先验知识提升模型准确度 昨天,谷歌发布了 TensorFlow 1.4.0 先行版,将 tf.data 等功能加入了 A ...

最新文章

  1. 计算器,利用灰度图的顶帽扣出数字
  2. js获取页面url中的各项值
  3. RHEL/CentOS 一些不错的第三方软件包仓库
  4. linux内核网络协议栈--kernel bridge转发逻辑(十一)
  5. 2021牛客暑期多校训练营2 G.League of Legends(转化+单调队列)
  6. 线性调频信号(LFM)的形式及幅度谱、相位谱特性
  7. python高阶函数看不懂_Python进阶:高阶函数的详细说明
  8. C#LeetCode刷题之#404-左叶子之和​​​​​​​​​​​​​​(Sum of Left Leaves)
  9. Js将字符串转数字的方式
  10. python端口转发_Python实现TCP/IP协议下的端口转发及重定向示例
  11. 双系统(win7+ubuntu)ubuntu磁盘空间不足时解决方法
  12. 多多客接入(拼多多)
  13. MODIS数据下载及图像处理教程
  14. mp4的box信息——avcC,mdat
  15. DCT变换(JAVA)
  16. pycharm网站打不开的解决措施
  17. 传奇私服游戏支付接口申请(已解决)
  18. iOS录音转码:amr转wav,wav转amr
  19. 面试题:如何判断一个对象是否属于某个类
  20. 高等数学(第七版)同济大学 习题9-8 个人解答

热门文章

  1. C# 实现数字转汉字大写
  2. 人生最重要的概念:复利
  3. 河南巴旦木生态农业:巴旦木与杏仁有哪些不同,如何分辨巴旦木仁与杏仁?
  4. vue前端导出(XLSX)
  5. cpu排行计算机专业,2020最新电脑cpu性能天梯图 i5i7i9处理器性能排行榜介绍
  6. 瞬时功率与有功功率计算公式
  7. 用户画像理解和方法论
  8. 树莓派Python编程手册
  9. 画PCB四层板细节总结
  10. (18)全民小视频引流脚本模块化开发12-任务总数与时间间隔By飞云脚本学院