item2vec等召回

item2vec等

item2vec

主流程:

从log中抽取用户行为序列
将行为序列当成预料训练word2Vec得到item embedding:把用户浏览的商品集合等价于word2vec中的word的序列.
得到item sim关系用于推荐

1、首先第一步:这是我们从推荐系统log中获得的,也就是说User A行为过item a、item b、item d,User B行为过item a、item c,User C行为过item b、item e。

2、继而我们需要将这些转化成句子。句子1就是a、b、d。句子2就是a、c。句子3就是b、e。这里我们已经没有了user之间的关系,只留下item组成的句子。

3、将句子放入到放入word2vec模型,这里就是一个输入(word2vec模型是一个三层的神经网络:输入层、隐含层、输出层)

经过word2vec模型的训练,会得到每一个item对应的embedding层向量。这里只写了item a [0.1,0.2,0.14…0.3] ,item b [0.4,0.6,0.14…0.3]。item c,item d,item e也是可以得到的。

4、得到item向量之后,就得到item的sim关系。基于item sim的关系,我们便完成了用户的推荐。

 ( 出现在同一个集合的商品被视为positive
word2vec 几大步骤
读取查看、点击、播放等行为数据,我用的是播放数据;
数据整理成(userid, itemid, playcnt)的形式,这个数据可能是聚合N天得到的;
过滤掉playcnt为小于3的数据,我把这些过滤掉,觉得这个数据没有贡献;
按照userid聚合,得到(userid, list(itemid))的形式;
训练word2vec;
导出model.vectors(),里面包括word和对应的向量vector,其中word其实就是itemid
crossjoin计算两两相似度,取相似度TOP N;
将结果存入mysql,后续可以加载到REDIS实现实时相似推荐;

对比ItemCF,Item2vec有更好的泛化能力,我们可以基于训练出来的item Embedding,召回邻近topK items,这突破了ItemCF邻域关系的限制。

Item2vec

  • 主要做法是把item视为word,用户的行为序列视为一个集合,item间的共现为正样本,并按照item的频率分布进行负样本采样。
  • 缺点是相似度的计算还只是利用到了item共现信息,(1)忽略了user行为序列信息;(2)没有建模用户对不同item的喜欢程度高低。
  • 无法解决覆盖率问题,在合理阈值下,只能覆盖出现在用户行为序列中的物品集,但对于低频物品和新物品,还是没有召回结果的。
  • 虽然覆盖率略高于ItemCF,但点击率低于ItemCF,整体收益仍是负向的,位置比较尴尬。

item2item

很多场景下item2item的推荐方式要优于user2item;

item2item的推荐方式:在获取item相似度矩阵之后,根据用户的最近的行为,根据行为过的item找到相似的item,完成推荐,如itemCF。

user2item:根据用户的基本属性和历史行为等基于一定的模型,算出最可能喜欢的item列表写在KV存储中;当用户访问系统的时候,将这些item列表推荐给用户,像userCF、LFM、personal rank算法等都是这种方式。

user2vec

推荐看比如YouTube DNN, DIN,wide&deep,沿着这几篇paper就可以搜出很多应该怎么样向量化表达用户的做法了。

给定一个用户,找到联合表征向量空间中的前K个相近的产品。
训练数据集分为用户购买顺序S,即给定用户un,其按照时间来排序的已经购买的产品。un = (pn1, pn2, . . . pnUn),Un表示用户un的项目购买数量。
怎么训练和生成user的Embedding?

item和user的量可以认为是无限的,所以不能直接使用它们的index来构建。我们可以用其某些有限的属性来表达它们。比如,说user,其实聊的是user喜欢什么item,接触过什么item,那么其中的核心其实还是item,这样理解的话,user的Embedding其实就源自于若干个与之相关的item的Embedding。

这里的核心就在于,如何结合用户有过行为的若干个item的Embedding,合成一个User Embedding。

最粗暴的方法是采用item-embedding进行平均,而序列的长度很关键,太短了无法完全表征,太长了无法可能用户兴趣发生了偏移效果不好,因而可以作为baseline(大多数情况下,效果说的过去)在上面的加上一点点改进,对应不同的推荐商品召回的情况下,采用不同的embedding,或者加上attention-layer,相当于用户的兴趣是多峰的,每次只有单峰激活(参考DIN)加上序列和时间考量,用LSTM(GRU)等处理这个“sentence”,最终最终得到的编码可以是user-embedding(DIEN)

生成item vector之后,可以根据用户历史上与item的交互行为,求avg/max/ pooling获取用户的向量表达。这是最直接的user vector生成方式,但是在实际使用中往往效果一般。主要原因是泛化能力差,对user embedding的学习是无监督的。


User Embedding的方法非常多,取决与你想怎么用,这里介绍几种工业界的方法。召回侧:
1.用户行为序列的item embedding求平均,这样求出的user embedding和item embedding是在同一个空间里的,可以直接通过user embedding和item embedding的内积形式做在线knn召回
2.进一步考虑到用户兴趣随时间的变化,把平均改为时间衰减的加权平均
3.更粗暴一些,直接用用户最近点击的那个item emebdding做user embedding,在某些业务场景下也有很好的效果
4.把召回看作在item全集上的超大规模多分类问题,用神经网络建模,输入user,context等特征,最上层是一个softmax的多分类,网络的最后一个隐层作为user embedding,隐层和每个类别的全连接权重作为item embedding,相当于user embedding和item embedding联合学习。线上使用和上述几种方法一样都是内积knn召回不走神经网络预测。具体可以参考youtubeDNN排序侧和召回侧不同,因为现在主流排序算法都是深度模型端到端训练,不需要一个额外输入的embedding。

几种DNN的方式构建user embedding。

FM
YOUTUBEDNN

介绍:https://juejin.im/post/6844904078619738126

,只需要将User Embedding和video Embedding存储到线上内存数据库,通过内积运算再排序的方法就可以得到video的排名,这大大加快了召回效率。

使用特征:用户观看过视频的 embedding 向量、用户搜索词的 embedding 向量、用户画像特征、context 上下文特征等。

训练方式:三层 ReLU 神经网络之后接 softmax 层,去预测用户下一个感兴趣的视频,输出是在所有候选视频集合上的概率分布。训练完成之后,最后一层 Relu 的输出作为 user embedding,softmax 的权重可当做当前预测 item 的 embedding 表示。

线上预测:通过 userId 找到相应的 user embedding,然后使用 KNN 方法 ( 比如 faiss ) 找到相似度最高的 top-N 条候选结果返回。

YouTubeNet 是 Google 于 2016 年提出的。与 item2vec 不同,YouTubeNet 在学习 item 向量的时候考虑了用户向量。从模型的优化目标上可以看出,是在给定用户向量的情况下,从候选池中筛选出该用户最感兴趣的 item 列表。

在召回DNN中,引入丰富的用户侧特征(包括用户的观看和搜索历史),模型的最后一层全连接的输出作为user embedding表达,item embedding则使用softmax+negative sampling有监督训练该DNN时,生成的softmax权重向量来表示

DSSM

DSSM及微软后续推出的multi-view DSSM也代表了一种思路。这种多塔的结构,可以为user,item构造不同的塔,通过n层全连接之后,将最后一层输出层的向量拼接在一起做softmax,或者直接通过cosine衡量两者的相似性。训练完成后,模型全连接层的输出向量可以作为user,item的embedding表达,而且向量处在同一个向量空间,可以在线进行ANN查找,有效提高线上serving的性能。

总结
user embedding就是网络的最后一个隐层,video embedding是softmax的权重.
将最后softmax层的输出矩阵的列向量当作item embedding vector,而将softmax之前一层的值当作user embedding vector。

链接

Spark使用word2vec训练item2vec实现内容相关推

https://www.crazyant.net/2447.html

改进:

Topic2vec:https://lxmly.github.io/2019/02/15/embedding/

w-item2vec:https://www.cnblogs.com/simplekinght/p/11545180.html

https://www.infoq.cn/article/0ueIPm2VFrOqECLU3316 (深度学习技术在美图个性化推荐的应用实践)

其他代码

MF的embdding

def build_model(user_indices, item_indices, rank, ratings, user_cnt, item_cnt, lr, lamb, mu, init_value):
    
    W_user = tf.Variable(tf.truncated_normal([user_cnt, rank], stddev=init_value/math.sqrt(float(rank)), mean=0), 
                         name = 'user_embedding', dtype=tf.float32)
    W_item = tf.Variable(tf.truncated_normal([item_cnt, rank], stddev=init_value/math.sqrt(float(rank)), mean=0), 
                         name = 'item_embedding', dtype=tf.float32)
    
    W_user_bias = tf.concat([W_user, tf.ones((user_cnt,1), dtype=tf.float32)], 1, name='user_embedding_bias')
    W_item_bias = tf.concat([tf.ones((item_cnt,1), dtype=tf.float32), W_item], 1, name='item_embedding_bias')
    
    user_feature = tf.nn.embedding_lookup(W_user_bias, user_indices, name = 'user_feature')
    item_feature = tf.nn.embedding_lookup(W_item_bias, item_indices, name = 'item_feature') 
    
    preds = tf.add(tf.reduce_sum( tf.multiply(user_feature , item_feature) , 1), mu)
    
    square_error = tf.sqrt(tf.reduce_mean( tf.squared_difference(preds, ratings)))
    loss = square_error + lamb*(tf.reduce_mean(tf.nn.l2_loss(W_user)) + tf.reduce_mean(tf.nn.l2_loss(W_item)))
        
    tf.summary.scalar('square_error', square_error)
    tf.summary.scalar('loss', loss)
    merged_summary = tf.summary.merge_all()
    #tf.global_variables_initializer()
    train_step = tf.train.GradientDescentOptimizer(lr).minimize(loss)   # tf.train.AdadeltaOptimizer(learning_rate=lr).minimize(loss)    #

    return train_step, square_error, loss, merged_summary


  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值