Graph Convolutionを自然言語処理に応用する Part3

piqcy
programming-soda
Published in
8 min readSep 14, 2018

Graph Convolutionを自然言語処理に応用するための調査Part3となります。

Part3では理論/実装から少し離れ、グラフ構造を扱うタスクの種類について整理します。具体的には、タスクとそのタスクにおけるinputとoutput(prediction)を整理します。これにより、応用しようとしている問題(自然言語処理)をどんな「グラフ構造を扱うタスク」に変換できるのかを考えられるようにします。理論・実装編であるPart2についてはこちらをご参照ください。

グラフ構造を扱うタスクの種類

グラフ構造を扱うタスクは、以下のように整理できます。

Structured deep models: Deep learning on graphs and beyond p12より
  • Node Classification: グラフのノードについて、そのクラスを分類する
  • Graph Classification: グラフ全体について、そのクラスを分類する
  • Link Prediction: あるノード同士が、接続関係にあるかを推定する。
  • Edge Classification/Relation Classification: あるノード同士の関係(親子なのか兄弟なのかetc)を推定する

Relation Extractionは、Link Prediction/Edge Classificationを含んだ関係性の推定全般のタスクを指し示す言葉のようです。

ノード、エッジに関するタスクについてはTransductiveとInductiveという概念があります。学習データ中にあるけれども、ラベルがついてないデータについて予測するものがTransductive、学習データ中にないデータについて予測するものがInductiveになります。

Transductiveの設定は通常の機械学習からすればとても奇妙に思えます。しかし、グラフを扱う場合はそもそもグラフ構造全体をネットワークに入れなければなりません。Part2で論文ネットワーク(CORA)の分類を行った際も、training/validation/testで入力しているネットワークは同じ[X, A]であることが確認できます。これはTransductiveな設定になります。

# Train model
validation_data = ([X, A], Y_val, idx_val)
model.fit([X, A],
Y_train,
sample_weight=idx_train,
epochs=epochs,
batch_size=N,
validation_data=validation_data,
shuffle=False,
callbacks=[es_callback, tb_callback])
# Evaluate model
eval_results = model.evaluate([X, A],
Y_test,
sample_weight=idx_test,
batch_size=N,
verbose=0)

このためTransductiveは「欠損データを補完する」ようなイメージになります。ただ、実際は今までにないノードやエッジを推定したいことが多いでしょう。これがInductiveの設定になります。

Inductiveの設定では周辺ノードの情報が確定していないため、サンプリングを行います。サンプリングした周辺ノードから、ターゲットノードの表現を推定します。GraphSAGE(Inductive Representation Learning on Large Graphs)やRevisiting Semi-Supervised Learning with Graph Embeddingsはこの代表的な手法となります。

GraphSAGE: Inductive Representation Learning on Large Graphs

さて、これまで述べたタスクは従来のグラフに関するタスクです。近年では、グラフの潜在表現を獲得する、グラフ構造を生成するといった研究も行われています。

Structured deep models: Deep learning on graphs and beyond

グラフの潜在表現の獲得は、データの構造情報を埋め込めるという面で有用です。観測されたモーションからそれを生み出している物理構造を明らかにしたり(Neural Relational Inference for Interacting Systems)、ユーザー・アイテムそれぞれの繋がりから潜在表現を作成することで推薦システムに利用するという研究もあります(Geometric Matrix Completion with Recurrent Multi-Graph Neural Networks)。

Geometric Matrix Completion with Recurrent Multi-Graph Neural Networks

グラフ構造の生成は、特定の性質を持つ化学物質構造の生成などが研究されています。創薬は非常にコストがかかるプロセスであり、今後はそこへの応用も進んでくるかもしれません。

MolGAN: An implicit generative model for small molecular graphs

グラフ構造では様々なタスクが可能なことがわかりました。しかし、適用に際してはグラフ構造全体を入れなければならないという点に変わりはありません。文や化学物質はまだ小さいほうですが、SNSにおけるユーザーのつながり等は数えきれないほどのノードがあります。これについてはどう扱えばよいでしょうか。

大規模なグラフ構造を扱う方法

大規模なグラフにGraph Convolutionを扱い方法については、とても参考になる研究があります。

こちらの研究では、 Pinterestの PinネットワークにGraph Convolutionを適用しています。そのノード数は実に30億にも上ります。ベースとなっているのは上記で紹介したGraphSAGEなのですが、近傍ノードを重点サンプリングから得ることでグラフ全体をメモリに乗せずとも良くしています。この「重点」は、ランダムウォークを何回か行いその到達回数で重みをかけています。

ノードを重点サンプリングで取得することは3つのメリットがあります。

  • ノード全体をメモリに乗せなくてもよくなる
  • トップNの重点ノードを使うことで周辺ノードの数をNに固定できる=計算の最適化を行いやすくできる
  • 各周辺ノードの重要度を考慮できる

この他にも、サンプリングはCPU・畳み込みはGPUで役割分担する、MapReduceによる分散処理を行うなどプロダクションレベルでGraph Convolutionを行うためのノウハウが詰まっています。

Part3では、グラフを扱うタスクの整理を行いました。また、実際グラフを扱う際に、サイズが大きい場合どのように対処すればよいのかについても参照しました。これで、グラフ構造を扱うことでどんなことができるのか、それをスケールするにはどういう方法があるのかが把握できました。

Part4では、いよいよ自然言語のデータにGraph Convolutionを適用していきたいと思います。

--

--

piqcy
programming-soda

All change is not growth, as all movement is not forward. Ellen Glasgow