これは人工ニューラルネットワークの非常に簡単な説明です

これは人工ニューラルネットワークの非常に簡単な説明です

[[419321]]

導入

私は機械学習についてはよく知りませんが、先月、GitHub で Go のサンプル コードを含む、最小限の入門レベルのニューラル ネットワーク チュートリアルを見つけました。簡潔で分かりやすく、数式1行で原理を余計な説明をせずに説明でき、読んでとても満足しました。

このような良いものはもっと多くの人に見てもらいたいのですが、原文は英語で直接共有できないため、まず著者に連絡して翻訳の許可を得てから、Xiaoxiongxiongがこのプロジェクトを翻訳し、ようやく皆さんがご覧になる記事が完成しました。このプロセスは骨の折れる作業で、1 か月かかり、簡単ではありませんでした。読んでみて良かったと思ったら、ぜひ「いいね!」して、もっと多くの人にシェアしてください。

内容は2つの部分に分かれています:

  • パート1:最も単純な人工ニューラルネットワーク

  • パート2:最も基本的なバックプロパゲーションアルゴリズム

人工ニューラル ネットワークは人工知能の基盤です。しっかりとした基盤を築いてこそ、AI の魔法を活用できるのです。

温馨提示:数式はたくさんあるのですが、難しそうに見えます。実は、辛抱強く読んでいけば、理解するのは難しくありません。本文は以下から!

1. 最も単純な人工ニューラルネットワーク

最も単純な人工ニューラル ネットワークを理論とコードを通じて説明および実証します。

サンプルコード: https://github.com/gokadin/ai-simplest-network

理論

ニューロンのシミュレーション

人間の脳の働きにヒントを得た人工ニューラル ネットワークは、パターンを保存し、互いに通信するシミュレートされたニューロンを相互接続します。最も単純な形式では、シミュレートされたニューロンには 1 つ以上の入力値と 1 つの出力値があり、それぞれに重みがあります。

最も簡単に言えば、出力値は入力値に重みを掛けた合計です。

簡単な例

ネットワークの役割は、複数のパラメータを通じて複雑な関数をシミュレートし、一連の入力値が与えられたときに特定の出力値を取得することです。これらのパラメータは通常、私たち自身で決定するのが困難です。

ここで、2 つの重み値 および に対応する 2 つの入力値 を持つネットワークがあるとします。

ここで、必要な出力値が生成されように重みを調整する必要があります。

初期化中は、最適な値がわからないため、重みにランダムな値を割り当てることがよくあります。ここでは、簡単にするために、すべて 1 に初期化します。

この場合、得られるものは

エラー値

出力値が予想と異なる場合はエラーが発生します。

例えば、目標値を次のようにしたい場合、ここでの違いは次のようになります。

通常、誤差を測定するには分散(つまりコスト関数)を使用します。

入力値と出力値のセットが複数ある場合、誤差は各セットの分散の平均になります。

分散を使用して、出力値が予想される目標値からどれだけ離れているかを測定します。値を二乗することで、負の偏差の影響を取り除き、より大きな偏差(正か負かに関係なく)を持つ偏差をより顕著にすることができます。

エラーを修正するには、結果が目標値に近くなるように重みの値を調整する必要があります。この例では、1.0から0.5に減らすことで目標を達成できます。

ただし、ニューラル ネットワークには多くの異なる入力値と出力値が含まれることが多いため、これを自動的に行うには学習アルゴリズムが必要です。

勾配降下法

ここで、エラーを使用して、エラーを最小限に抑えるために調整する必要がある重みの値を見つける必要があります。しかしその前に、グラデーションの概念を理解しましょう。

グラデーションとは何ですか?

勾配は本質的には関数の最大傾きを指すベクトルです。勾配を表すために を使用します。これは単純に関数変数の偏微分のベクトル形式です。

2 つの変数の関数の場合、次の形式になります。

いくつかの数字を使った簡単な例を見てみましょう。関数があるとすると、勾配は次のようになります。

