7 グラフ用の機械学習ライブラリ(PgxML)の使用

インメモリー・グラフ・サーバー(PGX)は、グラフ化された機械学習アルゴリズムをサポートする機械学習ライブラリoracle.pgx.api.mllibを提供します。

現在、次の機械学習アルゴリズムがサポートされています。

7.1 DeepWalkアルゴリズムの使用

DeepWalkは、業界で広く使用されている頂点表現学習アルゴリズムです。

次の2つの主なステップで構成されています。

  1. まず、ランダム・ウォーク生成ステップで、各頂点のランダム・ウォークが計算されます(事前定義されたウォークの長さと、事前定義された頂点ごとのウォーク数を使用します)。
  2. 次に、これらの生成されたウォークがWord2vecアルゴリズムにフィードされ、各頂点(Word2vecアルゴリズムに提供される入力の単語)のベクトル表現が生成されます。DeepWalkアルゴリズムの詳細は、KDDのドキュメントを参照してください。

DeepWalkでは、特定のグラフの頂点埋込みが作成され、グラフに変更を組み込むように更新することはできません。かわりに、この変更されたグラフで新しいDeepWalkモデルをトレーニングする必要があります。最後に、DeepWalkモデルのメモリー使用量がO(2n*d)であることに注意することが重要です。ここで、nはグラフ内の頂点の数、dは埋込み長です。

次に、8,637,721の頂点と165,049,964のエッジを含む例としてDBpediaグラフを使用して、インメモリーPGXでのDeepWalkの主な機能の使用方法を示します。

7.1.1 グラフのロード

次に、グラフをロードするステップについて説明します。

  1. セッションアナリストを作成します。
    JShellを使用したセッションおよびアナリストの作成
    cd /opt/oracle/graph/
    ./bin/opg-jshell
    // starting the shell will create an implicit session and analyst
    Javaを使用したセッションおよびアナリストの作成
    import oracle.pgx.api.*;
    import oracle.pgx.api.mllib.DeepWalkModel;
    import oracle.pgx.api.frames.*;
    ...
    PgxSession session = Pgx.createSession("my-session");
    Analyst analyst = session.createAnalyst();
    Pythonを使用したセッションおよびアナリストの作成
    session = pypgx.get_session(session_name="my-session")
    analyst = session.create_analyst()
  2. グラフをロードします。

    ノート:

    DeepWalkアルゴリズムの実装は有向グラフまたは無向グラフに適用できますが、現在は無向ランダム・ウォークのみが考慮されます。
    JShellを使用したグラフのロード
    opg-jshell> var graph = session.readGraphWithProperties("<path>/<graph.json>")
    Javaを使用したグラフのロード
    PgxGraph graph = session.readGraphWithProperties("<path>/<graph.json>");
    Pythonを使用したグラフのロード
    graph = session.read_graph_with_properties("<path>/<graph.json>")

7.1.2 最小限のDeepWalkモデルの作成

次のコードに示すように、最小限の構成とデフォルトのハイパーパラメータを使用するDeepWalkモデルを作成できます。

JShellを使用した最小限のDeepWalkモデルの作成
opg-jshell> var model = analyst.deepWalkModelBuilder()
                .setWindowSize(3)
                .setWalksPerVertex(6)
                .setWalkLength(4)
                .build()
Javaを使用した最小限のDeepWalkモデルの作成
DeepWalkModel model = analyst.deepWalkModelBuilder()
    .setWindowSize(3)
    .setWalksPerVertex(6)
    .setWalkLength(4)
    .build()
Pythonを使用した最小限のDeepWalkモデルの作成
model = analyst.deepwalk_builder(window_size=3,walks_per_vertex=6,walk_length=4)

7.1.3 カスタマイズしたDeepWalkモデルの作成

次のコードに示すように、カスタマイズされたハイパーパラメータを使用するDeepWalkモデルを作成できます。

JShellを使用したカスタマイズ済DeepWalkモデルの作成
opg-jshell> var model = analyst.deepWalkModelBuilder()
                .setMinWordFrequency(1)
                .setBatchSize(512)
                .setNumEpochs(1)
                .setLayerSize(100)
                .setLearningRate(0.05)
                .setMinLearningRate(0.0001)
                .setWindowSize(3)
                .setWalksPerVertex(6)
                .setWalkLength(4)
                .setSampleRate(0.00001)
                .setNegativeSample(2)
                .setValidationFraction(0.01)
                .build()
Javaを使用したカスタマイズ済DeepWalkモデルの作成
DeepWalkModel model= analyst.deepWalkModelBuilder()
    .setMinWordFrequency(1)
    .setBatchSize(512)
    .setNumEpochs(1)
    .setLayerSize(100)
    .setLearningRate(0.05)
    .setMinLearningRate(0.0001)
    .setWindowSize(3)
    .setWalksPerVertex(6)
    .setWalkLength(4)
    .setSampleRate(0.00001)
    .setNegativeSample(2)
    .setValidationFraction(0.01)
    .build()
Pythonを使用したカスタマイズ済DeepWalkモデルの作成
model = analyst.deepwalk_builder(min_word_frequency=1,
                                batch_size=512,num_epochs=1,
                                layer_size=100,
                                learning_rate=0.05,
                                min_learning_rate=0.0001,
                                window_size=3,
                                walks_per_vertex=6,
                                walk_length=4,
                                sample_rate=0.00001,
                                negative_sample=2,
                                validation_fraction=0.01)

各ビルダー操作の説明とデフォルト値については、JavadocのDeepWalkModelBuilderを参照してください。

7.1.4 DeepWalkモデルのトレーニング

次のコードに示すように、指定したデフォルト設定またはカスタマイズ設定でDeepWalkモデルをトレーニングできます。

