推荐算法的学习

devtools/2024/10/17 18:10:03/

文章目录

  • 前言
  • 1、模型
    • 1.1 从本领域模型的发展历史中学习
      • 1.1.1 在历史中总结发展规律和趋势
      • 1.1.2 发现模型之间的共性,方便记忆
    • 1.2 从其他领域的发展中学习
      • 1.2.1 注意力机制
      • 1.2.2 残差网络
    • 1.3 实践该怎么办?
  • 2、 特征
    • 2.1 数据源的选择与建立
    • 2.2 特征构造
      • 2.2.1 用户特征
      • 2.2.2 物料特征:
    • 2.3 特征组合和交叉
      • 2.3.1 经典特征交叉的方式:
        • 2.3.1.1 物料共现记录法:
        • 2.3.1.2 统计维度交叉法:
    • 2.4 特征选择
  • 3、样本
    • 3.1 正负样本
    • 3.2 跟着精排做召回
    • 3.3 再举一些样本技巧的例子:
  • 总结


前言

算法>推荐算法学习,自用自学,🈲转载


1、模型

请添加图片描述

1.1 从本领域模型的发展历史中学习

经过长时间的发展,现在基本上已经从早期的LR,到树模型到现在的深度模型,新的模型结构层出不穷。为了更好的学习,我们梳理其发展历史,总结发展趋势和模型之间的关系,将知识编织成网状结构,从而方便我们记忆和领会其精髓。
下面以ctr预估模型为例:CTR预估模型发展的历史

1.1.1 在历史中总结发展规律和趋势

从上往下,代表了整个CTR预估的发展趋势:

  1. LR的主要限制在于需要大量手动特征工程来间接提高模型表达,此时出现了两个发展方向:
  • 以FM为代表的端到端的隐向量学习方式,通过embedding来学习二阶交叉特征
  • 以GBDT+LR为代表的两阶段模型,第一阶段利用树模型优势自动化提取高阶特征交叉,第二阶段交由LR进行最终的学习
  • 阿里提出的MLR,以多个LR模型来提高整体模型性能。后续未见有继续发展。
  1. 以FM为结点,出现了两个方向:
  • 以FFM与AFM为代表的浅层模型改进。这两个模型本质上还是学习低阶交叉特征,只是在FM基础上为不同的交叉特征赋予的不同重要度
  • 深度学习时代到来,依附于DNN高阶交叉特征能力的Embedding+MLP结构开始流行
  1. 以Embedding+MLP为结点:
  • Embedding层的改造+DNN进行高阶隐式学习,出现了以PNN、NFM为代表的product layer、bi-interaction layer等浅层改进,这一类模型都是对embedding层进行改造来提高模型在浅层表达,减轻后续DNN的学习负担
  • 以W&D和DeepFM为代表的双路模型结构,将各个子模块算法的优势进行互补,例如DeepFM结合了FM的低阶交叉信息和DNN的高阶交叉信息学习能力
  • 显式高阶特征交叉网络的提出,这一阶段以更复杂的网络方式来进行显式交叉特征的学习,例如DCN的CrossNet、xDeepFM的CIN、AutoInt的Multi-head Self-attention结构
  • 由于现在业务场景的负责,特别是广告领域OCPX和信息流领域互动,时长等多目标同时预测需求的提出,MMOE和ESMM这两种多目标模型也随之出现。
    从整个宏观趋势来看,每一阶段新算法的提出都是在不断去提升模型的表达能力,从二阶交叉,到高阶隐式交叉,再到如今的高阶显示交叉,模型对于原始信息的学习方式越来越复杂的同时,也越来越准确。

1.1.2 发现模型之间的共性,方便记忆

右侧红色字体提取了部分模型之间的共性:

  • 手动特征:LR与W&D都需要进行手动的特征工程
  • 非端到端:GBDT+LR通过树模型提取特征+LR建模的两阶段,FNN则是FM预训练embedding+DNN建模的两阶段方式,这两者都是非端到端的模型
  • 多次嵌入:这里是指对于同一个特征,使用多个embedding来提升信息表达。包括FFM的Field-aware,ONN的Operation-aware
  • 注意力机制:Attention机制为CTR预估中的交叉特征赋予了不同的重要性,也增加了一定的可解释性。AFM中采用单个隐藏层的神经网络构建attention层,AutoInt在Interacting Layer中采用NLP中QKV形式学习multi-head self-attention
  • 显式交叉:DNN本身学习的是隐式特征交叉,DCN、xDeepFM、AutoInt则都提出了显式特征交叉的网络结构
  • 参差网络:ResNet的引入是为了保留历史的学习到的信息,CrossNet与AutoInt中都采用了ResNet结构
    另外一种分类思路:请添加图片描述

