当前位置:网站首页>论文笔记(SESSION-BASED RECOMMENDATIONS WITHRECURRENT NEURAL NETWORKS)
论文笔记(SESSION-BASED RECOMMENDATIONS WITHRECURRENT NEURAL NETWORKS)
2022-07-26 09:50:00 【qq_53430308】
1.论文介绍
会议:ICLR 国际表征学习大会
时间:2016
第一作者:Balazs Hidasi Gravity R&D Inc. Budapest, Hungary
通讯作者:Linas Baltrunas Netflflix Los Gatos, CA, USA
论文地址:https://arxiv.org/pdf/1511.06939.pdf
2.内容
2.1摘要
这是本文所提出的模型。
因此,我们提出了一种基于RNN的方法来进行基于会话的推荐
We therefore propose an RNN based approach for session-based recommendations.
Our approach also considers practical aspects of the task and introduces several modififications to classic RNNs such as a ranking loss function that make it more viable for this specifific problem.
2.2介绍
首先说明了基于会话的推荐是一个相对不受重视的问题,因为会话行为的难以收集。许多电子商务平台不会长期跟踪访问其平台的用户的ID,即使跟踪是可能的许多用户在网站上也只会留下一两个会话。cookies能提供某种程度的用户可识别性但会引起一些隐私问题。而在某些领域如分类网站,用户的行为往往显示出基于会话的特征,因此同一用户的后续会话应该被单独处理。大多数基于会话的推荐系统都是使用相对简单的方法并不能使用用户资料如项目之间的相似性。
推荐系统的常用方法是因子模型(感觉是矩阵分解)和领域方法,深度神经网络在图像和语音方面也取得了成功,RNNs是处理序列数据的首选方法。
因此作者提出了将RNNs应用于推荐系统,应用于基于会话的推荐,并且取得了成功。
他将用户进入网站时点击的第一个项目作为RNN的输入,然后根据这个初始输入来查询推荐。用户的每次连续点击都会产生一个取决于之前所有点击的输出推荐。
文中使用排名损失函数来训练RNN。
2.3相关工作
2.3.1基于会话的推荐
这里主要介绍了几种推荐方法,第一种是矩阵分解和邻域方法。这种方法主要利用项目的相似性矩阵,经常被一起点击的项目认为是相似的,然后推荐和用户点击项目相似的项目。这种方法简单有效,但是只考虑了用户的最后一次点击忽略了过去的点击信息。
另一种方法是马尔可夫决策过程(MDPs),他本质上是一阶马尔可夫链,下一个推荐可以根据项目之间的过度概率简单计算。但当用户选择变多时,状态空间就无法管理。
最后是通用因式分解框架的扩展版本,他可以使用会话数据,但是并不考虑会话之间的任何排序。
2.3.2推荐者中的深度学习
这里介绍了深度学习中的推荐方法,首先是使用受限玻尔兹曼机(RBM)进行协同过滤,后来又使用深度网络从项目中提取特征,这些方法在没用足够多的用户项目互动信息的情况下特别有用。
2.4基于RNN的推荐
然后是本文提出的基于RNN的推荐,首先给出了RNN的前向传播公式,然后给出了GRU(门控循环单元)的前向传播公式,因为文章使用的RNN就是GRU。

这是整个网络的结构,其中输入是实际的会话状态用one-hot编码,输出是项目的预测偏好。经过一个嵌入层,进入到多层的GRU结构中,在最后一层和输出之间可以添加前馈层。
在下面作者会提到代码中只使用了一层的GRU,因为这样效果最好。
接下来是如何获取输入数据

对于收集到的会话数据,因为他的长短是不一样的,因此不能像NLP那样使用滑动窗口。文中的做法是先对每一个会话内创建顺序,用前X个会话的第一个事件来形成第一个Mini-batch的输入,然后预测的结果是这个会话内的下一个事件。这里X是3。当任何一个会话结束时都使用下一个可用的会话的事件来补充,最后一个事件不能拿来当作输入因为没有他对应的预测输出(i2,3没有被拿来当作输入)。
当物品的数量过多时就要进行负采样来降低输出的维度,因为当输出过多时计算就会变得十分复杂,这在实践中是不可取的。负样本是其他训练实例中的项目,文中根据项目的受欢迎程度按比例进行采样。
接下来是论文里提出的两种损失函数
1.BPR


