わずか30行のJavaScriptコードでニューラルネットワークを作成する方法





わずか30行のコードでJavaScriptでニューラルネットワークを作成する方法の翻訳。



この記事では、 Synaptic.jsライブラリを使用してニューラルネットワークを作成およびトレーニングする方法について説明します。これにより、Node.jsブラウザーと組み合わせて詳細なトレーニングを行うことができます。 XOR方程式を解く簡単なニューラルネットワークを作成しましょう。 また、特別に作成されたインタラクティブなチュートリアルを学習することもできます。







しかし、コードに移る前に、ニューラルネットワークの基本について話しましょう。



ニューロンとシナプス



ニューラルネットワークの主要な「構築」要素は、もちろんニューロンです。 関数と同様に、いくつかの入力値を受け取り、何らかの結果を生成します。 ニューロンにはさまざまな種類があります。 私たちのネットワークは、任意の数を取り、それらを0から1の範囲の値に減らすシグモイドを使用します。そのようなニューロンの動作の原理を以下に示します。 入力の数は5、出力の数は1です。矢印は、ニューロンをニューラルネットワークの他の層に接続するシナプスを示しています。







しかし、なぜ5番が入り口にあるのでしょうか? これは、ニューロンに「入る」3つのシナプスの合計です。 それを理解しましょう。



左側には、値1と0、および-2のオフセットがあります。 最初に、最初の2つの値にその重み (7および3に等しい)を乗算し、結果を追加し、バイアスを追加して5を取得します。これは、人工ニューロンの入力値になります。







また、これは値を0から1の範囲に縮小するシグモイドであるため、出力値は1になります。シナプスを使用してこれらのニューロンを互いに接続すると、値が入力から出力に渡され、変換されるニューラルネットワークが得られます。 このようなもの:







ニューラルネットワークは、手書き認識やメールスパムなど、あらゆる種類のタスクを解決するために一般化することを学習します。 そして、適切に一般化できるかどうかは、ニューラルネットワーク全体での正しい重み変位の選択に依存します。



トレーニングでは、サンプルのセットを指定し、正しい答えが得られるまで、ニューラルネットワークにそれらを何度も繰り返し処理させます。 各反復の後、予測精度が計算され、重みとオフセットが調整されるため、次回ニューラルネットワークの応答がわずかに正確になります。 この学習プロセスは逆伝播と呼ばれます。 何千回も繰り返すと、ニューラルネットワークは一般化を学習します。



エラーの逆伝播法の動作については考慮しませんが、これはマニュアルの範囲外です。 ただし、詳細に興味がある場合は、次の記事を読むことができます。





コード



まず、レイヤーを作成し、 new Layer()



関数を使用してシナプスモードで実行します。 渡される数は、新しい層のニューロンの数を意味します。 レイヤーが何であるかわからない場合 、上記のチュートリアルをご覧ください



 const { Layer, Network } = window.synaptic; var inputLayer = new Layer(2); var hiddenLayer = new Layer(3); var outputLayer = new Layer(1);
      
      





次に、レイヤーを相互に接続し、新しいネットワークをインスタンス化します。



 inputLayer.project(hiddenLayer); hiddenLayer.project(outputLayer); var myNetwork = new Network({ input: inputLayer, hidden: [hiddenLayer], output: outputLayer });
      
      





次のようなスキーム2-3–1に従ってネットワークを取得しました。







彼女に教えましょう:



 // train the network - learn XOR var learningRate = .3; for (var i = 0; i < 20000; i++) { // 0,0 => 0 myNetwork.activate([0,0]); myNetwork.propagate(learningRate, [0]); // 0,1 => 1 myNetwork.activate([0,1]); myNetwork.propagate(learningRate, [1]); // 1,0 => 1 myNetwork.activate([1,0]); myNetwork.propagate(learningRate, [1]); // 1,1 => 0 myNetwork.activate([1,1]); myNetwork.propagate(learningRate, [0]); }
      
      





20,000回のトレーニングを繰り返しました。 各反復で、データは4回前後に実行されます。つまり、4つの可能な値の組み合わせ[0,0] [0,1] [1,0] [1,1]



が入力されます。



myNetwork.activate([0,0])



実行することから始めましょう。 [0,0]



は入力です。 これは、前方伝播、またはニューラルネットワークのアクティブ化と呼ばれます。 各直接伝播の後、反対の操作を行う必要があります。この場合、ニューラルネットワークは重みと変位を更新します。



myNetwork.propagate(learningRate, [0])



を使用して行われます。ここで、 learningRate



は定数であり、毎回調整する必要がある重みの量を意味します。 2番目のパラメーター0



は、入力[0,0]



での正しい出力値を表します。



次に、ニューラルネットワークは結果の出力値を正しい値と比較します。 したがって、彼女は仕事の正確さを決定します。



比較の結果に応じて、ニューラルネットワークは重みと変位を調整して、次回より正確に回答するようにします。 20,000回のこのようなサイクルの後、4つの可能な入力値すべてを使用して、ニューラルネットワークがトレーニングされているかどうかを確認できます。



 console.log(myNetwork.activate([0,0])); -> [0.015020775950893527] console.log(myNetwork.activate([0,1])); ->[0.9815816381088985] console.log(myNetwork.activate([1,0])); -> [0.9871822457132193] console.log(myNetwork.activate([1,1])); -> [0.012950087641929467]
      
      





結果を最も近い整数値に丸めると、XOR方程式の正確な答えが得られます。 うまくいく!



それだけです ニューラルネットワークのトピックを少し掘り下げましたが、すでにSynapticを実験して、自習を続けることができます。 ライブラリ作成者のウィキには、さらに多くの優れたチュートリアルがあります



All Articles