热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

[知识点整理]用于内容感知推荐系统的门控式注意自动编码器(GatedAttentiveAutoencoderforContentAwareRecommendation)

原文:ChenMa,PengKang,BinWu,QinglongWang,andXueLiu.2019.GatedAttentive-AutoencoderforContent-

原文:Chen Ma, Peng Kang, Bin Wu, Qinglong Wang, and Xue Liu. 2019. Gated Attentive-Autoencoder for Content-Aware Recommendation. In The Twelfth ACM International Conference on Web Search and Data Mining (WSDM ’19), February 11–15, 2019, Melbourne, VIC, Australia. ACM, New York, NY, USA, 9 pages. https://doi.org/10.1145/3289600.3290977

摘要

        随着用户和商品数量的大量增加,个性化推荐系统着几个挑战性的问题:



   1.利用稀疏隐式反馈比较困难(the hardness ofexploiting sparse implicit feedback)

   2.合并异构数据难度比较大(the difficulty of combining heterogeneous data)

        为了应对这些挑战,作者提出了门控式注意自动编码器(Gated Attentive-Autoencoder ,GATE)模型,该模型通过神经门控结构(neural gating structure)来学习商品内容和二元(例如like和dislike)评分的隐藏表示。该模型利用商品之间的邻近关系来推断用户的偏好。词语层次和邻居层次的注意模块与自动编码器集成在一起,词语注意模块从商品(描述)的词语序列中学习到商品的隐藏表示,分配较大的权重给信息量大的词语。邻居注意模块则通过加权考虑邻域来学习商品邻域的隐藏表示。

        本文主要的贡献如下:

1.为了从商品的词语序列中学习到隐藏的表示,使用词语注意模块来自适应地区分含有信息的词语,从而能够更好的理解商品的内容,并且该模块在参数更少的情况下达到与复杂的递归或卷积神经网络的效果。

2.为了有效融合商品的内容和评分的隐藏表示,提出了一个神经门控层(neural gating layer)提取和组合它们显著的部分。

3.根据商品和商品之间的关系,利用邻居注意模块来学习商品邻域的隐藏表示,在商品邻域上对用户偏好进行建模为推断改商品的用户偏好提供了重要补充。

4.提出的两个注意模块都能各自解释和可视化重要的词语和相邻商品。


问题描述

        本文考虑的推荐系统任务使用隐式反馈作为训练和测试数据用户的偏好由m*n的二元矩阵R构成,m代表用户数,n代表商品数。n个商品的完整集合用文件列表表示,而中的每一个文件表示为一串词语序列。商品相邻关系由一个n*n大小的二元相邻矩阵N表示,其中表示第i个商品和第j个商品相关联。给定NR的一部分,问题就是预测R中的剩下部分。之后用大写粗体表示矩阵,小写粗体表示列向量,细体表示标量。

方法

        模型的体系结构如上图所示。黄色部分是用于评分预测的堆叠式自动编码器(stacked autoencoder,以下autoencode简称为AE);绿色部分是用于商品内容的词语注意模块;蓝色为门控层(Gating Layer);用于融合隐藏表示,粉红色为邻居注意模块。Word_Att是词语注意层,Neighbor_Att是邻域注意层,Agg_Layer是聚合层。⊙是按元乘,⊕是按元加。


  • 模型基础


        用户和商品数量的增加使得处理交互复杂并且难以建模,为了捕捉用户对某个商品的偏好,我们使用堆叠式AE来对第i个商品所有用户的评分向量(1*m大小)来进行编码为,上标r表示该隐藏表示是从商品们的评分中学习到的。 编码和解码规则如下:

        W1为h1*m大小、W2为h*h1大小、W3为h1*h大小、W4为m*h1大小的加权矩阵,h1是第一个隐藏层的维度,h为瓶颈层(bottleneck layer)的维度 。ri是mult-hot向量(向量中含有多个1),rui=1表示用户u喜欢商品i。


  • 词语注意模块


        相对于之前的工作从词袋(bag-of-words)中学习而忽视了不同词语的重要性不同的情况下,所以提出了该模块,该模块的权重自适应地选择了重要性不同的词语,并使信息量更大的单词对描述(depict)商品做出更大的贡献。

1.嵌入层(Embedding Layer)

        商品i的输入是来自其内容描述的li个词语,每个单词用一个one-hot(只有一个为1)的列向量表示。在本层,one-hot编码向量通过一个h*v大小的词语嵌入矩阵(word embedding matrix)E转换为低维密集向量表示,h是词语嵌入的维度,v是词汇表(vocabulary)的大小。通过该层转换后,商品内容被表示为:

        Di为h*li大小矩阵,ej为h长列向量。 

