DLRM:Deep Learning Recommendation Model for Personalization and Recommendation Systems论文阅读笔记

本文主要是介绍DLRM:Deep Learning Recommendation Model for Personalization and Recommendation Systems论文阅读笔记,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 

介绍:

对于一个神经网络来说,有效地处理稀疏数据是很有挑战性的。由于缺乏代表性模型和数据集的公开可用细节,导致对推荐系统的研究进展缓慢。

DLRM(Deep Learning Recommendation Model)是深度学习推荐模型的实现,用于个性化推荐。DLRM通过结合协同过滤和基于预测分析的方法的原理,在其他模型的基础上取得了进展,这使得它能够有效地处理生产规模的数据,并提供最先进的结果。

DLRM 提供两个版本的代码,分别使用 PyTorch 和 Caffe2。此外,DLRM 还有一个使用 Glow C++算子实现的变体。为了适应不同框架,各个版本的代码略有不同,但整体结构类似。

DLRM网络结构:

dense feature和sparse indices嵌入的向量必须相同。dense用MLP来处理成一个向量,sparse indice用embdding_lookup嵌入到相同维度的向量。

模型(不同方式表达的两个模型图):

我按着DLRM随机生成的数据来讲解,有3个类(sparese feature)标签,一个dense feature标签。

 

 

DLRM_Net(

  #用于sparse feature特征处理的网络结构
  (emb_EmbeddingBag): ModuleList(
    (0): EmbeddingBag(4, 2, mode=sum)     #   第一类可有4个one-hot长度
    (1): EmbeddingBag(3, 2, mode=sum)    #第二类可有3个one-hot长度
    (2): EmbeddingBag(2, 2, mode=sum)    #第三类可有2个one-hot长度
  )

  #用于bottom_MLP处理的网络结构
  (bottom_MLP): Sequential(   #这是用于编码dense features设置的神经网络,输入4个神经单元,输出2个神经元
    (0): Linear(in_features=4, out_features=3, bias=True)
    (1): ReLU()
    (2): Linear(in_features=3, out_features=2, bias=True)
    (3): ReLU()  #底部输出用的是Relu函数
  )

#用于sparse feature和dense feature交互的网络结构
  (top_MLP): Sequential(   #这是用于处理交互的神经网络,输入8(为啥是8?下面会讲)个神经单元,输出1个(也就是最后的预测值)
    (0): Linear(in_features=8, out_features=4, bias=True)
    (1): ReLU()
    (2): Linear(in_features=4, out_features=2, bias=True)
    (3): ReLU()
    (4): Linear(in_features=2, out_features=1, bias=True)
    (5): Sigmoid()  #顶部输出用的是Sigmoid函数
  )
)

 

下面会详细介绍一下模型怎么进行交互的,这是模型最重要的部分。

比如dense feature数据处理后的向量为 [tensor([[0.41190, 0.00000]])]

3个类(sparse feature)标签嵌入后的向量为:tensor([[
         [-0.05473, -0.15156],
         [ 0.12820,  0.25686],
         [ 0.18523, -0.57685]]])

首先dense feature和类别嵌入向量两两进行点积(就是对应元素相乘然后相加)得到他们之间的交互:

4个向量会有【n(n-1)/2】6种可能(也就是6个值):

tensor([[-0.02254,  0.05280, -0.04594,  0.07629,  0.07729, -0.12442]])

然后再和处理过后dense feature特征进行拼接得到:

tensor([[0.41190, 0.00000,-0.02254,  0.05280, -0.04594,  0.07629,  0.07729, -0.12442]])

这里就变成8个输入了,解释了上面标红的内容。

之后将这8个输入TOP—MLP网络并进行训练就可以了。

 

实验:

论文代码 :https://github.com/facebookresearch/dlrm

数据集下载地址:http://labs.criteo.com/2014/02/download-kaggle-display-advertising-challenge-dataset/

 

需要的软件包:

pytorch-nightly (6/10/19)

onnx (可选)

torchviz (可选)

 

Criteo数据集的首选硬件应该是:

CPU — 8核以上

GPU — 推荐

Ram — 64GB (任何低于内存大小的将不起作用)

 

代码文件说明: 

dlrm_s_pytorch.py:在PyTorch框架下实现DLRM的文件 
dlrm_s_caffe2.py文件:在caffe2框架下实现DLRM的代码文件每个框架的代码略有不同,以适应每个框架的具体情况,但是总体结构是相似的。

测试代码能否正常运行,是否满足程序运行条件,打开程序当前位置的终端路径,然后输入:

python dlrm_s_pytorch.py --mini-batch-size=2 --data-size=6

$ python dlrm_s_pytorch.py --mini-batch-size=2 --data-size=6
time/loss/accuracy (if enabled):
Finished training it 1/3 of epoch 0, -1.00 ms/it, loss 0.451893, accuracy 0.000%
Finished training it 2/3 of epoch 0, -1.00 ms/it, loss 0.402002, accuracy 0.000%
Finished training it 3/3 of epoch 0, -1.00 ms/it, loss 0.275460, accuracy 0.000%

运行真实的数据集:

$dlrm_pt_bin --arch-sparse-feature-size=16 --arch-mlp-bot="13-512-256-64-16" --arch-mlp-top="512-256-1" --data-generation=dataset --data-set=kaggle --processed-data-file=./input/kaggle_processed.npz --loss-function=bce --round-targets=True --learning-rate=0.1 --mini-batch-size=128 --print-freq=1024 --print-time $dlrm_extra_option 2>&1 | tee run_kaggle_pt.log

--arch-sparse-feature-size=16           表示每个sparse feature特征嵌入到长度为16的向量(论文中有26个sparse feature)

--arch-mlp-bot="13-512-256-64-16   表示dense feature嵌入特征用的网络结构,13表示输入神经元个数,16表示输出神经元个数

--arch-mlp-top="512-256-1               表示top-MLP的结构,输入神经元个数是程序自己计算出来的。26(sparse)+1(dense)=27,两两交互产生351个值,与dense feaature处理后的长度为16的向量拼接得到367个值,作为top的输入(这些过程在程序中是自己计算出来的,好处是我们不用定义输入层,只需修改隐藏层和输出层就行),实际上top-MLP的网络架构为:367-512-256-1。输入神经元个数为376,输出神经元个数为1.

 

并行计算:

DLRM 基准模型提供了并行化的解决方案。但是这超出了论文的内容,作者没有细说,Facebook 研究团队计划优化这一系统,并在以后的博客中公开详细的性能细节。

 

模型的保存和加载

训练时,模型可以使用 --save-model=保存。如果在测试时准确率提升,则模型会被保存。查看测试精确率的命令是: --test-freq intervals。

可以使用 --load-model=加载之前保存的模型。加载的模型可以继续用于训练,通过 checkpoint 文件保存。如果只要求用模型进行测试,则需要特别命令—inference-only。

 

 

总结:

 

提示:

 

 

 

 

 

 

这篇关于DLRM:Deep Learning Recommendation Model for Personalization and Recommendation Systems论文阅读笔记的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/276605

相关文章

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟 开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚 第一站:海量资源,应有尽有 走进“智听

AI hospital 论文Idea

一、Benchmarking Large Language Models on Communicative Medical Coaching: A Dataset and a Novel System论文地址含代码 大多数现有模型和工具主要迎合以患者为中心的服务。这项工作深入探讨了LLMs在提高医疗专业人员的沟通能力。目标是构建一个模拟实践环境,人类医生(即医学学习者)可以在其中与患者代理进行医学

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

论文翻译:arxiv-2024 Benchmark Data Contamination of Large Language Models: A Survey

Benchmark Data Contamination of Large Language Models: A Survey https://arxiv.org/abs/2406.04244 大规模语言模型的基准数据污染:一项综述 文章目录 大规模语言模型的基准数据污染:一项综述摘要1 引言 摘要 大规模语言模型(LLMs),如GPT-4、Claude-3和Gemini的快

论文阅读笔记: Segment Anything

文章目录 Segment Anything摘要引言任务模型数据引擎数据集负责任的人工智能 Segment Anything Model图像编码器提示编码器mask解码器解决歧义损失和训练 Segment Anything 论文地址: https://arxiv.org/abs/2304.02643 代码地址:https://github.com/facebookresear

数学建模笔记—— 非线性规划

数学建模笔记—— 非线性规划 非线性规划1. 模型原理1.1 非线性规划的标准型1.2 非线性规划求解的Matlab函数 2. 典型例题3. matlab代码求解3.1 例1 一个简单示例3.2 例2 选址问题1. 第一问 线性规划2. 第二问 非线性规划 非线性规划 非线性规划是一种求解目标函数或约束条件中有一个或几个非线性函数的最优化问题的方法。运筹学的一个重要分支。2

【C++学习笔记 20】C++中的智能指针

智能指针的功能 在上一篇笔记提到了在栈和堆上创建变量的区别,使用new关键字创建变量时,需要搭配delete关键字销毁变量。而智能指针的作用就是调用new分配内存时,不必自己去调用delete,甚至不用调用new。 智能指针实际上就是对原始指针的包装。 unique_ptr 最简单的智能指针,是一种作用域指针,意思是当指针超出该作用域时,会自动调用delete。它名为unique的原因是这个

查看提交历史 —— Git 学习笔记 11

查看提交历史 查看提交历史 不带任何选项的git log-p选项--stat 选项--pretty=oneline选项--pretty=format选项git log常用选项列表参考资料 在提交了若干更新,又或者克隆了某个项目之后,你也许想回顾下提交历史。 完成这个任务最简单而又有效的 工具是 git log 命令。 接下来的例子会用一个用于演示的 simplegit

记录每次更新到仓库 —— Git 学习笔记 10

记录每次更新到仓库 文章目录 文件的状态三个区域检查当前文件状态跟踪新文件取消跟踪(un-tracking)文件重新跟踪(re-tracking)文件暂存已修改文件忽略某些文件查看已暂存和未暂存的修改提交更新跳过暂存区删除文件移动文件参考资料 咱们接着很多天以前的 取得Git仓库 这篇文章继续说。 文件的状态 不管是通过哪种方法,现在我们已经有了一个仓库,并从这个仓