人工ニューラル ネットワーク (ANN) またはコネクショニスト システムは、生物学的脳を構成する生物学的ニューラル ネットワークにヒントを得たコンピューティング システムです。このようなシステムは、通常、タスク固有のプログラミングを行わずに、例を検討することでタスクを達成することを学習します (パフォーマンスが徐々に向上します)。 Java やその他のプログラミング言語でニューラル ネットワークを設計するには、人工ニューラル ネットワークの構造と機能を理解する必要があります。 人工ニューラル ネットワークは、定義された目標を達成するために一連の手順を必要とする従来のアルゴリズム手法ではなく、パターン認識、データからの学習、専門家のような傾向の予測などのタスクを実行します。人工ニューラル ネットワークは、その高度にインタラクティブなネットワーク構造により、一部のタスクを独自に解決する方法を学習できます。 人工ニューロンは人間の脳のニューロンと似た構造を持っています。天然のニューロンは核、樹状突起、軸索で構成されています。軸索はいくつかの枝に伸び、他のニューロンの樹状突起とシナプスを形成します。 これまで、ニューロンの構造と、接続されたニューロンのネットワークを区別してきました。もう一つの重要な側面は、それぞれ単一のニューロンに関連するニューラル ネットワークの処理または計算です。天然のニューロンは信号処理装置であり、樹状突起で微小信号を受信し、軸索で信号をトリガーすることができます。潜在的な閾値があり、それに達すると軸索が刺激され、信号が他のニューロンに伝播します。したがって、人工ニューロンは、入力に信号受信機、出力に活性化ユニットを持ち、図に示すように他のニューロンに転送される信号を送信できるものと考えることができます。 さらに、ニューロン間の接続には対応する重みがあり、信号を変更してニューロンの出力に影響を与える可能性があります。重みはニューラル ネットワークの内部にあり、その出力に影響を与えるため、ニューラル ネットワークの内部規律と見なすことができます。また、ニューロンと他のニューロンまたは外界との接続を表す重みを調整することで、ニューラル ネットワークの機能が反映されます。 Bioinfo Publications によれば、次の通りです。 人工ニューロンは 1 つ以上の入力 (樹状突起を表す) を受け取り、それらを合計して出力/活性化 (ニューロンの軸索を表す) を生成します。通常、各ノードの合計は重み付けされ、その合計は活性化関数または伝達関数に渡されます。 自然なニューロンは非線形の動作をするため、このコンポーネントはニューラル ネットワーク処理に非線形性を追加します。特殊なケースでは、線形関数になることもあります。 Wikipedia には次のように記されています: 標準的なコンピュータ チップ回路は、入力が「オン」(1) か「オフ」(0) かに応じて機能をアクティブにするデジタル ネットワークと考えることができます。これは、ニューラル ネットワークにおける線形パーセプトロンの動作に似ています。ただし、非線形活性化関数を使用すると、このようなネットワークでは少数のノードのみを使用して特殊な問題を計算できます。よく使用される活性化関数の例としては、シグモイド、双曲正接、ハードしきい値、純粋線形などがあります。 この知識を Java コードに変換すると、次のようなニューロン クラスが作成されます。 - java.util.ArrayList をインポートします。
- java.util.List をインポートします。
- edu.neuralnet.core.activation.ActivationFunction をインポートします。
- edu.neuralnet.core.input.InputSummingFunction をインポートします。
- /**
- *次から構成されるニューロン モデルを表します: </br>
- * <ul>
- * <li>合計部分 - 入力合計関数</li>
- * <li>活性化関数</li>
- * <li>入力接続</li>
- * <li>出力接続</li>
- * </ul>
- */
- パブリッククラスニューロン{
- /**
- * ニューロンの識別子
- * ニューロン識別子
- */
- プライベート文字列ID;
- /**
- *ニューロンの入力接続(このニューロンへの接続)のコレクション
- * ニューロン入力接続のセット(このニューロンへの接続)
- */
- 保護されたリスト <接続> inputConnections;
- /**
- *ニューロンの出力接続の集合(ここから他のニューロンへの接続)
- * ニューロン)
- * ニューロンの出力接続の集合(このニューロンから他のニューロンへの接続)
- */
- 保護されたリスト <接続> outputConnections;
- /**
- * 入力合計機能 このニューロン
- * このニューロンの入力と機能
- */
- 保護された InputSummingFunction inputSummingFunction;
- /**
- * 活性化関数 このニューロン
- * このニューロンの活性化関数
- */
- 保護されたアクティベーション関数アクティベーション関数;
- /**
- *デフォルトコンストラクタ
- * デフォルトコンストラクタ
- */
- パブリックニューロン() {
- this.inputConnections = 新しいArrayList<>();
- this.outputConnections = 新しいArrayList<>();
- }
- /**
- * ニューロンの出力を計算する
- * ニューロン出力を計算する
- */
- 公共 ダブル計算出力() {
- ダブルtotalInput = inputSummingFunction.getOutput(inputConnections);
- activationFunction.getOutput(totalInput)を返します。
- }
- ...
- }
ニューロンには入力と出力の接続、入力の合計、および活性化関数がありますが、入力の重みはどこにあるのでしょうか?これらは、次のように接続自体に含まれています。 - /**
- *接続を表す 2 つのニューロン間の関係と関連する重み。
- * 2つのニューロンとそれに関連する重み間の接続を表す
- */
- パブリッククラス NeuronsConnection {
- /**
- *この接続のニューロン(ソースニューロン)から。この接続 は
- *出力 繋がり のために ニューロンから。
- * この接続をニューロン(ソースニューロン)から取得します。この接続はニューロンからの出力接続である
- */
- Neuron から Neuron を保護しました。
- /**
- *この接続のニューロン(ターゲット、宛先ニューロン)
- *繋がり 入力接続です のために ニューロンへ。
- * この接続に使用されるニューロン(ターゲット、ターゲットニューロン)の場合、この接続はニューロンの入力接続です
- */
- ニューロンからニューロンまで保護されています。
- /**
- *接続重量
- * 接続重量
- */
- 保護された二重重量。
- /**
- * 新しい接続を作成します ランダムな重みを持つ指定されたニューロン間。
- * ランダムな重みを持つ指定されたニューロン間に新しい接続を作成します
- * @param ニューロンから
- * ニューロンに 接続する から
- * @param ニューロン
- * ニューロンに 接続する に
- */
- パブリックNeuronsConnection(Neuron fromNeuron、Neuron toNeuron) {
- this.fromNeuron = fromNeuron;
- this.toNeuron = toNeuron;
- 重みは Math.random() で計算されます。
- }
- /**
- * 新しい接続を作成します 指定された重みのオブジェクトを持つ指定されたニューロンに
- * 指定された重みオブジェクトを使用して、指定されたニューロンへの新しい接続を作成します。
- *
- * @param ニューロンから
- * ニューロンに 接続する から
- * @param ニューロン
- * ニューロンに 接続する に
- * @param 重み
- *この接続の重み
- */
- パブリックNeuronsConnection(Neuron fromNeuron、Neuron toNeuron、 double重み) {
- this(Neuron から、Neuron へ);
- this.weight = 重量;
- }
- /**
- *この接続の重みを返します
- * この接続の重みを返します
- * @returnこの接続の重み
- */
- 公共 ダブルgetWeight() {
- 重量を返します。
- }
- /**
- *接続の重みを設定します。
- * 接続の重みを設定する
- * @param 重み
- * 接続の新しい重み 設定される
- */
- パブリックvoid setWeight(ダブルウェイト) {
- this.weight = 重量;
- }
- /**
- *この接続の入力を返します- 活性化関数の結果
- *この接続の入力ニューロンで計算されます。
- * この接続の入力を返します - この接続の入力ニューロンで計算された活性化関数の結果
- * @returnこの接続を通じて受信した入力
- */
- 公共 ダブルgetInput() {
- Neuron.calculateOutput() から戻ります。
- }
- /**
- *この接続の重み付けされた入力を返します
- * この接続の重み入力を返します
- * @return接続の重み付けされた入力
- */
- 公共 ダブルgetWeightedInput() {
- Neuron.calculateOutput() から重みを返します。
- }
- /**
- *この接続のニューロンから取得
- * ニューロンからこの接続を取得します
- * @戻る この接続のニューロンから
- */
- パブリックニューロンgetFromNeuron() {
- Neuronから戻ります。
- }
- /**
- *この接続のニューロンに到達する
- * この接続に使用されているニューロンを取得します
- * @returnニューロンを セット として ニューロンに
- */
- パブリックニューロンgetToNeuron() {
- Neuron に戻ります。
- }
- ...
- }
接続オブジェクトは重みを提供し、入力の重みを計算する役割を担います。 合計関数は、ニューロンの計算戦略を置き換えることができるインターフェースとして定義されます。 - java.util.List をインポートします。
- edu.neuralnet.core.Connectionをインポートします。
- /**
- *シグナルコレクターとも呼ばれるニューロンの入力合計部分を表します。
- * ニューロンの加算部分。信号コレクターとも呼ばれる。
- */
- パブリックインターフェースInputSummingFunction {
- /**
- * 出力に基づいて計算を実行します 価値観 入力ニューロンの。
- * 入力ニューロンの出力値に基づいて計算を実行する
- * @param 入力接続
- * ニューロンの入力接続
- * @return入力接続を持つニューロンの合計入力
- * 総入力、入力接続を持つニューロン
- */
- ダブルcollectOutput(List< Connection > inputConnections);
- }
それらは次のように実装されます。 - java.util.List をインポートします。
- edu.neuralnet.core.Connectionをインポートします。
- /**
- *入力ニューロンの出力の加重合計を計算します。
- * 入力ニューロン出力の加重和を計算する
- */
- パブリック最終クラス WeightedSumFunction は InputSummingFunction を実装します {
- /**
- * {@inheritDoc}
- */
- @オーバーライド
- 公共 ダブルcollectOutput(List< Connection > inputConnections) {
- ダブル加重合計 = 0d;
- (接続 接続: inputConnections) {
- weightedSum +=接続.getWeightedInput();
- }
- 重み付けされた合計を返します。
- }
- }
活性化関数のインターフェースは次のように定義できます。 - /**
- * ニューラル ネットワーク活性化関数インターフェイス。
- * ニューラルネットワーク活性化関数のインターフェース
- */
- パブリックインターフェースActivationFunction {
- /**
- *合計に基づいて計算を実行します 入力ニューロンの出力。
- * 入力ニューロン出力の合計に基づく計算
- * @param 合計入力
- * ニューロンの合計 出力と接続された入力の
- *ニューロン
- *
- * @戻る 合計に基づく出力の計算 入力の
- * 入力に基づいて出力を計算し、
- */
- ダブル計算出力(ダブル合計入力);
- }
コードを書き始める前に最後に知っておく必要があるのは、ニューラル ネットワーク レイヤーです。ニューラル ネットワークは複数のリンクされた層で構成され、いわゆる多層ネットワークを形成します。神経層は 3 つのカテゴリに分類できます。 - 入力レイヤー
- 隠しレイヤー
- 出力層
実際には、追加のニューラル層により外部刺激の抽象化のレベルがさらに高まり、ニューラル ネットワークがより複雑な知識を認識する能力が強化されます。 レイヤー クラスは、接続されたニューロンのリストとして定義できます。 - java.util.ArrayList をインポートします。
- java.util.List をインポートします。
- /**
- * ニューラルネットワークは、複数のリンクされた層で構成され、
- * いわゆる多層ネットワーク。レイヤーは集合として定義できる。 ニューロンの
- * 単一のニューラル ネットの層で構成されます。
- * ニューラルネットワークは複数の接続された層で構成され、いわゆる多層ネットワークを形成します。
- * レイヤーは、ニューラル ネットワーク レイヤーを構成するニューロンのセットとして定義できます。
- */
- パブリッククラスNeuralNetLayer {
- /**
- * レイヤーの識別子
- * 階層識別子
- */
- プライベート文字列ID;
- /**
- *この層のニューロンの集合
- * この層のニューロンの集合
- */
- 保護されたList<Neuron> ニューロン;
- /**
- * IDを持つ空のレイヤーを作成します。
- * ID付きの空のレイヤーを作成する
- * @パラメータID
- * レイヤーの識別子
- */
- パブリックNeuralNetLayer(文字列id) {
- id は、
- ニューロン = 新しいArrayList<>();
- }
- /**
- *ニューロンのリストとIDを持つレイヤーを作成します。
- * ニューロンとそのIDのリストを持つレイヤーを作成する
- * @パラメータID
- * レイヤーの識別子
- * @param ニューロン
- *レイヤーに追加するニューロンのリストこのレイヤーに追加されるニューロンのリスト
- */
- パブリックNeuralNetLayer(String id, List<Neuron> ニューロン) {
- id は、
- this.neurons = ニューロン;
- }
- ...
- }
***、Java で簡単なニューラル ネットワークを作成します。 - /**
- *ニューロンを含む層を持つ人工ニューラル ネットワークを表します。
- * ニューロンの層を持つ人工ニューラルネットワーク
- */
- パブリッククラスNeuralNet {
- /**
- * ニューラルネットワークID
- * ニューラルネットワークID
- */
- プライベート文字列ID;
- /**
- * ニューラルネットワーク入力層
- * ニューラルネットワークの入力層
- */
- プライベートNeuralNetLayer inputLayer;
- /**
- * ニューラルネットワークの隠れ層
- * ニューラルネットワークの隠れ層
- */
- プライベート List<NeuralNetLayer> hiddenLayers;
- /**
- * ニューラルネットワーク出力層
- * ニューラルネットワークの出力層
- */
- プライベート NeuralNetLayer 出力レイヤー;
- /**
- * ニューラルネットを構築し、 すべてのレイヤーが存在します。
- * すべての層を含むニューラルネットワークを構築する
- * @パラメータID
- *設定するニューラルネットワークIDニューラルネットワークIDを設定します
- * @param 入力レイヤー
- *設定するニューラルネットワークの入力層ニューラルネットワークの入力層を設定します
- * @param 隠しレイヤー
- * ニューラルネットワークの隠れ層を設定するニューラルネットワークの隠れ層を設定する
- * @param 出力レイヤー
- * ニューラルネットワークの出力層を設定するニューラルネットワークの出力層を設定する
- */
- パブリックNeuralNet(String id, NeuralNetLayer inputLayer, List<NeuralNetLayer> hiddenLayers,
- ニューラルネットレイヤー出力レイヤー) {
- id は、
- 入力レイヤーを作成します。
- this.hiddenLayers = 隠しレイヤー;
- 出力レイヤーを作成します。
- }
- /**
- * 隠れ層のないニューラル ネットを構築します。
- * 隠れ層のないニューラルネットワークを構築する
- * @パラメータID
- *設定するニューラルネットワークIDニューラルネットワークIDを設定します
- * @param 入力レイヤー
- *設定するニューラルネットワークの入力層ニューラルネットワークの入力層を設定します
- * @param 出力レイヤー
- * ニューラルネットワークの出力層を設定するニューラルネットワークの隠れ層を設定する
- */
- パブリックNeuralNet(文字列id、NeuralNetLayer入力レイヤー、NeuralNetLayer出力レイヤー) {
- id は、
- 入力レイヤーを作成します。
- 出力レイヤーを作成します。
- }
- ...
- }
得られるのは、ニューラル ネットワークのレイヤー、ニューロン、および接続の Java ベースの構造定義です。また、活性化関数についても少し説明し、それらのインターフェースを定義しました。簡単にするために、さまざまな活性化関数の実装とニューラル ネットワークの学習の基礎については省略します。これら 2 つのトピックについては、このシリーズの今後の記事で取り上げます。 オリジナルリンク: https://cloud.tencent.com/developer/article/1038393 ダニエラ・コラロヴァ [この記事は51CTOコラムニスト「雲家コミュニティ」によるオリジナル記事です。転載の許可を得るには51CTOを通じて原作者に連絡してください] この著者の他の記事を読むにはここをクリックしてください |