プログラマーの視点から Java でニューラル ネットワークを設計する

プログラマーの視点から Java でニューラル ネットワークを設計する

人工ニューラル ネットワーク (ANN) またはコネクショニスト システムは、生物学的脳を構成する生物学的ニューラル ネットワークにヒントを得たコンピューティング システムです。このようなシステムは、通常、タスク固有のプログラミングを行わずに、例を検討することでタスクを達成することを学習します (パフォーマンスが徐々に向上します)。

Java やその他のプログラミング言語でニューラル ネットワークを設計するには、人工ニューラル ネットワークの構造と機能を理解する必要があります。

人工ニューラル ネットワークは、定義された目標を達成するために一連の手順を必要とする従来のアルゴリズム手法ではなく、パターン認識、データからの学習、専門家のような傾向の予測などのタスクを実行します。人工ニューラル ネットワークは、その高度にインタラクティブなネットワーク構造により、一部のタスクを独自に解決する方法を学習できます。

人工ニューロンは人間の脳のニューロンと似た構造を持っています。天然のニューロンは核、樹状突起、軸索で構成されています。軸索はいくつかの枝に伸び、他のニューロンの樹状突起とシナプスを形成します。

これまで、ニューロンの構造と、接続されたニューロンのネットワークを区別してきました。もう一つの重要な側面は、それぞれ単一のニューロンに関連するニューラル ネットワークの処理または計算です。天然のニューロンは信号処理装置であり、樹状突起で微小信号を受信し、軸索で信号をトリガーすることができます。潜在的な閾値があり、それに達すると軸索が刺激され、信号が他のニューロンに伝播します。したがって、人工ニューロンは、入力に信号受信機、出力に活性化ユニットを持ち、図に示すように他のニューロンに転送される信号を送信できるものと考えることができます。

さらに、ニューロン間の接続には対応する重みがあり、信号を変更してニューロンの出力に影響を与える可能性があります。重みはニューラル ネットワークの内部にあり、その出力に影響を与えるため、ニューラル ネットワークの内部規律と見なすことができます。また、ニューロンと他のニューロンまたは外界との接続を表す重みを調整することで、ニューラル ネットワークの機能が反映されます。

Bioinfo Publications によれば、次の通りです。

人工ニューロンは 1 つ以上の入力 (樹状突起を表す) を受け取り、それらを合計して出力/活性化 (ニューロンの軸索を表す) を生成します。通常、各ノードの合計は重み付けされ、その合計は活性化関数または伝達関数に渡されます。

自然なニューロンは非線形の動作をするため、このコンポーネントはニューラル ネットワーク処理に非線形性を追加します。特殊なケースでは、線形関数になることもあります。

Wikipedia には次のように記されています:

標準的なコンピュータ チップ回路は、入力が「オン」(1) か「オフ」(0) かに応じて機能をアクティブにするデジタル ネットワークと考えることができます。これは、ニューラル ネットワークにおける線形パーセプトロンの動作に似ています。ただし、非線形活性化関数を使用すると、このようなネットワークでは少数のノードのみを使用して特殊な問題を計算できます。よく使用される活性化関数の例としては、シグモイド、双曲正接、ハードしきい値、純粋線形などがあります。

