基于多种算法的新闻推荐——机器学习大作业


实验目标:

​ 完成RecSys Challenge 2024比赛任务:

  • 下载训练数据集
  • 训练推荐模型
  • 基于测试集推理结果
  • 上传推理结果

1.下载训练数据集

根据比赛官网指示下载,十分简单:

每种Size的训练集里都包括如上的结构。

2.训练推荐模型

2.1 配置运行环境

进入GitHub下载实例代码, 运行安装ebnerd库和其他运行时依赖.

1
pip install .

2.2 尝试运行实例脚本(demo数据集)

其中有基于NRMS(Neural Recommendation with Multi-Head Self-Attention)模型的完整实例脚本:

image-20240614161045055

设置自己的数据路径

截屏2024-07-05 16.47.14

直接运行, 会在“Init model using HuggingFace’s tokenizer and wordembedding”部分报错:

image-20240614161700951

原因是网络问题, 无法直接连接huggingface下载模型.

解决: 由于服务器无法挂代理手动前往前往模型所在网址下载, 修改AutoModel库源码, 只读取本地一个目录下的模型, 将下载的模型上传到服务器这个目录即可.

再次尝试运行脚本, 发现超显存了, 经过测试, 不使用预训练语言模型进行word_embedding可以减少显存使用, 不会爆显存🤔

截屏2024-07-05 16.26.53

截屏2024-07-05 16.26.53

最终再次运行, 成功得到预测结果!

截屏2024-07-05 16.46.06

生成的predictions.txt文件很小, 但具有和实例提交文件相同的格式:

截屏2024-07-05 16.51.08

同时保存了所得模型的权重:

image-20240707155430334

2.3 更改数据集为small再次训练

**2.3.1 同时更改训练轮数epochs=20: **

截屏2024-07-07 19.18.10

训练过程通过Tensorboard监控, 训练val_loss变化如下:

截屏2024-07-07 19.39.13

2.3.2 结果

下图展示了在验证集上的评估指标, 比demo训练1轮有明显提升

image-20240707200334840

2.4 NRMS模型原理

**新闻推荐的常见普适原理: **

新闻表示模型用户表示模型点击预测, 模型通常都从新闻内容(如新闻标题,新闻类别,新闻内容,新闻内容中包含的实体)中学习,而用户表示通常从用户的浏览历史新闻中学习,点击预测即使用新闻表示和用户表示的相似度表示来计算用户点击这个新闻的概率

**核心思想: **从一个新闻标题中学习新闻的表示,或从一个用户浏览的历史新闻中学习用户的表示,很关键的一点是捕捉单词与单词、新闻与新闻之间的相关性。这是一种self-attention的方法,综合考虑任意两个单词(或新闻)间的关系。我猜这也是从Transformer模型中获得的启发。

npa_model

2.5 基于large数据集训练最终模型

3 基于测试集推理结果

3.1 下载测试数据集test

image-20240707201424927

3.2 用训练的模型进行推理

从large数据集采样率0.1进行训练epoch=40, 得到loss曲线如下:

image-20240709165932621

3.2.1 修改代码

去除掉训练部分的代码, 只保留对测试集test的读取:

image-20240708105550660

image-20240708110416080

运行过程先读取上一步用large训练集训练的模型权重, 经过测试, 当如上TEST_FRACTION取1也就是全部数据集时, 需要200G以上的内存才能运行完整个流程, 所以取TEST_FRACTION=0.5采样一半的test输入

最终得到predictions.txt如下

截屏2024-07-08 15.38.02

共6768355行.

4 上传推理结果

打包上传到Codabench比赛评测, 得到如下结果:

image-20240708171545028

详细参数结果:

image-20240708171526554