NRMS: 基于多头自注意力机制的神经新闻推荐系统

在当今信息爆炸的时代,如何从海量的新闻中为用户推荐感兴趣的内容是一个重要的研究课题。本文将介绍一种基于神经网络的新闻推荐方法——NRMS(Neural News Recommendation with Multi-Head Self-Attention),该方法利用多头自注意力机制来有效地学习新闻和用户的表示。

NRMS模型简介

NRMS是一种基于内容的神经新闻推荐方法,其核心由新闻编码器和用户编码器两部分组成:

  1. 新闻编码器:使用多头自注意力机制对新闻标题中的单词之间的相互作用进行建模,从而学习新闻的表示。
  2. 用户编码器:从用户浏览过的新闻中学习用户的表示,并使用多头自注意力来捕捉新闻之间的相关性。
  3. 加性注意力:通过选择重要的单词和新闻,学习更具信息量的新闻和用户表示。

NRMS的主要特点包括:

  • 基于内容的方法,不依赖于用户-物品交互矩阵
  • 利用多头自注意力机制建模单词和新闻之间的关系
  • 使用加性注意力机制选择重要特征

数据集介绍

为了快速训练和评估,本文使用了从MIND小型数据集中抽样的MINDdemo数据集,包含5000名用户的数据。MINDdemo数据集与MINDsmall和MINDlarge具有相同的文件格式。数据集分为训练集(MINDdemo_train)和验证集(MINDdemo_dev),每个集合包含新闻文件和用户行为文件。

新闻数据

新闻文件包含新闻ID、类别、子类别、标题、摘要、URL以及标题和摘要中的实体信息。每行代表一条新闻,格式如下:

[新闻ID] [类别] [子类别] [标题] [摘要] [URL] [标题实体] [摘要实体]

用户行为数据

用户行为文件记录了用户的点击历史和展示新闻。每行代表一个展示实例,格式如下:

[展示ID] [用户ID] [时间戳] [点击历史] [展示新闻]

其中,点击历史是用户在该时间戳之前点击过的新闻ID列表,展示新闻是该次展示的新闻ID列表及其是否被点击的标签(0表示未点击,1表示点击)。

模型实现

接下来,我们将使用TensorFlow框架来实现NRMS模型,并在MINDdemo数据集上进行训练和评估。

环境准备

首先,我们需要导入必要的库和模块:

import os
import sys
import numpy as np
import tensorflow as tf
from recommenders.models.deeprec.deeprec_utils import download_deeprec_resources 
from recommenders.models.newsrec.newsrec_utils import prepare_hparams
from recommenders.models.newsrec.models.nrms import NRMSModel
from recommenders.models.newsrec.io.mind_iterator import MINDIterator
from recommenders.models.newsrec.newsrec_utils import get_mind_data_set

print("System version: {}".format(sys.version))
print("Tensorflow version: {}".format(tf.__version__))

数据下载与准备

接下来,我们需要下载并准备MINDdemo数据集:

tmpdir = TemporaryDirectory()
data_path = tmpdir.name

train_news_file = os.path.join(data_path, 'train', r'news.tsv')
train_behaviors_file = os.path.join(data_path, 'train', r'behaviors.tsv')
valid_news_file = os.path.join(data_path, 'valid', r'news.tsv')
valid_behaviors_file = os.path.join(data_path, 'valid', r'behaviors.tsv')
wordEmb_file = os.path.join(data_path, "utils", "embedding.npy")
userDict_file = os.path.join(data_path, "utils", "uid2index.pkl")
wordDict_file = os.path.join(data_path, "utils", "word_dict.pkl")
yaml_file = os.path.join(data_path, "utils", r'nrms.yaml')

mind_url, mind_train_dataset, mind_dev_dataset, mind_utils = get_mind_data_set('demo')

# 下载数据集
download_deeprec_resources(mind_url, os.path.join(data_path, 'train'), mind_train_dataset)
download_deeprec_resources(mind_url, os.path.join(data_path, 'valid'), mind_dev_dataset)
download_deeprec_resources(r'https://recodatasets.z20.web.core.windows.net/newsrec/', 
                           os.path.join(data_path, 'utils'), mind_utils)

模型参数设置

我们需要设置模型的超参数:

hparams = prepare_hparams(yaml_file, 
                          wordEmb_file=wordEmb_file,
                          wordDict_file=wordDict_file, 
                          userDict_file=userDict_file,
                          batch_size=32,
                          epochs=5,
                          show_step=10)
print(hparams)

这里我们设置了批次大小为32,训练轮数为5。其他重要参数包括:

  • word_emb_dim: 300 (词嵌入维度)
  • attention_hidden_dim: 200 (注意力层隐藏单元数)
  • head_num: 20 (多头注意力的头数)
  • head_dim: 20 (每个注意力头的维度)