JShellを使用したDeepWalkモデルのトレーニング
opg-jshell> model.fit(graph)
Javaを使用したDeepWalkモデルのトレーニング
model.fit(graph)
Pythonを使用したDeepWalkモデルのトレーニング
model.fit(graph)

7.1.5 DeepWalkモデルのLoss値の取得

次のコードに示すように、setValidationFractionを使用してビルダーで設定された、指定された割合のトレーニング・データのloss値をフェッチできます。

JShellを使用したLoss値の取得
opg-jshell> var loss = model.getLoss()
Javaを使用したLoss値の取得
double loss = model.getLoss();
Pythonを使用したLoss値の取得
loss = model.loss

7.1.6 特定頂点の類似頂点の計算

次のコードに示すように、特定の頂点の最も類似したk個の頂点をフェッチできます。

JShellを使用した特定頂点の類似頂点の計算
opg-jshell> var similars = model.computeSimilars("Albert_Einstein", 10)
opg-jshell> similars.print()
Javaを使用した特定頂点の類似頂点の計算
PgxFrame similars = model.computeSimilars("Albert_Einstein", 10)
similars.print()
Pythonを使用した特定頂点の類似頂点の計算
similars = model.compute_similars("Albert_Einstein",10)
similars.print()
トレーニング済モデルを使用してAlbert_Einsteinの類似頂点を検索すると、次の出力が得られます。
+-----------------------------------------+
| dstVertex          | similarity         |
+-----------------------------------------+
| Albert_Einstein    | 1.0000001192092896 |
| Physics            | 0.8664291501045227 |
| Werner_Heisenberg  | 0.8625140190124512 |
| Richard_Feynman    | 0.8496938943862915 |
| List_of_physicists | 0.8415523767471313 |
| Physicist          | 0.8384397625923157 |
| Max_Planck         | 0.8370327353477478 |
| Niels_Bohr         | 0.8340970873832703 |
| Quantum_mechanics  | 0.8331197500228882 |
| Special_relativity | 0.8280861973762512 |
+-----------------------------------------+

7.1.7 頂点バッチの類似頂点の計算

次のコードに示すように、入力頂点のリストに対して最も類似したk個の頂点をフェッチできます。

JShellを使用した頂点バッチの類似頂点の計算
opg-jshell> var vertices = new ArrayList()
opg-jshell> vertices.add("Machine_learning")
opg-jshell> vertices.add("Albert_Einstein")
opg-jshell> batchedSimilars = model.computeSimilars(vertices, 10)
opg-jshell> batchedSimilars.print()
Javaを使用した頂点バッチの類似頂点の計算
List vertices = Arrays.asList("Machine_learning","Albert_Einstein");
PgxFrame batchedSimilars = model.computeSimilars(vertices,10);
batchedSimilars.print();
Pythonを使用した頂点バッチの類似頂点の計算
vertices = ["Machine_learning","Albert_Einstein"]
batched_similars = model.compute_similars(vertices,10)
batched_similars.print()
次に、出力結果を示します。
+-------------------------------------------------------------------+
| srcVertex        | dstVertex                 | similarity         |
+-------------------------------------------------------------------+
| Machine_learning | Machine_learning          | 1.0000001192092896 |
| Machine_learning | Data_mining               | 0.9070799350738525 |
| Machine_learning | Computer_science          | 0.8963605165481567 |
| Machine_learning | Unsupervised_learning     | 0.8828719854354858 |
| Machine_learning | R_(programming_language)  | 0.8821185827255249 |
| Machine_learning | Algorithm                 | 0.8819515705108643 |
| Machine_learning | Artificial_neural_network | 0.8773092031478882 |
| Machine_learning | Data_analysis             | 0.8758628368377686 |
| Machine_learning | List_of_algorithms        | 0.8737979531288147 |
| Machine_learning | K-means_clustering        | 0.8715602159500122 |
| Albert_Einstein  | Albert_Einstein           | 1.0000001192092896 |
| Albert_Einstein  | Physics                   | 0.8664291501045227 |
| Albert_Einstein  | Werner_Heisenberg         | 0.8625140190124512 |
| Albert_Einstein  | Richard_Feynman           | 0.8496938943862915 |
| Albert_Einstein  | List_of_physicists        | 0.8415523767471313 |
| Albert_Einstein  | Physicist                 | 0.8384397625923157 |
| Albert_Einstein  | Max_Planck                | 0.8370327353477478 |
| Albert_Einstein  | Niels_Bohr                | 0.8340970873832703 |
| Albert_Einstein  | Quantum_mechanics         | 0.8331197500228882 |
| Albert_Einstein  | Special_relativity        | 0.8280861973762512 |
+-------------------------------------------------------------------+

7.1.8 トレーニング済DeepWalkモデルの格納

モデルはデータベースに格納できます。モデルは、モデル・ストア表内の行として格納されます。

次のコードは、トレーニング済DeepWalkモデルを特定のモデル・ストア表のデータベースに格納する方法を示しています。

JShellを使用したトレーニング済DeepWalkモデルの格納
opg-jshell> model.export().db() 
              .modelstore("modelstoretablename")  // name of the model store table
              .modelname("model")                 // model name (primary key of model store table)
              .description("a model description") // description to store alongside the model
              .store();
Javaを使用したトレーニング済DeepWalkモデルの格納
model.export().db()
    .modelstore("modelstoretablename")  // name of the model store table
    .modelname("model")                 // model name (primary key of model store table)
    .description("a model description") // description to store alongside the model
    .store();
Pythonを使用したトレーニング済DeepWalkモデルの格納
model.export().db(model_store="modelstoretablename",
                  model_name="model")

