BOOM!推荐系统遇上多模态信息

2024-02-15 00:20

本文主要是介绍BOOM!推荐系统遇上多模态信息,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

NewBeeNLP原创出品   

公众号专栏作者@上杉翔二   

悠闲会 · 信息检索

推荐已经成为许多在线内容共享服务的核心组成部分,从图像、博客公众号、音乐推荐、短视频推荐等等。与传统推荐不一样的地方,就是这些项目内容包含着丰富的多媒体信息-帧、音轨和描述,涉及多种形式的视觉、声学和文本信息。

「那么如此丰富的多媒体、多模态信息如何融合到推荐中呢?」

最普通也是最直接的方式可能就是对多模态抽特征,然后多模态融合直接作为side Information或者item的representation之后参与到推荐中的。

本篇博文主要整理三篇整合多模态信息到表示中的文章,一篇是通用的融合结果,其他两篇中一篇涉及到了GCN,一篇涉及到了KG,可能需要补充相关基础知识可见博主以往整理过的系列文章[1]。还有其他关于多模态的+比较有意义的论文也欢迎在博文后面留言推荐。

LOGO

  • 论文:Hashtag Our Stories: Hashtag Recommendation for Micro-Videos via Harnessing Multiple Modalities

  • 地址:https://www.sciencedirect.com/science/article/abs/pii/S0950705120303798

  • 代码:https://tagrec.wixsite.com/logo

领域是短视频标签推荐。这篇文章就是使用比较直观的手段,分为三个步骤:

  • 「抽取特征:」 对视觉,声音,文本三个模态都用LSTM+Attention进行模态抽取。

  • 「共同空间投影:」 投影到Common space之后以弥合不同模态之间的表达gap。

  • 「NCF推荐:」 直接使用NCF推荐tag就可以了。

模型较为简单清晰,直接看代码结构

class LOGO(nn.Module):def __init__(self, img_in, img_h, au_in, au_h, text_in, text_h, common_size):super(LOGO, self).__init__()self.ilstm = ImageLSTM(img_in, img_h)self.alstm = AudioLSTM(au_in, au_h)self.tlstm = TextLSTM(text_in, text_h)# map into the common spaceself.ilinear = MLP(img_h, common_size)self.alinear = MLP(au_h, common_size)self.tlinear = MLP(text_h, common_size)def forward(self, image, audio, text):# lstm + attentionh_i = self.ilstm(image) # batch*img_hh_a = self.alstm(audio) # batch*au_hh_t = self.tlstm(text) # batch*text_h# map into the common spacex_i = self.ilinear(h_i) # batch*common_sizex_a = self.alinear(h_a) # batch*common_sizex_t = self.tlinear(h_t) # batch*common_size# return three kind of featuresreturn x_i, x_a, x_t

UHMAN

  • 论文:User Conditional Hashtag Recommendation for Micro-Videos

  • 地址:https://ieeexplore.ieee.org/document/9102824

这个也是短视频标签推荐,旨在给出能够反映短视频主题或内容的标签,且满足用户的偏好。文章的motivation在于:大多数用户在看视频时只关注帧的某些特定区域和整个视频的某些特定帧。所以方法上是融合了用户信息+视频时空注意力最后得到结果。

完整模型如上,视频的时空两方面的信息都会在multi-head attention习得到融合,同时结合了很多用户信息,如性别、年龄、国家等等一起参与到模型预测中。

然后以上沿着这个经典线路,可以把多模态融合的很多技术手段拿进来做魔改,就不再单独展开。

MMGCN

  • 论文:Multi-modal Graph Convolution Network for Personalized Recommendation of Micro-video

  • 地址:http://staff.ustc.edu.cn/~hexn/papers/mm19-MMGCN.pdf

  • 代码:https://github.com/weiyinwei/MMGCN

出自MM2019,为了基于多媒体推荐,那么不仅要求能够理解User-item交互,还得考虑item内容本身多模态的特征。但是,目前的多模态推荐方法主要是利用item本身的多模态内容来丰富item侧的表示;但是很少会考虑用它来提升 user侧的表示,然而捕获这种表示是能够提高用户对不同模态特征的细粒度偏好的。主要涉及到有三点:

  • 不同模态的语义差异。如上图中,战争片和恐怖片在视觉模态空间很相似,但是在文本模态空间却并不相似,它们的主题并不一样。所以同时融合多模态对item的理解是有意义的。

  • 同一个用户对不同模态的不同偏好。有些人在意画面,而有些人却喜欢bgm。

  • 不同的模式可以作为探索用户兴趣的不同渠道。结合用户的交互,体现了多模态信息是能够加强用户特征理解的,即喜欢画面就多推画面精彩的item,喜欢bgm就多推相应的item就好。