1.2 从其他领域的发展中学习

不同领域的相互借鉴:
再以CTR预估模型为例,看看从其他机器学习领域借鉴(抄袭)来了什么?

1.2.1 注意力机制

Attention机制最早在视觉领域提出,2014年Google Mind发表了《Recurrent Models of Visual Attention》,使Attention机制流行起来,这篇论文采用了RNN模型,并加入了Attention机制来进行图像的分类。
2005年,Bahdanau等人在论文《Neural Machine Translation by Jointly Learning to Align and Translate》中,将attention机制首次应用在nlp领域,其采用Seq2Seq+Attention模型来进行机器翻译,并且得到了效果的提升,Seq2Seq With Attention中进行了介绍。
2017 年,Google 机器翻译团队发表的《Attention is All You Need》中,完全抛弃了RNN和CNN等网络结构,而仅仅采用Attention机制来进行机器翻译任务,并且取得了很好的效果,此文一出,注意力机制立马变成热点,也被广告和推荐领域所注意到,AFM和DIN等网络模型也随之出现。

1.2.2 残差网络

残差网络(Residual Network简称ResNet)是在2015年继Alexnet Googlenet VGG三个经典的CNN网络之后提出的,并在ImageNet比赛classification任务上拔得头筹,ResNet因其简单又实用的优点,现已在检测,分割,识别等领域被广泛的应用。
ResNet可以说是过去几年中计算机视觉和深度学习领域最具开创性的工作,有效的解决了随着网络的加深,出现了训练集准确率下降的问题。
请添加图片描述

残差单元可以以跳层连接的形式实现,即将单元的输入直接与单元输出加在一起,然后再激活。
DCN网络就借鉴了ResNet的思想,可以将原始信息在CrossNet中进行传递
请添加图片描述
每一层都将上一层的结果addtion后生成了本层的输出。

1.3 实践该怎么办?

今天看到transformer在NLP里面序列建模很有效果,而推荐中也有用户的行为序列,就把transformer借助过来;再比如xdeepfm看起来很厉害,赶快也拿过来试一试。所以对于模型结构派来说,只要业界有新的发展(paper),永远不会陷入没事情可做的境地,而且像transformer这样的技术确实也能在推荐中发挥很大的作用,能拿到很不错的收益。
对于高手来说,有的模型变形不大,看起来是蜻蜓点水,然而效果却非常犀利。他们能把深度学习的很多技术和之前的机器学习技术都融会贯通。但是对于初学者来说,经常会陷入不断尝试新模型,不断猴子掰苞谷的境地之中。似乎自己厉害,什么模型都能搞一下。模型看似猛如虎,一看实验报告万分之五。而且新的模型网络结构也越来越复杂,算力要求越来越高。好容易做正一个实验,要么延迟有问题,要么为了降低延迟,部署的打分服务数量乘2。导致算法效费比越来越低。这样的工作其实就是吃了现在算力提升的红利,而非真正创新性的工作。而且导致后面迭代越难,因为没那么多算力提升的红利可吃。
但是算法工程师有时候会陷入一种误区,就是只有模型创新才算创新。万般皆下品,唯有模型高。大家争相内卷:你能看paper,我也能看,你能实现一个新算法,我也能实现。管他合适不合适,先搞上去试一试。把不work的东西包装成有效果,把不必要的环节强行加进去等等,然后大加吹捧。这是一个非常不健康的路径。
工业界做算法本质还是要实事求是+创新。看文章实现仅仅是初出茅庐的水平,如果想做出真正有价值的东西,应该对模型结构有自己的认识,有自己的理解,到底他合适不合适当前的场景。我们做的业务场景能不能发挥出这个模型的创新点和优势。
另外对于推荐系统模型学习有下面几个建议:

  1. 注重基础模型的学习和理解,同时关注业界最新的进展
  2. 重点精读和实践工业界的论文,对于学界的论文有甄别的读
  3. 关注其他领域的重点发展,可能有重大的借鉴意义