この知識を Java コードに変換すると、次のようなニューロン クラスが作成されます。

  1. java.util.ArrayList をインポートします。
  2. java.util.List をインポートします。
  3. edu.neuralnet.core.activation.ActivationFunction をインポートします。
  4. edu.neuralnet.core.input.InputSummingFunction をインポートします。
  5. /**
  6. *次から構成されるニューロン モデルを表します: </br>
  7. * <ul>
  8. * <li>合計部分 - 入力合計関数</li>
  9. * <li>活性化関数</li>
  10. * <li>入力接続</li>
  11. * <li>出力接続</li>
  12. * </ul>
  13. */
  14. パブリッククラスニューロン{
  15. /**
  16. * ニューロンの識別子
  17. * ニューロン識別子
  18. */
  19. プライベート文字列ID;
  20. /**
  21. *ニューロンの入力接続(このニューロンへの接続コレクション
  22. * ニューロン入力接続のセット(このニューロンへの接続)
  23. */
  24. 保護されたリスト <接続> inputConnections;
  25. /**
  26. *ニューロンの出力接続集合(ここから他のニューロンへの接続
  27. * ニューロン)
  28. * ニューロンの出力接続の集合(このニューロンから他のニューロンへの接続)
  29. */
  30. 保護されたリスト <接続> outputConnections;
  31. /**
  32. * 入力合計機能 このニューロン
  33. * このニューロンの入力と機能
  34. */
  35. 保護された InputSummingFunction inputSummingFunction;
  36. /**
  37. * 活性化関数 このニューロン
  38. * このニューロンの活性化関数
  39. */
  40. 保護されたアクティベーション関数アクティベーション関数;
  41. /**
  42. *デフォルトコンストラクタ
  43. * デフォルトコンストラクタ
  44. */
  45. パブリックニューロン() {
  46. this.inputConnections = 新しいArrayList<>();
  47. this.outputConnections = 新しいArrayList<>();
  48. }
  49. /**
  50. * ニューロンの出力を計算する 
  51. * ニューロン出力を計算する
  52. */
  53. 公共 ダブル計算出力() {
  54. ダブルtotalInput = inputSummingFunction.getOutput(inputConnections);
  55. activationFunction.getOutput(totalInput)を返します
  56. }
  57. ...
  58. }

ニューロンには入力と出力の接続、入力の合計、および活性化関数がありますが、入力の重みはどこにあるのでしょうか?これらは、次のように接続自体に含まれています。

  1. /**
  2. *接続を表す  2 つのニューロン間の関係と関連する重み。
  3. * 2つのニューロンとそれに関連する重み間の接続を表す
  4. */
  5. パブリッククラス NeuronsConnection {
  6. /**
  7. *この接続ニューロン(ソースニューロン)から。この接続  
  8. *出力 繋がり のために ニューロンから
  9. * この接続をニューロン(ソースニューロン)から取得します。この接続はニューロンからの出力接続である
  10. */
  11. Neuron から Neuron を保護しました。
  12. /**
  13. *この接続ニューロン(ターゲット、宛先ニューロン)
  14. *繋がり 入力接続です のために ニューロン
  15. * この接続に使用されるニューロン(ターゲット、ターゲットニューロン)の場合、この接続はニューロンの入力接続です
  16. */
  17. ニューロンからニューロンまで保護されています。
  18. /**
  19. *接続重量
  20. * 接続重量
  21. */
  22. 保護された二重重量。
  23. /**
  24. * 新しい接続を作成します ランダムな重みを持つ指定されたニューロン
  25. * ランダムな重みを持つ指定されたニューロン間に新しい接続を作成します
  26. * @param ニューロンから
  27. * ニューロン 接続する から 
  28. * @param ニューロン
  29. * ニューロン 接続する  
  30. */
  31. パブリックNeuronsConnection(Neuron fromNeuron、Neuron toNeuron) {
  32. this.fromNeuron = fromNeuron;
  33. this.toNeuron = toNeuron;
  34. 重みは Math.random() で計算されます。
  35. }
  36. /**
  37. * 新しい接続を作成します 指定された重みのオブジェクトを持つ指定されたニューロン
  38. * 指定された重みオブジェクトを使用して、指定されたニューロンへの新しい接続を作成します。
  39. *
  40. * @param ニューロンから
  41. * ニューロン 接続する から 
  42. * @param ニューロン
  43. * ニューロン 接続する  
  44. * @param 重み
  45. *この接続重み 
  46. */
  47. パブリックNeuronsConnection(Neuron fromNeuron、Neuron toNeuron、 double重み) {
  48. this(Neuron から、Neuron へ);
  49. this.weight = 重量;
  50. }
  51. /**
  52. *この接続重みを返します 
  53. * この接続の重みを返します
  54. * @returnこの接続重み 
  55. */
  56. 公共 ダブルgetWeight() {
  57. 重量を返します
  58. }
  59. /**
  60. *接続重み設定します
  61. * 接続の重みを設定する
  62. * @param 重み
  63. * 接続新しい重み 設定れる 
  64. */
  65. パブリックvoid setWeight(ダブルウェイト) {
  66. this.weight = 重量;
  67. }
  68. /**
  69. *この接続入力を返します- 活性化関数の結果
  70. *この接続入力ニューロン計算されます
  71. * この接続の入力を返します - この接続の入力ニューロンで計算された活性化関数の結果
  72. * @returnこの接続を通じて受信した入力 
  73. */
  74. 公共 ダブルgetInput() {
  75. Neuron.calculateOutput() から戻ります
  76. }
  77. /**
  78. *この接続重み付けされた入力を返します 
  79. * この接続の重み入力を返します
  80. * @return接続重み付けさた入力 
  81. */
  82. 公共 ダブルgetWeightedInput() {
  83. Neuron.calculateOutput() から重みを返します
  84. }
  85. /**
  86. *この接続ニューロンから取得 
  87. * ニューロンからこの接続を取得します
  88. * @戻る この接続ニューロンから 
  89. */
  90. パブリックニューロンgetFromNeuron() {
  91. Neuronから戻ります
  92. }
  93. /**
  94. *この接続ニューロン到達する 
  95. * この接続に使用されているニューロンを取得します
  96. * @returnニューロン セット として ニューロン
  97. */
  98. パブリックニューロンgetToNeuron() {
  99. Neuron に戻ります
  100. }
  101. ...
  102. }