ノート:

前述のすべての例では、現在ログインしているデータベースにモデルを格納することを前提としています。別のデータベースにモデルを格納する必要がある場合は、トレーニング済モデルの別のデータベースへの格納の例を参照してください。
7.1.8.1 トレーニング済モデルの別のデータベースへの格納

モデルは、ログインに使用されたものとは異なるデータベースに格納できます。

次のコードは、トレーニング済モデルを別のデータベースに格納する方法を示しています。

JShellを使用したトレーニング済モデルの格納
opg-jshell> model.export().db() 
              .username("user")                   // DB user to use for storing the model
              .password("password")               // password of the DB user
              .jdbcUrl("jdbcUrl")                 // jdbc url to the DB
              .modelstore("modelstoretablename")  // name of the model store table
              .modelname("model")                 // model name (primary key of model store table)
              .description("a model description") // description to store alongside the model
              .store();
Javaを使用したトレーニング済モデルの格納
model.export().db()
    .username("user")                   // DB user to use for storing the model
    .password("password")               // password of the DB user
    .jdbcUrl("jdbcUrl")                 // jdbc url to the DB
    .modelstore("modelstoretablename")  // name of the model store table
    .modelname("model")                 // model name (primary key of model store table)
    .description("a model description") // description to store alongside the model
    .store();
Pythonを使用したトレーニング済モデルの格納
model.export().db(username="user",
                  password="password",
                  model_store="modelstoretablename",
                  model_name="model",
                  jdbc_url="jdbc_url")

7.1.9 事前トレーニング済DeepWalkモデルのロード

データベースからモデルをロードできます。

次のコードに示すように、事前トレーニング済のDeepWalkモデルをデータベースのモデル・ストア表からロードできます。

JShellを使用した事前トレーニング済DeepWalkモデルのロード
opg-jshell> var model = analyst.loadDeepWalkModel().db()
                .modelstore("modeltablename") // name of the model store table
                .modelname("model")           // model name (primary key of model store table)
                .load();
Javaを使用した事前トレーニング済DeepWalkモデルのロード
DeepWalkModelmodel = analyst.loadDeepWalkModel().db()
     .modelstore("modeltablename") // name of the model store table
     .modelname("model")           // model name (primary key of model store table)
     .load();
Pythonを使用した事前トレーニング済DeepWalkモデルのロード
analyst.get_deepwalk_model_loader().db(model_store="modelstoretablename",
                                       model_name="model")

ノート:

前述のすべての例では、現在ログインしているデータベースからモデルをロードすることを前提としています。別のデータベースからモデルをロードする必要がある場合は、別のデータベースからの事前トレーニング済モデルのロードの例を参照してください。
7.1.9.1 別のデータベースからの事前トレーニング済モデルのロード

ログインに使用したものとは異なるデータベースからモデルをロードできます。

次のコードに示すように、事前トレーニング済モデルをデータベースのモデル・ストア表からロードできます。

JShellを使用した事前トレーニング済モデルのロード
opg-jshell> var model = analyst.<modelLoader>.db()
                .username("user")             // DB user to use for storing the model
                .password("password")         // password of the DB user
                .jdbcUrl("jdbcUrl")           // jdbc url to the DB
                .modelstore("modeltablename") // name of the model store table
                .modelname("model")           // model name (primary key of model store table)
                .load();
<modelLoader>は次のように適用されます。
  • loadDeepWalkModel(): Deepwalkモデルをロード
  • loadSupervisedGraphWiseModel(): GraphWiseモデルをロード
  • loadPg2vecModel(): Pg2vecモデルをロード
Javaを使用した事前トレーニング済DeepWalkモデルのロード
DeepWalkModelmodel = analyst.<modelLoader>.db()
     .username("user")             // DB user to use for storing the model
     .password("password")         // password of the DB user
     .jdbcUrl("jdbcUrl")           // jdbc url to the DB
     .modelstore("modeltablename") // name of the model store table
     .modelname("model")           // model name (primary key of model store table)
     .load();
<modelLoader>は次のように適用されます。
  • loadDeepWalkModel(): Deepwalkモデルをロード
  • loadSupervisedGraphWiseModel(): GraphWiseモデルをロード
  • loadPg2vecModel(): Pg2vecモデルをロード
Pythonを使用した事前トレーニング済DeepWalkモデルのロード
analyst.<modelLoader>.db(username="user",
                                       password="password",
                                       model_store="modelstoretablename",
                                       model_name="model",
                                       jdbc_url="jdbc_url")
<modelLoader>は次のように適用されます。
  • get_deepwalk_model_loader(): Deepwalkモデルをロード
  • get_pg2vec_model_loader(): Pg2vecモデルをロード

7.1.10 DeepWalkモデルの破棄

次のコードに示すように、DeepWalkモデルを破棄できます。

JShellを使用したDeepWalkモデルの破棄
opg-jshell> model.destroy()
Javaを使用したDeepWalkモデルの破棄
model.destroy();
Pythonを使用したDeepWalkモデルの破棄
model.destroy()

7.2 Supervised GraphWiseアルゴリズムの使用

Supervised GraphWiseは、頂点の特徴情報を利用できる、帰納的な頂点表現学習アルゴリズムです。頂点分類やリンク予測などの様々なタスクに適用できます。

Supervised GraphWiseは、HamiltonらによるGraphSAGEに基づいています。

モデル体系

Supervised GraphWiseモデルは、2つのグラフの畳込み層とそれに続く複数の予測層で構成されます。

