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

この記事では、Synaptic.jsを使用してニューラルネットワークを作成およびトレーニングする方法を紹介します。これにより、Node.jsとブラウザーでディープラーニングを行うことができます。

XOR方程式を解くことができる最も単純なニューラルネットワークを作成します。

この例では、インタラクティブなScrimbaチュートリアルも作成したので、それも確認してください。

Scrimbaチュートリアルでは、いつでも好きなときにコードを試すことができます。

または、JavaScriptのニューラルネットワークのフルコースに興味がある場合は、ScrimbaのBrain.jsの無料コースをチェックしてください。

画像をクリックしてコースにアクセスしてください

しかし、コードを見る前に、ニューラルネットワークの非常に基本的なことを見ていきましょう。

ニューロンとシナプス

ニューラルネットワークの最初の構成要素は、まあ、ニューロンです。

ニューロンは関数のようなもので、いくつかの入力を受け取り、出力を返します。

ニューロンにはさまざまな種類があります。私たちのネットワークは、任意の数を取るとの間の値にそれを潰すシグモイドニューロン、使用しようとしている0とします1

下の円は、シグモイドニューロンを示しています。その入力はで5あり、その出力は1です。矢印はシナプスと呼ばれ、ニューロンをネットワーク内の他の層に接続します。

では、なぜ赤い数字なの5ですか?左側の3つの矢印で示されているように、ニューロンに接続しているのは3つのシナプスの合計だからです。それを開梱しましょう。

左端には、2つの値といわゆるバイアス値があります。値はで1あり、0これは緑色の数字です。バイアス値は-2、茶色の数値です。

最初の2つの入力は、それらが乗算された重みであり、7及び3青色数字によって示されるように。

最後に、それをバイアスで合計し、5または赤い数字で終わります。これが私たちの人工ニューロンへの入力です。

これは任意の値を0から1の間に押しつぶすシグモイドニューロンであるため、出力はに絞り込まれ1ます。

これらのニューロンのネットワークを一緒に接続すると、ニューラルネットワークができます。これは、シナプスを介して相互に接続されているニューロンを介して、入力から出力へと順方向に伝播します。下の画像のように:

ニューラルネットワークの目標は、手書きの数字や​​電子メールスパムの認識などの一般化を行うようにニューラルネットワークをトレーニングすることです。そして、一般化が得意であるということは、ネットワーク全体で適切な重みバイアス値を持つことです。上記の例の青と茶色の数字のように。

ネットワークをトレーニングするときは、手書きの数字などの例をたくさん表示し、ネットワークに正しい答えを予測させるだけです。

各予測の後で  、予測がどれほど間違っていかを計算、重みとバイアス値を調整して、ネットワークが次回にもう少し正確に推測できるようにします。この学習プロセスはバックプロパゲーションと呼ばれます。これを何千回も行うと、ネットワークはすぐに一般化できるようになります。

バックプロパゲーションが技術的にどのように機能するかはこのチュートリアルの範囲外ですが、それを理解するために私が見つけた3つの最良の情報源は次のとおりです。

  • ステップバイステップのバックプロパゲーションの例— MattMazur著
  • ニューラルネットへのハッカーガイド— AndrejKarpathy著
  • NeuralNetworksAndDeepLarning — MichaelNielsen著

コード

基本的なイントロを取得したので、コードに飛び込みましょう。最初に行う必要があるのは、レイヤーを作成することです。これnew Layer()はシナプスの機能で行います。関数に渡される数によって、各層に必要なニューロンの数が決まります。

レイヤーとは何かについて混乱している場合は、上のスクリーンキャストを確認してください。

const {レイヤー、ネットワーク} = window.synaptic;

var inputLayer = new Layer(2);

var hiddenLayer = new Layer(3);

var outputLayer = new Layer(1);

Next up we’ll connect these layers together and instantiate a new network, like this:

inputLayer.project(hiddenLayer);

hiddenLayer.project(outputLayer);

var myNetwork = new Network({

input: inputLayer,

hidden: [hiddenLayer],

output: outputLayer

});

So this is a 2–3–1 network, which can be visualized like this:

Now let’s train the network:

// train the network - learn XOR var learningRate = .3; for (var i = 0; i  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]); } 

Here we’re running the network 20,000 times. Each time we propagate forward and backwards four times, passing in the four possible inputs for this network: [0,0] [0,1] [1,0] [1,1] .

We start by doing myNetwork.activate([0,0]) , where [0,0] is the data point we’re sending into the network. This is the forward propagation, also called activating  the network. After each forward propagation, we need to do a backpropagation, where the network updates it’s own weights and biases.

The backpropagation is done with this line of code: myNetwork.propagate(learningRate, [0]), where the learningRate is a constant that tells the network how much it should adjust its weights each time. The second parameter 0 represents the correct output given the input [0,0].

The network then compares its own prediction to the correct label. This tells it how right or wrong it was.

It uses the comparison as a basis for correcting its own weights and bias values so that it will guess a little bit more correct the next time.

After it has done this process 20,000 times, we can check how well our network has learned by activating the network with all four possible inputs:

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] 

If we round these values to the closest integer, we’ll get the correct answers for the XOR equation. Hurray!

そしてそれはそれについてです。ニューラルネットワークの表面をかじったばかりですが、これでSynapticを自分でプレイし始め、自分で学習を続けることができます。彼らのウィキにはたくさんの良いチュートリアルが含まれています。

最後に、何か新しいことを学んだら、Scrimbaスクリーンキャストを作成するか、記事を書いて、知識を共有してください。:)

PS:無料のコースがもっとあります!

次のチャレンジをお探しの場合は、Scrimba.comでチェックできる他の無料コースがいくつかあります。これがあなたに関係があるかもしれない3つです:

  • JavaScriptのニューラルネットワーク
  • ES6 +の紹介
  • D3JSを学ぶ

ハッピーコーディング!