所以作者提出用User-item交互来引导模态表示,并反过来捕获在特定模态内容下用户的偏好。具体的实现如下图,在User-item二部图上按视频,音频,文本各自可得到三个图,然后先item聚合,再user聚合得到表示,其中这里的每步都会额外加入id和content一起,最后得到预测结果。

  • Aggregation Layer。user从item聚合,item从user聚合,这和以往GNN在推荐中的用法一致。这里作者提到了两种聚合机制,平均和最大,看一下公式:

    值得注意的是,因为分成了三个模态的图,所以这里是需要按modal-specific来汇聚邻居,jm表示对应模态m下的表示,然后用leakyrelu线性变换,最后用平均池化汇聚,平均是假设了所有领域节点的影响是等价的。另一个就是max聚合,

    好处是不同的邻域结点的影响力不同。

  • Combination Layer。融合三个信息,结构化信息hm(前一层消息传递后的特征),自有信息um(各模态原始特征表示原内容特征)和模态间信息uid(所有模态共享的id信息)。具体操作是先融合um和uid,然后再和hm进行融合,公式如下:

其实代码实现比文章更好理解。做了三个gcn之后得到平均的表示再预测就行:

#gcn部分的forward
def forward(self, features, id_embedding):temp_features = self.MLP(features) if self.dim_latent else featuresx = torch.cat((self.preference, temp_features),dim=0)x = F.normalize(x).cuda()h = F.leaky_relu(self.conv_embed_1(x, self.edge_index))#equation 1x_hat = F.leaky_relu(self.linear_layer1(x)) + id_embedding if self.has_id else F.leaky_relu(self.linear_layer1(x))#equation 5 x = F.leaky_relu(self.g_layer1(torch.cat((h, x_hat), dim=1))) if self.concate else F.leaky_relu(self.g_layer1(h)+x_hat)h = F.leaky_relu(self.conv_embed_2(x, self.edge_index))#equation 1x_hat = F.leaky_relu(self.linear_layer2(x)) + id_embedding if self.has_id else F.leaky_relu(self.linear_layer2(x))#equation 5x = F.leaky_relu(self.g_layer2(torch.cat((h, x_hat), dim=1))) if self.concate else F.leaky_relu(self.g_layer2(h)+x_hat)h = F.leaky_relu(self.conv_embed_3(x, self.edge_index))#equation 1x_hat = F.leaky_relu(self.linear_layer3(x)) + id_embedding if self.has_id else F.leaky_relu(self.linear_layer3(x))#equation 5x = F.leaky_relu(self.g_layer3(torch.cat((h, x_hat), dim=1))) if self.concate else F.leaky_relu(self.g_layer3(h)+x_hat)return x#模型部分的forward
def forward(self):#得到三个模态的表示v_rep = self.v_gcn(self.v_feat, self.id_embedding)a_rep = self.a_gcn(self.a_feat, self.id_embedding)# # self.t_feat = torch.tensor(scatter_('mean', self.word_embedding(self.words_tensor[1]), self.words_tensor[0])).cuda()t_rep = self.t_gcn(self.t_feat, self.id_embedding)representation = (v_rep+a_rep+t_rep)/3self.result = representationreturn representation

MKGAT

  • 论文:Multi-modal Knowledge Graphs for Recommender Systems

  • 地址:https://zheng-kai.com/paper/cikm_2020_sun.pdf

出自CIKM20,作者提出了多模态知识图关注网络(MKGAT)。这篇文章通过利用多模态知识图谱来更好地增强推荐系统。看起来很不错,首先需要考虑的是如何构建一个多模态知识图谱呢?

作者认为多模态信息实质是对原实体信息的补充,所以整个图将会存在四种节点:user,item,entity,mm(多模态补充信息将会一起处理,如上图所示,tail的multimodl表示包含了tag,image,sentence等等,他们会统一抽特征然后表示)。

然后根据这个MMKG,模型主要可以做:

  1. 实体信息聚合,将实体的邻居节点信息聚合起来,丰富实体本身

  2. 实体关系推理,通过三重(例如TransE)的评分函数构造推理关系)

模型的构建如下图,就模型设计上主要是加了层次GAT。

  • Propagation layer。实体嵌入用transE,关于KG的部分博主做过整理了,不做赘述,传送门[2]。公式如下:

  • Aggregation layer。聚合层是得到关于实体的新表示,也是有多种表示方法,如加和和拼接:

  • 然后可以得到训练KG的公式:

    再利用score对三元组进行训练:

  • 推荐部分直接内积就行,其中e会合并所有层的表示:

一起交流