頂点の畳込み層を通過する前方パスは、次のように処理されます。

  1. 頂点の近隣のセットがサンプリングされます。
  2. 近隣の前の層表現は平均集約され、集約された特徴は頂点の前の層表現と連結されます。
  3. この連結されたベクトルに重みが乗算され、バイアス・ベクトルが追加されます。
  4. 結果は、層出力が単位ノルムを持つように正規化されます。

予測層は、標準のニューラル・ネットワーク層です。

次に、Coraグラフを例として使用して、PGXでのGraphSAGEの実装における主な機能の使用方法を示します。

7.2.1 グラフのロード

次に、グラフをロードするステップについて説明します。

  1. セッションアナリストを作成します。
    JShellを使用したセッションおよびアナリストの作成
    cd /opt/oracle/graph/
    ./bin/opg-jshell
    // starting the shell will create an implicit session and analyst
    Javaを使用したセッションおよびアナリストの作成
    import oracle.pgx.api.*;
    import oracle.pgx.api.mllib.SupervisedGraphWiseModel;
    import oracle.pgx.api.frames.*;
    import oracle.pgx.config.mllib.ActivationFunction;
    import oracle.pgx.config.mllib.GraphWiseConvLayerConfig;
    import oracle.pgx.config.mllib.GraphWisePredictionLayerConfig;
    import oracle.pgx.config.mllib.SupervisedGraphWiseModelConfig;
    import oracle.pgx.config.mllib.WeightInitScheme;
    PgxSession session = Pgx.createSession("my-session");
    Analyst analyst = session.createAnalyst();
  2. グラフをロードします。
    JShellを使用したグラフのロード
    opg-jshell> var fullGraph = session.readGraphWithProperties("<path>/<full_graph.json>")
    opg-jshell> var trainGraph = session.readGraphWithProperties("<path>/<train_graph.json>")
    opg-jshell> var testVertices = fullGraph.getVertices()
                    .stream()
                    .filter(v -> !trainGraph.hasVertex(v.getId()))
                    .collect(Collectors.toList());
    Javaを使用したグラフのロード
    PgxGraph fullGraph = session.readGraphWithProperties("<path>/<full_graph.json>");
    PgxGraph trainGraph = session.readGraphWithProperties("<path>/<train_graph.json>");
    List<PgxVertex> testVertices = fullGraph.getVertices()
        .stream()
        .filter(v->!trainGraph.hasVertex(v.getId()))
        .collect(Collectors.toList());

7.2.2 最小限のGraphWiseモデルの作成

次のコードに示すように、最小限の構成とデフォルトのハイパーパラメータを使用するGraphWiseモデルを作成できます。

JShellを使用した最小限のGraphWiseモデルの作成
opg-jshell> var model = analyst.supervisedGraphWiseModelBuilder()
                .setVertexInputPropertyNames("features")
                .setVertexTargetPropertyName("label")
                .build()
Javaを使用した最小限のGraphWiseモデルの作成
SupervisedGraphWiseModel model = analyst.supervisedGraphWiseModelBuilder()
    .setVertexInputPropertyNames("features")
    .setVertexTargetPropertyName("labels")
    .build()

ノート:

前述の例では特徴プロパティが1つしか指定されていませんが、任意の数だけ指定できます。

7.2.3 高度なハイパーパラメータ・カスタマイズ

豊富なハイパーパラメータ・カスタマイズを使用してGraphWiseモデルを作成できます。

これは、次の2つのサブ構成クラスによって行われます。

  1. GraphWiseConvLayerConfig
  2. GraphWisePredictionLayerConfig

次のコードは、GraphWiseモデルで前述のクラスを使用した構成の実装を説明しています。

JShellを使用したカスタマイズ済GraphWiseモデルの作成
opg-jshell> var weightProperty = analyst.pagerank(trainGraph).getName()
opg-jshell> var convLayerConfig = analyst.graphWiseConvLayerConfigBuilder()
                .setNumSampledNeighbors(25)
                .setActivationFunction(ActivationFunction.TANH)
                .setWeightInitScheme(WeightInitScheme.XAVIER)
                .setWeightedAggregationProperty(weightProperty)
                .build()
opg-jshell> var predictionLayerConfig = analyst.graphWisePredictionLayerConfigBuilder()
                .setHiddenDimension(32)
                .setActivationFunction(ActivationFunction.RELU)
                .setWeightInitScheme(WeightInitScheme.HE)
                .build()
opg-jshell> var model = analyst.supervisedGraphWiseModelBuilder()
                .setVertexInputPropertyNames("features")
                .setVertexTargetPropertyName("labels")
                .setConvLayerConfigs(convLayerConfig)
                .setPredictionLayerConfigs(predictionLayerConfig)
                .build()
Javaを使用したカスタマイズ済GraphWiseモデルの作成
String weightProperty = analyst.pagerank(trainGraph).getName()
GraphWiseConvLayerConfig convLayerConfig = analyst.graphWiseConvLayerConfigBuilder()
    .setNumSampledNeighbors(25)
    .setActivationFunction(ActivationFunction.TANH)
    .setWeightInitScheme(WeightInitScheme.XAVIER)
    .setWeightedAggregationProperty(weightProperty)
    .build();

GraphWisePredictionLayerConfig predictionLayerConfig = analyst.graphWisePredictionLayerConfigBuilder()
    .setHiddenDimension(32)
    .setActivationFunction(ActivationFunction.RELU)
    .setWeightInitScheme(WeightInitScheme.HE)
    .build();

SupervisedGraphWiseModel model = analyst.supervisedGraphWiseModelBuilder()
    .setVertexInputPropertyNames("features")
    .setVertexTargetPropertyName("labels")
    .setConvLayerConfigs(convLayerConfig)
    .setPredictionLayerConfigs(predictionLayerConfig)
    .build();