2.多维注意(Multi-dimensional Attention)

        受机器翻译中只依赖注意机制的变换器(Transformer)的启发,我们在不使用复杂的递归或卷积神经网络的情况下,将多维注意机制应用于词语序列,来学习商品的隐藏表示。原因是在现实世界中,用户可能更关心可以用几个词语来表达商品的主题或主旨,而不是词语序列中的词语对词语的关系。

        词语注意的目的是给不同的词语赋予不同的重要性,然后以加权的方式聚合词语嵌入来描述(characterize)这个词。给定商品Di的词语嵌入,通过两层神经网络计算注意权重的普通(vanilla)注意机制表示:

        wa1为h长的列向量,Wa2为h*h矩阵,ba2是h长的列向量是需要被学习的参数,sofrmax()函数确保权重和为1,然后我们根据ai提供的权重来对Di中的词语嵌入求和,来获得商品的向量表示(上标c表示从商品内容中学习到的隐藏表示):

         然而,为单词嵌入指定一个重要值通常会使模型关注(focus on)商品内容的特定方面。特别是当词语数量特别大时,商品内容中的多个方面共同描述了该商品。因此我们需要多个ai来关注商品内容的不同部分,我们采用一个矩阵来代替ai来获取多维注意并 对每个词语嵌入分配一个注意权重向量。注意权重向量的每一维表示Di中所有嵌入关系的一个方面。假设我们希望从词语嵌入中提取注意的da个方面,然后我们将wa扩展到da*h大小的矩阵Wa1,它的表现像是”重要单词是什么“的高级表达:

        其中,Ai为da*li大小的注意权重矩阵,ba1是长为da的偏置向量, softmax是沿着输入的第二维,通过将注意力权重矩阵与词语嵌入相乘,我们得到了一个商品的矩阵表示:

        Zic是da*h大小的商品矩阵表示,然后我们用另一个神经层来将商品矩阵表示聚合为向量表示。商品的隐藏表示形式修改(revise)为:

         wt是da长的聚集层(aggregation layer)参数,at()是激活函数。


  • 神经门控层


        我们已经从商品的内容和评分获得了商品隐藏的表示,下一个目标是将这两种表示结合,以便对未评分的商品进行预测,受长短期记忆(long short-term memory,LSTM)的启发我们提出了本层进行自适应地合并(merge)他们。门控G和融合的商品隐藏表示zig通过以下公式计算:

        h*h大小的矩阵Wg1Wg2以及h长的向量bg是门控层的参数,通过该层可以提取出两个隐藏表示的显著部分并平滑地组合。


  • 邻域注意模块


        有些商品之前有固定的关系例如论文的引用,这些密切相关的商品可以形成有共同主题的邻域关系。如果用户对某个商品的邻居感兴趣,那么很可能对这个商品也感兴趣。在商品的邻居中,某些商品具有代表性,在描述邻域中发挥重要作用。我们将商品i的邻居集合定义为,可以从矩阵N获得。商品i的邻域隐藏表示计算为:

        h*h大小的矩阵Wn为邻居注意层要学习的参数 ,为了同时获得用户对商品及其邻域的偏好,可改写为

加权损失

        在平方损失函数(square loss function)中插入置信矩阵(confidence matrix):

         m*n大小的置信矩阵C如下:

        超参数ρ是固定的。

网络训练

        模型的目标函数如下: 

        λ为正则化参数。最小化目标函数可以通过反向传播的梯度下降实现,并使用Adam的方法来自动调整学习率。 


