見出し画像

機械学習における最も重要なアルゴリズム

GPTやM journeyからAlpha foldや様々な脳のモデルに至るまで、ほぼ全ての機械学習システムに共通点があります。全く異なる問題を解決するために設計され、まったく異なるアーキテクチャを持ち、異なるデータで訓練されているにもかかわらず、それらすべてを結びつけるものがあります。それは、全ての場合のトレーニング手順の裏で動作している単一のアルゴリズムです。このアルゴリズムは「バックプロパゲーション」と呼ばれ、機械学習分野全体の基盤となっています。その詳細はしばしば見過ごされがちですが、驚くべきことに、人工ニューラルネットワークに学習を可能にするものは、同時に脳と根本的に異なり、生物学的に両立しないものでもあるのです。
この動画は2部構成のシリーズの第1部です。今日は、人工システムにおけるバックプロパゲーションの概念を探求し、それが何であるか、なぜ機能するのか、そしてどのようにしてゼロから開発できたのかについて直感的な理解を深めていきます。次の動画では、生物学的な脳での学習を可能にするシナプス可塑性に焦点を当て、バックプロパゲーションが生物学的に妥当かどうか、そうでない場合、脳がどのようなアルゴリズムを使用している可能性があるかについて議論します。興味がある方はぜひご覧ください。
その変革的な影響にもかかわらず、誰がバックプロパゲーションを最初に発明したのかを断言するのは難しいです。特定の概念は17世紀のライプニッツにまで遡ることができますが、現在も使用されている最初の現代的な定式化は、1970年にセポ・リンナルの修士論文で発表されたと考えられています。ただし、彼は明示的にニューラルネットワークには言及していませんでした。もう一つの重要な節目は1986年に訪れました。デビッド・ルメルハート、ジェフリー・ヒントン、ロナルド・ウィリアムズが「誤差逆伝播による表現の学習」というタイトルの論文を発表しました。彼らはバックプロパゲーションアルゴリズムを多層パーセプトロン(ニューラルネットワークの一種)に適用し、バックプロパゲーションでトレーニングすることで、ネットワークがタスクの重要な規則性を捉えた隠れニューロンレベルで意味のある表現を開発し、問題を成功裏に解決できることを初めて実証しました。
分野が進歩するにつれ、研究者たちはこれらのモデルを大幅にスケールアップし、さまざまなアーキテクチャを導入しましたが、トレーニングの基本原則は大きく変わりませんでした。
ネットワークをトレーニングするとはどういうことなのか包括的に理解するために、バックプロパゲーションの概念を一から構築してみましょう。次の問題を考えてみてください。平面上にX,Yの点のセットを収集したとして、その関係を記述したいとします。これを達成するには、データを最もよく表す曲線y(x)を当てはめる必要があります。可能な関数は無限にあるので、いくつかの仮定を設ける必要があります。例えば、5次の多項式を使ってデータの滑らかな近似を見つけたいとしましょう。つまり、求めている結果の曲線は、定数項、1次の多項式(直線)、2次の多項式(放物線)などから5次の項までの組み合わせで、それぞれ特定の係数で重み付けされたものになります。言い換えれば、曲線の方程式は次のようになります:
y = k0 + k1x + k2x² + k3x³ + k4x⁴ + k5x⁵
ここで、各kは任意の実数です。私たちの仕事は、最も適合する曲線をもたらすk0からk5の設定を見つけることになります。
問題を完全に曖昧さのないものにするには、「最良の曲線」が何を意味するのかについて合意する必要があります。データポイントを視覚的に検査して、与えられた曲線がパターンを捉えているかどうかを推定することはできますが、この方法は非常に主観的で、大規模なデータセットを扱う際には実用的ではありません。代わりに、客観的な測定、つまり適合の質を定量化する数値が必要です。
一般的な方法の一つは、データポイントと当てはめた曲線との間の二乗距離を測定することです。高い値は、データポイントが曲線から大きく離れていることを示し、不適切な近似を意味します。逆に、低い値は曲線がデータポイントに密接に沿っているため、より良い適合を示します。この測定は一般に「損失」と呼ばれ、目的はこれを最小化することです。
固定されたデータに対して、この距離、つまり損失の値は、曲線の定義特性のみに依存することに注目してください。今回の場合、k0からk5の係数です。これは実質的にパラメータの関数であることを意味し、そのため通常「損失関数」と呼ばれます。
ここで、暗黙のうちに扱っている2つの異なる関数を混同しないことが重要です。1つ目は、1つの入力数と1つの出力数を持ち、曲線自体を定義するy(x)関数です。これはkで与えられる多項式の形を持ちます。このような関数は無限にあり、私たちは最良のものを見つけたいのです。これを達成するために、損失関数を導入します。これは代わりに6つの入力数(k0からk5)を持ち、各設定に対して対応する曲線yを構築し、観測されたデータポイントと曲線との距離を計算し、単一の数値、つまり損失の特定の値を出力します。
私たちの仕事は、損失を最小にするkの設定を見つける、つまり係数に関して損失関数を最小化することになります。そして、これらの最適なkを曲線の一般方程式に代入すれば、データを最もよく表す最良の曲線が得られます。
よし、素晴らしい。でも、損失を最小化するこの魔法のようなkの設定をどうやって見つけるのでしょうか?ここで少し助けが必要かもしれません。手動計算を簡略化するために設計された「Curve fitter 6000」というマシンを作ってみましょう。このマシンにはk0からk5用の6つの調整可能なノブが装備されており、自由に回すことができます。
まず、マシンにデータポイントを初期化します。そして、ノブの各設定に対して、曲線y(x)を評価し、データポイントとの距離を計算し、損失関数の値を出力します。これで、損失を最小にするためにノブをひねり始めることができます。
例えば、ある初期設定から始めて、ノブ1を少し右に動かしてみましょう。結果として曲線が変化し、損失関数の値が少し減少したことがわかります。素晴らしい、正しい方向に進んでいるようです。ノブ1をもう一度同じ方向に回してみましょう。おっと、今回はフィットが悪くなり、損失関数が増加しました。どうやら最後の動きが少し大きすぎたようです。そこで、ノブを前の位置に戻し、ノブ2を試してみましょう。
このように、各ノブを一度に1つずつ少しずつ動かし、結果の曲線がより適合しているかどうかを確認する作業を何度も繰り返すことができます。これは「ランダム摂動法」と呼ばれ、基本的に暗闇の中をさまよっているようなものです。各調整が損失関数にどのように影響するかを事前に知ることはできません。これは確かに機能しますが、非常に効率的とは言えません。
ノブの調整について、もっと賢明な方法はないでしょうか?最も一般的なケースでは、マシンが完全なブラックボックスの場合、ランダムな摂動以上のものは保証されません。しかし、私たちのカーブフィッターの下で行われる計算を含む多くの計算には、特別な特性があります。それは「微分可能性」と呼ばれるもので、最適なノブ設定をはるかに効率的に計算することを可能にします。
微分可能性が何を意味するのかについては、すぐに詳しく説明しますが、今は私たちがどこに向かっているのかの大まかな全体像を簡単に見てみましょう。私たちの目標は、マシンをアップグレードして、各ノブの横に小さな画面を付け、どの設定でも、損失関数を減少させるためにどの方向にノブを動かす必要があるか、そしてどれくらい動かすべきかを表示することです。
少し考えてみてください。私たちは基本的に、マシンに未来を予測させ、ノブの調整が損失関数に与える影響を、実際に調整を行わずに推定するよう求めています。以前のように、損失を計算してからノブを元に戻すのではありません。この未来への一瞥は、何か原則に違反しているのではないでしょうか?結局のところ、計算を実行せずに結果に飛びついているように聞こえます。これはズルのように聞こえませんか?
実は、この考えは非常に単純な数学的基礎の上に成り立っています。次の数分で、これをゼロから構築してみましょう。
まず、より単純なケースを考えてみましょう。6つのノブのうち5つを固定します。例えば、誰かがあなたに、残りのノブはすでに最適な位置にあると教えてくれたとします。そうすると、あなたがする必要があるのは、残りの1つのkn(例えばk1)の最良の値を見つけることだけです。
本質的に、マシンには今、私たちが調整できる1つの可変パラメータk1しかありません。そのため、損失関数も、1つの数値(ノブの設定)を受け取り、別の数値(損失値)を出力するより単純な関数になります。
1つの変数の関数として、これは2次元平面上のグラフとして便利に視覚化できます。このグラフは入力と出力の関係を捉えています。例えば、このような形になるかもしれません。そして、私たちの目標は、損失関数の最小値に対応するこのk1の値を見つけることです。
しかし、私たちには真の基礎となる形状へのアクセスはありません。私たちにできるのは、選んだ位置にノブを設定し、いわばマシンに損失の値を問い合わせることだけです。言い換えれば、私たちは最小化しようとしている関数に沿って個々の点をサンプリングすることしかできず、本質的に、知られている点の間で関数がどのように振る舞うかについては、サンプリングするまで盲目的です。
しかし、関数についてもっと知りたいとしましょう。各点での値だけでなく、例えばこの点で関数が上昇しているのか下降しているのかを知りたいとします。この情報は最終的に私たちの調整を導くことになります。なぜなら、入力を増やすにつれて関数が下降していることがわかれば、ノブを右に回すのは安全な賭けです。この操作で損失を確実に減少させることができるからです。
この点の周りでの「上昇」または「下降」の概念をより強固な数学的基盤の上に置いてみましょう。このグラフ上で点(x, k(n), y(k(n)))をサンプリングしたとします。私たちができるのは、入力を小さな量Δxだけ増やすことです。この新しく調整された入力は、古い値とΔyだけ異なる新しいyの値をもたらします。
このΔは私たちの調整の大きさに依存します。例えば、10倍小さいΔxのステップを取れば、Δyも約10倍小さくなります。そのため、Δy/Δxの比を取るのが理にかなっています。入力の単位変化あたりの出力の変化量です。
グラフィカルに、この比は点(x, y(k(n)))と(x+Δx, y(k(n))+Δy)を通る直線の傾きに対応します。
ここで注目すべきは、より小さなステップを取るにつれて、この直線が点(x, y(k(n)))の近傍のグラフにより正確に沿っていくということです。Δxが無限に小さな値に近づく極限をとると、この比が収束する極限値が、関数の「導関数」と呼ばれるものです。これはdy/dxと表記されます。
視覚的には、ある点での関数の導関数は、グラフに接する線の傾きであり、その点周辺での関数の瞬間的な変化率または急峻さに対応します。しかし、グラフに沿った異なる点では、異なる急峻さの値を持つ可能性があります。そのため、関数全体の導関数は単一の数値ではありません。
実際、導関数dy/dx(x)はそれ自体がxの関数であり、任意のxの値を取り、その点でのy(x)の局所的な急峻さを出力します。この定義は、すべての関数にその導関数の分身を割り当てます。これは同じ入力ドメインで動作する別の関数で、元の関数の急峻さに関する情報を保持します。
ここには少し微妙な点があります。厳密に言えば、関数がある点の周りで急峻さを持たない場合、例えば鋭い角や不連続性がある場合、導関数は存在しない可能性があります。しかし、このビデオの残りの部分では、私たちが扱うすべての関数が滑らかであり、常に導関数が存在すると仮定します。これは合理的な主張です。なぜなら、モデルを構築する際に、どのような関数が入力されるかを制御でき、通常、人々はすべての数学がうまく機能するように、すべてを滑らかまたは微分可能な関数に制限するからです。
さて、素晴らしい。k1の関数としての基礎となる損失と共に、私たちはk1のもう一つの関数である導関数についても推論できます。これも私たちには分かりませんが、その点での損失関数の急峻さに等しいものです。
マシンを実行して個々のサンプルを得ることで損失関数を問い合わせできるのと同様に、導関数関数もサンプリングするメカニズムがあると仮定しましょう。つまり、k1の各入力値に対して、マシンは損失の値とその点周辺の損失関数の局所的な急峻さを出力します。
この導関数情報は、まさに私たちがより賢明なノブ調整を行うために探していた未来への洞察です。例えば、これを使ってk1の最適値を効率的に見つけることができます。
私たちができるのは次のようなことです:

