阿里DIN源码之如何建模用户序列(1):base方案

本文深入解析DIN模型,探讨如何通过注意力机制优化用户行为序列特征的抽取,提高推荐系统的精准度。介绍了传统用户行为序列特征抽取方法的局限性,并详细阐述DIN模型如何通过计算相关性模块对序列行为加权,获取更有效的embedding。

阿里这篇文章,说白了就是如何将用户的行为序列抽象出一个特征,这里我称之为行为emb,往常对用户的一组行为序列,都是平等对待,同权pooling,或者加时间衰减。

这篇文章好就好在他深刻的分析了用户行为意图,即用户的每个行为和候选商品的相关性是不同的,以此为契机,利用一个计算相关性的模块(后来也叫attention),对序列行为加权pooling,得到想要的embedding。

网上对DIN源码分享的资料很少,代码原理并没有什么难的,tf代码只要搞懂了维度怎么变化的(我尽量都标注),看明白还是比较简单的,只是如何提升效率就是一门大学问了,这里不讨论。这里主要是自己对源码的一个学习小结,分享出来,一些代码细节都已经趟过了…有不足的地方希望大家指正。

下面包含大量代码,请结合注释享用~~~
文章同步更新于知乎:https://zhuanlan.zhihu.com/p/111173364

数据形式

train_set:

(userid,[13179,17993],28326,1)

[userid,[13179,17993],33333,0]

test_set:

(userid,[13179,17993,28326],(正样本id,负样本id))

中括号括起来的是用户的行为序列对应的itemid。

那么,先讲一下传统的用户行为序列特征的抽取方法,即paper中图2的左侧部分。

Base model

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-POvcsuUz-1583415091782)(C:\Users\Admin\AppData\Roaming\Typora\typora-user-images\image-20200305200049279.png)]

核心思想就是,将用户行为item list中的每个item,抽取特征做concat,然后直接做sum pooling,再其他特征输入MLP,最终得到候选商品的得分,也就是用户对候选商品的“喜好”程度。

先说下train.py部分,做的事情就是先用初始模型评估一遍测试集,然后按照batch训练,每1000次评估测试集。

流程很简单:

with tf.Session(config=tf.ConfigProto(gpu_options=gpu_options)) as sess:

  model = Model(user_count, item_count, cate_count, cate_list)
  sess.run(tf.global_variables_initializer())
  sess.run(tf.local_variables_initializer())

  print('test_gauc: %.4f\t test_auc: %.4f' % _eval(sess, model))
  sys.stdout.flush()
  lr = 1.0
  start_time = time.time()
  for _ in range(2):
    random.shuffle(train_set)
    epoch_size = round(len(train_set) / train_batch_size)
    loss_sum = 0.0
    for _, uij in DataInput(train_set, train_batch_size):
      loss = model.train(sess, uij, lr)
      loss_sum += loss

      if model.global_step.eval() % 1000 == 0:
        test_gauc, Auc = _eval(sess, model)
        print('Epoch %d Global_step %d\tTrain_loss: %.4f\tEval_GAUC: %.4f\tEval_AUC: %.4f' %
              (model.global_epoch_step.eval(), model.global_step.eval(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值