脳によるニューラルネットワーク入門js


ニューラルネットワークとは


ニューラルネットワークは、コンピュータが複雑な入力を処理し、それらを分類する方法を学ぶことができる非常に有用なコンピューティング構造です.ニューラルネットワークの機能は、その構造から来ています.

ネットワークが3つの異なった層に分けられることに注意してください.ニューラルネットワークが使用されるとき、それは左から右まで層を活性化します.また、複数の隠された層が可能ですが、我々は後でそれに取り組むでしょう.
上の図の各円はニューロンです.各ニューロンの仕事は特定の変数を測定することです、そして、ニューロンがある層がより高いほど、変数が持っているより多くの情報.入力ニューロンは単一のピクセルの明るさを測定するかもしれません、中央のニューロンは絵の個々の要素を記述するかもしれません、そして、出力ニューロンは全体の絵を説明するでしょう.この値は、ニューロンの活性化と呼ばれる特定の範囲(0と1のような)に収まる数です.ニューロンはまた、バイアスと呼ばれる第2の値を有し、ニューロンのデフォルト値を0.5から離れる.
層の各ニューロンは、次の層のすべてのニューロンに接続している.これらの接続の各々は、2つのニューロンが互いに関連する方法を表す値である重みを有する.非常に正の重みとは、第1のニューロンが第2のニューロンを活性化させる可能性が高いことを意味し、ここで、高い負の重みは、第1が第2の活性化を防止することを意味する.0の重みは、第1のニューロンが第2のニューロンに全く影響しないことを意味する.
入力データがニューラルネットワークに供給されるときに、それは第1のレイヤーの一組の活性化値をつくる.この層のすべての接続は、シーケンスで'火災'.接続が発火するとき、それは接続の重さによって左のニューロンの活性化を掛け算して、それからバイアスとともに正しいニューロンのために実行している合計にそれを加えます.この過程の終わりに、左の層のあらゆるニューロンは、右の層のあらゆるニューロンに貢献しました.
結果の数は、数行の任意の場所にでき、Activationは0から1の間でなければならないので、結果を適切な範囲に変換するために関数を使用する必要があります.この目的のために動作する多くの関数があります.一旦レイヤーの全てのニューロンのために起動値が生成されると、プロセスは出力レイヤーに着くまで繰り返される.

たとえば、以下の状況では、次の1つのノードに寄与する1行目の3つのノードがあります.最上位ノードは4.0 * 0.5 = 2.0、中間ノード0.5、および一番下のノード- 1に寄与します.影響を受けるノードも−2のバイアスを持っているので、合計は- 0.5です.この値をSigmoid関数に接続すると、0.378のアクティベーション値が得られます.

さて、いくつかの数字をシャッフルすることができますいくつかの数学がありますが、我々は任意の関数でそれを行うことができます.なぜ、我々はニューロンと接続と層ですべてのこのビジネスを持つ必要がありますか?

学習


ニューラルネットワークには多くの未知があり,ネットワーク内のすべてのニューロンはバイアスを持ち,ニューロン間の接続は重みを持つ.すべてのこれらの値を微調整することができますし、異なる行動を持つニューラルネットワークを生成するために修正.もちろん、これらの可能な組み合わせのほとんどは完全に無駄な答えを与える.どのように我々はいくつかの使用可能なセットのいずれかに無限の組み合わせから絞り込むのですか?
第一に、ニューラルネットワークのどのような構成がどれだけうまくやっているかを示すいくつかの方法を定義する必要がある.これは、通常、予想される実際の回答の違いの二乗の合計であるコスト関数を作成することによって行われます.コスト関数が高いとき、ネットワークは不十分です.しかし、コスト関数が0に近いとき、ネットワークは非常にうまくやっています.ただ一つのサンプルでどれくらいうまくネットワーク取引を知っているかは非常に役に立ちません、したがって、これは大規模なデータセットが入るところです.重みとバイアスのセットの有効性は、ニューラルネットを通して数千個のサンプルでなければ何百も実行することによって決定される.