使用可能なすべてのハイパーパラメータとそのデフォルト値の詳細は、JavadocのSupervisedGraphWiseModelBuilderGraphWiseConvLayerConfigBuilderおよびGraphWisePredictionLayerConfigBuilderを参照してください。

7.2.4 Supervised GraphWiseモデルのトレーニング

次のコードに示すように、グラフのSupervised GraphWiseモデルをトレーニングできます。

JShellを使用したGraphWiseモデルのトレーニング
opg-jshell> model.fit(trainGraph)
Javaを使用したGraphWiseモデルのトレーニング
model.fit(trainGraph)

7.2.5 Supervised GraphWiseモデルのLoss値の取得

トレーニングloss値は、次のコードに従ってフェッチできます。

JShellを使用したLoss値の取得
opg-jshell> var loss = model.getTrainingLoss()
Javaを使用したLoss値の取得
double loss = model.getTrainingLoss();

7.2.6 Supervised GraphWiseモデルの頂点ラベルの推測

次のコードに示すように、任意のグラフ(トレーニング中に表示されなかった頂点またはグラフを含む)の頂点のラベルを推測できます。

JShellを使用した頂点ラベルの推測
opg-jshell> var labels = model.inferLabels(fullGraph, testVertices)
opg-jshell> labels.head().print()
Javaを使用した頂点ラベルの推測
PgxFrame labels = model.inferLabels(fullGraph,testVertices);
labels.head().print();
出力は、次の出力例のようになります。
+----------------------------------+
| vertexId | label                 |
+----------------------------------+
| 2        | Neural Networks       |
| 6        | Theory                |
| 7        | Case Based            |
| 22       | Rule Learning         |
| 30       | Theory                |
| 34       | Neural Networks       |
| 47       | Case Based            |
| 48       | Probabalistic Methods |
| 50       | Theory                |
| 52       | Theory                |
+----------------------------------+

同様に、次のコードに示すように、予測ロジットを推測することで、各クラスのモデルの信頼度を取得することもできます。

JShellを使用したモデルの信頼度の取得
opg-jshell> var logits = model.inferLogits(fullGraph, testVertices)
opg-jshell> labels.head().print()
Javaを使用したモデルの信頼度の取得
PgxFrame logits = model.inferLogits(fullGraph,testVertices);
logits.head().print();

7.2.7 Supervised GraphWiseモデルのパフォーマンスの評価

次のコードに示すように、evaluateLabelsメソッドを使用して、モデルの様々な分類メトリックを評価できます。

JShellを使用したSupervised GraphWiseモデルのパフォーマンスの評価
opg-jshell> model.evaluateLabels(fullGraph, testVertices).print()
Javaを使用したSupervised GraphWiseモデルのパフォーマンスの評価
model.evaluateLabels(fullGraph,testVertices).print();
出力は、次の出力例のようになります。
+------------------------------------------+
| Accuracy | Precision | Recall | F1-Score |
+------------------------------------------+
| 0.8488   | 0.8523    | 0.831  | 0.8367   |
+------------------------------------------+

7.2.8 Supervised GraphWiseモデルの埋込みの推測

トレーニング済モデルを使用すると、次のコードに示すように、表示されないノードの埋込みを推測してデータベースに格納できます。

JShellを使用した埋込みの推測
opg-jshell> var vertexVectors = model.inferEmbeddings(fullGraph, fullGraph.getVertices()).flattenAll()
opg-jshell> vertexVectors.write()
    .db()
    .username("user")            // DB user
    .password("password")        // password of the DB user
    .jdbcUrl("jdbcUrl")          // jdbc url to the DB
    .name("vertex vectors")
    .tablename("vertexVectors")  // indicate the name of the table in which the data should be stored
    .overwrite(true)             // indicate that if there is a table with the same name, it will be overwritten (truncated)
    .store()
Javaを使用した埋込みの推測
PgxFrame vertexVectors = model.inferEmbeddings(fullGraph,fullGraph.getVertices()).flattenAll();
vertexVectors.write()
    .db()
    .username("user")           // DB user
    .password("password")       // password of the DB user
    .jdbcUrl("jdbcUrl")         // jdbc url to the DB
    .name("vertex vectors")
    .tablename("vertexVectors") // indicate the name of the table in which the data should be stored
    .overwrite(true)            // indicate that if there is a table with the same name, it will be overwritten (truncated)
    .store();
vertexVectorsのスキーマは、フラット化せずに次のようになります(flattenAllはベクトル列を個別のdouble値列に分割します)。
+---------------------------------------------------------------+
| vertexId                                | embedding           |
+---------------------------------------------------------------+

7.2.9 トレーニング済Supervised GraphWiseモデルの格納

モデルはデータベースに格納できます。モデルは、モデル・ストア表内の行として格納されます。

次のコードは、トレーニング済Supervised GraphWiseモデルを特定のモデル・ストア表のデータベースに格納する方法を示しています。

JShellを使用したトレーニング済Supervised GraphWiseモデルの格納
opg-jshell> model.export().db() 
              .modelstore("modelstoretablename")  // name of the model store table
              .modelname("model")                 // model name (primary key of model store table)
              .description("a model description") // description to store alongside the model
              .store();
Javaを使用したトレーニング済Supervised GraphWiseモデルの格納
model.export().db()
    .modelstore("modelstoretablename")  // name of the model store table
    .modelname("model")                 // model name (primary key of model store table)
    .description("a model description") // description to store alongside the model
    .store();

ノート:

前述のすべての例では、現在ログインしているデータベースにモデルを格納することを前提としています。別のデータベースにモデルを格納する必要がある場合は、トレーニング済モデルの別のデータベースへの格納の例を参照してください。