模型训练

现在我们可以创建NRMS模型并开始训练:

iterator = MINDIterator
model = NRMSModel(hparams, iterator, seed=42)

model.fit(train_news_file, train_behaviors_file, valid_news_file, valid_behaviors_file)

训练过程中,模型会输出每个epoch的训练损失和验证集上的评估指标。

模型评估

训练完成后,我们可以在验证集上评估模型的性能:

res_syn = model.run_eval(valid_news_file, valid_behaviors_file)
print(res_syn)

评估指标包括:

  • group_auc: 分组AUC
  • mean_mrr: 平均倒数排名
  • ndcg@5: 前5位的归一化折扣累积增益
  • ndcg@10: 前10位的归一化折扣累积增益

实验结果与分析

在MINDdemo数据集上训练5个epoch后,NRMS模型在验证集上的表现如下:

{'group_auc': 0.6521, 'mean_mrr': 0.3198, 'ndcg@5': 0.3394, 'ndcg@10': 0.4107}

让我们对这些结果进行分析:

  1. Group AUC (0.6521):
    这个指标衡量了模型区分用户点击和未点击新闻的能力。0.6521的分数表明模型的性能明显优于随机猜测(0.5),但仍有改进空间。
  2. Mean MRR (0.3198):
    平均倒数排名反映了相关项目在推荐列表中的平均位置。0.3198的分数表明相关新闻平均排在第3-4位左右,这是一个不错的开始,但仍有提升空间。
  3. NDCG@5 (0.3394) 和 NDCG@10 (0.4107):
    这两个指标衡量了推荐列表前5项和前10项的质量。分数表明模型在短推荐列表上表现尚可,但仍有改进余地。

总体而言,这些结果表明NRMS模型在新闻推荐任务上展现出了一定的效果,但仍有很大的优化空间。以下是一些可能的改进方向:

模型优化策略

  1. 增加训练数据:
    MINDdemo数据集只包含5000名用户,这可能限制了模型的学习能力。使用更大的数据集(如MIND small或MIND large)可能会显著提升模型性能。
  2. 调整模型架构:
  • 增加或减少注意力头的数量
  • 调整词嵌入和注意力层的维度
  • 尝试不同的注意力机制,如Transformer的编码器结构
  1. 特征工程:
  • 利用新闻的其他元数据,如发布时间、作者信息等
  • 引入用户的长期兴趣特征
  • 考虑新闻的时效性和热度信息
  1. 优化训练过程:
  • 尝试不同的学习率策略,如学习率衰减或热身预热
  • 使用更复杂的优化器,如AdamW或RAdam
  • 增加训练轮数,同时实施早停策略避免过拟合
  1. 集成学习:
    将NRMS与其他推荐模型(如协同过滤或基于内容的方法)集成,可能会产生更好的效果。
  2. 引入上下文信息:
    考虑用户的设备类型、时间、位置等上下文信息,可能会提高推荐的相关性。
  3. 处理冷启动问题:
    对于新用户或新闻,可以设计特殊的策略,如基于内容的推荐或探索性推荐。

结论

NRMS模型通过利用多头自注意力机制,在新闻推荐任务中展现出了潜力。它能够有效地捕捉新闻标题中词语之间的关系,以及用户历史行为中新闻之间的关联。虽然在MINDdemo数据集上的初步结果还有提升空间,但通过上述优化策略,NRMS模型有望在更大规模的数据集上取得更好的性能。

未来的研究方向可以包括:

  1. 探索更复杂的注意力机制,如多层次注意力或图注意力网络
  2. 结合知识图谱,增强模型对新闻内容的理解
  3. 引入强化学习,优化长期用户满意度
  4. 设计更好的负采样策略,提高模型的判别能力

总的来说,NRMS为基于深度学习的新闻推荐系统提供了一个有前景的框架,随着进一步的研究和优化,它有望在实际应用中发挥更大的作用。

参考文献

  1. Wu, C. , Wu, F., An, M., Huang, J., Huang, Y., & Xie, X. (2019). Neural News Recommendation with Multi-Head Self-Attention. In Proceedings of the 2019 Conference on Empirical Methods in Natural Language Processing and the 9th International Joint Conference on Natural Language Processing (EMNLP-IJCNLP) (pp. 6389-6394).
  2. Wu, F. , Qiao, Y., Chen, J. H., Wu, C., Qi, T., Lian, J., … & Xie, X. (2020). MIND: A Large-scale Dataset for News Recommendation. In Proceedings of the 58th Annual Meeting of the Association for Computational Linguistics (pp. 3597-3606).
0 0 投票数
Article Rating
订阅评论
提醒
0 评论
最多投票
最新 最旧
内联反馈
查看所有评论
0
希望看到您的想法,请您发表评论x