まず、ランダムな位置から始めます。
その位置での損失の値と損失関数の導関数を機械に尋ねます。
導関数の反対方向に小さなステップを取ります。
導関数が負の場合、関数が下降していることを意味し、最小値に到達したい場合はk1の値を増加させる方向に移動する必要があります。
導関数がゼロになる点に到達するまで、この手順を繰り返します。これは本質的に、接線が平らになる最小値に対応します。

基本的に、このようなガイド付きの各調整は、グラフに沿って丘を転がり落ちるボールのように機能し、谷に到達するまで続きます。
最初は簡単のために6つのノブのうち5つを固定しましたが、このプロセスは簡単により高次元に拡張できます。例えば、今度は2つの異なるノブk1とk2を自由に調整できるとします。損失は2つの変数の関数となり、表面として視覚化できます。
しかし、導関数はどうでしょうか?定義によると、各点での導関数は入力の単位変化あたりの出力の変化を示します。しかし、今や2つの異なる入力があります。k1だけを動かすべきか、k2だけか、それとも両方か?
本質的に、私たちの関数は2つの異なる導関数を持つことになります。これらは通常、この曖昧さのために「偏導関数」と呼ばれます。つまり、どの入力を動かすかという曖昧さです。
例えば、2つのノブがある場合、パラメータk1に関する損失関数の導関数はこのように書かれます:∂L/∂k1。これは、k2を一定に保ちながらk1の単位変化あたりの出力の変化量を示します。
逆に、この表現:∂L/∂k2は、k1を一定に保ちながらk2を少し動かした場合の出力の変化率を示します。
幾何学的には、興味のある点(k1, k2)で交差する軸に平行な平面で表面を切断することを想像できます。各断面は、他の1つが一定に保たれている間の1つの変数の関数としての損失の1次元グラフのようなものです。そして、各断面での接線の傾きが、その点での損失の対応する偏導関数を与えます。
偏導関数を各変数に対する2つの別々の表面として考えるのは完全に有効な方法ですが、人々は通常、2つの異なる値を「勾配ベクトル」と呼ばれるベクトルにプラグインします。本質的に、これは2つの入力値から別の2つの数値へのマッピングです。最初の数値は最初の入力のわずかな変化に対する出力の変化量を示し、2番目の入力についても同様です。
幾何学的に、このベクトルは最も急な上昇の方向を指します。そのため、損失のような関数を最小化したい場合は、この勾配ベクトルの反対方向にステップを取る必要があります。
勾配ベクトルの反対方向にパラメータを動かすこの反復的な手順は「勾配降下法」と呼ばれ、おそらく聞いたことがあるでしょう。これは2次元の場合の丘を転がり落ちるボールに類似しており、偏導関数は本質的にどの方向が下り坂かを教えてくれます。
2次元を超えると直接視覚化することは不可能ですが、数学は全く同じままです。例えば、今度は6つのノブすべてを自由に調整できるとします。損失関数は6次元の超曲面となり、勾配ベクトルには6つの数値が詰め込まれます。しかし、それでも最も急な上昇の方向を指し示すので、その反対方向に小さなステップを反復的に取れば、6次元で丘を転がり落とし、最終的に損失関数の最小値に到達します。
素晴らしい、少し戻ってみましょう。最適な調整の方向を示す画面を各ノブの横に追加する方法を探していたことを思い出してください。それは本質的に勾配ベクトルの成分に他なりません。特定の設定でk1に関する損失の偏導関数が正の場合、k1を増やすと損失が増加することを意味します。そのため、ノブを左に回して値を減少させる必要があります。他のパラメータについても同様です。
これが、導関数が関数のローカルな振る舞いに関する情報を提供することで、未来への窓として機能する方法です。そして、導関数にアクセスする方法があれば、勾配降下法を実行し、損失関数の最小値を効率的に見つけることができ、最適化問題を解決できます。
しかし、部屋には象がいます。これまで、導関数の情報が与えられている、または損失関数自体をサンプリングするのと同様に、与えられた点で導関数をサンプリングできると暗黙のうちに仮定してきました。しかし、実際にどのように導関数を見つけるのでしょうか?
これから見ていくように、これがバックプロパゲーションアルゴリズムの主な目的です。本質的に、任意に複雑な関数の導関数を見つける方法は以下の通りです:
まず、微積分から知られている単純な関数の導関数である、いくつかの基本的な構成要素から始めます。これらは、大学でよく暗記する種類の導関数の公式です。例えば:

