1. 序章

この記事では、 Neuroph –ニューラルネットワークを作成して機械学習を利用するためのオープンソースライブラリについて説明します。

この記事では、コアコンセプトと、それをすべてまとめる方法に関するいくつかの例を紹介します。

2. Neuroph

Neurophと対話するには、次のものを使用します。

  • GUIベースのツール
  • Javaライブラリ

どちらのアプローチも、ニューロンの層から人工ニューラルネットワークを構築する基礎となるクラス階層に依存しています。

プログラムの側面に焦点を当てますが、NeurophのGUIベースのアプローチからいくつかの共有クラスを参照して、私たちが行っていることを明確にするのに役立てます。

GUIベースのアプローチの詳細については、Neurophドキュメントを参照してください。

2.1. 依存関係

Neurophを使用するには、次のMavenエントリを追加する必要があります。

<dependency>
    <groupId>org.beykery</groupId>
    <artifactId>neuroph</artifactId>
    <version>2.92</version>
</dependency>

最新バージョンは、MavenCentralにあります。

3. 主要なクラスと概念

使用されるすべての基本的な概念の構成要素には、対応するJavaクラスがあります。

ニューロンレイヤーに接続され、ニューラルネットワークにグループ化されます。 その後、 NeuralNetworks は、LearningRulesおよびDataSetsを使用してトレーニングされます。

3.1. ニューロン

Neuronクラスには4つの主要な属性があります。

  1. inputConnection: Neurons間の加重接続
  2. inputFunction:は、着信接続データに適用される重みおよびベクトル合計を指定します
  3. transferFunction:は、送信データに適用される重みおよびベクトル合計を指定します。
  4. 出力: transferFunctionsおよびinputFunctionsinputConnectionに適用した結果の出力値

これらの4つの主要な属性が一緒になって、動作を確立します。

output = transferFunction(inputFunction(inputConnections));

3.2. レイヤー

レイヤーは本質的にニューロンのグループであり、レイヤーの各ニューロ n は(通常)ニューロン[前後のレイヤーのX159X]。

したがって、 Layers は、Neuronsに存在する重み付けされた関数を介してそれらの間で情報を渡します。

ニューロンをレイヤーに追加できます:

Layer layer = new Layer(); 
layer.addNeuron(n);

3.3. ニューラルネットワーク

トップレベルのスーパークラスNeuralNetworkは、畳み込みニューラルネットワーク(サブクラス ConvolutionalNetwork )、ホップフィールドニューラルネットワーク(サブクラス Hopfield )など、いくつかのよく知られた種類の人工ニューラルネットワークにサブクラス化されています。 、および多層パーセプトロンニューラルネットワーク(サブクラス多層パーセプトロン)。

すべてのNeuralNetworksはレイヤーで構成されており、通常は3分法で構成されています。

  1. 入力レイヤー
  2. 隠しレイヤー
  3. 出力層

NeuralNetwork のサブクラス( Perceptron など)のコンストラクターを使用している場合、 Layer Neuron[の数を渡すことができます。各LayerのX160X]と、この単純な方法を使用したそれらのインデックス:

NeuralNetwork ann = new Perceptron(2, 4, 1);

これを手動で実行したい場合があります(そして、ボンネットの下で何が起こっているかを確認するのは良いことです)。 LayerNeuralNetworkに追加する基本的な操作は、次のように実行されます。

NeuralNetwork ann = new NeuralNetwork();   
Layer layer = new Layer();
ann.addLayer(0, layer);
ann.setInputNeurons(layer.getNeurons());

最初の引数は、NeuralNetworkLayerのインデックスを指定します。 2番目の引数は、Layer自体を指定します。 手動で追加されたレイヤーは、ConnectionFactoryクラスを使用して接続する必要があります。

ann.addLayer(0, inputLayer);    
ann.addLayer(1, hiddenLayerOne); 
ConnectionFactory.fullConnect(ann.getLayerAt(0), ann.getLayerAt(1));

最初と最後のレイヤーも接続する必要があります。

ConnectionFactory.fullConnect(ann.getLayerAt(0), 
  ann.getLayerAt(ann.getLayersCount() - 1), false);
ann.setOutputNeurons(ann.getLayerAt(
  ann.getLayersCount() - 1).getNeurons());

NeuroNetworkの強度とパワーは主に以下に依存していることを忘れないでください。

  1. NeuroNetwork内のレイヤーの数
  2. レイヤー内のニューロンの数(およびそれらの間の加重関数)、および
  3. DataSetのトレーニングアルゴリズム/精度の有効性

3.4. ニューラルネットワークのトレーニング

NeuroNetworks は、DataSetおよびLearningRuleクラスを使用してトレーニングされます。

DataSet は、NeuroNetworkをトレーニングするために学習または使用される情報を表現および提供するために使用されます。 データセットは、入力サイズ、出力サイズ、、および行(DataSetRow)によって特徴付けられます。

int inputSize = 2; 
int outputSize = 1; 
DataSet ds = new DataSet(inputSize, outputSize);

DataSetRow rOne 
  = new DataSetRow(new double[] {0, 0}, new double[] {0});
ds.addRow(rOne);
DataSetRow rTwo 
  = new DataSetRow(new double[] {1, 1}, new double[] {0});
