深度学习----多模态推荐系统,多模态推荐数据集(WWW‘ 2023 MMSSL)

论文题目:Multi-Modal Self-Supervised Learning for Recommendation

收录会议:WWW' 2023

论文链接:https://mmssl.files.wordpress.com/2023/02/multi_modal_ssl_recsys_www23_weiwei.pdf

代码链接:https://github.com/HKUDS/MMSSL

Overview:

今天给大家介绍一篇香港大学黄超老师实验室发表的关于多模态自监督推荐系统的文章。在该文章中,作者通过设计两种多模态推荐场景下的自监督任务来:1)建模模态启发的用户交互偏好(即,建立模态内容和协同信号之间的依赖);2)建模各个模态之间关系;它们能够专门针对多模态场景引入自监督信号以一定程度地缓解推荐系统一直以来存在的数据稀疏性问题。模型在多个公开数据集上取得了较好的实验结果。该模型已经开源。

一.研究背景:

多模态推荐应用已经十分普及(如:Tiktok, Amazon)。它们包含的多模态信息(如:视觉信息,听觉信息,文本信息)能够很好帮助用户进行个性化的推荐。但是,目前的多模态推荐系统大多只是强化item端的内容,并且引入了额外模态内容学习的参数。这些模型的表征能力受限于训练数据量,并且学到的embedding可能因此缺少鲁棒性。作者引入自监督任务以缓解数据稀疏性以及它带来的一系列问题。而专门针对多模态推荐场景设计的自监督信号可以: 1) 增强模态内容相关的用户偏好; 2)学习跨模态的依赖。具体地,MMSSL引入了对抗任务以实现1)来进行从协同信号到模态feature的知识迁移;2)多个模态之间关系的建模则是通过对比学习将多个模态作为多个view进行。

编辑切换为居中

添加图片注释,不超过 140 字(可选)

(图1包含两个实验:(a)展示的实验将用户按交互数量分组(<4, <6, <9, <13, <100, all)之后各个模型的Recall@20的结果,柱状图表示各个组的用户数,折线图表示实验结果。(b)则是LATTICE和MMSSL的对不同曝光率的item的预测准确性的可视化。可以观察到,尤其针对交互数非常少的item,MMSSL的结果更好。)

二.模型介绍:

编辑切换为居中

添加图片注释,不超过 140 字(可选)

2.1 多模态对抗自增强

在多模态推荐场景中,不同于社交推荐和KG推荐,模态内容直接引导用户交互。为了捕捉模态信息相关的用户交互偏好,MMSSL的对抗自监督任务迫使模态view向交互view对齐,以向模态feature中注入协同信号。具体地,生成器G首先通过输入的模态feature为各个模态模拟生成交互图。然后,判别起D判别输入是真的交互信息还是G通过模态信息生成的。这个模块MMSSL将分成四个部分介绍:1)生成器; 2)判别器; 3)推荐场景下稀疏数据的对抗任务难点应对; 4)对抗优化。

2.1.1 模态引导的交互生成

在生成阶段,MMSSL的任务是使用模态feature生成模拟的交互。这样做是为了尽量攫取模态feature中的交互信息。具体的做法是用user feature和item feature得到交互的预测:

编辑

添加图片注释,不超过 140 字(可选)

编辑

添加图片注释,不超过 140 字(可选)

具体的交互边计算方式是内积经归一化。而为了充分地挖掘协同信号,这里的user feature和item feature不是使用简单的dense transformation,而是首先通过每个模态特定的GNN在进行feature densification同时先一步增强协同交互信号:

编辑

添加图片注释,不超过 140 字(可选)

item拥有高维的原始特征,因此首先通过它得到user得feature,然后user feature再过一遍GNN以得到最终用于生成交互边的item feature。为了避免使用整个交互矩阵,MMSSL使用分块矩阵乘法进行计算。

在这个部分生成的modality-specific的邻接矩阵将会作为fake data输入判别器。

2.1.2 交互信息判别器

在判别阶段,判别器D旨在鉴别模态feature生成的交互与真实的交互。通过得到能够迷惑判别器D的交互,模态feature能够被注入更多协同信号。在MMSSL中,判别器是多层的MLP, 具体如下:

编辑切换为居中

添加图片注释,不超过 140 字(可选)