2、 特征

数据和特征决定了机器学习的上限,而模型算法只是尽可能逼近这个上限。
所谓特征工程,就是对原始数据进行一系列工程处理,作为输入供算法和模型使用,方便模型易于学习,提升模型效果的过程。本质上讲,特征工程的目的是去除原始数据中的杂质和冗余,设计更高效的特征以刻画求解问题与预测模型之间的关系。请添加图片描述

2.1 数据源的选择与建立

在数据化时代,用户每天都要产生大量数据。把所有的数据都做成特征 ,以供算法使用是不现实且浪费的。哪些数据对你所负责的业务有用,哪些没有用,在数据源的选择上必须有所取舍。
取舍的关键首先要理解业务,寻找业务中关键点,可能会影响业务指标的关键因素。比如信息流业务中,从算法>推荐算法的协同原理和用户的兴趣来看,用户点击文章的历史非常重要。那么就要将这个数据选择为将要使用的数据源。如果没有就需要想办法让能够产生数据的业务方去产生这样的数据。这就是数据源的建立。

2.2 特征构造

这里的特征构造着重于如何构造复杂的特征而非简单的特征抽取方法。
原始的数据一般是没有办法喂给模型直接使用的,这就需要将原始数据抽取成模型可以使用的特征的格式。比如用户历史,一般在原始数据中是一条条用户的点击记录日志。这样的日志是没办法让模型直接使用的。下面以推荐常用的特征构造方法为例:

2.2.1 用户特征

没有类似于din的模型之时,就可以通过统计之前用户在category或者sub category上的曝光,点击和点击率信息来抓住用户历史的信息。
cate点击率统计:{“社会—点击率”:0.02,“军事-点击率:0.06”}
cate曝光统计:{“社会—曝光”:200,“军事-点击率:100”}
cate曝光点击:{“社会—点击”:4,“军事-点击:6”}
cate的点击占比统计:{“社会—点击”:0.4,“军事-点击:0.6”}
对cate=“社会”的点击占比(i.e., 用户一共点击了10文章,其中6篇带cate=“社会”,点击占比=0.6)
subCate点击率统计:{“反腐打虎-点击率”:0.25,“国内时政-点击率”:0.05,“国际足球-点击率”:0.03,“西甲-点击率”:0.01}
后续可能我们还会需要加上时间维度(时间太长可以考虑时间衰减),比如多少天内的。
再加上统计值过小不置信的时候可以加上平滑(威尔逊平滑,贝叶斯平滑)
实践下来 我们总结出来以下的方法
在这里插入图片描述
而有了DIN这样的模型之后,可以将用户点击的n个文章历史抽取成:
list historyIds : {“id1”,“id2”…“idn”}
list historyCats: {“cate1”, “cate2”, “caten”}
list historySubcats: {“subcate1”, “subcate2”, “subcaten”}

2.2.2 物料特征:

物料特征最重要的就是后验特征,与用户特征类似,我们可以总结以下方法:
在这里插入图片描述
例子:
24小时内文章a被点击的次数
30天内文章b被阅读的平均时长

2.3 特征组合和交叉

  • 举个简单的例子:
    • 到了春节,来了中国人,电商网站给他推饺子,大概率能够成交
    • 到了感恩节,来了美国人,电商网站给他推火鸡,大概率也能成交
      请添加图片描述

为什么?因为<春节,中国人,饺子>的模式、<感恩节、美国人、火鸡>的模式在训练样本中出现得太多太多了,模型只需要记得住,下次遇到同样的场景,“照方扒抓药”,就能“药到病除”。如果我们构造出 <节日—国家-物品>这个交叉特征后,模型就很容易记住“春节-中国人-饺子”、“感恩节-美国人-火鸡”这样的特征对于成交率非常重要。从而提高模型的预测准确率。

这个简单的例子说明了特征组合和交叉是非常重要的。