もしパラメータのあらゆる値に対してコスト関数をプロットするなら、上記のような(しかし、非常に複雑な)プロットがあります.これがコスト関数であるので、プロットの最も低い点はパラメータの最も正確なセットを表します.したがって、最急降下を使用して関数の局所極小を見つけることができます.急なまともなプロットの近くのセクションの最高の斜面を見つけることを含むし、その上昇から離れて移動します.これはcalculus I don’t have time to replicate hereの多くを含み、信じられないほど遅いです.

逆伝搬による学習の高速化


逆伝播は、最も速い降下を近似するより速い方法を提供します.背後にあるキーのアイデアは本質的に:ニューラルネットワークにサンプルをフィード、答えが期待値からどこにあるかを見つけるには、期待される答えを得るために行うことができます最小の微調整を見つける.
この過程はニューラルネットワークの広い分岐構造のために働く.ニューロンは非常に多くの異なった経路を通して供給されます、そして、各々のパスはそれに関連した異なる重さを持っていますので、あなたが他のものより気にかける値に、より多くの影響力の順序である値を見つけることは可能です.このプロセスの後で、既存の重量とバイアス値にする変更のリストにつながります.これらの変更を適用するだけでは、任意の変更を行う前に良い平均値を取得する必要がありますあなたのデータセットをオーバートレーニングにつながる.サンプルのランダムな品揃えを取得するように、それぞれの変更のリストを生成するshuffleのデータを設定する必要があります.一緒にこれらのリストの数百人を平均した後、ネットワークへの変更を制定することができます.これから生じる個々の厄介は最も急な降下でありませんが、平均は最終的にローカル機能最小にコスト機能をドラッグします.

すでに理論で十分!


Brainは、簡単で高レベルのニューラルネットワーキングのために作られたJavaScriptライブラリです.脳はあなたのために設定されたほぼすべてを扱う、あなたは高レベルの決定についてのみ心配することができます.
スケーリング機能:ニューロンの活性化値を決定するための関数を設定します.
隠された層の数:入力層と出力層の間の追加層の数.任意のプロジェクトの2つ以上の層を使用する理由はほとんどありません.層の数を増やすことは、大量に計算時間を増やす.
反復:ネットワークが実行されたデータの数は、それが停止する前に実行されます.
学習率:どのくらいの値を調整することができますグローバルスカラー.あまりにも低く、それは答えに収束する非常に長い時間がかかります.あまりにも高いし、ローカルの最小値を欠場することがあります.
const network = new brain.NeuralNetwork({
    activation: ‘sigmoid’,  //Sets the function for activation
    hiddenLayers: [2],  //Sets the number of hidden layers
    iterations: 20000, //The number of runs before the neural net stops training
    learningRate: 0.4 //The multiplier for the backpropagation changes
}) 
上記のパラメタは、オブジェクトとしてNeuralNetworkクラスに渡されます.次に、ネットワークを使用して訓練することができる.列車方式これには、準備されたトレーニングデータが必要である.サンプルデータは、入出力値を持つオブジェクトの配列として構成する必要があります.入力および出力値は、数字の配列でなければならない.そして、これらはそれぞれネットワークの第1および最後のレイヤーのニューロンの起動値に対応する.入出力アレイの要素の数が一貫したままであることは重要である(内部的に、それらは互いに等しくなければならない).
let trainingSample1 = {
    input: [ 5.3, 6 , 1 , -4 ]
    output: [ 0 , 1  ] 
}

let trainingSample2 = {
    input: [ 1 , -14 , 0.2 , 4.4 ]
    output: [ 1 , 1  ] 
} 
trainingData.push( trainingSample1 )
trainingData.push( trainingSample2 )

network.train(trainingData)
そして今、ネットワークはあなたの選択した設定とサンプルの下に自分自身を訓練するレベルを最高にしました.を使用することができます.指定したサンプルの出力を調べます.とVoila、あなたのネットワークは、任意の入力のオフに基づいて近似を行うことができます.あなたはそれがどのように動作するかを説明するだけで1000の言葉を読んでいない場合、それは魔法のようだと言うだろう.
    let sample = [20, -3, -5, 13]
    let result = network.run(sample)