D的输入是生成的邻接矩阵的各行(每一行代表每个user)。判别器输出判别input是否来自于real data。

2.1.3 推荐场景下稀疏数据的对抗任务难点应对----Bridge the Distribution Gap.

不同于视觉领域稠密的图像像素,推荐系统中观察到的交互往往是过稀疏的(邻接矩阵中大多数数据为0)。而由深度学习模型学习到的fake data是连续的数值。因此,推荐框架中对抗生成任务的一个挑战就是如何解决distribution gap以防止模式坍塌(mode collapse),比如生成全0的矩阵。为了减小real data和fake data的分布的差异并使模型易于收敛,MMSSL使用Gumbel-Softmax将原始的离散的交互转化成连续的分布。具体的计算方式如下:

编辑切换为居中

添加图片注释,不超过 140 字(可选)

公式的左边是由原始交互经Gumbel-Softmax转化得到的连续的版本。为了进一步减小分布的差异,并加入切合模型预测交互的分布,MMSSL用最终被BPR Loss约束的embedding生成既趋近于真实又符合模型预测分布的交互。

2.1.4 对抗任务损失函数

MMSSL的对抗自监督任务是通过将模态feature生成交互向real data来捕捉协同信号和模态内容之间的依赖。而这个分布对齐的过程则由生成器G和判别器D的分阶段训练和对抗优化过程得到:

编辑

添加图片注释,不超过 140 字(可选)

这里的G的参数包含在推荐模型中,因为整个对抗SSL任务的目的就是使得feature encoder能够向模态feature注入协同信号。而被推荐模型包含的生成器G和判别器D是分开训练的,它们各自的损失函数如下:

编辑

添加图片注释,不超过 140 字(可选)

这里,为了使得对抗模型更容易收敛,MMSSL引入了WassersteinGAN-GP的做法。将real data和fake data的线性插值引入计算过程能够进一步缓解数据稀疏的推荐场景下的数据分布差差异的问题。

2.2 跨模态对比学习

除了增强模态信息和协同信号之间的依赖,MMSSL还设计了对比学习来建模模态之间的依赖。比如,一个短视频能够吸引user和item可能是因为视觉和听觉两个通道同时起作用。为了得到每个用户跨模态的偏好,MMSSL对user embedding进行对比学习。这里不对item做的原因是item 端更应该尽量保留模态内容本身的特性,不应该像user一样强调跨模态信息。这里,值得注意的是,MMSSL设计的两个SSL任务分别是对feature和embedding进行的,即,对抗SSL是作用于feature, 而对比SSL是针对embedding。所以,MMSS的自监督任务从技术的角度讲,是分别增强了两种表征。

2.1.1 跨模态view的构建

首先,MMSSL进行多模态view的构建,具体的做法是将embedding过对抗SSL任务学到的modality-speific的交互的邻接矩阵:

编辑

添加图片注释,不超过 140 字(可选)

这里需要鉴别的一点是,之前的GNN是为了给modality-specific feature注入协同信号,而这里的GNN是为了给embedding注入模态相关的交互偏好。接下来,为了得到high-order的融合多模态的信息,MMSSL在多层的GNN之后使用了mean:

编辑

添加图片注释,不超过 140 字(可选)

编辑

添加图片注释,不超过 140 字(可选)

最终的embedding表征是聚合多层输出的结果。

2.1.2 跨模态对比损失

对比学习过程引入InfoNCE, 具体计算过程如下:

编辑

添加图片注释,不超过 140 字(可选)

为了在同一个超空间下对比,MMSSL在对比损失函数计算之前会首先进行归一化。

2.3 Multi-task模型训练

前面的部分已经详细介绍了SSL任务的部分,而最终的主任务推荐任务则会全面地使用之前两个SSL任务分别增强的feature表征和embedding表征:

编辑

添加图片注释,不超过 140 字(可选)

feature表征在和embedding表征融合之前首先会进行归一化。而最终推荐任务的预测分数则是由最终的user和item表征的内积得到。推荐任务的损失函数是BPR, 而整个框架则以主任务和辅助任务multi-task优化的方式行进:

编辑

添加图片注释,不超过 140 字(可选)

三.实验结果:

3.1 主实验

编辑切换为居中

添加图片注释,不超过 140 字(可选)

