多層パーセプトロン(PHPの例を使用)

ニューラルネットワークに関する資料、一般的に人工知能のトピックに関するHabrを読んで、私は単層パーセプトロンに関する投稿を見つけ、好奇心からそれからニューラルネットワークの研究を開始することに決め、その後、経験を多層パーセプトロンに拡張しました。 それについてお話します。



理論



多層パーセプトロンはWikiで詳しく説明されていますが、構造のみが説明されていますが、学習アルゴリズムと一緒に実際に試してみます。 ちなみに、それはWikiにも記載されていますが、他のいくつかのソース(booksとaiportal.ru )と比較していますが、こことそこの両方で問題のある場所をいくつか見つけました。

そのため、多層パーセプトロンは層で構成されるニューラルネットワークであり、各層は要素(ニューロン(より正確には、そのモデル))で構成されます。 これらの要素には、感覚(入力、S)、連想(訓練された「隠された」層、A)、および反応(出力、R)の3つのタイプがあります。 このタイプのパーセプトロンは、入力レイヤーと出力レイヤーをコード内でまったく省略できないため、複数のレイヤーで構成されているためではなく、 複数 (通常は2から3以下)のトレーニング(A)レイヤーが含まれているため、マルチレイヤーと呼ばれます。

ニューロンモデル(単にニューロンと呼ぶ)は、それぞれが重みを持つ複数の入力を持つネットワーク要素です。 信号を受信したニューロンは、信号に重みを乗算し、結果の値を合計します。その後、結果を別のニューロンまたはネットワーク出力に転送します。 ここでも、多層パーセプトロンには違いがあります。 その関数はシグモイドで 、0から1の範囲の値を与えます。いくつかの関数はシグモイドに属し、 ロジスティック関数を意味します 。 メソッドを確認すると、なぜこれが非常に優れているのかを理解できます。

トレーニング(より正確に調整)できるいくつかの層により、非常に複雑な非線形関数を近似することができます。つまり、その範囲は単層のものよりも広くなります。



実践してみます



すぐに私たちは理論を実践に移し、それがよりよく記憶され、誰もが試すことができるようにします。

もちろん、ニューラルネットワークの専門家でない場合は、 上記の投稿を読むことをお勧めします。

それでは、単純なタスクを取りましょう-回転や歪みのない数字を認識することです。 このようなタスクでは、多層パーセプトロンで十分であり、さらに、ノイズの影響を受けにくくなります。



ネットワーク構造


ネットワークには、入力より5倍小さい2つの隠れ層があります。 つまり、20個の入力がある場合、隠れ層には4つのニューロンがあります。 このタスクの場合、レイヤーとニューロンの数を経験的に選択する勇気を自分に与えます。 2つのレイヤーを使用しますが、レイヤーの数を増やしても結果は改善されません。



学習アルゴリズム


選択されたタイプのニューラルネットワークのトレーニングは、エラーの逆伝播のアルゴリズムに従って実行されます。 つまり、回答中にネットワークの出力で信号を送信するレイヤーがある場合、ニューラルネットワークの応答を正しい応答と比較し、エラーを計算します。エラーはネットワークに沿って出力から入力へと「上昇」します。



ネットワークエラーは、出力での信号の差の平方和の半分として評価します。 単純:これらの式のiで合計を半分に分割します:(ti-oi)^ 2、ここでtiは正解のi番目の信号の値、oiはニューラルネットワークのi番目の出力の値です。 つまり、入力の誤差の平方を要約し、すべてを半分に分割します。 このエラー(コード例では$ d)が十分に大きい場合(必要な精度に適合しない場合)、ニューロンの重みを修正します。



体重補正の公式はWikiに完全にアップロードされているため、再投稿しません。 公式を文字通り繰り返して、実際にどのようになっているのかが明確になったことに注意したいだけです。 これは、活性化関数を選択する利点をもたらします-単純な導関数(σ '(x)=σ(x)*(1-σ(x)))を持ち、重みを修正するために使用されます。 各レイヤーの重みは個別に調整されます。 つまり、最後から最初までレイヤーごとに。 そして、ここで私は間違いを犯しました。最初に各例の重みを個別に調整し、ニューラルネットワークは1つの「例」のみを解くことを学びました。 このようなアルゴリズムでは、トレーニングサンプルのすべての例を順番に入力に渡すのが適切です。これはエポックと呼ばれます。 そして、時代の終わりにのみ、エラー(すべてのサンプル例の合計)を考慮し、重みを調整します。



トレーニング中にエラーがジャンプする可能性がありますが、これは起こります。 係数α(トレーニングに対する重みの影響を決定する)およびη(補正δの大きさの影響を決定する)の選択は非常に重要です-収束の速度と局所的な極値への到達はそれに依存します。 α= 0.7とη= 0.001が最も普遍的であると考えていますが、それらを試してみてください:αとηを増やすと学習が速くなりますが、最小限に飛ばすことができます。



次に、 PHPの例をレイアウトします 。 コードは理想とはほど遠いですが、タスクを実行します。



All Articles