Shortcuts

TransR-FB15K237-single-gpu || TransR-FB15K237-single-gpu-wandb || TransR-FB15K237-single-gpu-hpo || TransR-FB15K237-accelerate

TransR-FB15K237-accelerate

备注

created by LuYF-Lemon-love <luyanfeng_nlp@qq.com> on May 7, 2023

备注

updated by LuYF-Lemon-love <luyanfeng_nlp@qq.com> on May 13, 2024

备注

last run by LuYF-Lemon-love <luyanfeng_nlp@qq.com> on May 13, 2024

这一部分介绍如何用多个 GPU 在 FB15K237 知识图谱上训练 TransR [LLS+15]

由于多 GPU 设置依赖于 accelerate , 因此,您需要首先需要创建并保存一个配置文件(如果想获得更详细的配置文件信息请访问 多GPU配置 ):

accelerate config

然后,您可以开始训练:

accelerate launch accelerate_transr_FB15K237.py

导入数据

UniKE 有 1 个工具用于导入数据: unike.data.KGEDataLoader

import os
from unike.data import KGEDataLoader, BernSampler, TradTestSampler
from unike.module.model import TransE, TransR
from unike.module.loss import MarginLoss
from unike.module.strategy import NegativeSampling
from unike.config import Trainer, Tester

unike 提供了很多数据集,它们很多都是 KGE 原论文发表时附带的数据集。 unike.data.TrainDataLoader 包含 in_path 用于传递数据集目录。

# dataloader for training
dataloader = KGEDataLoader(
    in_path = os.path.join(os.path.dirname(__file__), '../../benchmarks/FB15K237/'),
    batch_size = 2048,
    neg_ent = 25,
    test = True,
    test_batch_size = 10,
    num_workers = 16,
    train_sampler = BernSampler,
    test_sampler = TradTestSampler
)

导入模型

UniKE 提供了很多 KGE 模型,它们都是目前最常用的基线模型。我们首先导入 unike.module.model.TransE,它是最简单的平移模型, 因为为了避免过拟合,unike.module.model.TransR 实体和关系的嵌入向量初始化为 unike.module.model.TransE 的结果。

# define the transe
transe = TransE(
    ent_tol = dataloader.get_ent_tol(),
    rel_tol = dataloader.get_rel_tol(),
    dim = 100,
    p_norm = 1,
    norm_flag = True
)

下面导入 unike.module.model.TransR 模型, 是一个为实体和关系嵌入向量分别构建了独立的向量空间,将实体向量投影到特定的关系向量空间进行平移操作的模型。

transr = TransR(
    ent_tol = dataloader.get_ent_tol(),
    rel_tol = dataloader.get_rel_tol(),
    dim_e = 100,
    dim_r = 100,
    p_norm = 1,
    norm_flag = True,
    rand_init = False
)

损失函数

我们这里使用了 TransE [BUGD+13] 原论文使用的损失函数:unike.module.loss.MarginLossunike.module.strategy.NegativeSamplingunike.module.loss.MarginLoss 进行了封装,加入权重衰减等额外项。

model_e = NegativeSampling(
    model = transe,
    loss = MarginLoss(margin = 5.0)
)

model_r = NegativeSampling(
    model = transr,
    loss = MarginLoss(margin = 4.0)
)

训练模型

UniKE 将训练循环包装成了 unike.config.Trainer, 可以运行它的 unike.config.Trainer.run() 函数进行模型学习; 也可以通过传入 unike.config.Tester, 使得训练器能够在训练过程中评估模型。

# pretrain transe
trainer = Trainer(model = model_e, data_loader = dataloader.train_dataloader(),
    epochs = 1, lr = 0.5, opt_method = "sgd", use_gpu = True, device = 'cuda:0')
trainer.run()
parameters = transe.get_parameters()
transe.save_parameters("../../checkpoint/transr_transe.json")

# train transr
transr.set_parameters(parameters)

# test the model
tester = Tester(model = transr, data_loader=dataloader)

# train the model
trainer = Trainer(model = model, data_loader = dataloader.train_dataloader(),
    epochs = 1000, lr = 0.01, opt_method = "sgd", use_accelerator = True,
    tester = tester, test = True, valid_interval = 100,
    log_interval = 100, save_interval = 100,
    save_path = '../../checkpoint/transr.pth', delta = 0.01)
trainer.run()

备注

上述代码的运行日志可以从 此处 下载。


Total running time of the script: ( 0 minutes 0.000 seconds)

Gallery generated by Sphinx-Gallery

Docs

Access comprehensive developer documentation for UniKE

View Docs