阿里这篇文章,说白了就是如何将用户的行为序列抽象出一个特征,这里我称之为行为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)]](https://i-blog.csdnimg.cn/blog_migrate/2638244b6cf9426fd53159324170b54a.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(

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

被折叠的 条评论
为什么被折叠?