接続オブジェクトは重みを提供し、入力の重みを計算する役割を担います。

合計関数は、ニューロンの計算戦略を置き換えることができるインターフェースとして定義されます。

  1. java.util.List をインポートします。
  2. edu.neuralnet.core.Connectionをインポートします
  3. /**
  4. *シグナルコレクターとも呼ばれるニューロン入力合計部分を表します。
  5. * ニューロンの加算部分。信号コレクターとも呼ばれる。
  6. */
  7. パブリックインターフェースInputSummingFunction {
  8. /**
  9. * 出力基づいて計算を実行します 価値観 入力ニューロン
  10. * 入力ニューロンの出力値に基づいて計算を実行する
  11. * @param 入力接続
  12. * ニューロンの入力接続
  13. * @return入力接続を持つニューロン合計入力
  14. * 総入力、入力接続を持つニューロン
  15. */
  16. ダブルcollectOutput(List< Connection > inputConnections);
  17. }

それらは次のように実装されます。

  1. java.util.List をインポートします。
  2. edu.neuralnet.core.Connectionをインポートします
  3. /**
  4. *入力ニューロンの出力加重合計を計算します。
  5. * 入力ニューロン出力の加重和を計算する
  6. */
  7. パブリック最終クラス WeightedSumFunction は InputSummingFunction を実装します {
  8. /**
  9. * {@inheritDoc}
  10. */
  11. @オーバーライド
  12. 公共 ダブルcollectOutput(List< Connection > inputConnections) {
  13. ダブル加重合計 = 0d;
  14. (接続 接続: inputConnections) {
  15. weightedSum +=接続.getWeightedInput();
  16. }
  17. 重み付けされた合計を返します
  18. }
  19. }

活性化関数のインターフェースは次のように定義できます。

  1. /**
  2. * ニューラル ネットワーク活性化関数インターフェイス。
  3. * ニューラルネットワーク活性化関数のインターフェース
  4. */
  5. パブリックインターフェースActivationFunction {
  6. /**
  7. *合計基づいて計算を実行します 入力ニューロン出力
  8. * 入力ニューロン出力の合計に基づく計算
  9. * @param 合計入力
  10. * ニューロンの合計 出力と接続された入力
  11. *ニューロン
  12. *
  13. * @戻る 合計基づく出力の計算 入力
  14. * 入力に基づいて出力を計算し、
  15. */
  16. ダブル計算出力(ダブル合計入力);
  17. }

