誤差逆伝播とは何か
誤差逆伝播は、ニューラルネットワーク(入力から出力を作るために、たくさんの重みと計算の層を持つ仕組み)が「予測を外したときに、どこをどれくらい直せばよいか」を計算する方法です。学習とは、重み(入力に掛ける係数)やバイアス(出力を少しずらすための係数)を少しずつ調整して、予測のズレを小さくしていく作業ですが、その調整量を決めるために誤差逆伝播が使われます。
名前にある「誤差」は、モデルの出力と正解の差のことです。たとえば、上がるか下がるかを当てたいのに外した、価格を予測したけど実際と違った、といったズレが誤差になります。そして「逆伝播」は、計算の向きが「逆向き」になることを指しています。ニューラルネットワークは、入力から出力へ向かって順番に計算していきます。これを順伝播(入力から出力へ進む計算の流れ)と言います。一方で、誤差逆伝播では、出力側で分かった誤差を手がかりにして、出力に近い層から入力に近い層へ向かって、順番に「この重みが誤差にどれくらい影響したか」を計算していきます。だから逆伝播です。
もう少し具体的に言うと、誤差逆伝播は「各パラメータを少しだけ動かしたら、誤差がどれくらい変わるか」を求める計算です。この「少しだけ動かしたらどれくらい変わるか」という考え方は、微分(ある量を少し動かしたときの変化の割合)で表せます。誤差逆伝播は、重みやバイアスごとに、この微分の値を効率よく計算します。ここで出てくる微分の値は勾配(誤差を減らすための方向と強さを表す値)とも呼ばれます。
大事なのは、誤差逆伝播そのものが「重みを更新する」作業ではないことです。誤差逆伝播は、更新に必要な材料である勾配を計算する方法です。実際に重みをどう動かすかは、勾配降下法(勾配の向きに沿って誤差が小さくなる方向へ進めるやり方)などの別の手順が担当します。誤差逆伝播は、その別の手順が正しく動けるように、重みごとの勾配を揃えて渡す役割を持っています。
誤差逆伝播が重要なのは、パラメータの数が非常に多くても計算が成り立つからです。ニューラルネットワークでは、重みが何千、何万、場合によってはそれ以上になります。もし重みを1つずつ試しに少し動かして誤差の変化を測るようなやり方をすると、計算回数が増えすぎて現実的ではなくなります。誤差逆伝播は、順伝播で計算した途中結果を利用しながら、連鎖律(複数の計算がつながったときの微分のルール)を使って、必要な勾配をまとめて計算できるようにしています。
まとめると、誤差逆伝播は「予測のズレが出たとき、そのズレを減らすために、どの重みをどちらにどれくらい動かせばよいか」を決めるための勾配を、出力側から入力側へ向かって計算する方法です。これが、ニューラルネットワークが学習できるようになるための中心的な仕組みです。
誤差逆伝播が必要になる場面
誤差逆伝播が必要になるのは、ニューラルネットワークが「自分の出力を正解に近づけるように学ぶ」ときです。学ぶというのは、入力から出力を作る途中にある重みやバイアスを少しずつ調整して、同じ入力を入れたときに出力がより望ましい値になるように変えていくことです。この調整は、闇雲に動かすのではなく、「どの重みを、どちら向きに、どの程度動かせば、誤差が減る可能性が高いか」を根拠を持って決める必要があります。その根拠として使われるのが、誤差を各パラメータで微分した値です。
たとえば、過去のデータから「次の値が上がるか下がるか」を当てたい分類(複数の選択肢のどれに当てはまるかを当てる問題)では、モデルの出力は確率のような値になります。正解は上か下のどちらかなので、出力が正解に寄っていないと誤差が大きくなります。このとき誤差逆伝播を使うと、出力のズレがネットワークのどの層のどの重みにどれだけ関係しているかを計算し、次に動かす方向を作れます。
数値そのものを予測する回帰(連続した数値を当てる問題)でも同じです。たとえば次の価格や変化量を出力するモデルでは、予測値と実測値の差が誤差になります。誤差が出たとき、原因は入力の扱い方にあるのか、途中の層の組み合わせ方にあるのか、最後の出力に近い部分にあるのかは、見た目だけでは分かりません。誤差逆伝播は、その差がどの計算の積み重ねによって生まれたかをたどりながら、各パラメータが誤差に与えた影響の大きさを数値として出します。
もう少し現実の作業に寄せると、学習には通常、たくさんのデータを使います。1件のデータだけを見て重みを大きく変えると、たまたまその1件に合わせただけになってしまい、別のデータでは当たらなくなることがあります。そこで小さな更新を何度も繰り返して、全体として誤差が下がる方向へ少しずつ寄せていきます。この「小さな更新」を成立させるためには、重みを少し動かしたときに誤差がどう変わるかという情報が必要で、誤差逆伝播はそれを毎回用意します。
また、ニューラルネットワークの特徴は、活性化関数を挟んで非線形(入力が増えたら出力も比例して増える、という単純な関係ではないこと)の変換を繰り返せる点にあります。非線形の変換が入ると、誤差の原因を単純な式で一発で解くことは難しくなりますが、微分を使えば「今の状態で、少し動かすならどっちが良いか」という判断ができます。誤差逆伝播は、この微分を多層の構造全体で計算するための手順です。
誤差逆伝播が登場しない場面もあります。たとえば、すでに学習済みのモデルを使って予測だけを行う場合は、順伝播だけで足ります。入力を入れて出力を受け取り、その出力を売買判断などに使うだけなら、誤差を計算して重みを直す必要がないからです。逆に、運用中に新しいデータを取り込みながらモデルを更新したい、あるいはバックテストの期間内でパラメータを学習させたい、といった「重みを動かす」目的が入った瞬間に、誤差逆伝播が必要になります。
ニューラルネットワークの学習で起きていること
ニューラルネットワークの学習は、一言で言うと「入力から出力を作る計算のしかたを、データに合わせて少しずつ調整すること」です。調整する対象は、主に重み(入力に掛け算される係数)とバイアス(最後に足し算される係数)です。この2つを変えると、同じ入力を入れても出力が変わります。
学習の流れは、だいたい毎回同じ形で進みます。まず、入力データをネットワークに通して出力を作ります。たとえば「上がる確率」を出すモデルなら、出力は0から1の間の数値になりますし、「次の価格」を予測するモデルなら、出力は価格の数値になります。この時点では、まだ正解と比べて合っているかどうかは分かりません。そこで次に、出力と正解データを比べて、どれくらいズレているかを数値にします。このズレの大きさを表す数値が損失(予測の悪さを表す点数)です。
損失は、学習の目的そのものだと思ってかまいません。損失が大きい状態は「今の重みとバイアスでは、予測が外れやすい状態」です。損失が小さい状態は「今の重みとバイアスでは、予測が正解に近い状態」です。学習とは、この損失を小さくする方向へ重みとバイアスを動かしていく作業になります。
ただし、重みやバイアスは非常に数が多いことが普通です。入力が100個あって、途中の層(計算の段)がいくつもあると、重みは簡単に数万、数百万になります。ここで「どの重みをどう動かすべきか」を、試行錯誤で手動に決めるのは不可能です。そこで使うのが、損失が重みやバイアスに対して「どんな形で増減するか」を表す情報です。重みをほんの少し増やしたら損失は増えるのか減るのか、どれくらい変わるのかが分かれば、損失が減る方向へ動かす判断ができます。
この「少し動かしたときにどれくらい変わるか」は、微分の考え方で表せます。各重みや各バイアスについて、損失を微分した値を求めると、「このパラメータを増やすと損失が増えるのか減るのか」が分かります。たとえば微分の値が正なら、そのパラメータを少し増やすと損失が増えやすいので、減らす方向へ動かすのが自然です。微分の値が負なら、増やす方向へ動かすと損失が減りやすいので、増やす方向へ動かすのが自然です。微分の値の絶対値が大きいほど、少し動かしただけでも損失が大きく変わりやすいので、影響が強いことを意味します。
学習の「更新」は、こうして得られた微分の情報を使って行います。学習率(1回でどれくらい動かすかを決める係数)を決め、微分の値に学習率を掛けた分だけ、重みやバイアスを動かします。学習率が大きすぎると動かし過ぎて安定しにくくなり、小さすぎると動きが遅くなりますが、ここでは「微分が示す方向へ、少しだけ動かす」という点が中心です。
学習が「少しずつ」進むのは、いくつか理由があります。ひとつは、データにはばらつきがあり、ある1件だけに合わせてしまうと他のデータで外れることがあるからです。もうひとつは、ニューラルネットワークの計算は複雑で、損失が小さくなる道筋が一直線ではないからです。小さな更新を繰り返しながら、全体として損失が減る方向へ寄せていく方が、結果として安定しやすくなります。
ここまでの話で、誤差逆伝播が必要になる位置づけも見えてきます。学習で本当に欲しいのは、更新に使うための「損失を各パラメータで微分した値」です。ニューラルネットワークは計算が層でつながっているため、その微分を素直に求めようとすると大変ですが、つながり方に合わせて効率よく計算できるようにした方法が誤差逆伝播です。
誤差を数値にする損失関数の考え方
順伝播で出力が出たら、それを正解データと比べて「どれくらい外れているか」を一つの数値にします。この一つの数値が、学習の目標として最も扱いやすい形になります。なぜなら、学習は基本的に「その数値を小さくする」方向へ進めばよいからです。この「外れ具合を数値にするルール」が損失関数です。
損失関数は、問題の種類によって選ばれ方が変わります。回帰では、予測値と正解値の差がどれくらい大きいかを測る必要があるので、差の大きさを素直に点数化する形が使われます。分類では、出力が確率のような意味を持つことが多く、正解クラスに十分な確率が割り当てられているかを強く評価する形が使われます。どちらの場合でも、損失関数は「良い出力なら小さな値、悪い出力なら大きな値」を返すように作られています。
損失関数が重要なのは、学習が「誤差を減らす」という言葉だけでは動けないからです。誤差という言葉は、出力と正解の差という雰囲気は伝えますが、学習で本当に必要なのは「重みやバイアスをどちらに動かすと損失が減るか」という情報です。その情報を取り出すには、損失が計算式として定義されていて、微分できる形になっている必要があります。微分しやすい形で損失を設計することは、学習を成立させる前提に近いものです。
損失関数には、値の大きさ以外にも役割があります。たとえば分類で、正解から遠いときに強い罰を与える設計にすると、モデルは「外したときの痛み」を強く感じる形になります。逆に、外れ具合の影響を弱める設計にすると、外れ値(極端に変なデータ)の影響を受けにくくできます。どの損失関数を使うかは、学習の安定性や、どんな間違いを避けたいかに直結します。
導関数と勾配という言葉の意味
導関数は「入力を少し動かしたとき、出力がどれくらい変わるか」を表す値です。学習の話では、入力が何かというと「重みやバイアス」です。出力は何かというと「損失」です。つまり学習で欲しい導関数は、「この重みを少し増やしたら損失が増えるのか減るのか、どれくらい変わるのか」を表す値です。
ここで勾配という言葉が出てきます。勾配は、たくさんのパラメータがあるときの導関数をまとめて表す言い方です。重みが一つだけなら導関数は一つですが、実際には重みもバイアスも大量にあります。それぞれについて損失の導関数を計算すると、導関数が大量に並びます。この並び全体が勾配です。勾配は「どの方向へ動かすと損失が増えるか」を示す矢印のように考えると理解しやすいです。
勾配は符号と大きさに意味があります。符号は、増やすべきか減らすべきかを示します。大きさは、どれくらい強く影響しているかを示します。大きさが大きいパラメータは、少し動かしただけで損失が大きく変わりやすいので、更新の影響も大きくなります。逆に勾配がほとんどゼロなら、そのパラメータを動かしても損失があまり変わらない状態なので、学習が進みにくくなります。
学習の更新は、勾配そのものではなく、勾配を使って「次に動かす量」を決める作業です。学習率という係数で動かす量を調整し、基本的には損失が増える方向とは逆向きへ動かします。これで損失が減る方向へ少しずつ進めますが、ここで必要なのは、勾配が正しく計算できていることです。誤差逆伝播は、その計算を効率よく行うための手順です。
連鎖律が誤差逆伝播の中心になる理由
ニューラルネットワークの計算は、複数の計算がつながってできています。たとえば、入力に重みを掛けて足し合わせる計算があり、その結果を活性化関数に入れる計算があり、その結果を次の層へ渡す計算が続きます。損失は、このつながった計算の最後に出てくる値です。
連鎖律は、「つながった計算を微分するときのルール」です。直感的には、途中で何回も変換が入っているなら、その変換のしかたを順番にたどって「影響の伝わり方」を掛け合わせる必要がある、という考え方です。たとえば、最終的な損失が少し変わる原因が、途中のある値の変化にあるなら、その途中の値が重みにどう影響されるか、損失にどう影響するかをつないで考えます。
誤差逆伝播は、連鎖律を「ネットワークの構造に合わせて、再利用しやすい形で」適用する方法です。同じ層の中で計算されたものは、次の層でも使われます。そのため、導関数を一から何度も計算するのではなく、出力側から戻りながら、すでに計算した部分を使って次の導関数を作ると効率が上がります。これが逆向きに伝えていく計算になっている理由でもあります。
連鎖律がないと、各パラメータについて「損失を直接微分する式」をそれぞれ作る必要が出てしまいます。層が深くなるほど式は複雑になり、実装も確認も難しくなります。連鎖律を基準にすると、どんなに深いネットワークでも「局所的な計算の微分」を積み上げるだけで済む形にできます。
計算グラフで考える誤差逆伝播
誤差逆伝播を理解するとき、計算グラフという考え方が役に立ちます。計算グラフは、計算を「点」と「矢印」で表した図です。点は演算の結果の値、矢印は値が次の演算に渡される流れを表します。足し算や掛け算、活性化関数、損失関数といった処理を小さな部品として並べ、順伝播は矢印の向きに進み、逆伝播は矢印を逆向きに戻ります。
計算グラフで見ると、誤差逆伝播が何をしているかが整理しやすくなります。逆向きに戻るときは、各点で「ここを通ったときに、上流の値が下流へどれくらい影響するか」を計算します。その影響の割合が導関数です。下流から上流へ戻るときは、下流で分かっている損失の変化の情報に、各点での導関数を掛け合わせていきます。
この見方の良いところは、ネットワークの種類が変わっても考え方があまり変わらない点です。全結合層(入力と出力がすべてつながっている層)でも、畳み込み層(画像などの局所的なパターンを拾う層)でも、内部の計算を部品に分けて表せば、逆向きに導関数を伝えるという基本は同じです。部品ごとに「局所的な微分のルール」を持っておき、それをつないで使うイメージになります。
1層の例で追う誤差逆伝播の計算
いちばん単純な形として、入力から出力までが1回の線形変換と1回の活性化関数で終わるケースを考えます。入力をx、重みをw、バイアスをb、線形変換の結果をz、活性化関数の出力をyとします。線形変換は、zはwとxの掛け算にbを足したもの、という形になります。活性化関数は、yはzを別の形に変換したもの、という形です。最後に、損失Lはyと正解tから計算されます。
学習で必要なのは、損失Lをwやbで微分した値です。連鎖律の考え方を使うと、まず損失がyにどれくらい敏感か、つまりLをyで微分した値を考えます。次にyがzにどれくらい敏感か、つまりyをzで微分した値を考えます。最後にzがwやbにどう影響されるか、つまりzをwで微分した値、zをbで微分した値を考えます。
これらを掛け合わせると、Lをwで微分した値が作れます。直感的には、出力yのズレが損失に与える影響があり、そのズレが線形変換zのズレから生まれ、そのズレが重みwのズレから生まれる、という因果のつながりを、導関数として掛け合わせている形です。bについても同じで、zがbに対しては足し算で入っているので、zをbで微分した値は一定になりやすく、計算は比較的素直になります。
この1層の例で見える大事な点は、誤差逆伝播が「最後に出た損失の情報」を出発点にして、途中の導関数を掛け合わせながら、重みにたどり着く計算だということです。順伝播ではxからyへ進みますが、誤差逆伝播では損失から始めて、y、zへ戻り、最後にwやbへ戻ります。
多層ネットワークでの誤差逆伝播の流れ
層が増えると、やることは増えますが、形は1層の例の繰り返しに近くなります。多層ネットワークでは、各層が入力を受け取り、線形変換で中間値を作り、活性化関数で次の層へ渡す値を作ります。損失は最後の出力から計算されます。
逆伝播は、最後の層から始めます。最後の層では、損失が出力にどう影響されるかが計算できるので、そこから「最後の層の中間値」に対する損失の導関数を作れます。すると、その層の重みやバイアスに対する損失の導関数が計算できます。さらに同時に、その層の入力に対する損失の導関数も計算できます。ここで出てきた「層の入力に対する導関数」は、次に一つ前の層へ戻るための材料になります。
このように、各層は「自分のパラメータの勾配を計算する」と同時に「一つ前の層へ渡すべき勾配を作る」役割を持ちます。前の層から見れば、後ろの層から渡されてきた勾配が、自分の層での逆伝播の出発点になります。これが層をまたいで誤差が逆向きに伝わっていく理由です。
層が深くても、この流れが成立するためには、各層が「順伝播で作った中間値」を覚えておく必要があります。活性化関数の導関数を計算するときにzが必要になったり、行列演算の逆向きの計算で順伝播時の入力が必要になったりします。実装ではキャッシュと呼ばれる形で保持することが多く、どの値を保存するかは層の種類によって変わります。
活性化関数の導関数が果たす役割
活性化関数は、ニューラルネットワークが複雑な関係を表現できるようにするための重要な部品です。もし活性化関数がなければ、層を重ねても全体としては線形な変換のままになりやすく、表現できる関係が限定されます。活性化関数が入ることで非線形な変換が挟まれ、データの複雑なパターンに対応しやすくなります。
誤差逆伝播では、この活性化関数が「勾配を通す門」になります。逆伝播で前の層へ勾配を渡すとき、活性化関数を通ったあとに勾配がどう変わるかを計算する必要があり、そのときに活性化関数の導関数が使われます。導関数の値が大きい領域では、勾配が通りやすくなります。導関数の値が小さい領域では、勾配が弱まりやすくなります。
ここで、活性化関数の選び方が学習のしやすさに影響する理由が見えてきます。ある活性化関数は、入力がある範囲を超えると導関数がほとんどゼロに近くなります。そうなると、その範囲に入ったユニット(計算単位)は勾配をほとんど受け取れなくなり、更新が進みにくくなります。別の活性化関数は、広い範囲で導関数が一定に近く、勾配が比較的通りやすい性質を持ちます。学習が深い層まで届くかどうかは、この性質に強く左右されます。
活性化関数の導関数は、順伝播で作った中間値を使って計算されることが多いです。たとえば、活性化関数に入る直前の値zが必要だったり、活性化関数を通したあとの値yから導関数が書けたりします。そのため、順伝播で得られた値を保存しておくことが実装でも重要になります。
行列でまとめて計算する見方
ニューラルネットワークの計算は、実装ではたいてい行列でまとめて行われます。理由は単純で、データが複数件あったり、ユニットが多数あったりすると、個々の値を一つずつ計算するより、まとめて計算した方が速く、書き方も整理しやすいからです。
順伝播の線形変換は、入力の行列に重みの行列を掛け、バイアスを足す形で表されます。活性化関数は、その結果の行列に対して要素ごとに適用されます。損失も、出力行列と正解データから計算されます。逆伝播でも同じで、勾配は行列として伝わり、行列演算で一気に計算されます。
行列で考えるときに重要なのは、各層で「入力の形」と「重みの形」と「出力の形」が決まっていることです。形が決まっていると、逆伝播でも「どの形の勾配を受け取り、どの形の勾配を前へ渡し、どの形のパラメータ勾配を作るか」が決まります。形が合わない計算はできないので、実装のバグは形の不一致として表面化することが多いです。
また、ミニバッチで複数件をまとめると、入力は「件数×特徴量」のような形の行列になり、出力も同様に「件数×出力次元」の行列になります。このとき逆伝播の勾配も同じ形で流れます。1件ずつの計算を頭の中で追うより、まとまりとして扱う方が、実際の実装に近い見方になります。
勾配消失と勾配爆発が起きる理由
誤差逆伝播は、導関数を掛け合わせながら前の層へ戻っていきます。掛け合わせるということは、途中の導関数が小さい値だと、どんどん小さくなりやすいということです。たとえば0.5のような値を何回も掛けると急速に小さくなります。これが勾配消失です。勾配が小さくなると、前の層の重みがほとんど更新されなくなり、学習が進みにくくなります。深い層ほどこの影響を受けやすくなります。
逆に、途中の導関数が大きい値だと、掛け合わせることでどんどん大きくなりやすいです。たとえば2のような値を何回も掛けると急速に大きくなります。これが勾配爆発です。勾配が大きくなりすぎると、更新量が過剰になり、損失が安定して下がらず、発散するような動きになりやすくなります。
これらは、活性化関数の導関数の性質、重みの初期化のしかた、ネットワークの深さ、学習率の設定などが絡み合って起きます。たとえば、導関数が0に近づきやすい活性化関数を深く重ねると勾配消失が起きやすくなります。重みが大きすぎる初期化になっていると、活性化関数の入力が極端な領域へ行きやすくなり、導関数が小さくなったり、逆に不安定に大きくなったりします。
この問題に対応するために、活性化関数の選択を変えたり、重みの初期化を工夫したり、正規化(値の分布を整える処理)を挟んだりします。誤差逆伝播自体は同じでも、勾配が通りやすい状態を作る工夫が、深いネットワークでは特に重要になります。
誤差逆伝播と最適化手法の関係
誤差逆伝播は、各パラメータの勾配を計算する方法です。一方で最適化手法は、その勾配をどう使ってパラメータを更新するかの方法です。誤差逆伝播が計算係、最適化手法が運転係のような関係だと思うと整理しやすいです。
最も基本的な更新方法は、勾配降下法です。勾配が示す「損失が増える方向」と反対に動かすことで、損失が減る方向へ進みます。ミニバッチを使って少しずつ更新する形は、確率的勾配降下法と呼ばれることもあります。これだけでも学習はできますが、実際には学習が不安定になったり、進みが遅くなったりすることがあります。
そこで、勾配の情報をもう少し賢く使う更新方法が使われます。たとえば、過去の勾配の傾向を利用して、同じ方向に進みやすくする方法があります。別の方法では、勾配の大きさの偏りをならして、パラメータごとに更新の強さを調整します。これらは、同じ勾配を受け取っても、更新のされ方が変わるという点が重要です。
誤差逆伝播が正しくても、最適化手法の設定が合っていないと学習はうまく進みません。学習率が大きすぎれば揺れやすく、小さすぎれば進みが遅くなります。ミニバッチの大きさも、更新のノイズの大きさに影響します。誤差逆伝播は勾配という材料を作るだけなので、その材料の使い方が学習の品質を左右します。
実装でつまずきやすい点と確認方法
実装でよくつまずくのは、形と保存と符号です。形は、行列の次元が合っているかどうかです。順伝播で出力の形が合っていても、逆伝播で勾配の形が合わないことがあります。逆伝播では、前の層へ渡す勾配と、重みの勾配と、バイアスの勾配がそれぞれ別の形を持つので、どの形が正しいのかを層ごとに意識する必要があります。
保存は、順伝播で作った中間値をどこまで保持するかです。活性化関数の導関数を計算するためにzが必要なのに保存していなかったり、ドロップアウト(学習時だけ一部を無効にする仕組み)のマスク(どれを無効にしたかの記録)を保存していなかったりすると、逆伝播が正しくできません。順伝播が通って出力が出ても、逆伝播のための材料が足りないという形で壊れます。
符号は、更新の向きが合っているかです。勾配は損失を増やす方向を示すので、更新では逆向きへ動かす必要があります。ここを間違えると、学習すればするほど損失が増える動きになります。実装では、勾配の計算は合っているのに、更新の式だけ逆になっていた、という事故が起きやすいです。
確認方法としては、まず非常に小さなネットワークと非常に小さなデータで、数値が追える状態を作るのが基本です。次に、勾配の値が極端に大きくなっていないか、ほとんどゼロになっていないかを観察します。損失が下がらないとき、順伝播の出力が明らかにおかしいのか、逆伝播の勾配がおかしいのか、更新量がおかしいのかを切り分けます。切り分けでは、学習率を極端に小さくして挙動が変わるかを見る方法もあります。学習率を小さくすると発散はしにくくなるので、発散が止まるなら更新量が大きすぎる可能性が高くなります。
もう一つの強い確認は、数値微分との比較です。理屈としての勾配が合っているなら、パラメータをほんの少し動かして損失の変化を測った値と、誤差逆伝播で計算した勾配が近くなるはずです。数値微分は計算が遅いので大規模では使えませんが、小さな例で実装の正しさを確認する用途では非常に役に立ちます。
まとめとして押さえるポイント
誤差逆伝播は、ニューラルネットワークの学習で必要になる勾配を計算するための手順で、出力側の損失から始めて入力側へ戻りながら導関数を掛け合わせていきます。
損失関数は、出力と正解のズレを一つの数値にする役割を持ち、学習を「その数値を小さくする問題」に変換します。学習が成立するためには、損失が微分できる形で定義されていることが重要になります。
連鎖律は、つながった計算の微分を分解して扱えるようにするルールで、誤差逆伝播はこれをネットワークの構造に合わせて効率よく適用します。計算グラフで見ると、局所的な微分のルールを部品としてつないでいる構造が見えます。
活性化関数の導関数は、勾配が前の層へどれだけ通るかを左右し、勾配消失や勾配爆発の原因にもなります。深いネットワークほど、勾配が通る状態を作る工夫が学習の成否に関わります。
誤差逆伝播が作るのは勾配であり、更新のしかたは最適化手法が決めます。学習率や更新方法の選び方で、同じ勾配でも学習の進み方が大きく変わります。
実装では、次元の整合、順伝播の中間値の保存、更新の符号、勾配の大きさの異常といった点でつまずきやすく、必要なら小さな例で数値微分と比較して勾配の正しさを確認します。


