プログラマーの視点から 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を使ってカップルをテスト:ルー・ハンとグアン・シャオトンのテストスコアは笑える

ブログ    
ブログ    

推薦する

自動運転業界は2021年に爆発的な成長を遂げるでしょうか?

2020年は自動運転業界が徐々に安定する年だ。ウェイモなどの巨大企業が商業化の模索を開始し、テスラ...

スーパーパートナー:IoT、AI、クラウドが強力な同盟を形成

大ヒット映画とモノのインターネット(IoT)にはどのような関係があるのでしょうか?あなたが思っている...

ビッグデータの発展は、ソフトウェアエンジニアの漸進的な衰退とアルゴリズムエンジニアの台頭を伴うことになる。

[[190402]]ビッグデータは人類の歴史のどの時代にも存在していましたが、テクノロジーが一定の...

...

WeiboにおけるSparkベースの大規模機械学習の応用

[[195122]]周知のとおり、Weibo のビジネスは 2015 年以降急速に成長しています。内...

自動運転が原因でしょうか?上海の地下鉄で乗客がホームの網戸に挟まれて死亡した。この悲劇の責任は誰にあるのだろうか?

1月22日午後、上海地下鉄15号線で重大事故が発生した。千安路駅のプラットホームで、乗客が電車から...

ドローンのバッテリー寿命の悩みをどう解決するか?答えは3つの主要な方向から得られる

近年、我が国のドローン産業は、継続的な技術革新、継続的な政策奨励、加速した資本注入、段階的な市場改善...

...

RustベースのZedエディタがオープンソース化され、OpenAIとGitHub Copilotのサポートが組み込まれました

ティム・アンダーソンノアが編集制作:51CTO テクノロジースタック(WeChat ID:blog)...

6軸産業用ロボットの制御方法と特性

[[187760]]産業用ロボットは、産業分野における多関節マニピュレータまたは多自由度機械装置です...

2021 年のトップ 12 AI ツールとフレームワーク

AI トレンドがあらゆるところで広がる 2021 年を迎える準備はできていますか? ここでは、202...

AI技術が世界の感染症対策に情報提供を支援

最近、SingularityNETのCEOであるベン・ゲルツェル博士は、COVID-19サミットを開...

研究者:AIモデルの「推論」はより多くの電力を消費し、業界の電力消費は2027年に「オランダに匹敵する」ようになる

今週10月13日、Cellの姉妹誌Jouleは「人工知能の増大するエネルギーフットプリント」と題する...

本物そっくりの「人工顔」は顔認識を騙せるのか?

[[360561]]過去数年間に自分の写真をオンラインに投稿したことがあれば、Clearview ...

双子: 効率的な視覚的注意モデルの設計を再考する

著者 | 湘湘天志 張波 他Twins は Meituan とアデレード大学が提案した視覚的注意モデ...