# TransX
**Repository Path**: forcekeng/TransX
## Basic Information
- **Project Name**: TransX
- **Description**: 使用MindSpore实现知识图谱TransX(包括TransD、TransE、TransR、TransH)算法,数据集包括FB15K和WN18。
- **Primary Language**: Python
- **License**: EPL-1.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 1
- **Forks**: 1
- **Created**: 2022-10-24
- **Last Updated**: 2024-07-27
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# 目录
## 模型名称
知识图谱补全是从已知的知识图谱中提取出三元组(head,relation,tail),为实体和关系进行建模,通过训练出的模型进行链接预测,以达成知识图谱补全的目标。
此处使用MindSpore实现常见的四种知识图谱模型(transD、transE、transH和transR),数据集包含FB15K和WN18两个数据集。
## 模型架构
尽管实现的四个模型有部分相似之处,但为了便于后续使用和测试,所实现的四个模型采用**相互独立**的方式定义,在训练时可根据需要选取模型和数据集进行训练,其结构如下:
## 数据集
所用的数据集为FB15K和WN18,使用论文中的数据。
论文:
[Translating Embeddings for Modeling Multi-relational Data Knowledge Graph Embedding by Translating on Hyperplanes Learning Entity and Relation Embeddings for Knowledge Graph Completion Knowledge Graph Embedding via Dynamic Mapping Matrix](https://dl.acm.org/doi/10.5555/2893873.2894046)
Paperwithcode:
https://github.com/thunlp/TensorFlow-TransX
### 数据集详情:
| 数据集 | 关系数 | 实体数 | 训练集样本数 | 验证集样本数 | 测试集样本数 |
| ---- | ---- | ---- | ---- | ---- | ---- |
| WN18 | 18 | 40,9443 | 141,442 | 5,000 | 5,000|
| FB15K | 1,345 | 14,951 | 483,142 | 50,000 | 59,071|
||||||
注:论文中讲数据进行1-1、1-n等拆分出多个数据,实际仅用 `train2id.txt`, `valid2id.txt`,`test2id.txt`三个数据集。所给数据如下,[点击查看数据来源](https://github.com/thunlp/TensorFlow-TransX/blob/master/data/FB15K/test2id.txt),第一行为文件行数,在使用时**应删掉第一行**。
```
59071
453 1347 37
3136 4357 588
8663 4522 307
2404 8386 186
722 806 37
1248 10937 26
9182 1043 20
```
> [数据下载地址](https://git.openi.org.cn/forcekeng/transX_data_log_model/src/branch/master/data)
> 下载后解压,data/下包含整理后的FB15K和WN18数据。
## 环境要求
开发语言:Python3
使用框架:Mindspore
requirements.txt
```
mindspore>=1.6.0
numpy
easydict
tqdm
```
## 快速入门
将代码和数据下载解压后,代码所在根目录记为``。
### 基本配置
在训练或测试时,应指定配置信息,修改`/train.py`中的3项配置:
(1) 配置数据集文件夹`data_dir`,文件夹下应包含 `train2id.txt`,`valid2id.txt`,`test2id.txt`等三个文件,分别对应训练集、验证集和测试集。
(2) 数据集 `dataset`,可选 `FB15K`或`WN18`。
(3) 模型`model`,可选 `transD`, `transE`, `transH`或`transR`。
训练与测试:打开代码所在根目录
* 训练命令:`python train.py`
* 测试命令:`python eval.py`
说明1:训练和推理支持CPU/GPU/Ascend平台。
## 脚本说明
提供实现的细节
### 脚本和样例代码
目录结构如图所示:
各文件如下:
- eval.py: 验证脚本
- README.md: 本文档
- requirements.txt: Python库配置
- images/: README.md图等保存位置
- src/config.py: 训练集和测试集配置
- src/dataset.py: 数据集读取类
- src/transD,E,H,R: 定义的知识图谱模型
- val/testTransD,E,H,R: 定义的测试各个模型的对应类
### 脚本参数
由于训练集不同,其实体数、关系数、训练参数等均不同,因此将配置根据数据集划分为 `fb15k_config` 和 `wn18_config`,两者参数含义一致,此处以 `fb15k_config` 进行说明。每个数据集中再配置每个模型的参数。
```python
fb15k_config = ed({
# 全局参数
"model": "transE", # 模型,可选 {"transD", "transE", "transH", "transR"}
"n_entity": 14951, # 实体数量
"n_relation": 1345, # 关系数量
# 训练参数
"pre_model_path": "", # 预训练模型保存路径
"pretrained": False, # 是否使用预训练模型,为True时需要pre_model_path指定正确路径
"model_save_dir": "checkpoints/", # 模型保存路径
"log_save_file": "log.out", # 训练日志保存路径
"iterations": 1000000, # 最大迭代次数
"batch_size": 4096, # 批处理大小
"learning_rate": 0.001, # 学习率
# 模型参数
## transD参数
"transD": {
"n_entity_dim": 100, # 实体编码维度
"n_relation_dim": 100, # 关系编码维度
"margin": 1.0, # 算法中计算损失时参数
"norm": 1 # 计算损失所用范数,可选{1,2}
},
## transE参数
"transE": {
"n_dim": 100, # 编码维度,实体编码维度==关系编码维度
"margin": 1.0, # 算法中计算损失时参数
"norm": 1 # 计算损失所用范数,可选1或2
},
## transH参数
"transH": {
"n_dim": 100, # 编码维度,实体编码维度==关系编码维度
"margin": 1.0, # 算法中计算损失时参数
"norm": 1 # 计算损失所用范数
},
## transR参数
"transR": {
"n_entity_dim": 100, # 实体编码维度
"n_relation_dim": 100, # 关系编码维度
"margin": 1.0, # 算法中计算损失时参数
"norm": 1 # 计算损失所用范数
}
})
```
## 训练过程
目前训练过程和评估只支持CPU/GPU,使用Ascend训练损失会不断上升,无法完成训练。
训练时,每次随机抽取 `batch_size` 个三元组,并进行*corrupt*,每次训练为一次`iteration`,最多训练`iterations`次,`iterations`训练参数可从 `src/config.py` 进行配置。
### 训练
#### 训练方法:
打开 train.py 所在目录,运行:
```python
python train.py
```
#### 训练过程日志
以GPU在数据集WN18上训练transE为例,其部分日志如下:
```log
# python train.py
dataset = WN18, model = transR
read file path: /dataset/data/WN18/train2id.txt
data_loader initialized!
<=================== 开始训练 ===================>
epoch [1000], loss = 1331.6389914550782, 1000 iterations spend 0.12995397647221882 minutes!
epoch [2000], loss = 975.5102862548828, 1000 iterations spend 0.11221280495325724 minutes!
...
epoch [808000], loss = 1.239701193332672, 1000 iterations spend 0.10795061588287354 minutes!
epoch [809000], loss = 1.3451107335090637, 1000
...
loss_record:
[1331.6389914550782, ..., 1.239701193332672]
>=================== 训练结束 ===================<
```
- 说明:其他数据集或模型的[训练日志可从此处下载](https://git.openi.org.cn/forcekeng/transX_data_log_model/src/branch/master/log)。
## 评估
### 评估过程
评估过程分为两步,首先指定评估数据集、评估模型等参数。具体参数如下:
```python
# 数据集目录
data_dir = "/dataset/data/WN18/"
# 数据集:可选{"FB15K", "WN18"}
dataset = "WN18"
# 模型:可选{"transD", "transE", "transH", "transR"}
model="transH"
# 训练好的参数,即实体等相关编码,为.ckpt文件
param_path = "/model/fb15k_transE.ckpt" # 填入训练好的权重所在路径
```
### 评估命令
```python
python eval.py
```
> [点击下载训练好的ckpt模型参数](https://git.openi.org.cn/forcekeng/transX_data_log_model/src/branch/master/model),
> 模型文件名包含数据集、模型名、无filter的hits@10和mean-rank值等信息。
### 评估结果
对所给数据集,推理结果如下:
- 针对hits@10指标
|模型|FB15K hits@10(%)(no filter)| WN18 hits@10(%)(no filter)| FB15K hits@10(%)(with filter)| WB18 hits@10(%)(with filter)|
|---|---|---|---|---|
| transD | 44.82 | 74.17 | 58.97 | 86.19 |
| transE | 45.09 | 74.26 | 59.22 | 86.38 |
| transH | 45.36 | 78.74 | 59.54 | 91.65 |
| transR | 44.92 | 51.64 | 58.02 | 59.41 |
- 针对Mean-Rank指标
对于Mean-Rank指标,与filter无关
|模型|FB15K mean-rank| WN18 mean-rank|
|---|---|---|
| transD |212.6| 682.6 |
| transE |208.6| 676.4 |
| transH |210.0| 639.8 |
| transR |270.1| 606.5 |
运行结束后,会输出类似下面的内容:
```log
# python eval.py
read file path: /dataset/data/FB15K/test2id.txt
100%|████████████████████████████████████████████████████████████████████| 1000/1000 [00:57<00:00, 17.29it/s]
**************************************************
model: transR, dataset: FB15K, test, is_filter: False
hits10 = 0.33, mean_rank = [491.052]
**************************************************
```
## 性能
### 训练性能
提供您训练性能的详细描述,例如finishing loss, throughput, checkpoint size等
对模型transD、transE、transH、transR使用CPU/GPU平台训练,参数如下。多个模型采用单核2U8G CPU或PCIE V100-32G GPU等训练。
|参数 | 值 | |
| --- | ---| ---|
|Resource| 1*Ascend-910(32GB) | ARM: 24 vCPUs 96GB |
|AI Engine|
Ascend-Powered-Engine mindspore_1.5.1-cann_5.0.2-py_3.7-euler_2.8.3-aarch64 |
|Dataset| FB15K或WN18|
|Training Parameters| batch_size=4096(for FB15K), batch_size=1024(for WN18), iterations=$10^5至2\times 10^5$, learning_rate=0.001 |
|Loss| L1 norm |
| Uploaded Date | 09/14/2022 (month/day/year) |
|Total time| ≈15h |
| Scripts | [link](https://gitee.com/mindspore/models/tree/master/official/cv/) |
每次迭代(1个batch_size对应的样本)耗时:
| 模型 | 耗时-FB15K (min) | 耗时-WN18 (min) | 收敛后平均损失-FB15K| 收敛后平均损失-WN18 |
| --- | --- | --- | --- |--- |
|transD | 4.3 | 5.8 | 18.0 |1.7 |
|transE | 1.2 | 2.3 | 17.2 | 1.6 |
|transH | 9.2 | 9.0 | 17.0 | 1.5|
|transR | 13.9| 8.3 | 21.2 | 1.1 |
说明:模型的实体和关系编码维度和后文的“推理性能”中一致。
### 推理性能
提供推理性能的详细描述,包括耗时,精度等
你可以参照如下模板
| Parameters | Ascend |
| ------------------- | --------------------------- |
| Model Version | transD, transE, transH, transR |
| Resource |1*Ascend-910(32GB), ARM: 24 vCPUs 96GB |
| Uploaded Date | 09/20/2022 (month/day/year) |
| MindSpore Version | mindspore_1.5.1-py_3.7 |
| Dataset | FB15K/WN18 |
推理编码维度与模型大小
| 模型 | 实体/关系编码维度(FB15K) | 实体/关系编码维度(WN18) | 模型大小(FB15K) | 模型大小(WN18) | 推理耗时-FB15K(ms/样本) |推理耗时-WN18(ms/样本) |
|---|---|---| ---| ---| --- | --- |
|transD| 100 / 100 | 50 / 50 | 12.4M| 15.6M | 479 | 125 |
|transE| 100 / 100 | 50 / 50 |6.21M| 7.81M | 452 | 85.5 |
|transH| 100 / 100 | 50 / 50 |6.72M| 7.81M | 459| 92.0 |
|transR| 100 / 100 | 50 / 50 |57.5M| 7.98M | 461| 85.7 |
- 说明1:表中推理耗时为无filter时测得结果,有filter时耗时为无filter的1.2倍左右。
- 说明2:总推理耗时与样本数量相关,表中显示单个样本平均耗时。FB15K测试集样本数为59071,WN18数据集样本数为5000,可据此估计完成所有样本耗时分别为6小时左右和10分钟左右。
## 贡献指南
如果你想参与贡献昇思的工作当中,请阅读[昇思贡献指南](https://gitee.com/mindspore/models/blob/master/CONTRIBUTING_CN.md)和[how_to_contribute](https://gitee.com/mindspore/models/tree/master/how_to_contribute)
### 贡献者
此部分根据自己的情况进行更改,填写自己的院校和邮箱
* email: forcekeng@126.com (同济大学)
* [gitee](https://gitee.com/forcekeng)
## ModelZoo 主页
请浏览官方[主页](https://gitee.com/mindspore/models)。