【仕組み解説】全結合層をゼロから実装しよう:NNの学習の仕組み-誤差と損失、逆伝播-(NN #9)

前回は、全結合層の順方向側は完成させました。

【仕組み解説】全結合層をゼロから実装しよう:全結合層の順方向だけ実装してみる。(NN #8)

これまでの理論に基づき、順伝播(Forward)をゼロから実装します。入力から予測値を導くNNの骨格を作り上げます。

はじめに:学習ってなに?

 いよいよ今回から、ニューラルネットワークの醍醐味である「学習」に入ります。 ニューラルネットワークにおいて、順方向の計算結果をもとに重みを更新する作業を「逆伝播(Backpropagation)」と呼びます。

「なぜ逆なのか?」「中で何が起きているのか?」 今回は、まず、仕組みとイメージを掴み、その後それを実装する方法について考えてみます。

学習の3ステップ

学習のプロセスは、以下の3段階のサイクルで回っています。

このサイクルを理解し、なぜ逆なのか学習の仕組みについて知って、次回コードに落とし込めるようになりましょう。

【学習の3ステップ】

  1. 知る(Forward): 今の自分の実力を知る(推論してLossを出す)
  2. 考える(Backward): どっちに修正すればいいか考える(勾配を計算)
  3. 変わる(Update): 少しだけ自分を変える(重みを更新)
デフォルト画像 11 記事
シリーズ

ゼロから作る全結合層

ゼロから作る全結合層シリーズでは、初心者でも理解しやすいように、 「パーセプトロンの仕組み」から「全結合層の実装」までを...

この記事シリーズでは、ディープラーニングに入るまでの道筋をその根本的な設計思想からディープラーニングの肝であり、基礎の最小単位である全結合層について、ゼロから作って理解していきます。

1.知る(Forward)

どのくらい間違えているのか知る。 〜

 (今回は回帰問題(数値を当てる問題)を想定します。)

  • 出力 \(y\): NNが出した答え
  • 正解 \(t\): 本来の答え (true value)
  • 間違った度合い \( t – y \)

前提:考えるための材料(損失関数

次のステップ「考える」の前に、まず「どれくらい間違えたかを知る必要があります。Forwardのゴール地点ですね。 これを計算するのが損失関数(Loss Function)」です。

Forwardの最後: 「AIの答え」と「正解データ」を比べて、間違いの大きさ(Loss)を出す。

Backwardの最初: この「Loss」をスタート地点として、逆算が始まります。

Lossを計算するとき、気をつけないといけないことがあります。

それは、”+に間違えていても−に間違えていてもどのくらい間違っているかを同じように判断できないといけない”ことです。

もし、間違っている度合いがマイナスになったらどうでしょうか? 

Lossは間違っているほど大きな値になる必要があります。

マイナス側に間違っている(Lossが0より小さい)\(\to\)0よりも間違っていない!

となってしまいますし、

間違い度合いが+と−ちょうど釣り合ったら、どれだけ間違っていても全体のLossは0となり、正確に判断できなくなってしまいます。

損失関数 : 平均二乗誤差\(\text{MSE}\)

 この+ー関係なく間違い度合いを評価する損失関数にはいろんなものがありますが、今回は最も単純に、平均二乗誤差\(\text{MSE}\)を用いてみようと思います。

間違った度合い \( t – y \)をもとに、すべてのノードの間違った度合いを二乗し、を平均する関数です。

\[ matigai_i = t – y \]

N個のノードがあったらそれを平均する。

\[\text{MSE} = \frac{1}{N} \sum_{i=1}^{N} (matigai_i)^2 \]

MSEのイメージ:満足度メーターの例

あなたが新しいAI(人工知能)の家電製品の「満足度」を測る責任者だとします。この家電は、ユーザーの理想とする温度(実際の値)に対して、どれだけ正確な温度(予測値)を提供できるかを競っています。

どれくらい間違っているかを評価したいときは、すべてのユーザーのズレの二乗を合計し、ユーザーの人数で割って「平均」を出します。 

「理想の温度」と「実際の温度」の差を計算する

まず、ユーザーが設定した温度と、製品が出した温度の「ズレ」を計算します。

例: 理想が25度、製品が28度なら、ズレは+3度です。理想が25度、製品が22度なら、ズレは-3度です。

ズレを二乗して、マイナスをなくす

もしズレが+3と-3の場合、単純に合計するとゼロになってしまいます。しかし、どちらも同じくらい「ズレている」ことには変わりありません。

そこで、ズレを二乗します(例: (+3) × (+3) = 9、(-3) × (-3) = 9)。これにより、すべてのズレが正の値(プラス)になり、ズレの「大きさ」だけを評価できるようになります。

平均を出す

すべてのユーザのズレを二乗したものを全部平均すれば、設定温度がどのくらい理想の温度から離れているかを評価できるはずです。

2. 考える(Backward):逆伝播の仕組み

〜 誰のせいで間違えたのか?(責任の分配) 〜

このステップの目的は、重み \(W\) やバイアス \(b\) を書き換えることではありません。

知る(forward)で損失 lossが手に入りましたが、考える(Backward)では、

もし更新するとしたら、どの方向にどれくらい動かせばいいか?」という「方向(勾配)」を見つける」作業をします。

どうやって見つけるかというと、数学的には「連鎖律(チェーンルール)」を使って解きます。

連鎖律(チェーンルール)

1. 仕組み:責任のなすりつけ(連鎖律)

一番最後の出力から、入り口に向かって「間違いの原因」を遡っていきます。

  1. Loss → 出力層: 「全体でこれだけ間違えた(Loss)のは、出力値がズレていたからだ!」と、出力層に微分の値を渡します(\(dout\))。
  2. 出力層 → 中間層: 全結合層やReLU層は、受け取った dout を見て計算します。
    • 「私の重み \(W\) が大きすぎたせいかな?(\(dW\) の計算)」
    • 「いや、前の層からの入力 \(X\) が変だったせいだ。(\(dx\) の計算)」
  3. さらに前の層へ: 計算した \(dx\) を、さらに前の層へ dout として渡します。

これを繰り返すことで、すべてのパラメータ(\(W, b\))について、「お前を+0.01動かすと、誤差がこれくらい減るぞ」という情報(勾配)が行き渡ります。

2. 何が残るの?

このステップが終わった時点で、手元には以下の情報が残ります。

  • \(dW\) (重みの勾配): 重みをプラス方向に動かすべきか、マイナス方向に動かすべきか、そしてその強さは?
  • \(db\) (バイアスの勾配): バイアスをどう動かすべきか?

考えるステップで重みを変化させたときにどのくらい出力に影響が出るか?という情報が得られました。

ここで注意したいのは、 まだ、実際の重み \(W\) は1ミリも変化していないことです。ここでは、「どう動くべきか」を計算したただそれだけ、これが「考える」(backward)の操作になります。


Step 3: 更新 (Update)

〜 反省を活かして自分を変える(勾配降下法) 〜

ここでようやく、計算しておいた勾配を使って、実際に自分自身(パラメータ)を書き換えます。これが「勾配降下法」です。

更新の式

\[W \leftarrow W – \eta \cdot \frac{\partial L}{\partial W}\]

(コードで書くと: W = W - learning_rate * W.gradのような感じ)

1. 式の意味

  • \(W\) : 今の重み。
  • \(\frac{\partial L}{\partial W}\) (\(dW\)): さっきBackwardで計算した「誤差を増やす方向(勾配)」。
  • \(\eta\) (学習率) 一気に変わりすぎないようにブレーキをかける係数(例: 0.01)。
  • マイナス \(-\): 勾配は「山を登る方向(誤差が増える方向)」を指しているので、誤差を減らすには逆方向へ進む必要があります。

2. やっていること

「Backwardで『右に行くと間違いが増えるぞ』と言われたから、学習率の分だけ、ちょっとだけ『左』に動こう」

という作業を、すべてのパラメータに対して一斉に行います。


まとめ:3ステップの全体像

マスターの定義された3ステップに、専門的な処理を当てはめるとこうなります。

  1. 知る (Forward):
    • 入力 \(x\) を通して、予測値 \(y\) を出す。
    • 正解と比べて、間違いの量(Loss)を確定させる。
  2. 考える (Backward):
    • 連鎖律を使って、Lossを減らすための「各パラメータの修正方向(勾配 \(dW\))」を計算する。
    • まだ値は更新しない。
  3. 更新 (Update):
    • 勾配降下法を使って、実際に $W$ を書き換える。
    • \(W_{new} = W_{old} – \eta \cdot dW\)

「Backward」は「更新のための材料(勾配)を集めるための情報リレー」であり、「Update」で「実際に書き換える」。この役割分担がイメージできたでしょうか?

次回:逆伝播実装⇢全結合層完成

前回順方向伝播の出力までは得られていると思うので、

 この出力からMSEを計算してLossを得る。

 考える (Backward)更新 (Update)の仕組みを実装してみようと思います。

【仕組み解説】逆伝播と更新のサイクルを実装:「心臓部」の動きを理解(NN #10)

逆伝播とパラメータ更新のサイクルをゼロから実装。NNの「心臓部」を動かし、学習の仕組みを完成させます。

デフォルト画像 11 記事
シリーズ

ゼロから作る全結合層

ゼロから作る全結合層シリーズでは、初心者でも理解しやすいように、 「パーセプトロンの仕組み」から「全結合層の実装」までを...

ここまで読んでいただきありがとうございます。

では、次の記事で。 lumenHero