7.2.10 事前トレーニング済Supervised GraphWiseモデルのロード

データベースからモデルをロードできます。

次のコードに示すように、事前トレーニング済のSupervised GraphWiseモデルをデータベースのモデル・ストア表からロードできます。

JShellを使用した事前トレーニング済Supervised GraphWiseモデルのロード
opg-jshell> var model = analyst.loadSupervisedGraphWiseModel().db()
                .modelstore("modeltablename") // name of the model store table
                .modelname("model")           // model name (primary key of model store table)
                .load();
Javaを使用した事前トレーニング済Supervised GraphWiseモデルのロード
SupervisedGraphWiseModelmodel = analyst.loadSupervisedGraphWiseModel().db()
     .modelstore("modeltablename") // name of the model store table
     .modelname("model")           // model name (primary key of model store table)
     .load();

ノート:

前述のすべての例では、現在ログインしているデータベースからモデルをロードすることを前提としています。別のデータベースからモデルをロードする必要がある場合は、別のデータベースからの事前トレーニング済モデルのロードの例を参照してください。

7.2.11 Supervised GraphWiseモデルの破棄

次のコードに示すように、GraphWiseモデルを破棄できます。

JShellを使用したGraphWiseモデルの破棄
opg-jshell> model.destroy()
Javaを使用したGraphWiseモデルの破棄
model.destroy();

7.3 Pg2vecアルゴリズムの使用

Pg2vecは、エッジを主な学習ユニットとして使用し、表現学習タスクの各学習ユニットにより多くの情報(学習ユニットとして頂点を使用する場合との比較)をパックすることで、グラフレット(グラフ内のパーティション)の表現を学習します。

次の3つの主なステップで構成されています。

  1. 頂点ごとにランダム・ウォークが生成されます(事前定義されたウォークごとの長さと、事前定義された頂点ごとのウォーク数を使用します)。
  2. このランダム・ウォークの各エッジは、作成されたドキュメント(ドキュメント・ラベルはgraph-id)でproperty edge-wordとしてマップされます。ここで、property edge-wordはソース頂点と宛先頂点のプロパティの連結として定義されます。
  3. 生成されたドキュメント(およびそれにアタッチされたドキュメント・ラベル)は、各ドキュメントのベクトル表現(この場合はグラフ)を生成するdoc2vecアルゴリズムにフィードされます。

Pg2vecでは、特定のグラフレット・セットのグラフレット埋込みが作成され、これらのグラフレットに変更を組み込むように更新することはできません。かわりに、これらの変更されたグラフレットで新しいPg2vecモデルをトレーニングする必要があります。

Pg2vecモデルのメモリー消費量を次に示します。
O(2(n+m)*d)
説明:
  • n: グラフ内の頂点の数
  • m: グラフ内のグラフレットの数
  • d: 埋込み長

次に、4127グラフを含む例としてNCI109データセットを使用して、PGXでのPg2vecの実装における主な機能の使用方法を示します。

7.3.1 グラフのロード

次に、グラフをロードするステップについて説明します。

  1. セッションアナリストを作成します。
    JShellを使用したセッションおよびアナリストの作成
    cd /opt/oracle/graph/
    ./bin/opg-jshell
    // starting the shell will create an implicit session and analyst
    Javaを使用したセッションおよびアナリストの作成
    import oracle.pgx.api.*;
    import oracle.pgx.api.mllib.Pg2vecModel;
    import oracle.pgx.api.frames.*;
    ...
    PgxSession session = Pgx.createSession("my-session");
    Analyst analyst = session.createAnalyst();
    Pythonを使用したセッションおよびアナリストの作成
    session = pypgx.get_session(session_name="my-session")
    analyst = session.create_analyst()
  2. グラフをロードします。
    JShellを使用したグラフのロード
    opg-jshell> var graph = session.readGraphWithProperties("<path>/<graph.json>")
    Javaを使用したグラフのロード
    PgxGraph graph = session.readGraphWithProperties("<path>/<graph.json>");
    Pythonを使用したグラフのロード
    graph = session.read_graph_with_properties("<path>/<graph.json>")

7.3.2 最小限のPg2vecモデルの作成

次のコードに示すように、最小限の構成とデフォルトのハイパーパラメータを使用するPg2vecモデルを作成できます。

JShellを使用した最小限のPg2vecモデルの作成
opg-jshell> var model = analyst.pg2vecModelBuilder()
                .setGraphLetIdPropertyName("graph_id")
                .setVertexPropertyNames(Arrays.asList("category"))
                .setWindowSize(4)
                .setWalksPerVertex(5)
                .setWalkLength(8)
                .build()
Javaを使用した最小限のPg2vecモデルの作成
Pg2vecModel model = analyst.pg2vecModelBuilder()
    .setGraphLetIdPropertyName("graph_id")
    .setVertexPropertyNames(Arrays.asList("category"))
    .setWindowSize(4)
    .setWalksPerVertex(5)
    .setWalkLength(8)
    .build();
    
Pythonを使用した最小限のPg2vecモデルの作成
model = analyst.pg2vec_model_builder(
    graph_let_id_property_name="graph_id",
    vertex_property_names(["category"]),
    window_size=4,
    walks_per_vertex=5,
    walk_length=8)

Pg2vecModelBuilder#setGraphLetIdPropertyName操作を使用してプロパティ名を指定して各グラフレットを決定したり、Pg2vecModelBuilder#setVertexPropertyNames操作を使用して指定されたPg2vecの頂点プロパティを使用することもできます。

PGXの弱く接続されたコンポーネント(WCC)機能を使用して、特定のグラフのグラフレットを決定することもできます。

7.3.3 カスタマイズしたPg2vecモデルの作成

