La complémentation des graphes de connaissances a été réalisée à l'aide d'un framework open source appelé OpenKE. Comme mémo pour moi-même, je transcrirai le résultat.
Cet article s'applique aux personnes qui relèvent de l'une des conditions suivantes.
Le graphe de connaissances montre la connexion de diverses connaissances en tant que structure.
** Exemple) ** (obama, born-in, Hawaii)
Données qui ont un sujet, la forme de relations et des relations d'objet telles que l'on appelle un graphe de connaissance
Si le sujet, la forme des relations et l'objet sont respectivement $ s, r et o $, ils restent de la relation entre $ s $ et $ r $ ou $ o $ et $ r $. Le but de ce temps est de deviner $ o et s $.
OpenKE est une source ouverte créée par THUNLP](http://nlp.csai.tsinghua.edu.cn/site2/index.php/zh). C'est un cadre.
C'est un framework dédié aux graphes de connaissances écrits en C ++ et python, et semble actuellement prendre en charge pytorch et tensorflow.
Pour plus de détails, reportez-vous au lien github ci-dessous ou à la page d'accueil d'OpenKE. Page d'accueil d'OpenKE OpenKE github
Ensuite, le programme à exécuter réellement est indiqué ci-dessous. Cette fois, nous utiliserons train_distmult_WN18.py dans les exemples.
import openke
from openke.config import Trainer, Tester
from openke.module.model import DistMult
from openke.module.loss import SoftplusLoss
from openke.module.strategy import NegativeSampling
from openke.data import TrainDataLoader, TestDataLoader
# dataloader for training
train_dataloader = TrainDataLoader(
in_path = "./benchmarks/WN18RR/",
nbatches = 100,
threads = 8,
sampling_mode = "normal",
bern_flag = 1,
filter_flag = 1,
neg_ent = 25,
neg_rel = 0
)
# dataloader for test
test_dataloader = TestDataLoader("./benchmarks/WN18RR/", "link")
# define the model
distmult = DistMult(
ent_tot = train_dataloader.get_ent_tot(),
rel_tot = train_dataloader.get_rel_tot(),
dim = 200
)
# define the loss function
model = NegativeSampling(
model = distmult,
loss = SoftplusLoss(),
batch_size = train_dataloader.get_batch_size(),
regul_rate = 1.0
)
# train the model
trainer = Trainer(model = model, data_loader = train_dataloader, train_times = 2000, alpha = 0.5, use_gpu = True, opt_method = "adagrad")
trainer.run()
distmult.save_checkpoint('./checkpoint/distmult.ckpt')
# test the model
distmult.load_checkpoint('./checkpoint/distmult.ckpt')
tester = Tester(model = distmult, data_loader = test_dataloader, use_gpu = True)
tester.run_link_prediction(type_constrain = False)
test_dataloader est "./benchmarks/WN18RR/" le modèle est distmult La fonction de perte est SoftplusLoss () Je vais le laisser. dim prend la forme 200. Tous sont les mêmes que lors du téléchargement.
Il existe plusieurs autres types de programmes exécutables dans les exemples.
Trois parties peuvent être modifiées: le jeu de données, le modèle et la perte.
Assurez-vous que "./benchmarks/WN18RR/" dans train_dataloader et test_dataloader sont identiques. Vous pouvez utiliser l'ensemble de données dans le lien ci-dessous pour ces benchmarks. benchmarks
Les variables de TrainDataLoader peuvent être modifiées librement. En plus du nomal, cross peut être sélectionné pour sampling_mode. (Le réglage croisé peut nécessiter une légère modification du réglage plus profond.)
Pour le modèle, veuillez vous référer au lien ci-dessous. Modèles disponibles
En plus de Softplus Loss, la perte de marge et la perte sigmoïde peuvent être utilisées pour la perte.
Le résultat de l'exécution est le suivant. Je n'ai pas de machine GPU, je l'ai donc exécutée avec google colaboratory.
Nous allons le comparer avec le tableau Expériences sur GitHub. Le tableau semble être la valeur à Hits @ 10 (filtre).
La moyenne des résultats expérimentaux était de 0,463306, donc la précision était de 0,015 inférieure à la valeur de Dist Mult sur GitHub.
L'amélioration consiste à adopter une autre fonction de perte. De plus, je pense qu'une façon est de changer les valeurs de neg_ent, neg_rel et alpha.
Cette fois, j'ai essayé de compléter le graphe de connaissances en utilisant OpenKE. En conséquence, nous n'avons pas obtenu les résultats escomptés, mais il y avait place à l'amélioration, nous aimerions donc commencer les points d'amélioration indiqués ci-dessus.
Merci d'avoir lu jusqu'au bout.
Recommended Posts