推荐阅读
  • 深入解析C语言中结构体的内存对齐机制及其优化方法
    为了提高CPU访问效率,C语言中的结构体成员在内存中遵循特定的对齐规则。本文详细解析了这些对齐机制,并探讨了如何通过合理的布局和编译器选项来优化结构体的内存使用,从而提升程序性能。 ... [详细]
  • 在尝试对 QQmlPropertyMap 类进行测试驱动开发时,发现其派生类中无法正常调用槽函数或 Q_INVOKABLE 方法。这可能是由于 QQmlPropertyMap 的内部实现机制导致的,需要进一步研究以找到解决方案。 ... [详细]
  • C语言中全部可用的数学函数有哪些?2.longlabs(longn);求长整型数的绝对值。3.doublefabs(doublex);求实数的绝对值。4.doublefloor(d ... [详细]
  • 单片微机原理P3:80C51外部拓展系统
      外部拓展其实是个相对来说很好玩的章节,可以真正开始用单片机写程序了,比较重要的是外部存储器拓展,81C55拓展,矩阵键盘,动态显示,DAC和ADC。0.IO接口电路概念与存 ... [详细]
  • MySQL 5.7 学习指南:SQLyog 中的主键、列属性和数据类型
    本文介绍了 MySQL 5.7 中主键(Primary Key)和自增(Auto-Increment)的概念,以及如何在 SQLyog 中设置这些属性。同时,还探讨了数据类型的分类和选择,以及列属性的设置方法。 ... [详细]
  • 在Delphi7下要制作系统托盘,只能制作一个比较简单的系统托盘,因为ShellAPI文件定义的TNotifyIconData结构体是比较早的版本。定义如下:1234 ... [详细]
  • 本文详细介绍了MySQL数据库的基础语法与核心操作,涵盖从基础概念到具体应用的多个方面。首先,文章从基础知识入手,逐步深入到创建和修改数据表的操作。接着,详细讲解了如何进行数据的插入、更新与删除。在查询部分,不仅介绍了DISTINCT和LIMIT的使用方法,还探讨了排序、过滤和通配符的应用。此外,文章还涵盖了计算字段以及多种函数的使用,包括文本处理、日期和时间处理及数值处理等。通过这些内容,读者可以全面掌握MySQL数据库的核心操作技巧。 ... [详细]
  • 你的问题在于:1. 代码格式混乱,缺乏必要的缩进,导致可读性极低;2. 使用 `strlen()` 和 `malloc()` 函数时,必须包含相应的头文件;3. `write()` 函数的返回值处理不当,建议检查并处理其返回值以确保程序的健壮性。此外,建议在编写代码时遵循良好的编程规范,增加代码的可维护性和可读性。 ... [详细]
  • 本文详细解析了 Android 系统启动过程中的核心文件 `init.c`,探讨了其在系统初始化阶段的关键作用。通过对 `init.c` 的源代码进行深入分析,揭示了其如何管理进程、解析配置文件以及执行系统启动脚本。此外,文章还介绍了 `init` 进程的生命周期及其与内核的交互方式,为开发者提供了深入了解 Android 启动机制的宝贵资料。 ... [详细]
  • 在C++程序中,文档A的每一行包含一个结构体数据,其中某些字段可能包含不同数量的数字。需要将这些结构体数据逐行读取并存储到向量中,随后不仅在控制台上显示,还要输出到新创建的文档B中。希望得到指导,感谢! ... [详细]
  • 使用 ListView 浏览安卓系统中的回收站文件 ... [详细]
  • 本指南从零开始介绍Scala编程语言的基础知识,重点讲解了Scala解释器REPL(读取-求值-打印-循环)的使用方法。REPL是Scala开发中的重要工具,能够帮助初学者快速理解和实践Scala的基本语法和特性。通过详细的示例和练习,读者将能够熟练掌握Scala的基础概念和编程技巧。 ... [详细]
  • 本文介绍了如何在iOS平台上使用GLSL着色器将YV12格式的视频帧数据转换为RGB格式,并展示了转换后的图像效果。通过详细的技术实现步骤和代码示例,读者可以轻松掌握这一过程,适用于需要进行视频处理的应用开发。 ... [详细]
  • 【图像分类实战】利用DenseNet在PyTorch中实现秃头识别
    本文详细介绍了如何使用DenseNet模型在PyTorch框架下实现秃头识别。首先,文章概述了项目所需的库和全局参数设置。接着,对图像进行预处理并读取数据集。随后,构建并配置DenseNet模型,设置训练和验证流程。最后,通过测试阶段验证模型性能,并提供了完整的代码实现。本文不仅涵盖了技术细节,还提供了实用的操作指南,适合初学者和有经验的研究人员参考。 ... [详细]
  • 在TypeScript中,我定义了一个名为 `Employee` 的接口,其中包含 `id` 和 `name` 属性。为了使这些属性可选为空,可以通过使用 `| null` 或 `| undefined` 来扩展其类型定义。例如,`id: number | null` 表示 `id` 可以是数字或空值。这种类型的灵活性在处理不确定的数据时非常有用,可以提高代码的健壮性和可维护性。 ... [详细]
author-avatar
allmon白_980
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有