3.实验
The evaluation is done by providing the events of a session one-by-one and checking the rank of theitem of the next event. The hidden state of the GRU is reset to zero after a session fifinishes.
The best performing parametrizations are summarized in table 2. Weight matrices were initialized
by random numbers drawn uniformly from [−x, x]
这里初始化的权重矩阵为所有的超参数,并不是单是GRU中的权重参数。
下面是这里对应的代码。
#weight initialization if it was defined
def init_model(model):
if args.sigma is not None:
for p in model.parameters():
if args.sigma != -1 and args.sigma != -2:
sigma = args.sigma
p.data.uniform_(-sigma, sigma)
elif len(list(p.size())) > 1:
sigma = np.sqrt(6.0 / (p.size(0) + p.size(1)))
if args.sigma == -1:
p.data.uniform_(-sigma, sigma) #均匀分布初始化参数
else:
p.data.uniform_(0, sigma)4.复现
本次使用的代码为:GitHub - hungthanhpham94/GRU4REC-pytorch: An other implementation of GRU4REC using PyTorch
使用的数据集为:RecSys Challenge 2015 | Kaggle
如果是在本地去跑的话直接按照README文件的要求来操作即可,这里说明在kaggle平台的使用方法。
这里不推荐用链接直接下载GitHub的代码因为其中的路径需要修改,而kaggle不支持在线修改。
我们首先进入kaggle新建一个笔记本,然后点击右上角的Add data将RecSys Challenge 2015数据集添加到input里。

我们在本地下载完代码打开之后找到preprocessing.py修改下面的路径:
dataBefore = '../input/recsys-challenge-2015/yoochoose-clicks.dat' #Path to Original Training Dataset "Clicks" File
dataTestBefore = '../input/recsys-challenge-2015/yoochoose-test.dat' #Path to Original Testing Dataset "Clicks" File
dataAfter = './dataafter/' #Path to Processed Dataset Folder../input/dataafter将着三个路径分别修改为kaggle笔记本中文件对应的位置,要注意第三个地址的最后要加上一个"/"。
上面的代码是已经修改完成的可以作为参考,其中dataafter是处理完成后的数据所在的文件夹,databefore是数据集中的clicks文件的路径,datatestbefore是数据集中test文件的路径,我们要在kaggle中创建这样的一个文件夹。
!mkdir dataafter
我们在kaggle笔记本中运行上面的命令就会output中看到已经创建好的文件夹,运行完后刷新一下。

因为我已经运行了preprocessing.py所以文件夹中已经有处理之后的数据了。
我们在添加完数据集之后,可以直接在每个文件的最右边找到复制路径的选项,将对应文件的路径粘贴到代码里对应的地方即可。