DNN才出来的时候号称MLP可以模拟任何函数,达到特征自动交叉的能力。但是现在越来越多实践发现多层mlp的拟合能力只是理论上的,再多层的mlp都比不上网络结构上直接的交叉。因此我们可以看到各种非常复杂的模型,其改进部分相对于dnn就是提供了特征组合和交叉的能力。例如:DCN

其核心是一个叫做Cross Network的旁路,这一路是专门对特征进行交叉的。按照设计,这路网络会对特征进行任意有限阶交叉。其核心设计可以用下面的公式来表示:

请添加图片描述
其中, x(l)和x(l+1) 分别是DNN中,输入层和输出层的中间结果(向量)。 x0为一开始的输入特征的embedding的拼接,它会在每一个层都参与运算。 w就是这层要学习的权重了,这也是一个向量。结构上也可以用下面的图来辅助理解:
请添加图片描述

还有xdeepFM和DCN v2等更加多自动交叉的网络。其目的都是为了改进特征的自动交叉能力。

但是我们自己的实践中一般情况下手动的交叉效果还是大幅的强过通过模型带来的自动交叉组合。与此同时没有文献会说明某个具体的高阶,或者某种具体的形式是能够确定涨点的。又比如我们希望有人能够分享经验,说把用户,物料,环境信息三者交叉能涨点,或者这些大方面中的哪些具体特征交叉起来是最有利的。没有这些经验,高阶的探索变的很不确定,如果只是说就把所有的东西大杂烩放进去,那么里面可能有很多浪费的计算,而且操作很不经济。理解业务,设计特征交叉和交叉的方式是现在业界在实际操作中比较需要的地方,也是成长为高手需要积累的经验。、

2.3.1 经典特征交叉的方式:

2.3.1.1 物料共现记录法:

2016年google发表了著名的wide&Deep模型被广大算法工程师奉为圭臬,大家记忆更深的应该下面的模型结构Wide部分神经网络和深层的Deep部分多层神经网络。
请添加图片描述
但是其实论文中隐含了一种特征构造的方法,即物料共现记录请添加图片描述
大家可以看到红圈内的Wide部分采用了什么特征,它采用了两个id类特征的交叉,这两个id类特征是:已安装应用当前曝光应用

这篇文章是Google的应用商店团队Google Play发表的,我们不难猜测Google的工程师使用这个组合特征的意图,他们是想发现当前曝光app和用户安装app的共现关系,以此来直接影响最终的得分。

这种物料共现记录的方法适用于物料并不是特别多的场景,因为这种物料的交叉特征的one hot编码将会是n*n级别的。在应用商店这种万级别物料的情况下,加上L1 FTRL的优化函数(会让交叉特征的大部分权重都为0)的加持,参数规模就是能够承受的。

2.3.1.2 统计维度交叉法:

由于物料共现方法在信息流内容推荐的场景比较难以运用,因为信息流推荐的场景的物料基本都在百万以上。n*n的参数规模将会在万亿级别。所以可以退一步,将用户在物料的反馈以分类标签维度进行统计,再与当前物料进行交叉。
历史统计为以下形式:
{“社会—点击”:4,“军事-点击“:6,”生活-点击“:3,“宠物-点击”:5},
当前物料分类为“军事”时
可以交叉形成特征:{当前分类-点击:6}
也可以形成多个交叉特征
{“社会—军事-点击”:4,“军事-军事-点击“:6,”生活-军事-点击“:3,“宠物-军事-点击”:5}

2.4 特征选择

这里篇幅问题不予赘述。

3、样本

要想让模型的训练起来,仅仅有特征还不够。样本中一条完整的样本包含{x,y}两部分,其中x既是特征,是刚才在特征派进行大量讨论的。而y既是label/reward,是模型学习的目标。如果目标定义错了,那么相当于在教模型错误的东西。那么模型还怎么可能得到我们期望的结果。相当于一个模型,三观坏了,模型搞得再复杂,学习能力再强,喂进去的特征再厉害,最终训练出来的模型也只会给出错误的预测。
我们的模型说白了就是一组“规则”,一组动态的,具有自我生长和自我调节能力的规则,而赋予模型这个能力的正是样本,通过样本向模型向模型传递“什么是好?什么是坏“的反馈信号,好的我们要鼓励,通过正样本告诉模型,这样做对了。坏的我们要惩罚。通过负样本告诉模型,这是坏的。

