深度学习推荐系统学习笔记3——DIN

又进入相亲的节奏,还没见面,也不知道会不会获得见面的机会。与此同时,DIN算法把自己折磨的有点掉头发。难点在tf2.0程序开发和Attention的理解,经过2周多学习终于写完了。

前言

经过快2个月的锻炼,成功的把体重拉到了历史新高,那心情是哇凉哇凉的。以HIIT有氧为主,虽说大部分运动不到30分钟,但是吃的少啊,都这岁数了难道还会长肌肉?不扯了,进入正文。

准备

环境配置,包安装,数据源和下载,程序地址直接看上一篇就好,链接如下:
猿小明:深度学习推荐系统学习笔记1——deep_crossing

DIN算法由两部分组成,DNN和Attention单元。如下图所示:
深度学习推荐系统学习笔记3——DIN_第1张图片
这里采用新闻推荐为例子,新闻由tiny bert转换为128位向量,所以上图只有Goods部分,也就是新闻。如果没有Activation Unit部分,与deep crossing完全一致,用户点击新闻向量平均作为用户特征,预测的新闻向量作为新闻特征,拼接后进入DNN网络。

与上述deep crossing相比,DIN添加了Attention,即Activation Unit模块,每个点击历史新闻有了不同的权重。本文采用用户点击的5篇新闻作为User Behaviors,预测新闻向量作为Candidate。Activation Unit计算如下:

1、向量拼接,Cancat(点击新闻n向量, 候选新闻向量-点击新闻n向量, 候选新闻向量),n=1,2,…,5
2、将第一步获得的向量送入DNN,获得一个权重值。

经过上述获得权重后,再进行带权重求和,即5篇点击新闻加权求和,从而得到用户特征,再与候选新闻向量拼接进入新的DNN。

代码结构说明

DIN算法特征变换过程与前几篇略有差别,所以有自己独立的特征提取程序,添加了0号新闻,向量对应全0。主要是应对有些用户没有点击历史事件,或者点击事件不足5,用0号来补充。
深度学习推荐系统学习笔记3——DIN_第2张图片
1、data文件夹(无改动)
(1)bert是tf1.14程序,利用bert将文本转换为向量,这里用的tiny bert,下载地址为,https://github.com/google-research/bert
(2)dev和train,是数据文件,上面数据源下载的
(3)bert_sentence_vector.py,调用bert向量化程序
(4)build_data_set.py,根据向量和用户点击行为,生成用户、新闻向量和中间用到的字典数据。从上到下各个函数,有to_csv和save保存文件的程序,跑一下就好了。

2、din文件夹
(1)dev文件夹,验证集相关数据。
(2)train文件夹,训练集相关数据。
(3)model,模型文件保存文件夹
(4)din_build_data_set,构建模型训练所需数据,新闻id编号字典,新闻向量等。
(5)din_model,模型网络结构和创建。
(6)din_train,模型训练。
(7)din_evaluate,模型验证。

说明:把模型、训练、验证拆分出来,为了减少代码重复。训练和验证只需要加载din_model里边构建好的网络,直接运行即可。避免了训练和验证重复构建网络部分代码,导致参数等错误导致模型加载无法运行。

总结

实现了几个算法之后,发现evaluate部分代码有问题,加载验证数据时进行随机打乱,导致AUC总是0.5左右。将随机打乱参数修改为False后,结果正常,这个问题居然找了3天。目前调优各个算法AUC最高0.62左右,与mind论文中deep&cross算法相近,也算是有了一点点进展。

最后再来个git地址:
https://github.com/ConstellationBJUT/recommender_system_study/tree/main/din

你可能感兴趣的:(推荐系统,推荐系统,深度学习,算法,人工智能)