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

豊富なハイパーパラメータ・カスタマイズを使用して、Unsupervised GraphWiseモデルを構築できます。各ノードに対して内部的に、GraphWiseによって、近隣表現の集計が適用されます。この操作は、次のサブ構成クラスのいずれかを使用して構成できます。

また、enable_ml_acceleratorsグラフ・サーバー(PGX)構成パラメータを使用して、グラフィック処理ユニット(GPU)を有効または無効にできます(詳細は、「グラフ・サーバー(PGX)エンジンの構成パラメータ」を参照)。また、GPUサポートを使用するために、システムが次の前提条件を満たしていることを確認してください:

  • CUDA (Compute Unified Device Architecture)ツールキットがインストールされているGPUデバイスが必要です。
  • 次のCUDAライブラリのリストが必要です:
    • libcuda.so.1
    • libnvrtc.so.12
    • libnvToolsExt.so.1
    • libcudart.so.12

enable_ml_acceleratorsオプションはデフォルトで有効になっています。ただし、GPUデバイスが検出されず、CUDAツールキットがインストールされていない場合、この機能は無効になり、CPUはすべてのPgxMLライブラリ操作に使用されます。

次のコード例では、畳込み層構成にGraphWiseConvLayerConfigクラスを使用します。この例では、過剰適合に対抗するために、GraphWiseモデルに対して重み減衰パラメータ0.001およびドロップ確率0.5のドロップアウトを指定しています。また、埋込みをダウンストリームの分類タスクで使用する場合は、埋込みの正規化を無効にすることをお薦めします。setEnableAcceleratorメソッドが、使用可能なGPUを使用できるようになっていることに注意してください。

opg4j> var weightProperty = analyst.pagerank(trainGraph).getName()
opg4j> var convLayerConfig = analyst.graphWiseConvLayerConfigBuilder().
         setNumSampledNeighbors(25).
         setActivationFunction(ActivationFunction.TANH).
         setWeightInitScheme(WeightInitScheme.XAVIER).
         setWeightedAggregationProperty(weightProperty).
         setDropoutRate(0.5).
         build()
opg4j> var dgiLayerConfig = analyst.graphWiseDgiLayerConfigBuilder().
         setCorruptionFunction(new PermutationCorruption()).
         setDiscriminator(GraphWiseDgiLayerConfig.Discriminator.BILINEAR).
         setReadoutFunction(GraphWiseDgiLayerConfig.ReadoutFunction.MEAN).
         build()
opg4j> var model = analyst.unsupervisedGraphWiseModelBuilder().
         setVertexInputPropertyNames("vertex_features").
         setEdgeInputPropertyNames("edge_features").
         setConvLayerConfigs(convLayerConfig).
         setDgiLayerConfig(dgiLayerConfig).
         setLossFunction(UnsupervisedGraphWiseModelConfig.LossFunction.SIGMOID_CROSS_ENTROPY).
         setEmbeddingDim(256).
         setLearningRate(0.05).
         setNumEpochs(30).
         setSeed(42).
         setShuffle(false).
         setStandardize(true).
         setNormalize(false).  // recommended
         setBatchSize(64).
         setEnableAccelerator(true). // Enable or disable GPU
         build()
String weightProperty = analyst.pagerank(trainGraph).getName();
GraphWiseConvLayerConfig convLayerConfig = analyst.graphWiseConvLayerConfigBuilder()
    .setNumSampledNeighbors(25)
    .setActivationFunction(ActivationFunction.TANH)
    .setWeightInitScheme(WeightInitScheme.XAVIER)
    .setWeightedAggregationProperty(weightProperty)
    .setDropoutRate(0.5)
    .build();

GraphWiseDgiLayerConfig dgiLayerConfig = analyst.graphWiseDgiLayerConfigBuilder()
    .setCorruptionFunction(new PermutationCorruption())
    .setDiscriminator(GraphWiseDgiLayerConfig.Discriminator.BILINEAR)
    .setReadoutFunction(GraphWiseDgiLayerConfig.ReadoutFunction.MEAN)
    .build();

UnsupervisedGraphWiseModel model = analyst.unsupervisedGraphWiseModelBuilder()
    .setVertexInputPropertyNames("vertex_features")
    .setEdgeInputPropertyNames("edge_features")
    .setDgiLayerConfig(dgiLayerConfig)
    .setLossFunction(UnsupervisedGraphWiseModelConfig.LossFunction.SIGMOID_CROSS_ENTROPY)
    .setConvLayerConfigs(convLayerConfig)
    .setWeightDecay(0.001)
    .setEmbeddingDim(256)
    .setLearningRate(0.05)
    .setNumEpochs(30)
    .setSeed(42)
    .setShuffle(false)
    .setStandardize(true)
    .setNormalize(false)  // recommended
    .setBatchSize(64)
    .setEnableAccelerator(true) // Enable or disable GPU
    .build();
weightProperty = analyst.pagerank(train_graph).name

conv_layer_config = dict(num_sampled_neighbors=25,
                         activation_fn='tanh',
                         weight_init_scheme='xavier',
                         neighbor_weight_property_name=weightProperty,
                         dropout_rate=0.5)
conv_layer = analyst.graphwise_conv_layer_config(**conv_layer_config)

dgi_layer_config = dict(corruption_function=None, 
                        readout_function="mean", 
                        discriminator="bilinear")
dgi_layer = analyst.graphwise_dgi_layer_config(**dgi_layer_config)

params = dict(conv_layer_config=[conv_layer],
              dgi_layer_config=dgi_layer,
              loss_fn="sigmoid_cross_entropy",
              vertex_input_property_names=["vertex_features"],
              edge_input_property_names=["edge_features"],
              weight_decay=0.001,
              layer_size=256,
              learning_rate=0.05,
              num_epochs=30,
              seed=42,
              standardize=True,
              normalize=False,  # recommended
              batch_size=64,
              enable_accelerator=True # Enable or disable GPU
)

model = analyst.unsupervised_graphwise_builder(**params)

前述の例では、GraphWiseConvLayerConfigGraphWiseAttentionLayerConfigクラスに置き換えて、Graph Attention Networksモデルを構築できます。また、サンプリングされた近隣の数がsetNumSampledNeighborsを使用して-1に設定されている場合、すべての近隣ノードがサンプリングされることに注意してください。

opg4j> var convLayerConfig = analyst.graphWiseAttentionLayerConfigBuilder().
         setNumSampledNeighbors(25).
         setActivationFunction(ActivationFunction.LEAKY_RELU).
         setWeightInitScheme(WeightInitScheme.XAVIER_UNIFORM).
         setHeadAggregation(AggregationOperation.MEAN).
         setNumHeads(4).
         setDropoutRate(0.5).
         build()
GraphWiseAttentionLayerConfig convLayerConfig = analyst.graphWiseAttentionLayerConfigBuilder()
    .setNumSampledNeighbors(25)
    .setActivationFunction(ActivationFunction.LEAKY_RELU)
    .setWeightInitScheme(WeightInitScheme.XAVIER_UNIFORM)
    .setHeadAggregation(AggregationOperation.MEAN)
    .setNumHeads(4)
    .setDropoutRate(0.5)
    .build();
conv_layer_config = dict(num_sampled_neighbors=25,
                         activation_fn='leaky_relu',
                         weight_init_scheme='xavier_uniform',
                         aggregation_operation='mean',
                         num_heads=4,
                         dropout_rate=0.5)
詳細は、Javadocを参照してください。