Copyright © 2019, Oracle and/or its affiliates. All rights reserved. |
2019年05月16日
日本オラクル株式会社
クラウド・テクノロジーコンサルティング
玉越 敬典
1
PGX ユーザー勉強会 #12
Deep Walk について
Copyright © 2019, Oracle and/or its affiliates. All rights reserved. | 2
Agenda
1. Deep Walk とは
2. Deep Walk by PGX
3. Demo
Copyright © 2019, Oracle and/or its affiliates. All rights reserved. | 3
1. Deep Walk とは
Copyright © 2019, Oracle and/or its affiliates. All rights reserved. | 4
Graph データ構造
• Graph の最も基本的なデータ構造(行列表現)は以下の2つ
隣接行列 隣接リスト
B
C
A F
D
E
B
C
A F
D
E
0 1 1 0 0 0
1 0 0 0 1 1
1 0 0 1 0 1
0 0 1 0 1 0
0 1 1 1 0 0
0 1 1 0 0 0
A B C D E F
A
B
C
D
E
F
A
B
C
D
E
F
B C
F
E F
C E
グラフの頂点と頂点の
隣接関係を表す正方行列
各頂点から接続している頂点を
数珠つなぎに保持するリスト構造
Copyright © 2019, Oracle and/or its affiliates. All rights reserved. | 5
Graph データ構造の統計手法への適用
• Graph を一般的な統計アルゴリズムで処理しようとすると、
スパース性からうまくいかないことが多い…
クラスタリング異常検知
ノードの数が増えれば増えるほど
0 が増えてスパースになる
0 1 … 0
0 0 … 0
.. .. … …
0 0 … 0
グラフ 隣接行列
B
C
A F
D
E
Copyright © 2019, Oracle and/or its affiliates. All rights reserved. | 6
潜在表現 (latent representation)
• そこで、Graph データの特徴 (ノードとノードのつながりの情報)をある程度保持したまま、
Graph 構造に関する潜在的な情報を抽出したデータ表現を使う
グラフ 隣接行列
B
C
A F
D
E
クラスタリング異常検知
潜在表現
0 1 … 0
0 0 … 0
.. .. … …
0 0 … 0
Copyright © 2019, Oracle and/or its affiliates. All rights reserved. | 7
Deep Walk
• Deep Walk は 潜在表現を獲得するためのアルゴリズム
– Deep Learning を使って Graph の潜在的な情報を学習する
0 1 1 0
1 0 0 0
1 0 0 1
0 0 1 0
グラフ 隣接行列
B
C
A F
D
E
Deep Walk!!
Random Walk
Word2vec
(Skip-gram)
潜在表現
2つのステップ
A のベクトル
B のベクトル
….
各ノードごとに
同次元のベクトル表現が得られる
Copyright © 2019, Oracle and/or its affiliates. All rights reserved. | 8
Deep Walk 詳細の前に – NLPとの関連①
• 自然言語処理 (NLP) 界隈でも Graph と同様の問題があった
– 文章、パラグラフ、単語といった情報を ①コンテキスト情報を踏まえた、②密なデータを表す表現の
方法がなかった
A. One-Hot ベクトル B. TF-IDF によるベクトル化
これ
は
ペン
です
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
これ
は
ペン
です
単語の出現頻度等を
重み付けして計算
0.2333
0.7685
0.2311
0.4562
語彙が増えれば増えるほど
スパースになる
コンテキスト情報を
考慮できていない
古典的な 単語ベクトル表現獲得手法
Copyright © 2019, Oracle and/or its affiliates. All rights reserved. | 9
Deep Walk 詳細の前に – NLPとの関連②
• そこで word2vec という手法が生み出された
– 「各単語はその周辺の単語と何らかの関係性がある」と仮定して、ある単語が与えられたときの周辺の単語
を予測するというタスクから、単語の潜在表現ベクトルを獲得する方法
潜在表現
引用: Xin Rong. word2vec Parameter Learning Explained
https://arxiv.org/pdf/1411.2738.pdf
Copyright © 2019, Oracle and/or its affiliates. All rights reserved. | 10
Deep Walk の発想とアルゴリズム
• 「ノードを適当に(ランダムに)たどっていけば、ノードの順序をもった集合ができる」
これは “文” とみなして、word2vec を適用できるのではないか?
B
C
A F
D
E
G
H
I J
2. word2vec
Random Walk
Word2vec
(Skip-gram)
Start
適当な ノードを出発起点として
ランダムにノードをたどる
辿ったノードの集合を順に
リストする
1. Random Walk
H I E B F[ ]
潜在表現
これを文とみなす
Copyright © 2019, Oracle and/or its affiliates. All rights reserved. | 11
Deep Walk で何ができるか
• Graph の潜在表現 = 「各ノードのベクトル集合」なため、ノード間の関係を計算できる
Aさん 商品1
Bさん
Cさん
商品2
商品3
リコメンドエンジン
比較対象 類似度
Bさん 0.987665
Cさん 0.87721
Aさんとの類似度が高いユーザ
• Aさんと類似度が高い
ユーザを導出
• そのユーザが買っている商品
をリコメンド
クラスタリング
DeepWalk によって計算された各ノードの
ベクトルを Kmeans 等のクラスタリング
アルゴリズムにくわせて、Graph のクラスタを
算出
Copyright © 2019, Oracle and/or its affiliates. All rights reserved. | 12
[参考] Deep Walk パフォーマンス
• 論文によると他の手法よりもパフォーマンスは高く、特にラベル付きデータがまばらである場合、
Deep Walk は競合する方法よりも最大10%高いF 1スコアになっている
(出典) Bryan Perozzi, Rami Al-Rfou, Steven Skiena. DeepWalk: Online Learning of Social
Representations
Copyright © 2019, Oracle and/or its affiliates. All rights reserved. | 13
2. Deep Walk by PGX
Copyright © 2019, Oracle and/or its affiliates. All rights reserved. | 14
PGX での Deep Walk の利用
• PGX 3.2 から Deep Walk が利用可能に
– https://docs.oracle.com/cd/E56133_01/latest/tutorials/mllib/deepwalk.html
• 以下のようなフローで Deep Walk を利用する
Graph データ準備 モデル構築 モデル学習 モデル利用
Copyright © 2019, Oracle and/or its affiliates. All rights reserved. | 15
PGX Deep Walk – 1. データの準備
• 通常の PGX の使用通りにまずは Graph データをロードして PgxGraph オブジェクトを
生成する
• そのあと、PgxGraph#undirect() で無向グラフ化する
PGX> G = session.readGraphWithProperties(“test.json”)
==> PgxGraph[name=sub-graph_13,N=4483,E=10000,
created=1557815262110]
# Deep Walk を適用するグラフは無向グラフである必要がある
PGX> uG = G.undirect()
Copyright © 2019, Oracle and/or its affiliates. All rights reserved. | 16
PGX Deep Walk – 2. モデルの構築
• ハイパーパラメータを設定して DeepWalk モデルを構築
– 各種ハイパーパラメータの意味は 以下の JavaDoc で確認
PGX> model = analyst.deepWalkModelBuilder()
.setWindowSize(3)
.setWalksPerVertex(6)
.setWalkLength(4)
.build()
==> oracle.pgx.api.beta.mllib.DeepWalkModel@50027e64
https://docs.oracle.com/cd/E56133_01/latest/javadocs/oracle/pgx/api/beta/mllib/DeepWalkModelBuilder.html
Copyright © 2019, Oracle and/or its affiliates. All rights reserved. | 17
PGX Deep Walk – 3. モデルの学習
• DeepWalkMode#fit(PgxGraph) で DeepWalk のモデルを学習させる
PGX> model.fit(uG)
# 学習後の損失を算出する (現在は 学習過程の損失は取得できない)
PGX> model.getLoss()
==> -1.1363721109080635E-6
# 学習後の 各ノードのベクトルは以下のように取得する
PGX> model.getTrainedVertexVectors()
==> oracle.pgx.api.beta.frames.internal.PgxFrameImpl@b2954e
Copyright © 2019, Oracle and/or its affiliates. All rights reserved. | 18
PGX Deep Walk – 4. モデル使用
• 学習さ (せたモデルで特定ノードの類似性を測定できる
– DeepWalkMode#computeSimilars を使用
– 現在はノードIDを元にした類似性の算出 API しか用意されていない
# 第一引数で比較元のノードIDを指定
# 第二引数で上位何件を取得するかを指定
PGX> sim = model.computeSimilars(111, 3)
PGX> sim.print()
+--------------------------------+
| dstVertex | similarity |
+--------------------------------+
| 111 | 1.0000001192092896 |
| 112 | 0.9316596984863281 |
| 113 | 0.9065075516700745 |
+--------------------------------+
Copyright © 2019, Oracle and/or its affiliates. All rights reserved. | 19
PGX Deep Walk – その他
• もちろんモデルの再利用を可能にするための API も備えている
– モデルの保存/モデルのロード
# モデルの保存
PGX> model.store("/tmp/dw.model")
==> null
# モデルのロード
PGX> model2 = analyst.loadDeepWalkModel("/tmp/dw.model")
==> oracle.pgx.api.beta.mllib.DeepWalkModel@ac91282
Copyright © 2019, Oracle and/or its affiliates. All rights reserved. | 20
3. Demo
Copyright © 2019, Oracle and/or its affiliates. All rights reserved. | 21
Demo 内容
• DBpedia の人物情報を使用して、各人物ノードの類似性をみる
Copyright © 2019, Oracle and/or its affiliates. All rights reserved. | 22
まとめ
• DeepWalk は Graph データ構造を汎用的な統計手法に適用させるための潜在表現を
得るための手法
– Graph をランダムウォークして、得られたノード列を文章とみなして、word2vec モデルに適用させる
• PGX 3.2 から DeepWalk が使え、一連のフローを実行するための API が提供されている
Deep walk について

Deep walk について

  • 1.
    Copyright © 2019,Oracle and/or its affiliates. All rights reserved. | 2019年05月16日 日本オラクル株式会社 クラウド・テクノロジーコンサルティング 玉越 敬典 1 PGX ユーザー勉強会 #12 Deep Walk について
  • 2.
    Copyright © 2019,Oracle and/or its affiliates. All rights reserved. | 2 Agenda 1. Deep Walk とは 2. Deep Walk by PGX 3. Demo
  • 3.
    Copyright © 2019,Oracle and/or its affiliates. All rights reserved. | 3 1. Deep Walk とは
  • 4.
    Copyright © 2019,Oracle and/or its affiliates. All rights reserved. | 4 Graph データ構造 • Graph の最も基本的なデータ構造(行列表現)は以下の2つ 隣接行列 隣接リスト B C A F D E B C A F D E 0 1 1 0 0 0 1 0 0 0 1 1 1 0 0 1 0 1 0 0 1 0 1 0 0 1 1 1 0 0 0 1 1 0 0 0 A B C D E F A B C D E F A B C D E F B C F E F C E グラフの頂点と頂点の 隣接関係を表す正方行列 各頂点から接続している頂点を 数珠つなぎに保持するリスト構造
  • 5.
    Copyright © 2019,Oracle and/or its affiliates. All rights reserved. | 5 Graph データ構造の統計手法への適用 • Graph を一般的な統計アルゴリズムで処理しようとすると、 スパース性からうまくいかないことが多い… クラスタリング異常検知 ノードの数が増えれば増えるほど 0 が増えてスパースになる 0 1 … 0 0 0 … 0 .. .. … … 0 0 … 0 グラフ 隣接行列 B C A F D E
  • 6.
    Copyright © 2019,Oracle and/or its affiliates. All rights reserved. | 6 潜在表現 (latent representation) • そこで、Graph データの特徴 (ノードとノードのつながりの情報)をある程度保持したまま、 Graph 構造に関する潜在的な情報を抽出したデータ表現を使う グラフ 隣接行列 B C A F D E クラスタリング異常検知 潜在表現 0 1 … 0 0 0 … 0 .. .. … … 0 0 … 0
  • 7.
    Copyright © 2019,Oracle and/or its affiliates. All rights reserved. | 7 Deep Walk • Deep Walk は 潜在表現を獲得するためのアルゴリズム – Deep Learning を使って Graph の潜在的な情報を学習する 0 1 1 0 1 0 0 0 1 0 0 1 0 0 1 0 グラフ 隣接行列 B C A F D E Deep Walk!! Random Walk Word2vec (Skip-gram) 潜在表現 2つのステップ A のベクトル B のベクトル …. 各ノードごとに 同次元のベクトル表現が得られる
  • 8.
    Copyright © 2019,Oracle and/or its affiliates. All rights reserved. | 8 Deep Walk 詳細の前に – NLPとの関連① • 自然言語処理 (NLP) 界隈でも Graph と同様の問題があった – 文章、パラグラフ、単語といった情報を ①コンテキスト情報を踏まえた、②密なデータを表す表現の 方法がなかった A. One-Hot ベクトル B. TF-IDF によるベクトル化 これ は ペン です 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 これ は ペン です 単語の出現頻度等を 重み付けして計算 0.2333 0.7685 0.2311 0.4562 語彙が増えれば増えるほど スパースになる コンテキスト情報を 考慮できていない 古典的な 単語ベクトル表現獲得手法
  • 9.
    Copyright © 2019,Oracle and/or its affiliates. All rights reserved. | 9 Deep Walk 詳細の前に – NLPとの関連② • そこで word2vec という手法が生み出された – 「各単語はその周辺の単語と何らかの関係性がある」と仮定して、ある単語が与えられたときの周辺の単語 を予測するというタスクから、単語の潜在表現ベクトルを獲得する方法 潜在表現 引用: Xin Rong. word2vec Parameter Learning Explained https://arxiv.org/pdf/1411.2738.pdf
  • 10.
    Copyright © 2019,Oracle and/or its affiliates. All rights reserved. | 10 Deep Walk の発想とアルゴリズム • 「ノードを適当に(ランダムに)たどっていけば、ノードの順序をもった集合ができる」 これは “文” とみなして、word2vec を適用できるのではないか? B C A F D E G H I J 2. word2vec Random Walk Word2vec (Skip-gram) Start 適当な ノードを出発起点として ランダムにノードをたどる 辿ったノードの集合を順に リストする 1. Random Walk H I E B F[ ] 潜在表現 これを文とみなす
  • 11.
    Copyright © 2019,Oracle and/or its affiliates. All rights reserved. | 11 Deep Walk で何ができるか • Graph の潜在表現 = 「各ノードのベクトル集合」なため、ノード間の関係を計算できる Aさん 商品1 Bさん Cさん 商品2 商品3 リコメンドエンジン 比較対象 類似度 Bさん 0.987665 Cさん 0.87721 Aさんとの類似度が高いユーザ • Aさんと類似度が高い ユーザを導出 • そのユーザが買っている商品 をリコメンド クラスタリング DeepWalk によって計算された各ノードの ベクトルを Kmeans 等のクラスタリング アルゴリズムにくわせて、Graph のクラスタを 算出
  • 12.
    Copyright © 2019,Oracle and/or its affiliates. All rights reserved. | 12 [参考] Deep Walk パフォーマンス • 論文によると他の手法よりもパフォーマンスは高く、特にラベル付きデータがまばらである場合、 Deep Walk は競合する方法よりも最大10%高いF 1スコアになっている (出典) Bryan Perozzi, Rami Al-Rfou, Steven Skiena. DeepWalk: Online Learning of Social Representations
  • 13.
    Copyright © 2019,Oracle and/or its affiliates. All rights reserved. | 13 2. Deep Walk by PGX
  • 14.
    Copyright © 2019,Oracle and/or its affiliates. All rights reserved. | 14 PGX での Deep Walk の利用 • PGX 3.2 から Deep Walk が利用可能に – https://docs.oracle.com/cd/E56133_01/latest/tutorials/mllib/deepwalk.html • 以下のようなフローで Deep Walk を利用する Graph データ準備 モデル構築 モデル学習 モデル利用
  • 15.
    Copyright © 2019,Oracle and/or its affiliates. All rights reserved. | 15 PGX Deep Walk – 1. データの準備 • 通常の PGX の使用通りにまずは Graph データをロードして PgxGraph オブジェクトを 生成する • そのあと、PgxGraph#undirect() で無向グラフ化する PGX> G = session.readGraphWithProperties(“test.json”) ==> PgxGraph[name=sub-graph_13,N=4483,E=10000, created=1557815262110] # Deep Walk を適用するグラフは無向グラフである必要がある PGX> uG = G.undirect()
  • 16.
    Copyright © 2019,Oracle and/or its affiliates. All rights reserved. | 16 PGX Deep Walk – 2. モデルの構築 • ハイパーパラメータを設定して DeepWalk モデルを構築 – 各種ハイパーパラメータの意味は 以下の JavaDoc で確認 PGX> model = analyst.deepWalkModelBuilder() .setWindowSize(3) .setWalksPerVertex(6) .setWalkLength(4) .build() ==> oracle.pgx.api.beta.mllib.DeepWalkModel@50027e64 https://docs.oracle.com/cd/E56133_01/latest/javadocs/oracle/pgx/api/beta/mllib/DeepWalkModelBuilder.html
  • 17.
    Copyright © 2019,Oracle and/or its affiliates. All rights reserved. | 17 PGX Deep Walk – 3. モデルの学習 • DeepWalkMode#fit(PgxGraph) で DeepWalk のモデルを学習させる PGX> model.fit(uG) # 学習後の損失を算出する (現在は 学習過程の損失は取得できない) PGX> model.getLoss() ==> -1.1363721109080635E-6 # 学習後の 各ノードのベクトルは以下のように取得する PGX> model.getTrainedVertexVectors() ==> oracle.pgx.api.beta.frames.internal.PgxFrameImpl@b2954e
  • 18.
    Copyright © 2019,Oracle and/or its affiliates. All rights reserved. | 18 PGX Deep Walk – 4. モデル使用 • 学習さ (せたモデルで特定ノードの類似性を測定できる – DeepWalkMode#computeSimilars を使用 – 現在はノードIDを元にした類似性の算出 API しか用意されていない # 第一引数で比較元のノードIDを指定 # 第二引数で上位何件を取得するかを指定 PGX> sim = model.computeSimilars(111, 3) PGX> sim.print() +--------------------------------+ | dstVertex | similarity | +--------------------------------+ | 111 | 1.0000001192092896 | | 112 | 0.9316596984863281 | | 113 | 0.9065075516700745 | +--------------------------------+
  • 19.
    Copyright © 2019,Oracle and/or its affiliates. All rights reserved. | 19 PGX Deep Walk – その他 • もちろんモデルの再利用を可能にするための API も備えている – モデルの保存/モデルのロード # モデルの保存 PGX> model.store("/tmp/dw.model") ==> null # モデルのロード PGX> model2 = analyst.loadDeepWalkModel("/tmp/dw.model") ==> oracle.pgx.api.beta.mllib.DeepWalkModel@ac91282
  • 20.
    Copyright © 2019,Oracle and/or its affiliates. All rights reserved. | 20 3. Demo
  • 21.
    Copyright © 2019,Oracle and/or its affiliates. All rights reserved. | 21 Demo 内容 • DBpedia の人物情報を使用して、各人物ノードの類似性をみる
  • 22.
    Copyright © 2019,Oracle and/or its affiliates. All rights reserved. | 22 まとめ • DeepWalk は Graph データ構造を汎用的な統計手法に適用させるための潜在表現を 得るための手法 – Graph をランダムウォークして、得られたノード列を文章とみなして、word2vec モデルに適用させる • PGX 3.2 から DeepWalk が使え、一連のフローを実行するための API が提供されている