We study the problem of learning to reason in large scale knowledge graphs (KGs). More specifically, we describe a novel reinforcement learning framework for learning multi-hop relational paths: we use a policy-based agent with continuous states based on knowledge graph embeddings, which reasons in a KG vector-space by sampling the most promising relation to extend its path. In contrast to prior work, our approach includes a reward function that takes the accuracy, diversity, and efficiency into consideration. Experimentally, we show that our proposed method outperforms a path-ranking based algorithm and knowledge graph embedding methods on Freebase and Never-Ending Language Learning datasets.
Download the knowledge graph dataset NELL-995
Python 2.7.14rc1 NumPy Version 1.13.3 TensorFlow Version 1.4.0
Python 2.7.14rc1 NumPy Version 1.13.3 TensorForce Version 0.3.2
-
Unzip the NELL-995 dataset in the top level code directory of your project executing following command
wget http://cs.ucsb.edu/%7Exwhan/datasets/NELL-995.zipunzip NELL-995.zip
This command will create [NELL-995/folder].
See Format of the Dataset section for more details about the dataset.
-
Run the following script within
tfscripts/python deepPath_main.py -a <agent_name> -r <relation_name>
Example
python deepPath_main.py -a vpg -r concept_athletehomestadium
-
Parameter accepted by the program
-ror--relation= relation name (Mandatory)-eor--episodes= Number of episodes, default 500-aor--agent= Agent Name, defaultvpg- We have implemented two agents:
vpgdqn
- We have implemented two agents:
-Dor--debug= Debug Log, defaultFalse
-
unzip the NELL, put the data folder in the code directory
-
run the following scripts within
scripts/./pathfinder.sh ${relation_name}# find the reasoning paths, this is RL training, it might take sometime./fact_prediction_eval.py ${relation_name}# calculate & print the fact prediction results./link_prediction_eval.sh ${relation_name}# calculate & print the link prediction results
Examples (the relation_name can be found in
NELL-995/tasks/):./pathfinder.sh concept_athletehomestadium./fact_prediction_eval.py concept_athletehomestadium./link_prediction_eval.sh concept_athletehomestadium
-
Since we already put the reasoning paths in the dataset, you can directly run fact_prediction_eval.py or link_prediction_eval.sh to get the final results for each reasoning task
raw.kb: the raw kb data from NELL systemkb_env_rl.txt: we add inverse triples of all triples inraw.kb, this file is used as the KG for reasoningentity2vec.bern/relation2vec.bern: transE embeddings to represent out RL states, can be trained using TransX implementations by thunlptasks/: each task is a particular reasoning relationtasks/${relation}/*.vec: trained TransH Embeddingstasks/${relation}/*.vec_D: trained TransD Embeddingstasks/${relation}/*.bern: trained TransR Embedding trainedtasks/${relation}/*.unif: trained TransE Embeddingstasks/${relation}/transX: triples used to train the KB embeddingstasks/${relation}/train.pairs: train triples in the PRA formattasks/${relation}/test.pairs: test triples in the PRA formattasks/${relation}/path_to_use.txt: reasoning paths found the RL agenttasks/${relation}/path_stats.txt: path frequency of randomised BFS
A new environment class was created to interface with tensorforce library.
environment = DPEnv(graphPath, relationPath, task=data)We have defined Neural Network with 2 hidden layer using tensoforce's API.
network_spec = [
dict(type='dense', size=512, activation='relu'),
dict(type='dense', size=1024, activation='relu')
]We are using VPGAgent() and DQNAgent() from tensorforce.agents API to create the agents.
from tensorforce.agents import VPGAgent
from tensorforce.agents import DQNAgent
[...]
agent = VPGAgent(states_spec=dict(shape=state_dim, type='float'),
actions_spec=dict(num_actions=action_space, type='int'),
network_spec=network_spec, optimizer=step_optimizer,
discount=0.99, batch_size=1000)
agent = DQNAgent(states_spec=dict(shape=state_dim, type='float'),
actions_spec=dict(num_actions=action_space, type='int'),
network_spec=network_spec, optimizer=step_optimizer,
discount=0.99, batch_size=1000)We have used adam is the Optimization Algorithm, however RMSprop,AdaGrad or other algorithms can also be used.
step_optimizer = dict(type='adam', learning_rate=1e-3)runner from tensorforce.execution API has been used for learning.
from tensorforce.execution import Runner
runner = Runner(agent=agent, environment=environment)
runner.run(episodes = args.episodes, max_episode_timesteps=report_episodes, episode_finished=episode_finished)@InProceedings{wenhan_emnlp2017,
author = {Xiong, Wenhan and Hoang, Thien and Wang, William Yang},
title = {DeepPath: A Reinforcement Learning Method for Knowledge Graph Reasoning},
booktitle = {Proceedings of the 2017 Conference on Empirical Methods in Natural Language Processing (EMNLP 2017)},
month = {September},
year = {2017},
address = {Copenhagen, Denmark},
publisher = {ACL}
}