同时,NeuralKG不仅可以在知识图谱嵌入的标准数据集(如FB15K237和WN18RR)上运行,我们可以在自定义的知识图谱数据集上引入NeuralKG提供的众多高性能基线模型,来完成更综合的实验。下面我们通过一个例子来说明如何使用NeuralKG来丰富我们的实验结果。
NeuralKG是一款支持多种知识图谱表示学习/知识图谱嵌入模型(Knowledge Graph Embedding, KGE)的Python工具包,涵盖了传统知识图谱嵌入、基于图神经网络的知识图谱嵌入以及基于规则的知识图谱嵌入方法等多种知识图谱嵌入模型。NeuralKG提供了详细的文档和简单的使用方式,容易上手。
初始设置
我们以发表在WWW2020会议上的论文《Mining Implicit Entity Preference from User-Item Interaction Data for Knowledge Graph Completion via Adversarial Learning》为例,该论文对应的开源代码位于https://github.com/RUCDM/KB4Rec/tree/master/Projects/UPGAN
实验用到的环境基本情况如下:
- 服务器:Ubuntu 18.04.5 LTS (GNU/Linux 4.15.0-163-generic x86_64)
- 计算资源:Nvidia GeForce RTX 3090 * 1
- Python:3.7.11,已安装torch等深度学习所需的基本库
我们首先使用git clone
获取它的源代码,并按照仓库中提供的下载链接下载实验所需的数据集,在本博客中,我们只使用3个数据集中的Amazon-Book数据集,其他数据集也一样可以进行类似的操作。在准备好所有文件之后,项目的文件结构如下:
├── Model
│ ├── DistMult.py
│ ├── UGAT.py
│ ├── UGAT_mlp.py
│ ├── base_model.py
│ ├── concat_1layer.py
│ ├── concat_2layer.py
│ ├── dot_2layer.py
│ ├── generator.py
│ ├── generator_concat.py
│ └── layers.py
├── README.md
├── checkpoint
├── data
│ ├── Readme.md
│ └── book
│ ├── kg
│ │ ├── e_map.dat
│ │ ├── r_map.dat
│ │ ├── test.dat
│ │ ├── train.dat
│ │ └── valid.dat
│ ├── neuralkg
│ │ ├── entities.dict
│ │ ├── relations.dict
│ │ ├── test.txt
│ │ ├── train.txt
│ │ └── valid.txt
│ └── rs
│ ├── i2kg_map.tsv
│ ├── i_map.dat
│ ├── ratings.txt
│ └── u_map.dat
├── kg_preprocess.py
├── log_compgcn.txt
├── log_rotate.txt
├── log_transe.txt
├── log_transh.txt
├── main_pretrain.py
├── main_upgan.py
├── model.Jpeg
├── pretrain
│ ├── base_trainer.py
│ ├── init.py
│ └── trainer.py
├── run_book.sh
├── run_neuralkg.py
├── train
│ ├── base_trainer.py
│ ├── evaluation.py
│ ├── init.py
│ ├── load_data.py
│ └── trainer.py
└── util
├── Regularization.py
├── dataset.py
├── kernel.py
├── sage_kernel.py
├── triple_kernel.py
└── utils.py
如果要运行源代码,我们可以直接使用run_book.sh提供的指令,下面我们重点介绍如何使用NeuralKG在自定义的数据集(即本项目中的book数据集)上进行基线的训练来丰富我们的实验结果。
数据处理
首先我们要对数据进行预处理,将该论文开源代码中的数据集转换成我们需要的形式,该数据集的知识图谱部分位于book/kg
下面,包含了实体/关系两个映射表和训练验证测试三个数据集,和NeuralKG要求的格式基本一致,我们需要将其处理成NeuralKG可以接受的数据形式:
entities.dict
relations.dict
train.txt
test.txt
valid.txt
然后我们可以编写一个简单的脚本kg_preprocess.py
来处理数据格式,处理完之后,data目录下面的文件结构变成了:
├── Readme.md
└── book
├── kg
│ ├── e_map.dat
│ ├── r_map.dat
│ ├── test.dat
│ ├── train.dat
│ └── valid.dat
├── neuralkg
│ ├── entities.dict
│ ├── relations.dict
│ ├── test.txt
│ ├── train.txt
│ └── valid.txt
└── rs
├── i2kg_map.tsv
├── i_map.dat
├── ratings.txt
└── u_map.dat
其中neuralkg目录下的就是处理好的数据集,下面我们就可以开始使用neuralkg来完成更多的baseline实验。
配置文件
阅读原论文我们可以了解到,作者使用了TransE, DistMult, ConvE, ConvTransE, R-GCN, KBGAN, CoFM, KTUP, KGAT作为基线模型和自己提出的方法形成了对比,而我们可以使用NeuralKG提供了更多知识图谱嵌入模型得到更丰富的基线实验结果,我们可以尝试使用TransH, RotatE, CompGCN等模型作为我们的基线模型,使得实验结果更具有说服力。
NeuralKG提供了配置式的使用方式,我们只需要使用YAML格式的配置文件填写模型的基本配置和参数信息就可以非常方便地训练知识图谱嵌入模型。配置文件的模版可以在NeuralKG项目仓库的config
目录下找到,我们只需要复制这些文件,并修改重要的几个参数就行,比如将data_path
改成当前数据集所在的路径,还有像训练轮数max_epochs
,嵌入维度emb_dim
,负样本个数num_neg
等影响模型性能的关键信息。
我们在当前目录下创建三个对应的配置文件config_transh.yaml
,config_rotate.yaml
和config_compgcn.yaml
,并仿照论文中的实验设置,将训练轮数设置为1000,嵌入维度设置为100
然后我们可以创建一个代码文件run_neuralkg.py
来调用NeuralKG完成实验,这里的代码可以直接复制项目仓库中的main.py
这样一来,我们就完成了实验的基本设置,下面就可以开始进行实验了。
进行实验
我们在当前目录打开Terminal,并输入指令:
python run_neuralkg.py --load_config --config_path ./config_transh.yaml
这样就可以训练一个TransH模型并进行测试,同理可以训练RotatE, CompGCN等模型。训练模型往往需要几个小时的时间,我们可以将进程挂在后台运行,并耐心等待结果。
最终我们得到的实验结果如下表所示:
这样一来,我们就可以很方便的得到当前数据集在多种经典模型上的表现,为了得到更强壮的基线结果,我们可以进一步调整模型的参数。
模型 | MRR | Hit@1 | Hit@3 | Hit@10 |
---|---|---|---|---|
TransH | 28.5 | 0.225 | 0.312 | 0.400 |
RotatE | 31.6 | 0.253 | 0.344 | 0.448 |
CompGCN | 19.2 | 0.159 | 0.203 | 0.258 |
这样的流程对于其他数据集也是同理,在写作论文和进行对比实验的时候,我们可以非常方便地使用NeuralKG来提供更多经典模型的强基线。