MMSSL的主实验是与多种类型的baseline进行对比,包括普通GNN推荐模型(NGCF, LightGCN),自监督推荐(SGL, NCL, HCCF)和多模态推荐(VBPR, MMGCN, GRCN, LATTICE, CLCRec, MMGCL, SLMRec)。 数据集包括亚马逊的Baby和Sports类别,TikTok短视频转化数据和食谱推荐数据集。而使用的指标则包括Recall@20,NDCG@20和 Precision@20。可以观察到,MMSSL的结果在各个数据集上优于所比较的baseline。对于普通的GNN-based的方法,它们的结果低于MMSSL的原因可能是未能充分建模多模态信息。SGL,NCL和HCCF虽然是自监督的方法,但是它们没有关于多模态场景的设计。其他SOTA多模态的方法,在结果上比其他几类baseline好很多,这说明多模态信息的重要性。但可能因为数据稀疏性导致的表征学习不足,它们并没有达到更优的结果。

3.2 消融实验

编辑

添加图片注释,不超过 140 字(可选)

消融实验首先通过w/o-ASL和w/o-CL检验了两个SSL任务的结果;r/p-GAE是用负对数似然最大化交互边的信息以替代对抗生成任务。w/o-GT则是忽略了文章中3.1.3中提到的问题和技术。消融实验证明了MMSSL设计的模块的有效性。对抗SSL增强了feature表征,对比SSL增强了embedding表征, “Bridge Distribution Gap”则保证了向模态feature迁移协同信号的效用。

总结:

在这个工作中,MMSSL提出了多模态自监督模型以应用于多模态推荐场景。MMSSL中设计了一个新的多模态对抗自监督任务以在稀疏的交互下捕捉模态信息引导的用户偏好。此外,MMSSL引入了跨模态对比学习范式以建模用户交互中跨模态的依赖。在几个数据集上全面的实验表明了有自监督任务的MMSSL与各种baseline相比达到了SOTA的结果。

  • 1
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基于深度学习的视频推荐算法常用的有协同过滤、基于内容的推荐深度学习推荐等方法。下面以基于深度学习的视频推荐算法为例,给出一个简单的代码实现。 首先,我们需要准备数据集。假设我们有一个视频数据集,其中包含每个用户对于不同视频的评分,我们可以将这个数据集划分成训练集和验证集,然后构建一个基于神经网络的推荐模型。 接下来,我们可以使用 TensorFlow 或者 PyTorch 等深度学习框架来实现推荐模型。以下是一个使用 TensorFlow 实现基于深度学习的视频推荐算法的简单示例代码: ```python import tensorflow as tf # 定义模型参数 num_users = 1000 num_videos = 2000 embedding_dim = 50 # 定义输入变量 user_input = tf.keras.layers.Input(shape=(1,), dtype='int32', name='user_input') video_input = tf.keras.layers.Input(shape=(1,), dtype='int32', name='video_input') # 定义用户和视频的嵌入层 user_embedding = tf.keras.layers.Embedding(input_dim=num_users, output_dim=embedding_dim, input_length=1, name='user_embedding')(user_input) video_embedding = tf.keras.layers.Embedding(input_dim=num_videos, output_dim=embedding_dim, input_length=1, name='video_embedding')(video_input) # 将用户嵌入层和视频嵌入层相乘,并将结果展平 user_video_interaction = tf.keras.layers.Dot(axes=2, name='dot_product')([user_embedding, video_embedding]) user_video_interaction_flat = tf.keras.layers.Flatten(name='flatten')(user_video_interaction) # 定义输出层 output_layer = tf.keras.layers.Dense(units=1, activation='sigmoid', name='output_layer')(user_video_interaction_flat) # 定义模型 model = tf.keras.models.Model(inputs=[user_input, video_input], outputs=output_layer) # 编译模型 model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy']) # 训练模型 history = model.fit(x=[user_train, video_train], y=y_train, batch_size=128, epochs=10, validation_data=([user_val, video_val], y_val)) ``` 以上代码中,我们首先定义了模型参数,包括用户数、视频数和嵌入维度等。然后定义了输入变量和嵌入层,使用了 Dot 层将用户嵌入层和视频嵌入层相乘,并将结果展平。最后定义了输出层,并编译模型,使用训练数据训练模型。 需要注意的是,以上代码只是一个简单的示例,实际应用中可能需要根据具体情况进行调整和优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值