引言
在信息爆炸的时代,如何从海量新闻中为用户推荐感兴趣的内容,成为了推荐系统研究的热点之一。传统的基于 ID 的协同过滤算法往往难以捕捉新闻内容的语义信息,而基于内容的推荐算法则需要人工提取新闻特征,效率低下。深度知识感知网络 (DKN) 算法应运而生,它结合了深度学习和知识图谱的优势,能够自动学习新闻内容的语义表示,并利用知识图谱中的实体信息提升推荐效果。
DKN 算法原理
DKN 算法的核心思想是将新闻内容和知识图谱信息融合到一个深度学习模型中,通过联合学习语义级和知识级的新闻表示,实现更精准的推荐。具体来说,DKN 算法主要包含以下几个步骤:
- 知识图谱表示学习: 使用 TransX 方法将知识图谱中的实体和关系嵌入到低维向量空间中,得到实体嵌入向量。
- 新闻语义表示学习: 使用卷积神经网络 (CNN) 对新闻标题进行编码,得到新闻语义嵌入向量。
- 知识感知卷积神经网络 (KCNN): 将实体嵌入向量和新闻语义嵌入向量融合,并使用 KCNN 进行特征提取,得到最终的新闻表示向量。
- 注意力机制: 使用注意力机制对用户的历史点击行为进行加权平均,得到用户的兴趣表示向量。
- 点击率预测: 将新闻表示向量和用户兴趣表示向量输入到一个全连接神经网络中,预测用户点击该新闻的概率。
MIND 数据集
MIND 数据集是一个大规模英文新闻数据集,包含了 1,000,000 用户、161,013 篇新闻文章和 15,777,377 条点击日志。每篇新闻文章包含丰富的文本内容,包括标题、摘要、正文、类别和实体。每条点击日志包含用户的点击事件、未点击事件以及该用户在该次点击之前的历史点击行为。
本示例使用 MIND 数据集的子集 MIND demo,包含 500 用户、9,432 篇新闻文章和 6,134 条点击日志。
DKN 模型训练
首先,需要下载 MIND demo 数据集和预训练的词嵌入、实体嵌入和上下文嵌入文件。
tmpdir = TemporaryDirectory()
data_path = os.path.join(tmpdir.name, "mind-demo-dkn")
# ... 定义数据文件路径 ...
if not os.path.exists(yaml_file):
download_deeprec_resources("https://recodatasets.z20.web.core.windows.net/deeprec/", tmpdir.name, "mind-demo-dkn.zip")
然后,设置模型超参数,并创建 DKN 模型。
# 设置超参数
EPOCHS = 10
HISTORY_SIZE = 50
BATCH_SIZE = 500
# 创建 DKN 模型
hparams = prepare_hparams(yaml_file,
news_feature_file = news_feature_file,
user_history_file = user_history_file,
wordEmb_file=wordEmb_file,
entityEmb_file=entityEmb_file,
contextEmb_file=contextEmb_file,
epochs=EPOCHS,
history_size=HISTORY_SIZE,
batch_size=BATCH_SIZE)
model = DKN(hparams, DKNTextIterator)
最后,使用训练集和验证集对模型进行训练。
model.fit(train_file, valid_file)
模型评估
模型训练完成后,可以使用测试集对模型性能进行评估。
res = model.run_eval(test_file)
print(res)
评估指标包括 AUC、Group AUC、Mean MRR、NDCG@5 和 NDCG@10。
总结
DKN 算法是一种结合了深度学习和知识图谱的先进新闻推荐算法,能够有效提升推荐效果。微软 Recommenders 工具提供了 DKN 算法的示例代码,方便用户快速上手并进行实验。