勾配降下法とは何ですか?

降下法は、勾配を通じて関数の最大傾斜の方向を見つけ、次に反対方向に小さなステップで複数回試行して関数のグローバル (場合によってはローカル) エラー値を最小化する重みを見つけることとして簡単に理解できます。

逆方向へのこの小さなステップを表すために、学習率と呼ばれる定数を使用し、これを式で表します。

値が大きすぎると、最小値を直接逃してしまう可能性がありますが、値が小さすぎると、ネットワークの学習に時間がかかり、浅い局所最小値に陥ってしまう可能性もあります。

この例では、2 つの重みについて、これらの 2 つの重みに関する誤差関数の勾配を見つける必要があります。

上記の式を覚えていますか?と については、それらを と に代入して、微積分の連鎖律を用いて勾配をそれぞれ計算することができる。

簡潔にするために、今後はこの用語を使用します。

勾配が得られたら、提案された学習率を使用して重みを次のように更新できます。

次に、エラー値が最小化されてゼロに近づくまでこのプロセスを繰り返します。

コードサンプル

添付の例では、勾配降下法を使用して、次のデータセットを 2 つの入力値と 1 つの出力値を持つニューラル ネットワークにトレーニングします。

トレーニングが完了すると、ネットワークは 2 つの 1 を入力すると ~0 を出力し、1 と 0 を入力すると ~1 を出力します。

どのように機能しますか?

行く

  1. PS D:\github\ai-simplest-network-master\src> go build -o bin/test.exe
  2. PS D:\github\ai-simplest-network-master\bin> ./test.exe
  3. エラー: 1.7930306267024234
  4. エラー: 1.1763080417089242
  5. エラー: 0.00011642621631266815
  6. エラー: 0.00010770190838306002
  7. エラー: 9.963134967988221e -05
  8. 111回の反復を経て完了
  9. 結果 - - - - - - - - - - -
  10. [ 1 1 ] => [ 0.007421243532258703 ]
  11. [ 1 0 ] => [ 0.9879921757260246 ]

ドッカー 

  1. 最も単純なネットワークを docker build -t します。
  2. docker run --rm 最もシンプルなネットワーク

2. 最も基本的なバックプロパゲーションアルゴリズム

バックプロパゲーション (BP) は、「エラー バックプロパゲーション」の略語です。これは、最適化手法 (勾配降下法など) と組み合わせて人工ニューラル ネットワークをトレーニングする一般的な方法です。

バックプロパゲーション技術は、少なくとも 1 つの隠し層を持つニューラル ネットワークをトレーニングするために使用できます。次に、理論から始めて、それをコードと組み合わせてバックプロパゲーションアルゴリズムを取得します。

サンプルコード: https://github.com/gokadin/ai-backpropagation

理論

パーセプトロン入門

パーセプトロンは、入力を受け取り、活性化関数を使用してそれを変換し、結果を出力する処理ユニットです。

ニューラル ネットワークでは、入力値は前のレイヤーのノードの出力値の加重合計と前のレイヤーのエラーを加えたものになります。

エラーをレイヤー内の定数-1を持つ別のノードとして扱うと、式は次のように簡略化できます。

活性化関数

活性化関数はなぜ必要なのでしょうか?そうでない場合、各ノードの出力は線形になり、ニューラル ネットワーク全体が入力値に基づく線形演算の出力になります。線形関数の組み合わせは依然として線形であるため、ニューラル ネットワークを線形回帰モデルと異なるものにするには、非線形関数を導入する必要があります。

の場合、典型的な活性化関数は次の形式になります。

シグモイド関数:

線形整流関数:

tanh関数:

バックプロパゲーション

バックプロパゲーション アルゴリズムは、人工ニューラル ネットワーク、特に 2 層以上のネットワークをトレーニングするために使用できます。

原理としては、フォワードパスを使用してネットワーク出力値と誤差を計算し、誤差勾配に応じて入力層の重み値を逆に更新します。