想和你一起学习进步!『NewBeeNLP』目前已经建立了多个不同方向交流群(机器学习 / 深度学习 / 自然语言处理 / 搜索推荐 / 图网络 / 面试交流 / 等),名额有限,赶紧添加下方微信加入一起讨论交流吧!(注意一定要备注信息才能通过)

本文参考资料

[1]

系列文章: https://nakaizura.blog.csdn.net/article/details/107898237

[2]

传送门: https://blog.csdn.net/qq_39388410/category_8523573.html

END -



如何利用多任务学习提升模型性能?

2021-03-17

无心插柳 | 聊聊我的 ACL2020 论文

2021-03-11

跨界出圈 | 谈谈BERT跨模态预训练

2021-02-10

复旦邱锡鹏教授 | 『语言+X』预训练模型

2021-02-07

这篇关于BOOM!推荐系统遇上多模态信息的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Java SWT库详解与安装指南(最新推荐)

《JavaSWT库详解与安装指南(最新推荐)》:本文主要介绍JavaSWT库详解与安装指南,在本章中,我们介绍了如何下载、安装SWTJAR包,并详述了在Eclipse以及命令行环境中配置Java... 目录1. Java SWT类库概述2. SWT与AWT和Swing的区别2.1 历史背景与设计理念2.1.

基于Python实现一个简单的题库与在线考试系统

《基于Python实现一个简单的题库与在线考试系统》在当今信息化教育时代,在线学习与考试系统已成为教育技术领域的重要组成部分,本文就来介绍一下如何使用Python和PyQt5框架开发一个名为白泽题库系... 目录概述功能特点界面展示系统架构设计类结构图Excel题库填写格式模板题库题目填写格式表核心数据结构

Java日期类详解(最新推荐)

《Java日期类详解(最新推荐)》早期版本主要使用java.util.Date、java.util.Calendar等类,Java8及以后引入了新的日期和时间API(JSR310),包含在ja... 目录旧的日期时间API新的日期时间 API(Java 8+)获取时间戳时间计算与其他日期时间类型的转换Dur

Linux系统中的firewall-offline-cmd详解(收藏版)

《Linux系统中的firewall-offline-cmd详解(收藏版)》firewall-offline-cmd是firewalld的一个命令行工具,专门设计用于在没有运行firewalld服务的... 目录主要用途基本语法选项1. 状态管理2. 区域管理3. 服务管理4. 端口管理5. ICMP 阻断

Windows 系统下 Nginx 的配置步骤详解

《Windows系统下Nginx的配置步骤详解》Nginx是一款功能强大的软件,在互联网领域有广泛应用,简单来说,它就像一个聪明的交通指挥员,能让网站运行得更高效、更稳定,:本文主要介绍W... 目录一、为什么要用 Nginx二、Windows 系统下 Nginx 的配置步骤1. 下载 Nginx2. 解压

如何确定哪些软件是Mac系统自带的? Mac系统内置应用查看技巧

《如何确定哪些软件是Mac系统自带的?Mac系统内置应用查看技巧》如何确定哪些软件是Mac系统自带的?mac系统中有很多自带的应用,想要看看哪些是系统自带,该怎么查看呢?下面我们就来看看Mac系统内... 在MAC电脑上,可以使用以下方法来确定哪些软件是系统自带的:1.应用程序文件夹打开应用程序文件夹

windows系统上如何进行maven安装和配置方式

《windows系统上如何进行maven安装和配置方式》:本文主要介绍windows系统上如何进行maven安装和配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不... 目录1. Maven 简介2. maven的下载与安装2.1 下载 Maven2.2 Maven安装2.

使用Python实现Windows系统垃圾清理

《使用Python实现Windows系统垃圾清理》Windows自带的磁盘清理工具功能有限,无法深度清理各类垃圾文件,所以本文为大家介绍了如何使用Python+PyQt5开发一个Windows系统垃圾... 目录一、开发背景与工具概述1.1 为什么需要专业清理工具1.2 工具设计理念二、工具核心功能解析2.

Linux系统之stress-ng测压工具的使用

《Linux系统之stress-ng测压工具的使用》:本文主要介绍Linux系统之stress-ng测压工具的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、理论1.stress工具简介与安装2.语法及参数3.具体安装二、实验1.运行8 cpu, 4 fo

MySQL 存储引擎 MyISAM详解(最新推荐)

《MySQL存储引擎MyISAM详解(最新推荐)》使用MyISAM存储引擎的表占用空间很小,但是由于使用表级锁定,所以限制了读/写操作的性能,通常用于中小型的Web应用和数据仓库配置中的只读或主要... 目录mysql 5.5 之前默认的存储引擎️‍一、MyISAM 存储引擎的特性️‍二、MyISAM 的主