19|NeuralCF:如何用深度学习改造协同过滤?
19|NeuralCF:如何用深度学习改造协同过滤?
讲述:王喆
时长11:57大小10.92M
NeuralCF 模型的结构
NeuralCF 模型的扩展,双塔模型
(出自论文 Sampling-Bias-Corrected Neural Modeling for Large Corpus Item Recommendations)
(出自论文 Sampling-Bias-Corrected Neural Modeling for Large Corpus Item Recommendations)
NeuralCF 的 TensorFlow 实现
小结
课后思考
赞 15
提建议
精选留言(39)
- Evan-wyl2020-11-25不可以,如果是新闻推荐的话,地点信息会产生很大的影响;这时把地点信息仅仅是加入到用户侧没有任何作用。
作者回复: 这是从效果的层面考虑。如果从model serving的角度考虑,如果在物品侧或者用户侧加入场景特征的话,就没法做到预存embedding的serving方式了。因为场景特征是在线上不断变化的。
24 - 定春一号2020-11-26把context特征放进user塔或者item塔,那么离线生成user embedding或者item embedding的数量就要翻好多倍,能否考虑把context特征单独作为context塔呢?
作者回复: 是这样的,离线有组合爆炸的风险。 一般不会有context塔,如果希望引入context特征,最好就不用双塔模型,因为双塔模型易线上serving的优势就不存在了。
共 3 条评论18 - AstrHan2021-01-16embedding之后,如果使用点积,那么这两个embedding是在同一个向量空间;如果使用的MLP则不在同一个向量空间。因为点积不影响向量空间,线性变换矩阵会影响。老师这么说对吧。
作者回复: 是这样的。
共 3 条评论17 - 小小的天2020-12-15双塔模型对于新闻场景是不是也不太好?新闻时效性很强,在我们公司的数据里,大部分新闻曝光在2个小时内,双塔的训练数据有足够的曝光时,新闻的价值也失去了很多了
作者回复: 这是个好问题。新闻的场景确实是很有意思的场景,因为时效性很强。这时候新闻id类的特征就不太管用了,因为如果不重新训练,id类特征对应的embedding没办法引入。 所以对于这类时效性很强的场景,还是推荐基于一些与id无关的feature来构建模型,比如新闻的类型、人物、地点、关键词等等。
共 2 条评论15 - Sebastian2020-12-01老师,我还是没理解为什么不能加入context的特征。在训练DSSM的时候除了user和item的特征外,在user塔加入context的特征,比如用户的地理位置、手机型号等等,训练完后,将user和item的embedding存入redis后。线上请求时,将user的静态特征和实时context特征再过一遍DSSM,得到新的user embedding后,与存入redis的item emebdding取topN即可,为什么不妥呢?
作者回复: 因为将user的静态特征和实时context特征再过一遍DSSM是一个非常重的操作,需要把深度模型部署上线,做实时推断。 这样当然是可以的。但跟离线生成user 和 item emb预存起来,线上只做简单dot product这样的部署方式,显然复杂了许多。 业界往往追求的实用性的效率,这就是加不加入context特征的区别所在。
共 2 条评论15 - Geek_790c432021-01-29不可以,因为如有地点或者时间这种波动比较大的特征就不能用预存embedding来表示当前的用户或者当前的物品了。例如外卖推荐,在公司和家时用户的embedding应该是不同的。或者新闻网站早晨和晚上的也应该不同
作者回复: 非常好
10 - 🍃2021-05-08老师,我还是不理解为什么用用户id和物品id做one-hot编码?直接数值特征不好么?
作者回复: 数值特征从理解上就是错了,比如 用户id 1761 和用户id 1881,如果是数值特征说明他们两个是有可比性的,但其实并没有,我们需要id类的特征来单独表达他们这两个用户的行为特点。
7 - Geek_790c432021-01-29图二中,和之前deep crossing 以及 wide&deep,把用户id的one hot向量作为输入, 如果有几亿的用户也这么处理么?
作者回复: 也是。这就是为什么大厂模型动辄上亿维的原因。当然,如果需要,可以使用一些降维的方法。
共 4 条评论6 - AstrHan2021-01-18双塔版本的模型是不是有些问题,点积之后应该还要加一层输出层吧? output = tf.keras.layers.Dense(1, activation='sigmoid')(output)
作者回复: 理论上不是一定要加sigmoid函数。但tf这里如果值超过1会报错,已经接收了你的PR,感谢。
共 2 条评论6 - Eayon2021-04-26老师前面提到Embedding+MLP中的物品,Embedding不能计算物品和用户的相似度,提到不在一个空间向量(也说不能点乘就不在一个空间,其实还是不太理解)这里就有两个问题 1.不在一个空间究竟是什么概念,真就是不能点积就行了,还是跟里面数据内涵有点关系? 2.另外Embedding+MLP 中的Embedding能不能计算物品与物品之间的相似度呢? 然后是这节课双塔模型中又可以得到物品和用户的Embedding,可以通过点积得到相似度 3.那这时候的物品embedding能用来计算物品间的相似度吗?展开
作者回复: 1. 由于他们不在一个空间内,所以不能点积,而不是反过来 2. 可以,物品和物品之间是一定在一个空间内的,但Embedding+MLP不可以直接物品和用户进行点积,因为他们是两个独立的embedding层。双塔模型如果训练的时候就是用用户emb点积物品emb训练的,那么他们是在一个空间内。 3.可以
5 - Alan2021-03-18答:肯定会有影响的! 首先,NeuralCF 模型计算的用户与物品之间的协同过滤后的计算结果,加入任何的维度,都会导致矩阵变化,失去其意义。 其次,因为时间、地点这两类特征因素具有很强的影响力!基于用户-物品的协同过滤在此情况下失去意义。就以视频推荐类App来说,白天推荐给我(在公司工作)的新闻、娱乐短视频的协同过滤的结果,到了晚上推荐给我(在校学习)学习类、游戏类长视频为主展开
作者回复: 基本是这个原因。简单来说就是加入context feature之后就无法使用纯预训练的方式进行model serving了。
5 - Geek_8ac51c2021-01-15老师,mlp层为啥可以替代点积操作。有理论资料学习吗?
作者回复: 基础知识部分说了,mlp其实模拟的是一个函数,既然两个向量间的互操作当然是一个函数,所以mlp当然可以模拟。
4 - 范闲2020-12-02不可以直接加入用户侧或者物品侧,会产生组合爆炸的问题。 可以考虑变成3塔的结构,加个other塔~~,other embedding也可以预存。但是有个问题other的这些变化可能会比较快,对模型、embedding的更新要求会很高~~
作者回复: 预存这里所谓的other塔确实有点得不偿失,因为线上的context特征,比如时间,地点变化会非常快。理想的方式就是做实时inference
4 - lyx2021-10-05请问下DenseFeatures这层是做embedding的么,搜了半天不知道这层是干嘛的。
作者回复: 是的,生成embedding
2 - Geek_71fed12021-03-22老师,为什么两个embedding向量是在同一向量空间?
作者回复: 最后用点积作为互操作的embedding都可以视为在一个空间内。
2 - Geek12542021-03-02老师您好,Youtube的案例中。用户侧有用户正在观看的视频ID,这是需要及时获取的,然后视频的views和likes也需要及时更新。那么这些信息在变化,需要即时获取。那么u(x)和v(y)需要重新计算,请问是在什么时候放入特征数据库呢?
作者回复: 这是个特征实时更新的问题,目前主流的方案是在一些流计算平台上完成特征的不断更新。
共 2 条评论2 - 努力学习2021-02-15关于课后思考请问老师,如果只考虑已有数据是不是就可以添加位置等信息了? 如果就是做位置推荐,那么位置信息还算是context吗?位置推荐若不能使用双塔模型应该优选什么模型那?谢谢老师
作者回复: 不可以,只要需要复杂online inference的都不可以加进去。 如果一定要加,可以考虑embedding+MLP,MLP做线上inference的结构。
2 - LUO FAN2021-02-05请问在neuralCF的实现中,为什么是把物品特征和用户特征拼接起来送入网络,而不是先分别过embedding 层然后再拼接
作者回复: 我觉得完全可以做embedding后再拼接,没问题。
2 - Geek_e8024b2022-03-13老师,想问一下比如新增了一个用户或者商品,比如用户数量变了,用户的onehot,那模型需要重新训练吗1
- 罗辑2021-10-07老师,tf.feature_column.embedding_column 中得到embedding向量是通过矩阵分解还是通过神经网络得到的?
作者回复: 神经网络end2end训练得到
1