ds.addRow(rTwo);

LearningRule は、DataSetNeuralNetworkによって教示またはトレーニングされる方法を指定します。 LearningRule のサブクラスには、BackPropagationおよびSupervisedLearningが含まれます。

NeuralNetwork ann = new NeuralNetwork();
//...
BackPropagation backPropagation = new BackPropagation();
backPropagation.setMaxIterations(1000);
ann.learn(ds, backPropagation);

4. すべてを一緒に入れて

それでは、これらのビルディングブロックを実際の例にまとめましょう。 まず、いくつかのレイヤーを組み合わせて、ほとんどのニューラルネットワークアーキテクチャで例示されている、使い慣れた入力レイヤー、非表示レイヤー、および出力レイヤーパターンにします。

4.1. レイヤー

4つのレイヤーを組み合わせてNeuralNetworkを組み立てます。 私たちの目標は、(2、4、4、1)NeuralNetwork。を構築することです。

まず、入力レイヤーを定義しましょう。

Layer inputLayer = new Layer();
inputLayer.addNeuron(new Neuron());
inputLayer.addNeuron(new Neuron());

次に、隠れ層1を実装します。

Layer hiddenLayerOne = new Layer();
hiddenLayerOne.addNeuron(new Neuron());
hiddenLayerOne.addNeuron(new Neuron());
hiddenLayerOne.addNeuron(new Neuron());
hiddenLayerOne.addNeuron(new Neuron());

そして隠されたレイヤー2:

Layer hiddenLayerTwo = new Layer(); 
hiddenLayerTwo.addNeuron(new Neuron()); 
hiddenLayerTwo.addNeuron(new Neuron()); 
hiddenLayerTwo.addNeuron(new Neuron()); 
hiddenLayerTwo.addNeuron(new Neuron());

最後に、出力レイヤーを定義します。

Layer outputLayer = new Layer();
outputLayer.addNeuron(new Neuron()); 

4.2. ニューラルネットワーク

次に、それらをNeuralNetworkにまとめることができます。

NeuralNetwork ann = new NeuralNetwork();
ann.addLayer(0, inputLayer);
ann.addLayer(1, hiddenLayerOne);
ConnectionFactory.fullConnect(ann.getLayerAt(0), ann.getLayerAt(1));
ann.addLayer(2, hiddenLayerTwo);
ConnectionFactory.fullConnect(ann.getLayerAt(1), ann.getLayerAt(2));
ann.addLayer(3, outputLayer);
ConnectionFactory.fullConnect(ann.getLayerAt(2), ann.getLayerAt(3));
ConnectionFactory.fullConnect(ann.getLayerAt(0), 
  ann.getLayerAt(ann.getLayersCount()-1), false);
ann.setInputNeurons(inputLayer.getNeurons());
ann.setOutputNeurons(outputLayer.getNeurons());

4.3. トレーニング

トレーニングの目的で、入力ベクトルと結果の出力ベクトルの両方のサイズを指定して、DataSetをまとめましょう。

int inputSize = 2;
int outputSize = 1;
DataSet ds = new DataSet(inputSize, outputSize);

上記で定義した入力および出力の制約に準拠して、 DataSet に基本行を追加します。この例の目標は、基本的なXOR(排他的論理和)演算を実行するようにネットワークに教えることです。

DataSetRow rOne
  = new DataSetRow(new double[] {0, 1}, new double[] {1});
ds.addRow(rOne);
DataSetRow rTwo
  = new DataSetRow(new double[] {1, 1}, new double[] {0});
ds.addRow(rTwo);
DataSetRow rThree 
  = new DataSetRow(new double[] {0, 0}, new double[] {0});
ds.addRow(rThree);
DataSetRow rFour
  = new DataSetRow(new double[] {1, 0}, new double[] {1});
ds.addRow(rFour);

次に、組み込みの BackPropogationLearningRuleを使用してNeuralNetworkをトレーニングしましょう。

BackPropagation backPropagation = new BackPropagation();
backPropagation.setMaxIterations(1000);
ann.learn(ds, backPropagation);

4.4. テスト

NeuralNetwork がトレーニングされたので、テストしてみましょう。 DataSetDataSetRowとして渡された論理値の各ペアに対して、次の種類のテストを実行します。

ann.setInput(0, 1);
ann.calculate();
double[] networkOutputOne = ann.getOutput();

覚えておくべき重要なことは、NeuralNetworksは0と1の包括的間隔でのみ値を出力するということです。 他の値を出力するには、データを正規化および非正規化する必要があります。

この場合、論理演算の場合、0と1がジョブに最適です。 出力は次のようになります。

Testing: 1, 0 Expected: 1.0 Result: 1.0
Testing: 0, 1 Expected: 1.0 Result: 1.0
Testing: 1, 1 Expected: 0.0 Result: 0.0
Testing: 0, 0 Expected: 0.0 Result: 0.0

NeuroNetworkが正しい答えを正しく予測していることがわかります。

5. 結論

Neurophで使用される基本的な概念とクラスを確認しました。

このライブラリの詳細については、こちらをご覧ください。この記事で使用されているコード例は、GitHubにあります。