次のコードに示すように、カスタマイズされたハイパーパラメータを使用するPg2vecモデルを作成できます。

JShellを使用したカスタマイズ済Pg2vecモデルの作成
opg-jshell> var model = analyst.pg2vecModelBuilder()
                .setGraphLetIdPropertyName("graph_id")
                .setVertexPropertyNames(Arrays.asList("category"))
                .setMinWordFrequency(1)
                .setBatchSize(128)
                .setNumEpochs(5)
                .setLayerSize(200)
                .setLearningRate(0.04)
                .setMinLearningRate(0.0001)
                .setWindowSize(4)
                .setWalksPerVertex(5)
                .setWalkLength(8)
                .setUseGraphletSize(true)
                .setValidationFraction(0.05)
                .setGraphletSizePropertyName("<propertyName>")
                .build()
Javaを使用したカスタマイズ済Pg2vecモデルの作成
Pg2vecModel model= analyst.pg2vecModelBuilder()
    .setGraphLetIdPropertyName("graph_id")
    .setVertexPropertyNames(Arrays.asList("category"))
    .setMinWordFrequency(1)
    .setBatchSize(128)
    .setNumEpochs(5)
    .setLayerSize(200)
    .setLearningRate(0.04)
    .setMinLearningRate(0.0001)
    .setWindowSize(4)
    .setWalksPerVertex(5)
    .setWalkLength(8)
    .setUseGraphletSize(true)
    .setValidationFraction(0.05)
    .setGraphletSizePropertyName("<propertyName>")
    .build()
Pythonを使用したカスタマイズ済Pg2vecモデルの作成
model = analyst.pg2vec_model_builder(
    graph_let_id_property_name = "graph_id",
    vertex_property_names = ["category"],
    min_word_frequency = 1,
    batch_size = 128,
    num_epochs = 5,
    layer_size = 200,
    learning_rate = 0.04,
    min_learning_rate = 0.0001,
    window_size = 4,
    walks_per_vertex = 5,
    walk_length = 8,
    use_graphlet_size = true,
    graphlet_size_property_name = "<property_name>",
    validation_fraction = 0.05)
    

各ビルダー操作の説明とデフォルト値については、JavadocのPg2vecModelBuilderを参照してください。

7.3.4 Pg2vecモデルのトレーニング

次のコードに示すように、指定したデフォルト設定またはカスタマイズ設定でPg2vecモデルをトレーニングできます。

JShellを使用したPg2vecモデルのトレーニング
opg-jshell> model.fit(graph)
Javaを使用したPg2vecモデルのトレーニング
model.fit(graph);
Pythonを使用したPg2vecモデルのトレーニング
model.fit(graph)

7.3.5 Pg2vecモデルのLoss値の取得

次のコードに示すように、指定された割合のトレーニング・データ(setValidationFractionを使用してビルダーで設定)のトレーニングloss値をフェッチできます。

JShellを使用したLoss値の取得
opg-jshell> var loss = model.getLoss()
Javaを使用したLoss値の取得
double loss = model.getLoss();
Pythonを使用したLoss値の取得
loss = model.loss

7.3.6 特定グラフレットの類似グラフレットの計算

次のコードに示すように、特定のグラフレットに対して最も類似したk個のグラフレットをフェッチできます。

JShellを使用した特定グラフレットの類似グラフレットの計算
opg-jshell> var similars = model.computeSimilars(52, 10)
Javaを使用した特定グラフレットの類似グラフレットの計算
PgxFrame similars = model.computeSimilars(52, 10);
Pythonを使用した特定グラフレットの類似グラフレットの計算
similars = model.compute_similars(52, 10) 
トレーニング済モデルを使用してID = 52のグラフレットの類似頂点を検索し、similars.print()で出力すると、次のように出力されます。
+----------------------------------+
| dstGraphlet | similarity         |
+----------------------------------+
| 52          | 1.0                |
| 10          | 0.8748674392700195 |
| 23          | 0.8551455140113831 |
| 26          | 0.8493421673774719 |
| 47          | 0.8411962985992432 |
| 25          | 0.8281504511833191 |
| 43          | 0.8202780485153198 |
| 24          | 0.8179885745048523 |
| 8           | 0.796689510345459  |
| 9           | 0.7947834134101868 |
+----------------------------------+

次に、2つの類似グラフレット(上: ID = 52および下: ID = 10)の視覚化を示します。

7.3.7 グラフレット・バッチの類似の計算

次のコードに示すように、入力グラフレットのバッチに対して最も類似したk個のグラフレットをフェッチできます。

JShellを使用したグラフレット・バッチの類似グラフレットの計算
opg-jshell> var graphlets = new ArrayList()
opg-jshell> graphlets.add(52)
opg-jshell> graphlets.add(41)
opg-jshell> var batchedSimilars = model.computeSimilars(graphlets, 10)
Javaを使用したグラフレット・バッチの類似グラフレットの計算
List graphlets = Arrays.asList(52,41);
PgxFrame batchedSimilars = model.computeSimilars(graphlets,10);
Pythonを使用したグラフレット・バッチの類似グラフレットの計算
batched_similars = model.compute_similars([52,41],10)
トレーニング済モデルを使用してID = 52およびID = 41でグラフレットの類似頂点を検索し、batched_similars.print()で出力すると、次のように出力されます。
+------------------------------------------------+
| srcGraphlet | dstGraphlet | similarity         |
+------------------------------------------------+
| 52          | 52          | 1.0                |
| 52          | 10          | 0.8748674392700195 |
| 52          | 23          | 0.8551455140113831 |
| 52          | 26          | 0.8493421673774719 |
| 52          | 47          | 0.8411962985992432 |
| 52          | 25          | 0.8281504511833191 |
| 52          | 43          | 0.8202780485153198 |
| 52          | 24          | 0.8179885745048523 |
| 52          | 8           | 0.796689510345459  |
| 52          | 9           | 0.7947834134101868 |
| 41          | 41          | 1.0                |
| 41          | 197         | 0.9653506875038147 |
| 41          | 84          | 0.9552277326583862 |
| 41          | 157         | 0.9465565085411072 |
| 41          | 65          | 0.9287481307983398 |
| 41          | 248         | 0.9177336096763611 |
| 41          | 315         | 0.9043129086494446 |
| 41          | 92          | 0.8998928070068359 |
| 41          | 297         | 0.8897411227226257 |
| 41          | 50          | 0.8810243010520935 |
+------------------------------------------------+

