21|注意力机制、兴趣演化:推荐系统如何抓住用户的心?
21|注意力机制、兴趣演化:推荐系统如何抓住用户的心?
讲述:王喆
时长15:50大小14.46M
什么是“注意力机制”?
注意力机制在深度兴趣网络 DIN 上的应用
(出自论文 Deep Interest Network for Click-Through Rate Prediction)
(出自论文 Deep Interest Network for Click-Through Rate Prediction)
注意力机制对推荐系统的启发
兴趣进化序列模型
小结
课后思考
赞 21
提建议
精选留言(30)
- 浣熊当家2020-11-29图3中DIN的激活单元里我们用到了“外积”, 之前的课程里感觉我们多数是用“内积”。请问老师,如何选择使用“内积”和“外积”, 有什么规则吗?
作者回复: 本质上都是做特征交叉,计算相似性的方式,一般来说,外积因为输出是一个向量,所以表达能力更强一些。
36 - 李元2021-01-09根据NLP的发展,我觉得GRU这种提取序列信息的方式肯定会被Transformer取代。不知道有没有人已经发paper了。
作者回复: 已经不少了,最近提的比较多的是bert for rec
共 3 条评论21 - Sebastian2020-11-28老师想问下,DIN模型在工业界的排序阶段使用的多吗?因为我在想在业界每个用户都有比较长的用户行为序列的场景可能还是少数,很多公司的场景可能是,用户进入app端后点击了2-3次后可能就没有后续行为了,那么这种场景下,DIN应该就不适用了吧?
作者回复: DIN比DIEN的使用场景要求低很多,我知道很多团队在用,或者说很多团队在用DIN的思路来构建自己的模型。 就我自己的实践经验,attention机制是非常有价值的,推荐在自己的场景下尝试。
17 - Leo Zhao2020-11-28思考题:广告和历史行为 相关性 其实就是 广告物品与历史物品的相关性,可以用一个dot层 或者通过物品embedding 算出similarity 当作feature 直接输入。
作者回复: 非常好
共 3 条评论14 - 轩2021-01-06老师您好,我有一个问题请教您: transformer中有position encoding,而在推荐的领域中,点击的序列中同样有时间间隔的因素,例如取用户最近若干次点击,可能每次间隔时间不等。这个间隔时间应该是有信息可以揭示用户兴趣的变迁速率等信息的吧?但是如何将其引入到推荐序列中呢? 是类似于transformer中 position learned encoding这样么?
作者回复: 这是一个很好的idea。但说实话我还没有见到非常成功的案例说能够很好的利用event interval然后取得很大的收益。也许是这个信号本身不够强,带来的收益有限。 如果今后发现相关paper,可以分享到这里。
10 - fsc20162020-12-091,老师,看了最近几章介绍的推荐模型,发现神经网络的隐层数量都比较少(相对cv),这个是防止模型太复杂,导致线上推断太慢吗 2,请教下老师,业界常用的MLP隐层数量和神经元数量,有没有一个大致的取值范围?
作者回复: 这个问题其实挺好的。相比CV动辄上百的隐层数量,推荐模型真的是比较“浅”的了。 隐层数量大致在1到5之间吧,确实在推荐问题上再提高隐层数量效果上意义不大,inference延迟还大,得不偿失。 至于为什么相比cv,推荐模型不需要那么多隐层,你能分享下你的思考吗?
共 6 条评论10 - 小红亮2021-04-10老师,请教一下DIEN中用到了GRU,它是串行处理的,那么推理的过程会比较慢,这就不太适合延长要求很高的场景,比如计算广告,那对于电商场景来说它DIEN的推理延迟能满足业务要求吗,或者有什么优化手段可以解决延迟问题吗
作者回复: 这是个非常好的问题,一般上线前要做模型的割裂,把复杂部分生成的Embedding做预生成,线上直接使用。
8 - 浣熊当家2020-11-29想请教老师一个题外问题, 您作为面试官的话,对于MLE的候选人会更注重考察哪方面的能力(比如算法coding, 系统架构设计,机器学习的领域知识)?,然后对于机器学习的各种模型会期待候选人有多深的了解(比如说了解DIEN的各个层级的结构就够了,还是要知道GRU是具体如何实现的)。 随着老师课程,我对深度学习燃起了更大的热情,觉得想真正提高的话,最好的方法还是能从事做深度学习的工作,想知道从面试角度来讲,怎么学习才是性价比最高的选择, (比如注重项目经验,刷题,还是算法的理论公式推到)。展开
作者回复: 我在知乎有一篇专栏文章专门讲面试,可以参考 https://zhuanlan.zhihu.com/p/76827460 我在课程最后也会有一些总结。
8 - 庄小侠2021-02-18老师,我看了下这节课DIN.py里面的代码,发现 user_behaviors_emb_layer和candidate_emb_layer是两套不同的embding向量,请问这是为什么啊?我的理解是它们都是电影的embding向量,共用一套embding不是参数量更少嘛。实际使用里面,大家都是这样用嘛?
作者回复: 问的非常好。其实应该是共用一套,用shared embedding。DIN的代码是咱们同学贡献的,如果可以改进的话,可以提交PR,非常欢迎越来越多人参与进来。
共 2 条评论6 - Geek_3c29c32020-12-16老师,我对DIN里面的注意力机制有一点疑问:就是DIN的目标广告的id和usr behavior的id是同一领域的id,那能不能推广到比如我们的广告id和商城内的物品不是同属于一个id系列的。就是广告的内容和商城的内容(包含用户行为)是不一样的,这时候还可以用DIN的注意力机制了吗?如果不能,还有什么方法呢?
作者回复: 这是个好问题,我觉得是可以的,因为广告内容和商城内容从经验上来说也会有一定的相关性。 就拿deepfm的思路来说,其实可以做任意两个特征之间的交叉。对于注意力机制,当然也可以学任意两个特征间的注意力。但到底作用有多大,能不能提高效果,就看自己的实践了。
7 - 张弛 Conor2020-11-27思考题:可以借鉴FM及DeepFM中特征交叉的计算方式,对两个向量直接计算内积,或者先通过Embedding层转换成维度相等的Embedding再求内积,又或者可以像双塔结构一样,设计一个历史行为物品塔和广告物品塔,在塔的最后通过求内积或者拼接后用全连接层输出权重。 课后疑问: DIEN模型中输出的用户当前兴趣向量h'(T)是由用户的历史兴趣向量所得,我的问题是,DIEA能否探索到历史兴趣以外的兴趣呢?如果可以的话,是如何在没有其他兴趣向量的参与下做到的呢?如果不行的话,请问老师在实践中是否有什么方法,可以对用户历史兴趣以外的兴趣进行探索的方法呢?展开
作者回复: 思考题的回答很赞同。 关于疑问,我不是很清楚你的问题,什么叫做“历史兴趣以外的兴趣”?
共 7 条评论6 - Geek12542021-03-03老师您好。 1.我看到在Sparrow里面的代码。没有严格意义上使用外积吧?使用的是element-wise sub & multipy。然后用这两个向量去拼接,组成的activation_all。请问这是老师实践之后得到的方法吗? 2. 我看到参考代码中使用的是PRelu(),请问这种激活函数适合哪些场景呢?
作者回复: 1. 确实没有使用外积。我的实践经验来看外积的作用不是很大,而且大幅增加参数量,所以我个人不是很喜欢外积操作。 2. PRelu几乎是深度学习默认的激活函数,速度比较快,梯度消散问题比较小。如果有特殊需要可以测试其他激活函数,看实践。
共 2 条评论6 - 那时刻2020-11-27DIN 使用了一个结构比较复杂的激活单元来计算注意力权重,能否有其它方法来计算呢?我开始想到的上节课提到的特征交叉,我回顾了下特征交叉,它是加强模型对于特征组合和特征交叉的学习能力以及对于未知特征组合样本的预测能力。而注意力权重是计算历史物品和广告物品相关行。我觉得它们是不同的。
作者回复: 其实只要是接收两个embedding,生成一个输出分数的结构理论上都可以作为激活单元。所以最简单的结构其实就是dot product或者cosin similarity。因为它们刚好揭示了两个item之间的相似度。
6 - 范闲2020-12-021.历史行为和广告物品直接dot 2.利用双塔模型,取最终的输出做特征
作者回复: 没问题
共 3 条评论4 - Geek_e0d66a2020-11-28请问老师,DIN中的激活单元,的网络结构中,为什么用户Embedding和候选集的embedding的外积,再拼接在一起??
作者回复: 因为DIN的同学经过多次实验之后这个网络结构最好。曾经最早的DIN的激活单元是通过element wise minus做特征交叉,但是几经修改,所以都是实践的结果。
共 2 条评论4 - 张弛 Conor2020-11-27课后疑问: 请问老师,对于DIN和DIEN这种包含N个历史商品的模型,如果用户历史商品数小于N,那么这些位置应该如何去填充呢?如果用户商品数大于N,是否是选择最近的N个商品呢?
作者回复: 大于N肯定要选择最近的N个, 小于N考虑使用masking layer tf.keras.layers.Masking
5 - VictorWu2021-01-13DIN.py 文件中第137行 tf.keras没有sum方法,sum方法应该在tf.keras.backend中 我发了个pr哈
作者回复: 感谢,我找时间review。
共 2 条评论2 - 邓生2020-12-22关于sum pooling有一点不明确,假如user1买了good1,对应embedding是[1,2,3],sum pooling后是[1,2,3],user2买了good1 good2,对应embedding是[1,2,3]和[4,5,6],sum pooling 后是[5,7,9]。然后后续都输入到神经网络。这样就实现了神经网络固定维度输入,是这样理解吗?
作者回复: 是这样
共 3 条评论2 - 墨量2021-01-12大佬,这一句(它的输入是当前这个历史行为商品的 Embedding,以及候选广告商品的 Embedding)加几个字,变为: 它的输入是当前这个【用户的】历史行为商品的 Embedding,以及候选广告商品的 Embedding。 是不是更好理解哇
作者回复: 这不是好不好理解的问题,是你理解错了的问题。
1 - freedom2020-11-30老师我想问一个问题,在训练模型过程中,在用到BN的时候,经常会出现BN层训练不好的情况,具体表现为训练时候(is_training=TRUE)准召比较高。但是设置is_training为false的时候 准召降得比较厉害。moving_mean和moving_var也都有更新。请问这是因为什么原因呢,该如何解决呢?
作者回复: 抱歉不能提供很多经验上的指导,我很少在推荐模型里面使用BN层,从原理上怀疑是某些类别型特征非常系数导致的,权当猜测。 如果其他同学有相关经验,欢迎讨论。
共 3 条评论2