コードを書き始める前に最後に知っておく必要があるのは、ニューラル ネットワーク レイヤーです。ニューラル ネットワークは複数のリンクされた層で構成され、いわゆる多層ネットワークを形成します。神経層は 3 つのカテゴリに分類できます。

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

実際には、追加のニューラル層により外部刺激の抽象化のレベルがさらに高まり、ニューラル ネットワークがより複雑な知識を認識する能力が強化されます。

レイヤー クラスは、接続されたニューロンのリストとして定義できます。

  1. java.util.ArrayList をインポートします。
  2. java.util.List をインポートします。
  3. /**
  4. * ニューラルネットワークは、複数のリンクされた層構成され、
  5. * いわゆる多層ネットワーク。レイヤーは集合として定義できる  ニューロン
  6. * 単一のニューラル ネットの層で構成されます。
  7. * ニューラルネットワークは複数の接続された層で構成され、いわゆる多層ネットワークを形成します。
  8. * レイヤーは、ニューラル ネットワーク レイヤーを構成するニューロンのセットとして定義できます。
  9. */
  10. パブリッククラスNeuralNetLayer {
  11. /**
  12. * レイヤーの識別子
  13. * 階層識別子
  14. */
  15. プライベート文字列ID;
  16. /**
  17. *この層ニューロン集合
  18. * この層のニューロンの集合
  19. */
  20. 保護されたList<Neuron> ニューロン;
  21. /**
  22. * IDを持つ空のレイヤーを作成します。
  23. * ID付きの空のレイヤーを作成する
  24. * @パラメータID
  25. * レイヤーの識別子
  26. */
  27. パブリックNeuralNetLayer(文字列id) {
  28. id は、
  29. ニューロン = 新しいArrayList<>();
  30. }
  31. /**
  32. *ニューロンリストIDを持つレイヤーを作成します。
  33. * ニューロンとそのIDのリストを持つレイヤーを作成する
  34. * @パラメータID
  35. * レイヤーの識別子
  36. * @param ニューロン
  37. *レイヤー追加するニューロンリストこのレイヤーに追加されるニューロンのリスト
  38. */
  39. パブリックNeuralNetLayer(String id, List<Neuron> ニューロン) {
  40. id は、
  41. this.neurons = ニューロン;
  42. }
  43. ...
  44. }

***、Java で簡単なニューラル ネットワークを作成します。

  1. /**
  2. *ニューロンを含む層持つ人工ニューラル ネットワークを表します。
  3. * ニューロンの層を持つ人工ニューラルネットワーク
  4. */
  5. パブリッククラスNeuralNet {
  6. /**
  7. * ニューラルネットワークID
  8. * ニューラルネットワークID
  9. */
  10. プライベート文字列ID;
  11. /**
  12. * ニューラルネットワーク入力層
  13. * ニューラルネットワークの入力層
  14. */
  15. プライベートNeuralNetLayer inputLayer;
  16. /**
  17. * ニューラルネットワークの隠れ層
  18. * ニューラルネットワークの隠れ層
  19. */
  20. プライベート List<NeuralNetLayer> hiddenLayers;
  21. /**
  22. * ニューラルネットワーク出力
  23. * ニューラルネットワークの出力層
  24. */
  25. プライベート NeuralNetLayer 出力レイヤー;
  26. /**
  27. * ニューラルネット構築し、  すべてのレイヤーが存在します。
  28. * すべての層を含むニューラルネットワークを構築する
  29. * @パラメータID
  30. *設定するニューラルネットワークIDニューラルネットワークIDを設定します
  31. * @param 入力レイヤー
  32. *設定するニューラルネットワーク入力層ニューラルネットワークの入力層を設定します
  33. * @param 隠しレイヤー
  34. * ニューラルネットワークの隠れ層を設定するニューラルネットワークの隠れ層を設定する
  35. * @param 出力レイヤー
  36. * ニューラルネットワークの出力を設定するニューラルネットワークの出力層を設定する
  37. */
  38. パブリックNeuralNet(String id, NeuralNetLayer inputLayer, List<NeuralNetLayer> hiddenLayers,
  39. ニューラルネットレイヤー出力レイヤー) {
  40. id は、
  41. 入力レイヤーを作成します。
  42. this.hiddenLayers = 隠しレイヤー;
  43. 出力レイヤーを作成します。
  44. }
  45. /**
  46. * 隠れ層のないニューラル ネットを構築します。
  47. * 隠れ層のないニューラルネットワークを構築する
  48. * @パラメータID
  49. *設定するニューラルネットワークIDニューラルネットワークIDを設定します
  50. * @param 入力レイヤー
  51. *設定するニューラルネットワーク入力層ニューラルネットワークの入力層を設定します
  52. * @param 出力レイヤー
  53. * ニューラルネットワークの出力を設定するニューラルネットワークの隠れ層を設定する
  54. */
  55. パブリックNeuralNet(文字列id、NeuralNetLayer入力レイヤー、NeuralNetLayer出力レイヤー) {
  56. id は、
  57. 入力レイヤーを作成します。
  58. 出力レイヤーを作成します。
  59. }
  60. ...
  61. }