関数が線形の場合、その導関数は明らかに定数で、その線の傾きに等しく、どこでも自身の接線と一致します。
放物線x²は、xを増やすにつれてより急になり、その導関数は実際に2xです。
実際、x^nの導関数に対するより一般的な公式があります。
同様に、指数関数や対数関数の導関数も明示的に書き下すことができます。

しかし、これらは単純な周知の関数の個々の例に過ぎません。任意の導関数を計算するには、このような原子的な構成要素を組み合わせる方法が必要です。
これを行うためのいくつかのルールがあります。例えば:

2つの関数の和の導関数は、導関数の和です。
2つの関数の積の導関数に対する公式もあります。

これにより、3x² - e^xのような式の導関数を計算することができます。
しかし、全体像を完成させ、ほぼすべてのものの導関数を見つけることができるようにするには、もう1つのルールが必要です。これは「連鎖律」と呼ばれ、機械学習の分野全体を支えています。
連鎖律は、一方が他方の入力となる2つの関数の組み合わせの導関数を計算する方法を教えてくれます。これについて推論する方法は次の通りです:
単一の入力xを受け取り、ノブで変更可能で、出力j(x)を吐き出すより単純なマシンの1つを考えてみましょう。次に、異なる関数f(x)を実行する同じ種類の2番目のマシンを取ります。
これらを順番に接続して、最初のマシンの出力が2番目のマシンの入力として供給されるとどうなるでしょうか?このような構造は単一の関数と見なすことができます。2番目の関数への入力はj(x)であり、したがって2番目のマシンの局所的な変化率は、点j(x)で評価されたfの導関数です。
今、ノブxを微小量Δだけ動かすと想像してください。その入力の変化が最初のマシンから出てくると、jの導関数によって乗算されます。なぜなら、導関数は入力の単位変化あたりの出力の変化率だからです。
そのため、最初の関数の後、出力はΔに導関数jを掛けたものだけ増加します。この表現は本質的に2番目のマシンへの入力の微小な変化であり、その点での導関数はこの表現で与えられます。
これは、入力のΔ増加ごとに、出力をこれだけ増加させることを意味します。したがって、それをΔで割った導関数はこのように見えます:
(df/dx)(x) = (df/dj)(j(x)) * (dj/dx)(x)
これについて、3つの相互接続された歯車のセットとして考えることができます。最初の歯車は入力ノブxを表し、他の2つの歯車はそれぞれj(x)とf(j(x))の関数を表します。最初の歯車を動かすと、中間の歯車に変化を引き起こし、その変化の振幅はjの導関数で与えられます。これが今度は3番目の歯車を回転させ、その結果の変化の振幅は導関数を連鎖させることで与えられます。
素晴らしい、これで任意の複雑な関数の導関数を得る直接的な方法ができました。それが単純な関数(明示的な導関数の公式を持つ)の構成要素、例えば和、積、指数、対数などに分解できる限り。
しかし、これをどのように使ってカーブフィッターを使用して最良の曲線を見つけることができるでしょうか?私たちが目指している大きな絵は次のようなものです:
各パラメータノブについて、簡単に微分可能な操作の観点からそれが損失に与える影響を書き下します。一連の構成要素ができたら、それがどれほど長くても、各要素に連鎖律を順次適用して、入力ノブそれぞれに関する損失関数の導関数の値を見つけ、反復的な勾配降下を実行して損失を最小化できるはずです。
例を見てみましょう。まず、損失関数が依存する可能性のある各数値にノブを作成します。これには明らかにパラメータが含まれますが、データ自体、つまり我々が曲線をフィットしようとしている点の座標も含まれます。
最適化の間、データポイントは固定されているので、より低い損失を得るためにそれらを変更することは意味がありません。しかし、概念上の目的のために、これらの値を1つの位置に固定された動かせないノブとして考えることができます。
既存のすべての数値がマシンに供給されると、損失計算の分解を始めることができます。定義により、損失は各点から曲線までの垂直距離の二乗和です。曲線はkによってパラメータ化されています。
例えば、最初のデータポイント(x1, y1)を取り、x座標をk1倍し、それにx1の2乗にk2を掛けたものを加え、他のkについても同様に続けます。k0の定数項も含めます。x1のこの重み付けされたべき乗の和は、現在の曲線によって予測されるyの値f(x1)です。これをy1_hatと呼びましょう。
次に、実際の値と予測値の二乗差を取る必要があります。これが最初のデータポイントが結果の損失関数の値にどれだけ寄与するかを示します。
残りのすべてのデータポイントに対して同じ手順を繰り返し、結果の二乗距離を合計すると、私たちが最小化しようとしている全体的な総損失が得られます。
私たちが今行った計算、つまりパラメータとデータノブの特定の設定に対する損失の値を見つけることは、「順伝播」として知られています。計算の全シーケンスは、各ノードが加算や乗算などの単純な操作である一種の計算グラフとして視覚化できます。
順伝播は、左から右へ計算が流れることに対応します。しかし、最適化を行うためには、勾配に関する情報、つまり各ノブが損失にどのように影響するかについての情報も必要です。
ここで私たちは「逆伝播」と呼ばれるものを行います。計算のシーケンスを逆順に展開して導関数を見つけます。
逆伝播を可能にするのは、計算グラフの各ノードが容易に微分可能な操作であるという事実です。個々のノードを単純に加算、乗算、またはべき乗を行う小さなマシンと考えてください。私たちはそれらの導関数を知っており、それらの出力が順次接続されているため、連鎖律を適用できます。
つまり、各ノードについて、そのノードに関する出力損失の偏導関数である勾配を見つけることができます。
これがどのように行われるか見てみましょう。2つの数値ノードAとBが加算を行うマシンに供給され、その結果A+Bがさらにシステムによって処理されて全体的な出力Lを計算する計算グラフの領域を考えてみましょう。
A+Bの勾配をすでに計算したと仮定します。つまり、この和を動かすことが出力にどのように影響するかを知っています。問題は、AとBの個々の勾配は何かということです。
直感的に、Aをある量だけ動かすと、A+Bも同じ量だけ動くので、Aに関する損失の偏導関数(勾配)は和の勾配と同じになります。Bについても同様です。
これは、連鎖律を書き下して、A+BをAで偏微分すると単に1になることに注目すると、より形式的に見ることができます。
言い換えれば、計算グラフでこの状況に遭遇した場合、和の勾配は単純に和に接続されるノードの勾配に伝播します。
もう1つの可能なシナリオは、AとBが乗算される場合です。先ほどと同様に、それらの積の勾配がすでに計算されているとします。この場合、Aの個々の動きはB倍でスケーリングされるので、積はB倍だけ動き、それが出力に伝播します。
したがって、ABの積に関する出力の導関数が何であれ、Aに関する出力の導関数はB倍にスケーリングされ、Bの勾配についても逆も成り立ちます。
ここでも、連鎖律を調べることでより形式的に見ることができます。言い換えれば、計算グラフの乗算ノードは、下流の勾配を入力ノードに分配し、それらの値を交差して掛けます。
べき乗を取ることや対数を取ることなど、他の基本的な計算のための同様のルールを簡単に定式化できます。
最後に、単一のノードが計算グラフの複数の枝に関与する場合、対応する枝からの勾配は単純に加算されます。
実際、次のような構造がグラフにあるとします。同じノードAが2つの異なる操作にプラグインし、全体の損失に寄与しています。この場合、AをΔだけ動かすと、出力は最初の枝からのこの導関数と2番目の枝からのこの導関数によって同時に動かされます。したがって、Aを動かす全体的な効果は2つの勾配の和になります。
素晴らしい、計算グラフを構築し、それをどのように個別のチャンクで処理するかを確立したので、出力から始めて後ろ向きに順次これらのルールを適用するだけです。
例えば、グラフの最も右のノードは損失関数の結果値です。そのノードの増分変化が出力にどのように影響するでしょうか?それは出力そのものなので、その勾配は定義上1に等しくなります。
次に、損失関数は多くのΔy²の和です。和のノードをどうするか知っています。それは単に右側の勾配値をすべての入力ノードにコピーします。
したがって、すべてのΔy²の勾配も1に等しくなります。これらの各ノードは対応するΔyの二乗値であり、この二乗操作をどのように微分するか知っています。Δy1に関する損失関数の導関数は2*Δy1になります。これは順伝播計算中に見つけた数値に過ぎません。
このように、計算グラフに沿って後ろ向きに導関数計算を順次伝播し続けることができ、最終的に最も左のノード、つまりデータとパラメータノブに到達します。
損失に関する入力データの導関数は実際には重要ではありませんが、パラメータに関する導関数はまさに私たちが求めているものです。
これらのパラメータ勾配が見つかったら、勾配降下の1回の反復を実行できます。つまり、勾配の反対方向にノブを少し動かします。各調整の正確な大きさは、勾配と学習率と呼ばれる小さな数(例えば0.01)の負の積になります。
調整が行われた後、マシンの設定と結果の損失が異なるため、見つけた古い勾配値はもはや有効ではありません。そのため、更新された勾配と新しく減少した損失を得るために、順伝播と逆伝播の計算を再度実行する必要があります。
順伝播、逆伝播、調整、繰り返しのこのループを実行することが、現代のすべての機械学習システムのトレーニングの本質であり、最も複雑なモデルでも全く同じアルゴリズムが使用されています。
特定のモデルアーキテクチャで解決しようとしている問題が、微分可能な個々の操作に分解できる限り、連鎖律を何度も順次適用してパラメータの最適な設定に到達することができます。
例えば、フィードフォワードニューラルネットワークは本質的に、層間にいくつかの非線形活性化関数が散りばめられた乗算と和の集まりです。これらの原子的な計算のそれぞれが微分可能なので、計算グラフを構築し、それに対して逆伝播を実行して、ニューロン間の接続の重みなどの各パラメータが損失関数にどのように影響するかを見つけることができます。
そして、ニューラルネットワークは十分なニューロンがあれば、理論的には想像できるあらゆる関数を近似できるため、画像の分類や新しいテキストの生成などの問題を解決するために、これらの構成要素の数学的機械の十分に大きなシーケンスを作成できます。
これは非常にエレガントで効率的な解決策のように思えます。結局のところ、最適化問題を解決したい場合、導関数は正確にどの調整が必要かを教えてくれます。しかし、これは脳が実際に歩くこと、話すこと、読むことを学ぶときに行っていることとどれほど似ているでしょうか?脳もある種の損失関数を最小化しているのでしょうか?導関数を計算しているのでしょうか?それとも、全く異なることをしている可能性があるのでしょうか?
次の動画では、シナプス可塑性の世界に飛び込み、生物学的なニューラルネットワークがどのように学習するかについて話し合います。
生物学的学習のトピックに沿って、このチャンネルの長年のパートナーであるShortformにシャウトアウトを送りたいと思います。Shortformは、精神をよりよく理解し、より健康でより賢くなるのに役立つプラットフォームです。まだまだ興味深いトピックが控えています。さようなら、そして脳への関心をありがとうございました。

この記事が気に入ったらサポートをしてみませんか?