Knowledge Graph Embeddingを簡単に作れるDGL-KEを使ってみた
July 31, 2021
Knowledge Graphのembeddingsを簡単に作れるDGL-KEを使ってみました。
実行環境はGoogle Colabです。
インストール
pipでdglとdglkeをインストールします。dglはバージョン0.4.3で固定しないと以降のコマンド実行中にエラーが発生しました。
!pip install dgl==0.4.3
!pip install dglke
組み込みのKnowledge Graphの学習
ライブラリに組み込まれているFB15kというKnowledge Graphのデータセットを学習させてみます。
!DGLBACKEND=pytorch dglke_train --model_name TransE_l2 --dataset FB15k --batch_size 1000 \
--neg_sample_size 200 --hidden_dim 400 --gamma 19.9 --lr 0.25 --max_step 500 --log_interval 100 \
--batch_size_eval 16 -adv --regularization_coef 1.00E-09 --test --num_thread 1 --num_proc 8
上記の実行例だとCPU実行でも5分くらいで完了します。実行が完了するとckpts/TransE_l2_FB15k_2
のようなディレクトリにnpy形式で埋め込みベクトルが格納されます。
numpyで読み込むと、それぞれのentity/relation毎に学習時に指定した次元数のベクトルが得られているのが分かります。
import numpy as np
entities = np.load('ckpts/TransE_l2_FB15k_2/FB15k_TransE_l2_entity.npy')
relations = np.load('ckpts/TransE_l2_FB15k_2/FB15k_TransE_l2_relation.npy')
print(entities.shape) # -> (14951, 400)
print(relations.shape) # -> (1345, 400)
自分で用意したKnowledge Graphの学習
今度は自分でKnowledge Graphを用意して学習させてみます。
DGL-KEのドキュメントにあった以下のようなテキストファイルを用意しました。
"Beijing","is_capital_of","China"
"Paris","is_capital_of","France"
"London","is_capital_of","UK"
"UK","located_at","Europe"
"China","located_at","Asia"
"Tokyo","is_capital_of","Japan"
これをmy_data/train.txt
というファイル名で保存し、下記コマンドで学習を実行します。
学習用ファイル以外にバリデーション用・テスト用も指定できますが今回は省略しました。
!DGLBACKEND=pytorch dglke_train --model_name TransE_l2 --data_path my_data --dataset mykg --format raw_udd_hrt --delimiter "," --data_files train.txt \
--batch_size 2 --neg_sample_size 2 --hidden_dim 4 --gamma 19.9 --lr 0.25 --max_step 10 --log_interval 2 \
-adv --regularization_coef 1.00E-09
組み込みのときと同じようにentityとrelationのベクトルを得られました。
entities2 = np.load('ckpts/TransE_l2_mykg_14/mykg_TransE_l2_entity.npy')
relations2 = np.load('ckpts/TransE_l2_mykg_14/mykg_TransE_l2_relation.npy')
print(entities2.shape) # -> (10, 4)
print(relations2.shape) # -> (2, 4)
推論を試してみる
DGL-KEには学習したembeddingsを使ってトリプレット中の欠損したentity/relationを予測するdglke_predict
コマンドと類似のentityを探索するdglke_emb_sim
コマンドがあります。
これらも試してみたのですが、Colabだと以下のようなエラーが発生して残念ながら結果は得られませんでした。
Traceback (most recent call last):
File "/usr/local/bin/dglke_emb_sim", line 33, in <module>
sys.exit(load_entry_point('dglke==0.1.0.dev0', 'console_scripts', 'dglke_emb_sim')())
File "/usr/local/lib/python3.7/dist-packages/dglke/infer_emb_sim.py", line 120, in main
result = model.topK(head, tail, bcast=bcast, pair_ws=pair_wise, k=args.topK)
File "/usr/local/lib/python3.7/dist-packages/dglke/models/infer.py", line 329, in topK
result.append((F.asnumpy(head[head_idx]),
IndexError: tensors used as indices must be long, byte or bool tensors
プログラミングを一切することなくデータを用意してコマンドを実行するだけで出来たので、TransEやDistMultなどの既存のモデルでいいからとりあえず学習させたいというケースには有用だなと思いました。