用語

  • これらはそれぞれI層、J層、K層ノードの入力値です。

  • これらはそれぞれI層、J層、K層ノードの出力値です。

  • K 出力ノードの期待出力値です。

  • それぞれレイヤーI~JとレイヤーJ~Kの重み値です。

  • T の関連付けセット内の現在の関連付けセットを表します。

次の例では、異なるレイヤーのノードに対して次の活性化関数を使用します。

  • 入力層 -> 恒等関数

  • 隠れ層 -> シグモイド関数

  • 出力層 -> 恒等関数

フォワードパス

フォワードパスでは、入力層で入力を受け取り、出力層で結果を取得します。

隠れ層の各ノードへの入力は、入力層の入力値の加重合計です。

隠れ層の活性化関数はシグモイドなので、出力は次のようになります。

同様に、出力層の入力値は

活性化関数として恒等関数を割り当てたので、このレイヤーの出力は入力値と等しくなります。

入力値がネットワークを通じて伝播されると、エラー値を計算できます。関連付けのセットが複数ある場合、最初の部分で学習した分散を覚えていますか?ここでは、平均二乗誤差を使用して誤差を計算できます。

バックワードパス

これでエラーが得られたので、それを逆伝播してネットワークの重みを修正することができます。

最初の部分の研究を通して、重みの調整は、重みに対する誤差の偏微分に学習率を乗じたものに基づいて行われることが分かっています。これは次の形式です。

連鎖律を使用して誤差勾配を次のように計算します。

したがって、重量の調整は

複数の関連付けがある場合、重み調整は各関連付けの重み調整の合計になります。

同様に、隠れ層間の重み調整については、上記の例を続けると、入力層と最初の隠れ層間の重み調整値は

そして、すべての関連に基づく重み調整は、各関連ごとに計算された調整値の合計である。

計算する

ここで、さらに詳しく調べることができます。上記を見ました。

前半は

後半では、この層でシグモイド関数を使用するので、シグモイド関数の微分形は次のように表せることが分かっています。

まとめると、計算式は次のようになります。

アルゴリズムの概要

まず、ネットワークの重みに小さなランダム値が割り当てられます。

エラーが 0 になるまで、次の手順を繰り返します。

  • 各関連付けについて、ニューラルネットワークに渡して出力値を取得します。

    • 各出力ノードの誤差を計算する()

    • 重ね合わせは各出力重みの勾配を計算する()

    • 隠れ層の各ノードの()を計算する

    • 重ね合わせは各隠れ層の重みの勾配を計算します()

  • すべての重み値を更新し、オーバーレイの勾配をリセットします()

バックプロパゲーション図

この例では、実際のデータを使用してニューラル ネットワークの各ステップをシミュレートします。入力値は[1.0, 1.0]で、期待される出力値は[0.5]です。簡単にするために、重みを 0.5 に初期化します (ただし、実際にはランダムな値がよく使用されます)。入力層、隠れ層、出力層では、活性化関数としてそれぞれ恒等関数、シグモイド関数、恒等関数を使用し、学習率は 0.01 に設定されています。

前方パス

操作の開始時に、入力層のノード入力値を に設定します。

入力層の活性化関数として恒等関数を使用するため、次のようになります。

次に、前の層の重み付け和をとって、ネットワークをJ層に渡します。

次に、J 層ノードの値をシグモイド関数に入力します ( に代入すると、0.731 が得られます)。

最後に、この結果を最終出力層に渡します。

出力層の活性化関数も恒等関数なので、

バックパス

バックプロパゲーションの最初のステップは、出力ノードを計算することです。

2 つのレイヤー J と K のノード間の重み勾配は次のように計算されます。

次に、同じ方法で各隠し層の値を計算します (この例では、隠し層は 1 つだけです)。

I 層および J 層のノード重みの勾配は次のように計算されます。

最後のステップは、計算された勾配を使用してすべての重みを更新することです。複数の関連付けがある場合は、関連付けの各セットの勾配を累積してから重みを更新できることに注意してください。