上面是导入的原始数据集,把鼠标放在每个文件的最右边就可以看到复制路径的选项。
然后就要修改main.py中的路径。
parser.add_argument('--data_folder', default='./dataafter/', type=str)#./dataafter
parser.add_argument('--train_data', default='recSys15TrainOnly.txt', type=str)
parser.add_argument('--valid_data', default='recSys15Valid.txt', type=str)要修改的是以上这三项,第一个为我们创建的处理完成后数据集的存放的文件夹,要注意加上”/“,下面两个路径的修改是一样的,这是训练集和验证集的文件名称。这里的train_data和valid_data不能直接复制文件的kaggle路径,这样会导致路径搜索时重复一项./dataafter,会报错搜索不到数据集,直接填写文件名称即可。
print('Training Set has', len(trainTR), 'Events, ', trainTR.SessionID.nunique(), 'Sessions, and', trainTR.ItemID.nunique(), 'Items\n\n')
trainTR.to_csv(dataAfter + 'recSys15TrainOnly.txt', sep=',', index=False)
print('Validation Set has', len(trainVD), 'Events, ', trainVD.SessionID.nunique(), 'Sessions, and', trainVD.ItemID.nunique(), 'Items\n\n')
trainVD.to_csv(dataAfter + 'recSys15Valid.txt', sep=',', index=False在preprocessing.py里原作者已经对处理好后的文件进行了命名,直接填写即可。
最后还要修改一项
# torch.Tensor.item() to get a Python number from a tensor containing a single value
losses.append(loss.item())
recalls.append(recall)
mrrs.append(mrr.cpu().numpy())将这里的mrr后面加上.cpu().numpy(),因为在训练的过程中numpy不能直接处理GPU中的数据,需要先将数据复制到CPU。
接下来就是上传源代码了,在Add data 里选择upload

输入名称然后将代码的文件夹拖入进去,然后右下角创建即可,如果在对代码修改后进行上传就会提示有重复文件这时只需点击右下角的箭头选择include这一项即可。
上传完成后如下图所示

然后就可以执行代码了,
!python ../input/gru4rec9/GRU4REC-pytorch-master/GRU4REC-pytorch-master/preprocessing.py首先执行处理数据的代码,其中preprocessing.py前面必须加上他在kaggle中的路径,复制方法和上面一样,执行完成后dataafter文件夹中就会有处理好的文件。
!python ../input/gru4rec13/GRU4REC-pytorch-master/GRU4REC-pytorch-master/main.py然后执行main.py一样要加上其所在的kaggle路径。
最后得到结果:

因为时间问题,这里的epoch我设置为1,这样一轮下来也要将近一个小时。
然后进行验证:
!python ../input/gru4rec13/GRU4REC-pytorch-master/GRU4REC-pytorch-master/main.py --is_eval --load_model ./checkpoint/07240927/model_00000.pt其中main.py的路径和上边一样必须是kaggle中的路径,后面的一个.pt文件是运行完main.py文件后生成的checkpoint文件里的,复制其路径即可。

验证的结果:

最后给出论文里的结果:

我们这里使用的是TOP1损失,隐藏层维度为100,batch_size为32,n_epoch为1,其他参数为代码中的默认选项。
边栏推荐
- EOJ 2020 1月月赛 E数的变换
- Development to testing: a six-year road to automation starting from 0
- Node memory overflow and V8 garbage collection mechanism
- 阿里云技术专家郝晨栋:云上可观测能力——问题的发现与定位实践
- Sqoop【环境搭建 01】CentOS Linux release 7.5 安装配置 sqoop-1.4.7 解决警告并验证(附Sqoop1+Sqoop2最新版安装包+MySQL驱动包资源)
- Apple dominates, Samsung revives, and domestic mobile phones fail in the high-end market
- 【信息系统项目管理师】初见高项系列精华汇总
- 服务器内存故障预测居然可以这样做!
- 高斯消元求解异或线性方程组
- IE7 set overflow attribute failure solution
猜你喜欢

Gauss elimination

CSV data file settings of JMeter configuration components

MySQL的逻辑架构
![Azkaban [basic knowledge 01] core concepts + features +web interface + Architecture +job type (you can get started with Azkaban workflow scheduling system in one article)](/img/f9/c86ccbb0967894d370498c3a9630eb.png)
Azkaban [basic knowledge 01] core concepts + features +web interface + Architecture +job type (you can get started with Azkaban workflow scheduling system in one article)

Node memory overflow and V8 garbage collection mechanism

配置ADCS后访问certsrv的问题

The diagram of user login verification process is well written!

Server and client dual authentication (2)

2019 ICPC Asia Yinchuan regional (water problem solution)

Redis sentinel mode setup under Windows
随机推荐
【Datawhale】【机器学习】糖尿病遗传风险检测挑战赛
Gauss elimination for solving XOR linear equations
解决ProxyError: Conda cannot proceed due to an error in your proxy configuration.
Development to testing: a six-year road to automation starting from 0
学习笔记之常用数组api 改变原数组和不改变原数组的有哪些?
Solve the problem of storing cookies in IE7 & IE8
CSV data file settings of JMeter configuration components
新增市场竞争激烈,中国移动被迫推出限制性超低价5G套餐
(2) Hand eye calibration of face scanner and manipulator (eye out of hand: nine point calibration)
PMM (percona monitoring and management) installation record
WARNING: [pool www] server reached pm. max_ children setting (5), consider raising it
Gauss elimination
Server and client dual authentication (2)
Node 内存溢出及V8垃圾回收机制
编写一个在bash / shell 和 PowerShell中均可运行的脚本
Matlab Simulink realizes fuzzy PID control of time-delay temperature control system of central air conditioning
Qt随手笔记(二)Edit控件及float,QString转化、
IE7 set overflow attribute failure solution
QT handy notes (III) use qtcharts to draw a line chart in VS
Sqoop [put it into practice 02] sqoop latest version full database import + data filtering + field type support description and example code (query parameter and field type forced conversion)