3.1 正负样本

可能大家会有疑惑就是,正负样本不是很好定义么?拿推荐CTR模型的正负样本来说:点击就是正样本,曝光没点击就是负样本嘛,不是很好定义么。

想像刷信息流的时候是不是经常有这样的场景:

  • 不小心点了个文章,不是自己喜欢的,马上退了出来。
  • 标题看起来很有意思的一个文章,点进去一看原来是标题党,马上退了出来。
    请添加图片描述
    这时候点击这个行为还是显示了用户对文章的喜爱?这样的样本还适合当作正样本么?模型拿到这样的正样本是变得更“好”,还是更“坏”?
    另外一种情景:在信息流中,用户在不断下滑寻找感兴趣的内容,注意力是从上到下,当用户点击一个文章的时候,一般只有点击文章上面的文章是被用户看到,而点击文章下面的文章一般是用户尚未看到的。这个时候这些虽然有曝光打点,但是其实未被用户看到的内容被当成负样本显然是不合适的。请添加图片描述
    根据模型适用场景目标定制样本的过程称之为“样本工程”,其重要度不亚于特征工程,而且更容易被忽略。

3.2 跟着精排做召回

回到推荐ctr的模型,继续**“点击就是正样本,曝光没点击就是负样本”**。我们去除掉快速回退的点击正样本,训练得到了一个排序模型,上线后当作精排模型,看起来效果不错。后来老板又让去做召回模型。有了之前的成功经验和data pipiline,再做一个召回模型不是手到擒来。于是拿着精排模型的样本(“点击就是正样本,曝光没点击就是负样本”),照葫芦画瓢,搞个双塔模型。
请添加图片描述
线下测试下来发现auc还不错,但这时候上线一跑实验,基于我的经验:大概率是负向的(除非召回的base太差)。离线查看召回结果,发现召回的物料与用户画像、用户点击历史,相关性很差。为什么精排模型的样本生成方法在召回模型这块就不行尼?
因为这种方法违背了机器学习的一条基本准则:离线训练数据的分布,应该与线上实际应用的数据,保持一致。
以前,我们谈到召回与排序的不同,往往只强调速度,即因为召回的候选集更大,所以要求速度更快,所以模型可以简单一些。这是只知其一,另一个方面就是:

  • 排序其目标是“从用户可能喜欢的当中挑选出用户最喜欢的”,是为了优中选优。与召回相比,排序面对的数据环境,是相对优秀的。
  • 召回是“是将用户可能喜欢的,和海量对用户根本不靠谱的,分隔开”,所以召回在线上所面对的数据环境,就是鱼龙混杂、良莠不齐。
    所以,要求喂入召回模型的样本,既要让模型见过<user,doc>最匹配的,也要让模型见过<user,doc>最不靠谱的,才能让模型达到"开眼界、见世面"的目的,从而在“大是大非”上不犯错误。
  • <user,doc>最匹配的,没有异议,就是用户点击的样本
  • <user,doc>最不靠谱的,是“曝光未点击”样本吗?这里牵扯到一个推荐系统里常见的bias,就是我们从线上日志获得的训练样本,已经是上一版本的召回、粗排、精排替用户筛选过的,即已经是对用户“比较靠谱”的样本了。拿这样的样本训练出来的模型做召回,一叶障目,只见树木,不见森林。
    请添加图片描述

3.3 再举一些样本技巧的例子:

  1. 复制正样本:
  • 在不方便做多目标或者更改loss时,又希望能够加权某种正样本。那么可以直接复制这种行为的正样本,让训练时这种正样本多次被模型学习。比如,在信息流场景中,大部分样本点击了后阅读了2分钟,小部分样本B点击了后阅读了4分钟。希望能够提升阅读时长的时候,可以复制样本B一遍加入到训练集合中。这样模型将会倾向于推荐阅读时长更长的文章。
  1. 去除无效样本:
  • 过滤无点击行为用户。在构造样本时候,过滤掉没用任何点击行为的用户数据,这样做合不合适呢?有人说,他们不直接把没有点击行为用户数据全部过滤掉,而是对这些用户进行随机采样作为负样本,效果要好一些。
  • 过滤异常数据。把一些行为异常的用户数据过滤掉,例如有人一天点击了十万条帖子,这种行为在实际生活中几乎不可能。
  1. 降采样:
  • 高频用户进行降采样,缓解高频用户对loss的过度影响,平等对待高活跃用户与其他用户。
  • 对高频item进行降采样,缓解推荐系统的马太效应