重みの値はほとんど変化していないことがわかりますが、この重みでフォワードパスを再度実行すると、通常、以前よりもエラーが小さくなります。では、見てみましょう…

最初のパスは、新しい重み値を使用して計算されます。

したがって、、そして。

誤差が減ったのが分かります!縮小は小さいですが、実際のシーンを再現しています。アルゴリズムを繰り返し実行することで、エラーは一般的に 0 にまで減少し、ニューラル ネットワークのトレーニングが完了します。

コードサンプル

この例では、2X2X1 ネットワークが XOR 演算子の効果を生成するようにトレーニングされます。

ここで、f は隠れ層のシグモイド活性化関数です。

データセットの分布が非線形であるため、最初の部分では XOR 演算子を線形ネットワークでシミュレートできないことに注意してください。つまり、XOR の 4 つの入力値を直線で 2 つのカテゴリに正しく分割することはできません。シグモイド関数を恒等関数に置き換えると、このネットワークも実行不可能になります。

ここまで言ったら、次はあなたが自分でやる番です!さまざまな活性化関数、学習率、ネットワーク トポロジを使用して、結果を確認してください。

許可をいただいた原作者に感謝します:

<<:  解読: ボストン ダイナミクスがアルゴリズムを使用してアトラス ロボットの感覚世界を構築する方法

>>:  4つの主要な応用分野が開拓され、外骨格ロボットのブルーオーシャンが出現している

推薦する

海外の科学者が「AI漢方」を開発:舌診断システムの精度は最大94%

10月23日、中国医学では2000年以上もの間、人の舌の色や形を観察して病気を診断してきたと報じら...

...

それでおしまい? Gptsのプロンプト単語をランダムにクロールします

11月7日のOpenAI開発者会議でサム・アルトマンがGptsを正式に発表しリリースして以来、Gpt...

NLP モデルは人間のレベルを超えるか?大きな詐欺に遭ったかもしれない

[[276457]]ビッグデータダイジェスト制作出典: thegradient編纂者:張瑞怡、呉帥、...

分類アルゴリズムの概要

[[154315]]決定木分類アルゴリズム決定木誘導は古典的な分類アルゴリズムです。これは、トップダ...

OpenAI のもう一つの「大ヒット作」: AI に芸術的創造性を与える

OpenAIがまた爆弾発言をしました。昨年夏に人気の言語モデルGPT-3を発表したOpenAIの研究...

...

魔法の顔認識: たとえマスクやサングラスをかけていても、身近な人を認識できるのはなぜでしょうか?

見知らぬ人々の集団の中に見覚えのある人を見つけたり、とても見覚えのある顔を見かけたりします。その人は...

ガートナーの予測: データレイクの90%は役に立たなくなる

ガートナーは以前、2018 年までにデータ レイクの 90% が生データで満たされ、そのテクノロジを...

AIエンジニアの年収はわずか50万元程度で、年間100万元を稼ぐには長年の経験が必要です。

[[259190]]近年、人工知能技術のあらゆる分野への応用がますます普及し、関連する専門的・技術...

ユーザーエクスペリエンスは過去のものになりました。AIは国民、さらには社会の視点から問題を考える必要があります。

今日、テクノロジーの巨人とその AI ベースのデジタル プラットフォームおよびソリューションは、世界...

人工知能の時代において、ロボットを超える子どもたちが身につけるべき能力とは何でしょうか?

[[428042]]今後予測できることは、人工知能の時代が徐々に深まり、私たちの生活がSF映画のリ...

自動運転が何千もの家庭に普及するまでにどれくらいの時間がかかるのでしょうか?

2019年9月に百度、海亮科技、センスタイムなどの企業が世界初の自動運転車の商用ライセンスを取得し...

...

AIテスト:自動運転車のテストに関するケーススタディ

編集者注:最近、清華大学自動化学部システム工学研究所の李立准教授を筆頭著者として、林一倫、鄭南寧、王...