7.3.8 グラフレット・ベクトルの推測

次のコードに示すように、特定の新しいグラフレットのベクトル表現を推測できます。

JShellを使用したグラフレット・ベクトルの推測
opg-jshell> var graphlet = session.readGraphWithProperties("<path>/<graphletConfig.json>")
opg-jshell> inferredVector = model.inferGraphletVector(graphlet)
opg-jshell> inferredVector.print()
Javaを使用したグラフレット・ベクトルの推測
PgxGraph graphlet = session.readGraphWithProperties("<path>/<graphletConfig.json>");
PgxFrame inferredVector = model.inferGraphletVector(graphlet);
inferredVector.print();
Pythonを使用したグラフレット・ベクトルの推測
PgxGraph graphlet = session.read_graph_with_properties("<path>/<graphletConfig.json>")
inferredVector = model.infer_graphlet_vector(graphlet)
inferredVector.print()
inferredVectorのスキーマは、次の出力のようになります。
+---------------------------------------------------------------+
| graphlet                                | embedding           |
+---------------------------------------------------------------+

7.3.9 グラフレット・バッチのベクトルの推測

次のコードに示すように、(1つのグラフ内で異なるgraph-idで指定されている)複数のグラフレットのベクトル表現を推測できます。

JShellを使用したグラフレット・バッチのベクトルの推測
opg-jshell> var graphlet = session.readGraphWithProperties("<path>/<graphletConfig.json>")
opg-jshell> inferredVectorBatched = model.inferGraphletVectorBatched(graphlets)
opg-jshell> inferredVectorBatched.print()
Javaを使用したグラフレット・バッチのベクトルの推測
PgxGraph graphlet = session.readGraphWithProperties("<path>/<graphletConfig.json>");
PgxFrame inferredVectorBatched = model.inferGraphletVectorBatched(graphlets);
inferredVector.print();
Pythonを使用したグラフレット・バッチのベクトルの推測
graphlets = session.read_graph_with_properties("<path>/<graphletConfig.json>")
inferred_vector_batched = model.infer_graphlet_vector_batched(graphlets)
inferred_vector_batched.print()

スキーマはinferGraphletVectorと同じですが、入力グラフレットに対応する行が多くなります。

7.3.10 トレーニング済Pg2vecモデルの格納

モデルはデータベースに格納できます。モデルは、モデル・ストア表内の行として格納されます。

次のコードは、トレーニング済Pg2vecモデルを特定のモデル・ストア表のデータベースに格納する方法を示しています。

JShellを使用したトレーニング済Pg2vecモデルの格納
opg-jshell> model.export().db() 
              .modelstore("modelstoretablename")  // name of the model store table
              .modelname("model")                 // model name (primary key of model store table)
              .description("a model description") // description to store alongside the model
              .store();
Javaを使用したトレーニング済Pg2vecモデルの格納
model.export().db()
    .modelstore("modelstoretablename")  // name of the model store table
    .modelname("model")                 // model name (primary key of model store table)
    .description("a model description") // description to store alongside the model
    .store();
Pythonを使用したトレーニング済Pg2vecモデルの格納
model.export().db(model_store="modelstoretablename",
                  model_name="model")

ノート:

前述のすべての例では、現在ログインしているデータベースにモデルを格納することを前提としています。別のデータベースにモデルを格納する必要がある場合は、トレーニング済モデルの別のデータベースへの格納の例を参照してください。

7.3.11 事前トレーニング済Pg2vecモデルのロード

データベースからモデルをロードできます。

次に示すように、事前トレーニング済のPg2vecモデルをデータベースのモデル・ストア表からロードできます。

JShellを使用した事前トレーニング済Pg2vecモデルのロード
opg-jshell> var model = analyst.loadPg2vecModel().db()
                .modelstore("modeltablename") // name of the model store table
                .modelname("model")           // model name (primary key of model store table)
                .load();
Javaを使用した事前トレーニング済Pg2vecモデルのロード
Pg2vecModelmodel = analyst.loadPg2vecModel().db()
     .modelstore("modeltablename") // name of the model store table
     .modelname("model")           // model name (primary key of model store table)
     .load();
Pythonを使用した事前トレーニング済Pg2vecモデルのロード
analyst.get_pg2vec_model_loader().db(model_store="modelstoretablename",
                                     model_name="model")

ノート:

前述のすべての例では、現在ログインしているデータベースからモデルをロードすることを前提としています。別のデータベースからモデルをロードする必要がある場合は、別のデータベースからの事前トレーニング済モデルのロードの例を参照してください。

7.3.12 Pg2vecモデルの破棄

次のコードに示すように、Pg2vecモデルを破棄できます。

JShellを使用したPg2vecモデルの破棄
opg-jshell> model.destroy()
Javaを使用したPg2vecモデルの破棄
model.destroy();
Pythonを使用したPg2vecモデルの破棄
model.destroy()