总结

本文深入探讨了机器学习中的三个核心要素:模型、特征和样本。在模型方面,文章回顾了CTR预估模型的发展历程,分析了不同模型之间的共性和发展趋势,并探讨了如何从其他领域借鉴创新技术。特征部分强调了特征工程的重要性,并详细介绍了用户特征和物料特征的构造方法,以及特征组合和交叉的技巧。样本部分则讨论了如何正确定义正负样本,以及如何通过样本工程来提高模型的泛化能力。


http://www.ppmy.cn/devtools/126521.html

相关文章

APIJSON的使用

APIJSON是一个用于简化后端接口开发的工具&#xff0c;在Java中可以按照以下步骤使用&#xff1a; 1. 引入依赖 在Java项目中&#xff0c;需要引入APIJSON的相关依赖。如果使用Maven&#xff0c;可以在pom.xml文件中添加以下依赖&#xff1a; <dependency><groupId…

Linux 挂载新磁盘到指定目录

目录 1. 背景2. 创建新的磁盘3. 创建挂载点4. 格式化新磁盘&#xff08;如果尚未格式化&#xff09;5. 挂载新磁盘6. 开机自启&#xff08;可选&#xff09;7. 卸载磁盘 1. 背景 最近需要使用 Linux 搭建一个 NFS 服务器&#xff0c;主要用于 K8S 的日志和配置的持久化。但是考…

MySQL插入优化-性能对比

插入优化主要包括&#xff1a; 批量插入条数据&#xff0c;而不是单个记录逐条插入。手动提交事务&#xff0c;避免自动提交事务带来的额外开销。使用load命令从本地文件导入。 性能对比 创建数据库表 CREATE TABLE if not exists tb_sku ( id int(20) …

基于Java的可携宠物酒店管理系统的设计与实现(论文+源码)_kaic

摘 要 随着社会经济的不断发‎‏展&#xff0c;现如今出行并住酒店的人越来越多&#xff0c;与之而来的是酒店行业的工作量日益增加&#xff0c;酒店的管理效率亟待提升。此外很多人出门旅游时会有携带宠物的情况&#xff0c;但是现如今酒店对宠物的限制&#xff0c;导致许多…

西门子网络程序传输,无需开通网络驱动器直接接入底层,支持各类数控 如发那科、三菱 、新代、海德汉、广数、精雕、马扎克等等

有关西门子的程序传输问题&#xff0c;大家一般是通过文件共享、ftp、网络驱动器等方式&#xff0c;其中828D还需要授权开通网络启动器 下面介绍一种方式直接进入西门子Linux底层系统实现和NCK的文件交互功能 软件截图如下 功能表如下 机床程序上载至电脑 电脑程序下传…

IO进程---day3

1、完成标准io的单字符实现两个文件的拷贝&#xff1b; #include<myhead.h>//标准io的单字符现两个文件的拷贝&#xff1b; int main(int argc, const char *argv[]) {//判断是否有3个文件传入if(3 ! argc){fputs("input file error\n",stderr);return -1;}//打…

构建高效购物推荐系统:SpringBoot实战

1系统概述 1.1 研究背景 如今互联网高速发展&#xff0c;网络遍布全球&#xff0c;通过互联网发布的消息能快而方便的传播到世界每个角落&#xff0c;并且互联网上能传播的信息也很广&#xff0c;比如文字、图片、声音、视频等。从而&#xff0c;这种种好处使得互联网成了信息传…

【C++】STL--stack

1. stack的介绍 stack的文档介绍 后进先出&#xff08;LIFO&#xff09;&#xff1a;Stack容器遵循后进先出的原则&#xff0c;即最后进入栈的元素最先被移出栈。 2.stack的使用 常用的几个接口 代码演示如下 int main() {stack<int> st;st.push(1);st.push(2);st.…