得られるのは、ニューラル ネットワークのレイヤー、ニューロン、および接続の Java ベースの構造定義です。また、活性化関数についても少し説明し、それらのインターフェースを定義しました。簡単にするために、さまざまな活性化関数の実装とニューラル ネットワークの学習の基礎については省略します。これら 2 つのトピックについては、このシリーズの今後の記事で取り上げます。

オリジナルリンク: https://cloud.tencent.com/developer/article/1038393

ダニエラ・コラロヴァ

[この記事は51CTOコラムニスト「雲家コミュニティ」によるオリジナル記事です。転載の許可を得るには51CTOを通じて原作者に連絡してください]

この著者の他の記事を読むにはここをクリックしてください

<<:  ブロックチェーン投資の10大リスクポイント。これらを理解していないなら投資しないでください!

>>:  アリババがAIを使ってカップルをテスト:ルー・ハンとグアン・シャオトンのテストスコアは笑える

ブログ    
ブログ    
ブログ    

推薦する

4 大検索大手は人工知能に夢中です。最も有望なのはどれだと思いますか?

近年、世界の科学技術分野で最もホットな言葉は「人工知能」です。グーグル、百度、ヤンデックス、ネイバー...

「世界AI人材追跡調査」:米国の上級AI研究者の29%は中国出身。人材を追放することは自らの道を断つことに等しい

中国は世界最大の人工知能研究者の供給国となった。米国の人工知能分野のトップ研究者のほぼ3分の1は中国...

日本はAIと無人機械を使って月面基地を建設する計画で、2030年代までに完成することを目指している。

共同通信によると、国土交通省は月面に滞在できる基地を建設するため、無人重機の開発を進めている。日本は...

現代の分散ストレージシステムをサポートするアルゴリズム

アプリケーションによって処理されるデータの量が増え続けるにつれて、ストレージの拡張はますます困難にな...

構築は簡単だが、維持は難しい! Googleの機械学習システムの苦い教訓

[[279958]] 2014年、機械学習の背後に隠れた高い技術的負債を調査したGoogleの論文が...

具現化された知能の新時代! VLAは、UIナビゲーションとロボット操作を備えた最強の基本モデルMagmaを歓迎します

既存の大規模言語モデル、画像生成モデルなどは、少数のモーダルデータに対してのみ動作し、人間のように物...

ビジネスに適したRPAソフトウェアの選び方

[[407899]] [51CTO.com クイック翻訳]研究によると、企業の従業員がより生産的な仕...

...

...

5つの重要なステップ!ディープラーニングモデルを構築するにはどうすればいいですか?

この記事は、公開アカウント「Reading the Core」(ID: AI_Discovery)か...

将来のスマートホームに AI はどのように統合されるのでしょうか?

人工知能(AI)については多くの誇大宣伝がなされていますが、それは人類のこれまでの発明と同じくらい画...

...

デジタル経済は新たな時代へ:インターネットが主導権を握り、ビッグデータと人工知能が注目の的

[[208505]]強固な経済基盤がなければ、豊かな国と強い国民は実現できません。中国共産党第19回...