7 グラフ用の機械学習ライブラリ(PgxML)の使用
インメモリー・グラフ・サーバー(PGX)は、グラフ化された機械学習アルゴリズムをサポートする機械学習ライブラリoracle.pgx.api.mllibを提供します。
現在、次の機械学習アルゴリズムがサポートされています。
- DeepWalkアルゴリズムの使用
DeepWalkは、業界で広く使用されている頂点表現学習アルゴリズムです。 - Supervised GraphWiseアルゴリズムの使用
Supervised GraphWiseは、頂点の特徴情報を利用できる、帰納的な頂点表現学習アルゴリズムです。頂点分類やリンク予測などの様々なタスクに適用できます。 - Pg2vecアルゴリズムの使用
Pg2vecは、エッジを主な学習ユニットとして使用し、表現学習タスクの各学習ユニットにより多くの情報(学習ユニットとして頂点を使用する場合との比較)をパックすることで、グラフレット(グラフ内のパーティション)の表現を学習します。
7.1 DeepWalkアルゴリズムの使用
DeepWalkは、業界で広く使用されている頂点表現学習アルゴリズムです。
次の2つの主なステップで構成されています。
- まず、ランダム・ウォーク生成ステップで、各頂点のランダム・ウォークが計算されます(事前定義されたウォークの長さと、事前定義された頂点ごとのウォーク数を使用します)。
- 次に、これらの生成されたウォークがWord2vecアルゴリズムにフィードされ、各頂点(Word2vecアルゴリズムに提供される入力の単語)のベクトル表現が生成されます。DeepWalkアルゴリズムの詳細は、KDDのドキュメントを参照してください。
DeepWalkでは、特定のグラフの頂点埋込みが作成され、グラフに変更を組み込むように更新することはできません。かわりに、この変更されたグラフで新しいDeepWalkモデルをトレーニングする必要があります。最後に、DeepWalkモデルのメモリー使用量がO(2n*d)であることに注意することが重要です。ここで、nはグラフ内の頂点の数、dは埋込み長です。
次に、8,637,721の頂点と165,049,964のエッジを含む例としてDBpediaグラフを使用して、インメモリーPGXでのDeepWalkの主な機能の使用方法を示します。
- グラフのロード
- 最小限のDeepWalkモデルの作成
- カスタマイズしたDeepWalkモデルの作成
- DeepWalkモデルのトレーニング
- DeepWalkモデルのLoss値の取得
- 特定頂点の類似頂点の計算
- 頂点バッチの類似頂点の計算
- トレーニング済DeepWalkモデルの格納
- 事前トレーニング済DeepWalkモデルのロード
- DeepWalkモデルの破棄
親トピック: グラフ用の機械学習ライブラリ(PgxML)の使用
7.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()
- グラフをロードします。
ノート:
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>")
親トピック: DeepWalkアルゴリズムの使用
7.1.2 最小限のDeepWalkモデルの作成
次のコードに示すように、最小限の構成とデフォルトのハイパーパラメータを使用するDeepWalkモデルを作成できます。
opg-jshell> var model = analyst.deepWalkModelBuilder()
.setWindowSize(3)
.setWalksPerVertex(6)
.setWalkLength(4)
.build()
DeepWalkModel model = analyst.deepWalkModelBuilder()
.setWindowSize(3)
.setWalksPerVertex(6)
.setWalkLength(4)
.build()model = analyst.deepwalk_builder(window_size=3,walks_per_vertex=6,walk_length=4)
親トピック: DeepWalkアルゴリズムの使用
7.1.3 カスタマイズしたDeepWalkモデルの作成
次のコードに示すように、カスタマイズされたハイパーパラメータを使用する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()
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()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を参照してください。
親トピック: DeepWalkアルゴリズムの使用
7.1.4 DeepWalkモデルのトレーニング
次のコードに示すように、指定したデフォルト設定またはカスタマイズ設定でDeepWalkモデルをトレーニングできます。
opg-jshell> model.fit(graph)
model.fit(graph)
model.fit(graph)
親トピック: DeepWalkアルゴリズムの使用
7.1.5 DeepWalkモデルのLoss値の取得
次のコードに示すように、setValidationFractionを使用してビルダーで設定された、指定された割合のトレーニング・データのloss値をフェッチできます。
opg-jshell> var loss = model.getLoss()
double loss = model.getLoss();
loss = model.loss
親トピック: DeepWalkアルゴリズムの使用
7.1.6 特定頂点の類似頂点の計算
次のコードに示すように、特定の頂点の最も類似したk個の頂点をフェッチできます。
opg-jshell> var similars = model.computeSimilars("Albert_Einstein", 10)
opg-jshell> similars.print()
PgxFrame similars = model.computeSimilars("Albert_Einstein", 10)
similars.print()
similars = model.compute_similars("Albert_Einstein",10)
similars.print()+-----------------------------------------+ | 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 | +-----------------------------------------+
親トピック: DeepWalkアルゴリズムの使用
7.1.7 頂点バッチの類似頂点の計算
次のコードに示すように、入力頂点のリストに対して最も類似したk個の頂点をフェッチできます。
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()
List vertices = Arrays.asList("Machine_learning","Albert_Einstein");
PgxFrame batchedSimilars = model.computeSimilars(vertices,10);
batchedSimilars.print();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 | +-------------------------------------------------------------------+
親トピック: DeepWalkアルゴリズムの使用
7.1.8 トレーニング済DeepWalkモデルの格納
モデルはデータベースに格納できます。モデルは、モデル・ストア表内の行として格納されます。
次のコードは、トレーニング済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();
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();model.export().db(model_store="modelstoretablename",
model_name="model")ノート:
前述のすべての例では、現在ログインしているデータベースにモデルを格納することを前提としています。別のデータベースにモデルを格納する必要がある場合は、トレーニング済モデルの別のデータベースへの格納の例を参照してください。7.1.8.1 トレーニング済モデルの別のデータベースへの格納
モデルは、ログインに使用されたものとは異なるデータベースに格納できます。
次のコードは、トレーニング済モデルを別のデータベースに格納する方法を示しています。
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();
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();model.export().db(username="user",
password="password",
model_store="modelstoretablename",
model_name="model",
jdbc_url="jdbc_url")親トピック: トレーニング済DeepWalkモデルの格納
7.1.9 事前トレーニング済DeepWalkモデルのロード
データベースからモデルをロードできます。
次のコードに示すように、事前トレーニング済の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();
DeepWalkModelmodel = analyst.loadDeepWalkModel().db()
.modelstore("modeltablename") // name of the model store table
.modelname("model") // model name (primary key of model store table)
.load();analyst.get_deepwalk_model_loader().db(model_store="modelstoretablename",
model_name="model")ノート:
前述のすべての例では、現在ログインしているデータベースからモデルをロードすることを前提としています。別のデータベースからモデルをロードする必要がある場合は、別のデータベースからの事前トレーニング済モデルのロードの例を参照してください。7.1.9.1 別のデータベースからの事前トレーニング済モデルのロード
ログインに使用したものとは異なるデータベースからモデルをロードできます。
次のコードに示すように、事前トレーニング済モデルをデータベースのモデル・ストア表からロードできます。
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();loadDeepWalkModel(): DeepwalkモデルをロードloadSupervisedGraphWiseModel(): GraphWiseモデルをロードloadPg2vecModel(): Pg2vecモデルをロード
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();loadDeepWalkModel(): DeepwalkモデルをロードloadSupervisedGraphWiseModel(): GraphWiseモデルをロードloadPg2vecModel(): Pg2vecモデルをロード
analyst.<modelLoader>.db(username="user",
password="password",
model_store="modelstoretablename",
model_name="model",
jdbc_url="jdbc_url")get_deepwalk_model_loader(): Deepwalkモデルをロードget_pg2vec_model_loader(): Pg2vecモデルをロード
親トピック: 事前トレーニング済DeepWalkモデルのロード
7.1.10 DeepWalkモデルの破棄
次のコードに示すように、DeepWalkモデルを破棄できます。
opg-jshell> model.destroy()
model.destroy();
model.destroy()
親トピック: DeepWalkアルゴリズムの使用
7.2 Supervised GraphWiseアルゴリズムの使用
Supervised GraphWiseは、頂点の特徴情報を利用できる、帰納的な頂点表現学習アルゴリズムです。頂点分類やリンク予測などの様々なタスクに適用できます。
Supervised GraphWiseは、HamiltonらによるGraphSAGEに基づいています。
モデル体系
Supervised GraphWiseモデルは、2つのグラフの畳込み層とそれに続く複数の予測層で構成されます。
頂点の畳込み層を通過する前方パスは、次のように処理されます。
- 頂点の近隣のセットがサンプリングされます。
- 近隣の前の層表現は平均集約され、集約された特徴は頂点の前の層表現と連結されます。
- この連結されたベクトルに重みが乗算され、バイアス・ベクトルが追加されます。
- 結果は、層出力が単位ノルムを持つように正規化されます。
予測層は、標準のニューラル・ネットワーク層です。
次に、Coraグラフを例として使用して、PGXでのGraphSAGEの実装における主な機能の使用方法を示します。
- グラフのロード
- 最小限のGraphWiseモデルの作成
- 高度なハイパーパラメータ・カスタマイズ
- Supervised GraphWiseモデルのトレーニング
- Supervised GraphWiseモデルのLoss値の取得
- Supervised GraphWiseモデルの頂点ラベルの推測
- Supervised GraphWiseモデルのパフォーマンスの評価
- Supervised GraphWiseモデルの埋込みの推測
- トレーニング済Supervised GraphWiseモデルの格納
- 事前トレーニング済Supervised GraphWiseモデルのロード
- Supervised GraphWiseモデルの破棄
親トピック: グラフ用の機械学習ライブラリ(PgxML)の使用
7.2.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(); - グラフをロードします。
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モデルを作成できます。
opg-jshell> var model = analyst.supervisedGraphWiseModelBuilder()
.setVertexInputPropertyNames("features")
.setVertexTargetPropertyName("label")
.build()SupervisedGraphWiseModel model = analyst.supervisedGraphWiseModelBuilder()
.setVertexInputPropertyNames("features")
.setVertexTargetPropertyName("labels")
.build()ノート:
前述の例では特徴プロパティが1つしか指定されていませんが、任意の数だけ指定できます。7.2.3 高度なハイパーパラメータ・カスタマイズ
豊富なハイパーパラメータ・カスタマイズを使用してGraphWiseモデルを作成できます。
これは、次の2つのサブ構成クラスによって行われます。
GraphWiseConvLayerConfigGraphWisePredictionLayerConfig
次のコードは、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()
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のSupervisedGraphWiseModelBuilder、GraphWiseConvLayerConfigBuilderおよびGraphWisePredictionLayerConfigBuilderを参照してください。
7.2.4 Supervised GraphWiseモデルのトレーニング
次のコードに示すように、グラフのSupervised GraphWiseモデルをトレーニングできます。
opg-jshell> model.fit(trainGraph)
model.fit(trainGraph)
7.2.5 Supervised GraphWiseモデルのLoss値の取得
トレーニングloss値は、次のコードに従ってフェッチできます。
opg-jshell> var loss = model.getTrainingLoss()
double loss = model.getTrainingLoss();
7.2.6 Supervised GraphWiseモデルの頂点ラベルの推測
次のコードに示すように、任意のグラフ(トレーニング中に表示されなかった頂点またはグラフを含む)の頂点のラベルを推測できます。
opg-jshell> var labels = model.inferLabels(fullGraph, testVertices) opg-jshell> labels.head().print()
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 | +----------------------------------+
同様に、次のコードに示すように、予測ロジットを推測することで、各クラスのモデルの信頼度を取得することもできます。
opg-jshell> var logits = model.inferLogits(fullGraph, testVertices) opg-jshell> labels.head().print()
PgxFrame logits = model.inferLogits(fullGraph,testVertices); logits.head().print();
7.2.7 Supervised GraphWiseモデルのパフォーマンスの評価
次のコードに示すように、evaluateLabelsメソッドを使用して、モデルの様々な分類メトリックを評価できます。
opg-jshell> model.evaluateLabels(fullGraph, testVertices).print()
model.evaluateLabels(fullGraph,testVertices).print();
+------------------------------------------+ | Accuracy | Precision | Recall | F1-Score | +------------------------------------------+ | 0.8488 | 0.8523 | 0.831 | 0.8367 | +------------------------------------------+
7.2.8 Supervised GraphWiseモデルの埋込みの推測
トレーニング済モデルを使用すると、次のコードに示すように、表示されないノードの埋込みを推測してデータベースに格納できます。
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()
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モデルを特定のモデル・ストア表のデータベースに格納する方法を示しています。
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();
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モデルをデータベースのモデル・ストア表からロードできます。
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();
SupervisedGraphWiseModelmodel = analyst.loadSupervisedGraphWiseModel().db()
.modelstore("modeltablename") // name of the model store table
.modelname("model") // model name (primary key of model store table)
.load();ノート:
前述のすべての例では、現在ログインしているデータベースからモデルをロードすることを前提としています。別のデータベースからモデルをロードする必要がある場合は、別のデータベースからの事前トレーニング済モデルのロードの例を参照してください。7.3 Pg2vecアルゴリズムの使用
Pg2vecは、エッジを主な学習ユニットとして使用し、表現学習タスクの各学習ユニットにより多くの情報(学習ユニットとして頂点を使用する場合との比較)をパックすることで、グラフレット(グラフ内のパーティション)の表現を学習します。
次の3つの主なステップで構成されています。
- 頂点ごとにランダム・ウォークが生成されます(事前定義されたウォークごとの長さと、事前定義された頂点ごとのウォーク数を使用します)。
- このランダム・ウォークの各エッジは、作成されたドキュメント(ドキュメント・ラベルはgraph-id)で
property edge-wordとしてマップされます。ここで、property edge-wordはソース頂点と宛先頂点のプロパティの連結として定義されます。 - 生成されたドキュメント(およびそれにアタッチされたドキュメント・ラベル)は、各ドキュメントのベクトル表現(この場合はグラフ)を生成するdoc2vecアルゴリズムにフィードされます。
Pg2vecでは、特定のグラフレット・セットのグラフレット埋込みが作成され、これらのグラフレットに変更を組み込むように更新することはできません。かわりに、これらの変更されたグラフレットで新しいPg2vecモデルをトレーニングする必要があります。
O(2(n+m)*d)説明:
n: グラフ内の頂点の数m: グラフ内のグラフレットの数d: 埋込み長
次に、4127グラフを含む例としてNCI109データセットを使用して、PGXでのPg2vecの実装における主な機能の使用方法を示します。
- グラフのロード
- 最小限のPg2vecモデルの作成
- カスタマイズしたPg2vecモデルの作成
- Pg2vecモデルのトレーニング
- Pg2vecモデルのLoss値の取得
- 特定グラフレットの類似グラフレットの計算
- グラフレット・バッチの類似の計算
- グラフレット・ベクトルの推測
- グラフレット・バッチのベクトルの推測
- トレーニング済Pg2vecモデルの格納
- 事前トレーニング済Pg2vecモデルのロード
- Pg2vecモデルの破棄
親トピック: グラフ用の機械学習ライブラリ(PgxML)の使用
7.3.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()
- グラフをロードします。
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>")
親トピック: Pg2vecアルゴリズムの使用
7.3.2 最小限のPg2vecモデルの作成
次のコードに示すように、最小限の構成とデフォルトのハイパーパラメータを使用するPg2vecモデルを作成できます。
opg-jshell> var model = analyst.pg2vecModelBuilder()
.setGraphLetIdPropertyName("graph_id")
.setVertexPropertyNames(Arrays.asList("category"))
.setWindowSize(4)
.setWalksPerVertex(5)
.setWalkLength(8)
.build()
Pg2vecModel model = analyst.pg2vecModelBuilder()
.setGraphLetIdPropertyName("graph_id")
.setVertexPropertyNames(Arrays.asList("category"))
.setWindowSize(4)
.setWalksPerVertex(5)
.setWalkLength(8)
.build();
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)機能を使用して、特定のグラフのグラフレットを決定することもできます。
親トピック: Pg2vecアルゴリズムの使用
7.3.3 カスタマイズしたPg2vecモデルの作成
次のコードに示すように、カスタマイズされたハイパーパラメータを使用する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()
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()
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を参照してください。
親トピック: Pg2vecアルゴリズムの使用
7.3.4 Pg2vecモデルのトレーニング
次のコードに示すように、指定したデフォルト設定またはカスタマイズ設定でPg2vecモデルをトレーニングできます。
opg-jshell> model.fit(graph)
model.fit(graph);
model.fit(graph)
親トピック: Pg2vecアルゴリズムの使用
7.3.5 Pg2vecモデルのLoss値の取得
次のコードに示すように、指定された割合のトレーニング・データ(setValidationFractionを使用してビルダーで設定)のトレーニングloss値をフェッチできます。
opg-jshell> var loss = model.getLoss()
double loss = model.getLoss();
loss = model.loss
親トピック: Pg2vecアルゴリズムの使用
7.3.6 特定グラフレットの類似グラフレットの計算
次のコードに示すように、特定のグラフレットに対して最も類似したk個のグラフレットをフェッチできます。
opg-jshell> var similars = model.computeSimilars(52, 10)
PgxFrame similars = model.computeSimilars(52, 10);
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)の視覚化を示します。
親トピック: Pg2vecアルゴリズムの使用
7.3.7 グラフレット・バッチの類似の計算
次のコードに示すように、入力グラフレットのバッチに対して最も類似したk個のグラフレットをフェッチできます。
opg-jshell> var graphlets = new ArrayList() opg-jshell> graphlets.add(52) opg-jshell> graphlets.add(41) opg-jshell> var batchedSimilars = model.computeSimilars(graphlets, 10)
List graphlets = Arrays.asList(52,41); PgxFrame batchedSimilars = model.computeSimilars(graphlets,10);
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 | +------------------------------------------------+
親トピック: Pg2vecアルゴリズムの使用
7.3.8 グラフレット・ベクトルの推測
次のコードに示すように、特定の新しいグラフレットのベクトル表現を推測できます。
opg-jshell> var graphlet = session.readGraphWithProperties("<path>/<graphletConfig.json>")
opg-jshell> inferredVector = model.inferGraphletVector(graphlet)
opg-jshell> inferredVector.print()
PgxGraph graphlet = session.readGraphWithProperties("<path>/<graphletConfig.json>");
PgxFrame inferredVector = model.inferGraphletVector(graphlet);
inferredVector.print();
PgxGraph graphlet = session.read_graph_with_properties("<path>/<graphletConfig.json>")
inferredVector = model.infer_graphlet_vector(graphlet)
inferredVector.print()inferredVectorのスキーマは、次の出力のようになります。+---------------------------------------------------------------+ | graphlet | embedding | +---------------------------------------------------------------+
親トピック: Pg2vecアルゴリズムの使用
7.3.9 グラフレット・バッチのベクトルの推測
次のコードに示すように、(1つのグラフ内で異なるgraph-idで指定されている)複数のグラフレットのベクトル表現を推測できます。
opg-jshell> var graphlet = session.readGraphWithProperties("<path>/<graphletConfig.json>")
opg-jshell> inferredVectorBatched = model.inferGraphletVectorBatched(graphlets)
opg-jshell> inferredVectorBatched.print()
PgxGraph graphlet = session.readGraphWithProperties("<path>/<graphletConfig.json>");
PgxFrame inferredVectorBatched = model.inferGraphletVectorBatched(graphlets);
inferredVector.print();
graphlets = session.read_graph_with_properties("<path>/<graphletConfig.json>")
inferred_vector_batched = model.infer_graphlet_vector_batched(graphlets)
inferred_vector_batched.print()スキーマはinferGraphletVectorと同じですが、入力グラフレットに対応する行が多くなります。
親トピック: Pg2vecアルゴリズムの使用
7.3.10 トレーニング済Pg2vecモデルの格納
モデルはデータベースに格納できます。モデルは、モデル・ストア表内の行として格納されます。
次のコードは、トレーニング済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();
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();model.export().db(model_store="modelstoretablename",
model_name="model")ノート:
前述のすべての例では、現在ログインしているデータベースにモデルを格納することを前提としています。別のデータベースにモデルを格納する必要がある場合は、トレーニング済モデルの別のデータベースへの格納の例を参照してください。親トピック: Pg2vecアルゴリズムの使用
7.3.11 事前トレーニング済Pg2vecモデルのロード
データベースからモデルをロードできます。
次に示すように、事前トレーニング済の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();
Pg2vecModelmodel = analyst.loadPg2vecModel().db()
.modelstore("modeltablename") // name of the model store table
.modelname("model") // model name (primary key of model store table)
.load();analyst.get_pg2vec_model_loader().db(model_store="modelstoretablename",
model_name="model")ノート:
前述のすべての例では、現在ログインしているデータベースからモデルをロードすることを前提としています。別のデータベースからモデルをロードする必要がある場合は、別のデータベースからの事前トレーニング済モデルのロードの例を参照してください。親トピック: Pg2vecアルゴリズムの使用
7.3.12 Pg2vecモデルの破棄
次のコードに示すように、Pg2vecモデルを破棄できます。
opg-jshell> model.destroy()
model.destroy();
model.destroy()
親トピック: Pg2vecアルゴリズムの使用

「図7-1 Pg2vec - 2つの類似グラフレットの視覚化」の説明