「ニューラルネットワーク」という言葉、最近よく耳にしませんか? スマートフォンの顔認証、翻訳アプリ、自動運転技術など、私たちの身の回りの多くの「賢い」技術の裏側で活躍しています。でも、一体ニューラルネットワークって何なのでしょう?
簡単に言うと、ニューラルネットワークは、私たち人間の脳の神経細胞(ニューロン)のネットワーク構造をヒントに作られた、数学的なモデルです。たくさんのニューロンが互いに情報をやり取りしながら、複雑な問題を解くことができる仕組みを持っています。
この記事では、ニューラルネットワークがどのようにして「学習」し、賢くなっていくのか、その基本的な仕組みを、数式も交えながら、できるだけ分かりやすく解説していきます。高校生の皆さんにも理解できるように、基本的なところから丁寧に説明しつつ、専門家の方が見ても納得できるような厳密さも目指します。特に、ニューラルネットワークが賢くなるための重要なステップである「誤差逆伝播法(バックプロパゲーション)」についても、詳しく見ていきましょう。
この記事を読み終える頃には、ニューラルネットワークが「入力(例えば画像データ)を受け取って、計算を行い、何らかの出力(例えば「猫」というラベル)を出す、一種の非常に賢い関数 \(y=f(x)\) である」というイメージが掴めるはずです。
さあ、ニューラルネットワークの不思議で面白い世界へ、一緒に旅立ちましょう!
第1部:ニューラルネットワークの仕組み(順伝播)
ニューラルネットワークは、一見複雑そうに見えますが、その基本的な部品や情報の流れ方は、段階を追って見ていけば理解できます。この第1部では、ニューラルネットワークがどのように入力情報を受け取り、内部で計算処理を行い、最終的な出力を出すのか、その「順方向の情報の流れ(順伝播)」を探っていきます。
基本的なアイデア:線を引くことから始めよう
ニューラルネットワークの考え方に触れる前に、もう少しシンプルな「線形モデル」というものから振り返ってみましょう。これがニューラルネットワークを理解するための良い出発点になります。
ちょっと寄り道:線形モデルのおさらい
例えば、「勉強時間 \((\mathbf{x})\) とテストの点数 \((y)\) 」の関係を予測したいとします。もし、勉強時間が増えれば点数もだいたい比例して上がると考えられるなら、この関係を一本の直線で表せるかもしれません。これが線形モデルの基本的な考え方です。
数学的には、入力データ \(\mathbf{x}\) を使って、何らかの出力 \(y\) を予測するモデルを考えます。線形モデルは、一般的に次のような形で書けます。
$$ y(\mathbf{x}, \mathbf{w})=f\left(\sum_{j=1}^M w_j \phi_j(\mathbf{x})\right) $$
この式は以下のステップで解釈できます。
- 入力データ \(\mathbf{x}\) を、いくつかの「基底関数」 \(\phi_j(\mathbf{x})\) を使って変換します。
基底関数は、入力データを別の見方で表現するための関数です。例えば、単純な \(x\) だけでなく、 \(x^2\) や \(x^3\) なども使うことができます(これが後で見る多項式フィッティングに つながります)。 - それぞれの基底関数 \(\phi_j(\mathbf{x})\) の出力に、「重み」 \(w_j\) を掛け算します。
この「重み」は、各基底関数が最終的な出力にどれだけ影響を与えるかを調整するパラメータです。 - 重みを掛けたものを全て足し合わせます(線形結合)
\(\sum_{j=1}^M w_j \phi_j(\mathbf{x})\) の部分です。 - 最後に、「活性化関数」 \(f\) を適用して、最終的な出力 \(y\) を得ます。
この活性化関数は、モデルの出力の形を整えたり、非線形な関係を表現したりするために使われます。
例:多項式曲線フィッティング
線形モデルの具体的な例として、多項式曲線フィッティングを見てみましょう。 これは、与えられたデータ点群に最もよく合うような多項式の曲線を見つける問題です。 この場合、基底関数として \(\phi_j(x) = x^j\) (つまり、\(x^0=1, x^1=x, x^2, x^3, \ldots, x^M\))を使います。 すると、モデルは次のようになります。 $$ y(x, \mathbf{w})=w_0+w_1 x+w_2 x^2+\ldots+w_M x^M=\sum_{j=0}^M w_j x^j $$ これは、\(M\) 次の多項式そのものですね。このモデルでは、適切な「重み」 \(w_0, w_1, \ldots, w_M\) を見つけることが目標になります。活性化関数\(f\)の選び方は、解きたい問題の種類によって変わります。
- 分類問題の場合(例:画像が犬か猫かを見分ける)
活性化関数は非線形関数(例:シグモイド関数、後で詳しく説明します)が使われます。これにより、特定のクラスに属する確率などを出力できます。 - 回帰問題の場合(例:株価予測のように連続的な数値を予測する)
活性化関数は恒等関数(\(f(x)=x\)、つまり何もしない関数)がよく使われます。出力がそのまま予測値となります。
| 分類問題の場合 | 回帰問題の場合 |
| 活性化関数→非線形(シグモイドなど) | 活性化関数→恒等関数(\(x = f(x)\)) |
線形モデルの限界とニューラルネットワークへの期待
この線形モデルはシンプルで強力ですが、一つ大きな問題点があります。それは、基底関数 \(\phi_j\) があらかじめ固定されているため、柔軟性に欠けるという点です。データに合わせて基底関数自体を自動で学習してくれたら、もっと複雑な関係も表現できるのに…と思いますよね。
そこで登場するのがニューラルネットワークです。ニューラルネットワークは、この基底関数もデータから学習できるように拡張したモデルと考えることができます。つまり、重みパラメータ \(w_j\) だけでなく、基底関数自体に含まれるパラメータも同時に学習することで、より柔軟で高い表現力を持ったモデルを作ろう、というのが基本的なアイデアです。
ここからは、このニューラルネットワークが具体的にどのような構造を持ち、どのように計算を行うのかを見ていきましょう。
ニューラルネットワークの心臓部:ニューロンと層
ニューラルネットワークは、その名の通り、多数のニューロン(またはユニットとも呼ばれます)が層状に並び、互いに結合したネットワーク構造をしています。
ニューロン(ユニット)
- 人間の脳の神経細胞をモデル化したもので、ニューラルネットワークにおける計算の基本単位です。
- 複数の入力信号を受け取り、それらを統合し、何らかの処理(後述する活性化関数による変換)を施して、一つの出力信号を次のニューロンへ送ります
層(Layer)
- ニューロンが集まって形成するグループのことです。ニューラルネットワークは通常、複数の層から構成されます。
- 入力層 (Input Layer): 外部からデータを受け取る最初の層です。ここには計算を行うニューロンはなく、入力値をそのまま次の層に渡す役割をします
- 隠れ層 (Hidden Layer): 入力層と出力層の間に位置する層です。1つだけでなく、複数存在することもあります。隠れ層のニューロンが、入力データから複雑な特徴を抽出する重要な役割を担います。その働きが外部から直接見えないため「隠れ」層と呼ばれます。
- 出力層 (Output Layer): ニューラルネットワークの最終的な計算結果を出力する層です。問題の種類(回帰か分類かなど)に応じて、出力の形式やニューロンの数が変わります。

補足:多層ネットワークの層の数え方について
信号の伝わり方:順伝播のステップ・バイ・ステップ

では、入力データがニューラルネットワークに入ってから、どのように計算されて出力に至るのか、その「信号の順方向への伝播(順伝播またはフォワードプロパゲーション)」の具体的なステップを見ていきましょう。ここでは、入力 \(\mathbf{x}\) から出力 \(\mathbf{y}\) が得られるまでの計算の流れを、数式を追いながら一つ一つ確認します。
step
1重み付きの足し算とバイアス(入力層 → 隠れ層)


まず、入力層から最初の隠れ層への処理を考えます。
各隠れ層のニューロン \(j\) は、入力層の各ニューロン \(i\) からの出力 \(x_i\) を受け取ります。このとき、各入力 \(x_i\) には、それぞれ異なる重み (weight)\(w_{ji}^{(1)}\) が掛けられます。この重みは、入力信号 \(x_i\) が隠れニューロン \(j\) に与える影響の強さを表します。
これらの重み付けされた入力信号を全て足し合わせ、さらにバイアス (bias) \(w_{j0}^{(1)}\) という値を加えます。数式で書くと、隠れニューロン \(j\) への入力の合計 \(a_j\) は以下のようになります
$$ a_j=\sum_{i=1}^D w_{j i}^{(1)} x_i+w_{j 0}^{(1)} $$
ここで、
- \(D\) は入力変数の数(入力ニューロンの数)です。
- \(x_i\) は \(i\) 番目の入力変数の値です。
- \(w_{ji}^{(1)}\) は、入力層の \(i\) 番目のニューロンから隠れ層の \(j\) 番目のニューロンへの重みです。(1)は最初の層の重みであることを示します。
- \(w_{j0}^{(1)}\) は、隠れ層の \(j\) 番目のニューロンのバイアス項です。
バイアスとは?
バイアスは、ニューロンがどれだけ「発火しやすいか(活性化しやすいか)」を調整する役割を持ちます。全ての入力が0でも、バイアスが大きな正の値ならニューロンは活性化しやすくなりますし、逆に大きな負の値なら活性化しにくくなります。これは、線形モデル (y = ax + b) における切片 (b) のようなものだと考えると分かりやすいかもしれません。
メモ
step
2活性化関数で個性を出す(隠れ層)


ステップ1で計算した合計値 \(a_j\) は、そのままでは単なる線形和です。これだけでは、層をいくら重ねても全体として線形な変換しか表現できません(線形変換を何度繰り返しても結果は線形変換のままです)。しかし、私たちが解きたい問題の多くは、もっと複雑な非線形な関係を持っています。
そこで、この線形和 \(a_j\) を、活性化関数 (activation function) \(h\) という非線形の関数に通して変換します。これにより、ニューラルネットワークに非線形性が導入され、より複雑なパターンを学習できるようになります。隠れニューロン \(j\) の出力 \(z_j\) は次のように表されます。
$$ z_j=h\left(a_j\right) $$
なぜ非線形性が必要なの?
もし活性化関数が線形(例えば (h(a)=ca))だったら、ニューラルネットワーク全体も結局は入力の線形変換になってしまい、隠れ層を持つ意味があまりなくなってしまいます。非線形な活性化関数を使うことで、層を重ねるごとに、より複雑で表現力の高いモデルを構築できるのです。池に石を投げたときに広がる波紋のように、単純な入力から複雑な反応を生み出すことができるようになります。
隠れ層でよく使われる代表的な活性化関数をいくつか紹介しましょう。これらの関数はすべて微分可能であることが重要で、その理由は後の「学習」のセクションで明らかになります。
隠れ層でよく使われる活性化関数
| tanh | Sigmoid | ReLU | PReLU |
![]() | ![]() | ![]() | ![]() |
| $$ f(x)=\frac{e^x-e^{-x}}{e^x+e^{-x}} $$tanh関数は活性化関数としてよく用いられる。tanh関数はシグモイド関数と形状が非常に似ており、座標(0,0)を起点として点対称なS字型の曲線でシグモイド関数と異なり出力が-1から1までの値をとる。シグモイド関数は微分すると勾配消失の問題があるが、tanh関数は微分した後の係数が0から1までの値をとるため勾配消失が起こりにくい。 | $$ f(x)=\frac{1}{1+e^{-x}} $$$$ \frac{d f(x)}{d x}=f(x)(1-f(x)) $$このようにシグモイド関数の微分は簡単に計算することができる。ニューラルネットワークにおいてパラメータの更新過程では誤差逆伝播という微分を利用した方法を用いるが、シグモイド関数はこのように微分後の関数を容易に求めることができますが、微分後の関数の最大値は0.25であり、誤差逆伝播法では出力層から入力層に向かって勾配を乗法していくため、層が深いほど0に近づいていってしまう勾配消失が起こりやすい | $$ f(x)= \begin{cases}0 & (x<0) \\ x & (x \geq 0 \text { })\end{cases} $$ このReLU関数なら微分しても勾配消失が起こりにくい。\(x = 0\)で滑らかにつながっていないからそこでは微分できないと思うかもしれないが、ディープラーニングの計算過程ではそこで微分するような場面はほとんどないため気にする必要はない。なので、ReLU関数は現在、活性化関数として非常によく使われる。 | $$ f(\alpha, x)= \begin{cases}\alpha x, & x<0 \\ x, & x \geq 0\end{cases} $$ PReLU関数の方はxが0より小さい範囲で出力値が下がっていっているのが分かる。xが0より小さい範囲でも値をわずかに持つことから、ReLU関数と違ってx<0でも値が更新される。これにより、ReLU関数を用いたときよりも良い結果をもたらす場合がある。 |
微分可能性の重要性
かつてパーセプトロンという初期のニューラルネットワークモデルでは、活性化関数としてステップ関数(ある閾値を超えたら1、それ以外は0を出力する階段状の関数)が使われていました。パーセプトロンとニューラルネットワークの違いは活性化関数です。
- パーセプトロンの活性化関数(ステップ関数): \( f(a) = \begin{cases} +1, & a \geq 0 \ -1, & a < 0 \end{cases} \) (または0と1)
- ニューラルネットワークの活性化関数(シグモイド関数など): 滑らかで連続的な関数。
パーセプトロンではステップ関数を用いるのに対して、ニューラルネットワークではシグモイド関数などの連続な非線形関数を用いる。ステップ関数は、ある値を境に急に値が変わる関数で、シグモイド関数は滑らかに値が変わる関数である。
| パーセプトロン | ニューラルネットワーク |
| ステップ関数:入力がある閾値を超えると急に1になり、それ未満では0になる関数。 | シグモイド関数:入力が大きくなるにつれて、滑らかに0から1へ変化する関数。 |
| 微分不可能 | 微分可能 |
ステップ関数は \(a=0\) の点で微分不可能です。一方、シグモイド関数やReLU(\(x=0\) を除く)のような関数は微分可能です。この「微分可能であること」が、ニューラルネットワークの学習において非常に重要なポイントになります。学習の際には、出力の誤差を減らすために各パラメータ(重みやバイアス)をどれだけ調整すればよいかを知る必要があり、そのために関数の「傾き」、つまり微分を利用するからです。この話は第2部の誤差逆伝播法で詳しく説明します。
step
3再び重み付きの足し算とバイアス(隠れ層 → 出力層)


隠れ層の各ニューロンが出力した値 \(z_j\) は、次に出力層のニューロンへの入力となります。ここでの計算は、ステップ1(入力層 → 隠れ層)と全く同じです。
つまり、出力層の各ニューロン \(k\) は、隠れ層の各ニューロン \(j\) からの出力 \(z_j\) を受け取り、それぞれに重み \(w_{kj}^{(2)}\) を掛けて足し合わせ、さらにバイアス \(w_{k0}^{(2)}\) を加えます。出力ニューロン \(k\) への入力の合計 \(a_k\) は以下のようになります。
$$ a_k=\sum_{j=1}^M w_{k j}^{(2)} z_j+w_{k 0}^{(2)} $$
ここで、
- \(M\) は隠れニューロンの数です。
- \(z_j\) は隠れ層の \(j\) 番目のニューロンの出力です。
- \(w_{kj}^{(2)}\) は、隠れ層の \(j\) 番目のニューロンから出力層の \(k\) 番目のニューロンへの重みです。(2)は2番目の層(隠れ層から出力層へ)の重みであることを示します。
- \(w_{k0}^{(2)}\) は、出力層の \(k\) 番目のニューロンのバイアス項です。
\(k\)は出力のユニットの番号であり、\(K\)は出力の総数です。この変換はネットワークの第二層に相当します。
step
4最終出力を決める活性化関数(出力層)


最後に、ステップ3で計算された出力層のニューロンへの入力合計 \(a_k\) を、出力層用の活性化関数 \(\sigma\)(シグマ)で変換して、ネットワークの最終的な出力 \(y_k\) を得ます。
$$
y_k=\sigma\left(a_k\right)
$$
出力層の活性化関数 \(\sigma\) は、解きたい問題の種類や、出力にどのような性質を持たせたいかによって選びます。以下に代表的な例を挙げます。
出力層の活性化関数の選び方
| 二値分類問題の場合 | シグモイド関数 $$ \sigma(x)=\frac{1}{1+\exp (-x)} $$
|
| 多クラス分類問題の場合 | softmax関数 $$ \sigma\left(x_k\right)=\frac{\exp \left(-x_k\right)}{\sum_j \exp \left(-x_j\right)} $$
|
| 回帰問題の場合 | 恒等関数 $$ \sigma(x)=x $$
|
まとめると、ニューラルネットワークの右方向、入力から出力までの流れ(順伝播)は行列演算と非線形変換の繰り返しである。ということができる。
ここまでのステップ1からステップ4までの計算を全てまとめて、一つのニューラルネットワーク(ここでは隠れ層が1層の2層ネットワーク)の入力 \(\mathbf{x}\) から出力 \(y_k\) までの計算を一つの式で表すと、以下のようになります。(出力層の活性化関数として、例えばシグモイド関数 \(\sigma\) を使った場合)
$$ y_k(\mathbf{x}, \mathbf{w})=\sigma\left(\sum_{j=1}^M w_{k j}^{(2)} h\left(\sum_{i=1}^D w_{j i}^{(1)} x_i+w_{j 0}^{(1)}\right)+w_{k 0}^{(2)}\right) $$
ここで、
- \(\mathbf{w}\) は、ネットワーク内の全ての重みパラメータ \((w_{ji}^{(1)}, w_{kj}^{(2)})\) とバイアスパラメータ \((w_{j0}^{(1)}, w_{k0}^{(2)})\) をまとめたものです。
- \(h\) は隠れ層の活性化関数です。
- \(\sigma\) は出力層の活性化関数です。
この式を見ると複雑に感じるかもしれませんが、やっていることは「重み付き和+バイアス」と「活性化関数による非線形変換」の繰り返しです。
つまり、ニューラルネットワークモデルとは、調整可能なパラメータ \(\mathbf{w}\) によって特徴づけられる、入力 \(\mathbf{x}\) から出力 \(\mathbf{y}\) への非線形な関数である、と言うことができます。
もっとシンプルに:バイアス項を重みとして扱うテクニック
ここまでの説明では、重みパラメータとバイアスパラメータを別々に扱ってきました。しかし、これらをまとめて扱うことで、数式を少しスッキリさせることができます。
これは、入力変数に常に値が1であるような特別な入力 \(x_0 = 1\) を追加することを考えます。すると、例えばステップ1の式は、
$$ a_j = \sum_{i=1}^D w_{ji}^{(1)} x_i + w_{j0}^{(1)} \cdot 1 = \sum_{i=0}^D w_{ji}^{(1)} x_i \quad (\text{ただし } x_0=1 \text{ とし、} w_{j0}^{(1)} \text{ を新たな重みとみなす}) $$
と書け、バイアス項 \(w_{j0}^{(1)}\) が、\(x_0\) にかかる重み \(w_{j0}^{(1)}\) であるかのように扱えます。
同様に出力層のバイアスも扱うことができます。
このテクニックを使うと、バイアスも重みの一部として統一的に扱えるようになり、以降の数式表現やプログラム実装が少し簡単になることがあります。
(ネットワーク図上では、値が常に1の特別なユニットが各層に追加され、そこからの結合がバイアスに相当すると考えます。)

Deepな構造への拡張
ここまで見てきたのは、隠れ層が1つだけの「浅い (shallow)」ニューラルネットワークでした。しかし、この「(重み付き和+バイアス)→ 活性化関数」という処理のブロックを何層も積み重ねることで、より「深い (deep)」ニューラルネットワークを作ることができます。
ニューラルネットワークは、結局のところ「行列演算(重み付き和の部分)と非線形変換(活性化関数)の繰り返し」です。
そのため、層を増やすのは簡単です。隠れ層が1つ増えると、「行列演算+非線形変換」のセットが1回増えるだけです。
このように層を深くすることで、ネットワークはより複雑で抽象的な特徴をデータから段階的に学習できるようになり、非常に高い性能を発揮することがあります。これが、いわゆるディープラーニング (Deep Learning) の基本的な考え方です。
万能近似器
ニューラルネットワークの一つの興味深い特性は、それが「万能近似器」としての能力を持つということです。これについての説明を分かりやすく解説する。
まず、「万能近似器」とは、ニューラルネットワークがある条件下で、任意の関数を近似する能力があるということを意味しています。
具体的には、例えば線形出力を持つ2層ネットワークにおいて、隠れユニットが十分に多ければ、コンパクトな定義域内でのどんな連続関数でも、どれだけ精度を高くしたいかに応じて近似できるのです。隠れユニットの活性化関数として、広い範囲の関数を使用してもこの性質は成り立つ(ただし、多項式を除く)。これは、ニューラルネットワークが非常に複雑な関数やデータ構造も表現できる可能性を秘めていることを示します。
これは万能近似定理(普遍性定理(Universal Approximation Theorem))として知られており
ポイント
有限個のユニットを持つ一層の隠れ層で構成されるfeed-forward networkは、いくつかの条件のもと、任意の連続関数を近似することが出来る
というものです。

多層パーセプトロンの関数を近似する能力を示す例。4つの関数はそれぞれ(a)\(f(x) = x^2\),(b)\(f(x) = sin(x) \),(c)\(f(x) = |x|\),(d) \(f(x) = H(x)\)、\(H(x)\)はヘヴィサイドステップ関数である。各ケースともデータ点(青点)は\(N=50\)であり、それぞれの\(x\)は区間(-1,1)から一様にサンプリングされ、各点で\(f(x)\)の対応する値を評価した。これらのデータ点を訓練させる二層ネットワークは隠れた三個の隠れユニットを持ち、隠れユニットの活性化関数は\(tanh\)、出力ユニットの活性化関数は線形である。訓練させたネットワークの出力は赤の曲線で示されている。
万能近似定理は、理論的にはニューラルネットワークが非常に強力であることを示すが、実際にはその能力を最大限に引き出すためには、適切な訓練方法やパラメータの調整が欠かせない。
したがって、この「万能近似器」としての性質は非常に興味深いものだが、それだけでなく、訓練データに対する適切な学習の方法や、適切なモデルの選択など、さらなる検討と工夫が必要であることを理解することが大切です。
ここまでで、ニューラルネットワークが入力から出力まで、どのように情報を処理していくか(順伝播)の基本的な流れを見てきました。次の第2部では、このニューラルネットワークをどのようにして「賢く」していくのか、つまり「学習」のプロセスについて詳しく見ていきます
第2部:誤差関数の選び方
第1部では、ニューラルネットワークが入力データを受け取ってから、どのように計算を行い、出力を出すのか(順伝播)を見てきました。しかし、ニューラルネットワークが真に役立つためには、ただ計算できるだけでは不十分です。問題に応じて「正しい」または「より良い」出力を出せるように、ネットワーク内部のパラメータ(重みやバイアス)を調整する必要があります。この調整プロセスを学習 (Learning) または訓練 (Training) と呼びます。
この第2部では、ニューラルネットワークがどのようにして賢くなっていくのか、その学習のメカニズムを探っていきます。特に、学習の心臓部とも言える誤差逆伝播法(バックプロパゲーション)と、効率的に最適なパラメータを見つけ出すための最適化アルゴリズムについて詳しく見ていきましょう。
学習のゴール:間違いを減らしたい!
ニューラルネットワークの学習の多くは、教師あり学習 (Supervised Learning)という枠組みで行われます。これは、問題(入力データ \(\mathbf{x}\))と、それに対応する「正解」(目標値または教師ラベル \(\mathbf{t}\))のペアがたくさん与えられた状態で、ネットワークが入力 \(\mathbf{x}\) から正解 \(\mathbf{t}\) に近い出力を出せるように学習する、というものです。学校のテスト勉強に似ていますね。問題集(訓練データ)を解いて、答え合わせ(正解との比較)をし、間違えたところを修正していくイメージです。
では、ネットワークの出力 \(y(\mathbf{x}, \mathbf{w})\) (\(\mathbf{w}\) はネットワークの重みとバイアスの集まり)が、正解 \(t\) とどれだけ「ズレているか」または「間違っているか」を測るためのものさしが必要になります。このものさしを誤差関数 (Error function)または損失関数 (Loss function) と呼びます。学習の目標は、この誤差関数の値をできるだけ小さくするようなパラメータ \(\mathbf{w}\) を見つけることです。
誤差関数の具体的な形は、解きたい問題の種類(回帰か分類か)によって異なります。
回帰問題の場合:予測と真の値のズレを測る
回帰問題では、連続的な数値を予測します(例:株価、温度)。この場合、最も一般的な誤差関数は二乗和誤差関数 (Sum of Squared Errors) です。
訓練データが \(N\) 個あり、\(n\) 番目の入力データ \(\mathbf{x}_n\) に対するネットワークの出力を \(y(\mathbf{x}_n, \mathbf{w})\)、対応する正解値を \(t_n\) とすると、二乗和誤差関数 \(E(\mathbf{w})\) は以下のように定義されます。
二乗和誤差関数はのように表される。
$$
E(\mathbf{w})=\frac{1}{2} \sum_{n=1}^N\left\{y\left(\mathbf{x}_n, \mathbf{w}\right)-t_n\right\}^2
$$
この部分が最小となる\(\mathbf{w}\)を\(\mathbf{w}_{\mathrm{ML}}\)とする。ただし
\(\mathbf{x}_n\) : 入力特徴ベクトル \((n=1,2, \ldots, N)\) \(\mathbf{t}_n\) : 目標値ベクトル \((n=1,2, \ldots, N)\) \(\mathbf{w}\) : ネットワーク全体の重みパラメータ
この式は、各データ点での「予測値と正解値の差(誤差)」を二乗し、それらを全て足し合わせたものです。係数 \(\frac{1}{2}\) は、後で微分したときに式がきれいになるためについているおまじないのようなものです(本質的な意味は変わりません)。この \(E(\mathbf{w})\) が小さければ小さいほど、ネットワークの予測が正解に近いと言えます。
さらにここで、ネットワークの出力を確立的に解釈すると、より一般的な学習を考えることができるようになります。
出力変数がガウス分布に従うと仮定することで、確率的な不確実性を取り入れることができるのです。これによって、出力が確定的な値ではなく、確率分布として得られます。このような確率的な枠組みは、データが持つノイズや未知の要素に対する耐性を高め、さらには新しいデータに対する予測の信頼区間を推定することも可能にします。
つまりは、予測にはある程度のノイズが乗ると考えるわけです。
まずは、回帰問題として任意の実数値を取れる一つの目標変数\(t\)を考えます。そして\(t\)は\(\mathbf{x}\)に依存する平均を持つガウス分布に従うと仮定します。
$$
p(t \mid \mathbf{x}, \mathbf{w})=N\left(t \mid y(\mathbf{x}, \mathbf{w}), \beta^{-1}\right)
$$
\(y(\mathbf{x}, \mathbf{w}):\)平均(NNの出力) \(\beta^{-1}:\) 精度
因みに、ここでの出力ユニットの活性化関数では恒等写像を考えれば十分で、というのもそのようなネットワークで任意の\(\mathbf{x}\)から\(y\)への連続関数を近似できるからです。
N個の独立確率分布に従う観測値\(\mathbf{X}=\left\{\mathbf{x}_1, \mathbf{x}_2, \ldots, \mathbf{x}_N\right\}\)とそれぞれに対応する目標値\(\mathbf{t}=\left\{t_1, t_2, \ldots, t_N\right\}\)からなるデータ集合が与えられたとき、これらのデータが得られるもっともらしさ(尤もらしさ)を表す尤度関数は、各データ点での確率の積として書けます。
$$
p(\mathbf{t} \mid \mathbf{X}, \mathbf{w}, \beta)=\prod_{n=1}^N p\left(t_n \mid \mathbf{x}_n, \mathbf{w}, \boldsymbol{\beta}\right)
$$
この尤度関数を最大にするようなパラメータ \(\mathbf{w}\) と \(\beta\) を見つけるのが最尤推定 (Maximum Likelihood Estimation) です。
通常、計算を簡単にするために負の対数尤度関数(negative Log-Likehood)を最小化します。(対数を取ると積が和になり、負号をつけることで最大化が最小化問題になります)。
この場合の負の対数尤度関数は次のようになります。
$$
\frac{\beta}{2} \sum_{n=1}^N\left\{y\left(\mathbf{x}_n, \mathbf{w}\right)-t_n\right\}^2-\frac{N}{2} \ln (\beta)+\frac{N}{2} \ln (2 \pi)
$$
学習すべきパラメータは重み\(\mathbf{w}\)と精度の\(\beta\)
最尤推定
まずは、\(\mathbf{w}\)を求めよう。\(\mathbf{w}\)に関して無関係な項を削除することによって
結局、尤度関数を最大化することは
$$
E(\mathbf{w})=\frac{1}{2} \sum_{n=1}^N\left\{y\left(\mathbf{x}_n, \mathbf{w}\right)-t_n\right\}^2
$$
となります。これは最初に見た二乗和誤差関数(に比例する形)と同じです!つまり、ガウス分布のノイズを仮定した最尤推定は、二乗和誤差の最小化と等価になるのです。この時の\(E(\mathbf{w})\)を最小化する\(\mathbf{w}\)は最尤推定解となるので、\(\mathbf{w}_{\mathrm{ML}}\)と表すことにします。
次に精度\(\beta\)に関して最適化を行おう。
精度\(\beta\)に関して微分して0とすれば
$$
\begin{array}{r}
\frac{1}{2} \sum_{n=1}^N\left\{y\left(\mathbf{x}_n, \mathbf{w}_{M L}\right)-t_n\right\}^2-\frac{N}{2 \beta}=0 \\
\frac{1}{\beta_{M L}}=\frac{1}{N} \sum_{n=1}^N\left\{y\left(\mathbf{x}_n, \mathbf{w}\right)-t_n\right\}^2
\end{array}
$$
これは、予測誤差の二乗平均が分散 \(\beta^{-1}\) の推定値になることを意味しています。ただし、通常はまず \(\mathbf{w}\) の最適化を行い、その後に \(\beta\) を推定するか、あるいは \(\beta\) を固定のハイパーパラメータとして扱います。
目的変数が多変量の場合
もし予測したい目標変数 \( \mathbf{t} \) が複数の値を持つベクトル(例えば、ロボットアームの複数の関節角度など)の場合も、同様に考えることができます。各出力要素が独立に同じ分散を持つ等方性の多変量ガウス分布を仮定します。
$$
p(\mathbf{t} \mid \mathbf{x}, \mathbf{w})=N\left(\mathbf{t} \mid \mathbf{y}(\mathbf{x}, \mathbf{w}), \beta^{-1} \mathbf{I}\right)
$$
ここで \(\mathbf{I}\) は単位行列です。この場合の負の対数尤度関数は、
$$
p(\mathbf{t} \mid \mathbf{X}, \mathbf{w}, \beta)=\prod_{n=1}^N p\left(\mathbf{t} \mid \mathbf{x}_n, \mathbf{w}, \beta\right)
$$
これまた同様に負の対数尤度関数を取ると
$$
\frac{\beta}{2} \sum_{n=1}^N\left(\mathbf{t}_n-\mathbf{y}\left(\mathbf{x}_n, \mathbf{w}\right)\right)^T\left(\mathbf{t}_n-\mathbf{y}\left(\mathbf{x}_n, \mathbf{w}\right)\right)-\frac{N K}{2} \ln (\beta)+\frac{N K}{2} \ln (2 \pi)
$$
と表されます。
同じように重みパラメータに関して最適化していく。
\(\mathbf{w}\)について無関係な項を削除して考えると、やはり
$$
\begin{aligned}
& \frac{1}{2} \sum_{n=1}^N\left(\mathbf{t}_n-\mathbf{y}\left(\mathbf{x}_n, \mathbf{w}\right)\right)^T\left(\mathbf{t}_n-\mathbf{y}\left(\mathbf{x}_n, \mathbf{w}\right)\right) \\
& =\frac{1}{2} \sum_{n=1}^N\left\|\left(\mathbf{y}\left(\mathbf{x}_n, \mathbf{w}\right)\right)-\mathbf{t}_n\right\|^2
\end{aligned}
$$
となり、多変量の場合も尤度関数の最大化は、二乗和誤差関数の最小化となります。
この最小化する最尤解を\(\mathbf{w}_{\mathrm{ML}}\)とします。
次に\(\beta\)に関して微分して0とすれば
$$
\begin{gathered}
\frac{1}{2} \sum_{n=1}^N\left(\mathbf{t}_n-\mathbf{y}\left(\mathbf{x}_n, \mathbf{w}_{M L}\right)\right)^T\left(\mathbf{t}_n-\mathbf{y}\left(\mathbf{x}_n, \mathbf{w}_{M L}\right)\right)-\frac{N K}{2 \beta}=0 \\
\frac{1}{\beta}=\frac{1}{N K} \sum_{n=1}^N\left(\mathbf{t}_n-\mathbf{y}\left(\mathbf{x}_n, \mathbf{w}_{M L}\right)\right)^T\left(\mathbf{t}_n-\mathbf{y}\left(\mathbf{x}_n, \mathbf{w}_{M L}\right)\right) \\
\quad=\frac{1}{N K} \sum_{n=1}^N\left\|\left(\mathbf{y}\left(\mathbf{x}_n, \mathbf{w}_{M L}\right)-\mathbf{t}_n\right)\right\|^2
\end{gathered}
$$
結局
$$
\frac{1}{\beta_{\mathrm{ML}}}=\frac{1}{N K} \sum_{n=1}^N\left\|\mathbf{y}\left(\mathbf{x}_n, \mathbf{w}_{\mathrm{ML}}\right)-\mathbf{t}_n\right\|^2
$$
となります。
分類問題の場合:クラス分けの自信度を測る
分類問題では、データがどのクラスに属するかを予測します。この場合の誤差関数としてよく使われるのが交差エントロピー誤差関数 (Cross-Entropy Error) です。
二値分類 (Binary Classification)
まず、2つのクラス(例えばクラス \(\mathcal{C}_1\) と \(\mathcal{C}_2\)、目標値 \(t=1\) と \(t=0\) で表現)に分類する問題を考えます。
\(\mathcal{C}_1\):\(t = 1\)
\(\mathcal{C}_2\):\(t = 0\)
で分類されるとする。
ニューラルネットワークの出力ユニットは1つで、活性化関数にはシグモイド関数を使います。すると、出力 \(y(\mathbf{x}, \mathbf{w})\) は0から1の間の値を取り、これをクラス \(\mathcal{C}_1\) に属する確率 \(P(\mathcal{C}_1 \mid \mathbf{x})\) と解釈できます。そうすると、クラス \(\mathcal{C}_2\) に属する確率は \(1 - y(\mathbf{x}, \mathbf{w})\) となります。
$$
p\left(C_1 \mid \mathbf{x}\right)=y \quad p\left(C_2 \mid \mathbf{x}\right)=1-y
$$
このとき、目標値 \(t\) が与えられたときの条件付き確率は、ベルヌーイ分布の形で書けます。
$$
\begin{aligned}
p(t \mid \mathbf{x}, \mathbf{w}) & =p\left(C_1 \mid \mathbf{x}\right)^t p\left(C_2 \mid \mathbf{x}\right)^{1-t} \\
& =y(\mathbf{x}, \mathbf{w})^t\{1-y(\mathbf{x}, \mathbf{w})\}^{1-t}
\end{aligned}
$$
(\(t=1\) のときは \(y\)、\(t=0\) のときは \(1-y\) となります。)
この尤度関数 \(p(t \mid \mathbf{x}, \mathbf{w})\) (または \(N\) 個のデータに対する総尤度 \( \prod_n p(t_n \mid \mathbf{x}_n, \mathbf{w}) \))の負の対数を取ると、誤差関数 \(E(\mathbf{w})\) が得られます。
負の対数関数は
$$
- \ln (p(t \mid \mathbf{x}, \mathbf{w}))=-\{t \ln (y(\mathbf{x}, \mathbf{w}))+(1-t) \ln (1-y(\mathbf{x}, \mathbf{w}))\}
$$
訓練集合が独立な観測値である場合には、負の対数尤度で与えられる誤差関数は
$$
E(\mathbf{w})=- \sum_{n=1}^N \{t_n \ln \left(y_n\right)+\left(1-t_n\right) \ln \left(1-y_n\right)\}
$$
という二値分類の交差エントロピー誤差関数になる。ここではラベル付けが正しくなされているという前提のもと計算しているので、ノイズ精度\(\beta\)に相当するものはない。そしてそれは、ラベル付け誤差を許容できるように簡単に拡張することができる。
クラス分類問題では二乗和の代わりに交差エントロピーを使う方が、高速で高い汎化性能を示す。
マルチラベリング(多クラス分類)の場合
これは、1つのデータが同時に複数のクラスに属することができる場合です(例:映画のジャンルが「アクション」かつ「コメディ」)。
この場合、\(K\) 個のクラスそれぞれについて独立した二値分類を行うと考え、出力層に \(K\) 個のユニットを用意し、それぞれにシグモイド活性化関数を使います。各出力 \(y_k\) はクラス \(k\) に属する確率を表します。
各クラスラベルが独立であると仮定すると、誤差関数は各クラスの交差エントロピーの和になります。
$$
p(\mathbf{t} \mid \mathbf{x}, \mathbf{w})=\prod_{k=1}^K y_k(\mathbf{x}, \mathbf{w})^{t_k}\left\{1-y_k(\mathbf{x}, \mathbf{w})\right\}^{1-t_k}
$$
同様に負の対数を取って独立な観測を考えれば
$$
E(\mathbf{w})=-\sum_{n=1}^N \sum_{k=1}^K \{t_{n k} \ln \left(y_{n k}\right)+\left(1-t_{n k}\right) \ln \left(1-y_{n k}\right)\}
$$
ここで \(t_{nk}\) はデータ \(n\) がクラス \(k\) に属するなら1、そうでなければ0、\(y_{nk} = y_k(\mathbf{x}_n, \mathbf{w})\) です。
多クラス分類の場合
これは、データが \(K\) 個のクラスのうち、必ずどれか1つだけに属する場合です(例:手書き数字が0~9のどれか)。
出力層には \(K\) 個のユニットを用意し、活性化関数にはソフトマックス関数を使います。ソフトマックス関数の出力 \(y_k(\mathbf{x}, \mathbf{w})\) は、入力 \(\mathbf{x}\) がクラス \(k\) に属する確率 \(P(t_k=1 \mid \mathbf{x})\) と解釈できます(全ての \(k\) について \(y_k \ge 0\) かつ \(\sum_k y_k = 1\))。
目標値 \(\mathbf{t}_n\) は、正解クラスに対応する要素だけが1で他が0のベクトル(one-hot表現)で与えられます。
この場合の誤差関数(負の対数尤度)は、
$$ E(\mathbf{w})=-\sum_{n=1}^N \sum_{k=1}^K t_{k n} \ln y_k\left(\mathbf{x}_n, \mathbf{w}\right) $$
となります。
となります。one-hot表現なので、内側の和 \(\sum_k\) は、実際には正解クラスに対応する \(k\) についての項 \( - \ln y_k(\mathbf{x}_n, \mathbf{w}) \) だけが残ります。
この関数も交差エントロピー誤差と呼ばれます。
ただし、\(y_k(\mathbf{x}_n, \mathbf{w})\): \(n\)番目のデータが\(k\)番目のクラスに属する確率(モデルの出力)
尤度を最適化することは、交差エントロピー誤差関数であるこの関数を最小化することと等価である。
なぜ分類問題で二乗和誤差ではなく交差エントロピーを使うのか?
理論的には、分類問題でもシグモイド関数やソフトマックス関数の出力を確率とみなし、目標値(0か1)との二乗和誤差を最小化することも考えられます。しかし、一般的に交差エントロピー誤差を使う方が、以下のような利点があるため推奨されます。
- 確率的な解釈との整合性: 交差エントロピーは、ベルヌーイ分布や多項分布といった確率分布の最尤推定から自然に導かれます。
- 学習の速さ: 特にシグモイド関数やソフトマックス関数と組み合わせた場合、勾配の形がシンプルになり(後述)、二乗和誤差を使った場合よりも学習が速く進むことが多いです(特に、出力が飽和している領域での勾配消失が起きにくい
- より良い汎化性能: 実験的にも、交差エントロピーの方がより良い汎化性能(未知のデータに対する予測精度)を示すことが多いと報告されています。
誤差関数まとめ
これまでの話をまとめると、出力ユニットの活性化関数と誤差関数は解くべき問題の形によって自然に選択されます。
回帰問題での誤差関数は二乗和誤差関数
分類問題の誤差関数は交差エントロピー誤差関数と呼ばれ、二乗和誤差最小化よりも高速かつ高い汎化性能を持っている。
| 回帰 | 二値分類 | マルチラベリング | 多クラス分類問題 | |
| 活性化関数 | 恒等関数 | シグモイド関数 | シグモイド関数 | ソフトマックス関数 |
| 誤差関数 | 二乗和誤差 | 交差エントロピー | 交差エントロピー | 交差エントロピー |
誤差関数の性質:誤差逆伝播法への伏線
後で詳しく見る誤差逆伝播法では、誤差関数 \(E(\mathbf{w})\) を各重み \(w\) で偏微分した値(勾配 \(\frac{\partial E}{\partial w}\))が必要になります。この計算の途中で、誤差関数を出力ユニットの活性化の入力 \(a_k\) (活性化関数を適用する前の値)で偏微分した \(\frac{\partial E}{\partial a_k}\) が現れます。この値は、実は非常にシンプルな形になることがあります。
例えば、回帰問題で出力の活性化関数が恒等関数 (\(y_k = a_k\))、誤差関数が \(E = \frac{1}{2} \sum_n \sum_k (y_{nk} - t_{nk})^2\) の場合を考えます。
あるデータ \(n\) のある出力ユニット \(k\) の活性化入力 \(a_{nk}\) で偏微分すると(他のデータやユニットは定数とみなせる)、
$$ \frac{\partial E}{\partial a_{nk}} = y_{nk} - t_{nk} $$
となります(1つのデータ点 \(n\) について考えれば、和の記号は不要で \(\frac{\partial E_n}{\partial a_{nk}} = y_{nk} - t_{nk}\))。
つまり、「出力値 - 目標値」という非常に単純な形で誤差信号が得られます。
同様に、多クラス分類で出力の活性化関数がソフトマックス関数 \(y_k = \frac{\exp(a_k)}{\sum_j \exp(a_j)}\)、誤差関数が交差エントロピー \(E = -\sum_n \sum_k t_{nk} \ln y_{nk}\) の場合、
$$ \frac{\partial E}{\partial a_{nk}} = y_{nk} - t_{nk} $$
という同じ形が得られます(\(t_{nk}\) はone-hot表現)。
(この導出は少し複雑ですが、ソフトマックス関数の微分と交差エントロピーの微分の組み合わせでこの結果が得られます。)
また、二値分類で出力活性化がシグモイド関数 \(y = \frac{1}{1+e^{-a}}\)、誤差が交差エントロピー \(E = -\sum_n (t_n \ln y_n + (1-t_n)\ln(1-y_n))\) の場合も、
$$ \frac{\partial E}{\partial a_{n}} = y_{n} - t_{n} $$
となります。
これらの「出力 - 目標値」というシンプルな形は、誤差逆伝播法の計算を効率的に行う上で非常に都合が良い性質です。この性質のおかげで、様々な問題設定に対して統一的な枠組みで学習アルゴリズムを設計できるのです。
第3部:ネットワークの学習・誤差逆伝播法(バックプロパゲーション)
さて、学習の目標(誤差関数を最小化する)と、そのものさし(誤差関数)が決まりました。次に問題になるのは、「どうやって誤差関数の値を小さくするような重み \(\mathbf{w}\) を見つけるのか?」ということです。ニューラルネットワークには、非常にたくさんの重みやバイアスといった調整可能なパラメータがあります。これらのパラメータを闇雲にいじっても、効率的に良い解は見つかりません。
そこで登場するのが、**誤差逆伝播法 (Error Backpropagation、単にバックプロパゲーションまたはBPとも)** というアルゴリズムです。これは、ニューラルネットワークの学習において、革命的とも言えるほど重要な役割を果たしてきました。誤差逆伝播法は、誤差関数 \(E(\mathbf{w})\) の各パラメータ \(w\) に対する勾配 \(\nabla E(\mathbf{w})\) (具体的には各 \(\frac{\partial E}{\partial w_{ji}}\) や \(\frac{\partial E}{\partial w_{j0}}\)) を効率的に計算するための手法です。
なぜ勾配が必要なのか?

「勾配」とは、関数のある地点での「傾き」を表すベクトルです。例えば、あなたが砂漠にいて、できるだけ早く谷底に降りたいとします。目隠しをしていても、足元の地面がどちらに傾いているかは分かりますよね? 最も急な下り坂の方向に一歩進めば、谷底に近づけるはずです。
誤差関数 \(E(\mathbf{w})\) を山の地形、現在の重み \(\mathbf{w}\) をあなたの現在地と考えると、誤差関数を小さくする(谷底へ向かう)ためには、勾配 \(\nabla E(\mathbf{w})\) が指し示す方向とは逆の方向(つまり \(-\nabla E(\mathbf{w})\) の方向)へパラメータ \(\mathbf{w}\) を少しずつ更新していけば良い、ということになります。これが後で見る勾配降下法という最適化手法の基本的な考え方です。
したがって、ニューラルネットワークを学習させるためには、まずこの勾配 \(\frac{\partial E}{\partial w}\) を計算することが不可欠です。
基本原理:間違いを逆向きに伝えていく「責任転嫁」ゲーム
ニューラルネットワークは多層構造をしています。出力層での誤差(予測と正解のズレ)が生じたとき、その誤差の原因は、出力層の重みだけでなく、その一つ前の隠れ層のニューロンの出力、さらにその隠れ層の重み、…というように、ネットワークを遡って入力層に近い部分のパラメータにも責任があると考えられます。
誤差逆伝播法は、この「責任」を、出力層から入力層に向かって、各層の計算の「逆」をたどるようにして伝播させていくイメージです。そして、各パラメータが最終的な誤差にどれだけ「貢献」したか(つまり、そのパラメータを少し変えたら誤差がどれだけ変わるか)を、数学の連鎖律 (Chain Rule) を使って計算していきます。
連鎖率とは?
連鎖律は、合成関数の微分に関するルールです。例えば、\(y = f(u)\) であり、かつ \(u = g(x)\) であるとき、\(y\) を \(x\) で微分したい場合、次のように計算できます。
$$ \frac{dy}{dx} = \frac{dy}{du} \cdot \frac{du}{dx} $$
つまり、「\(y\) の \(u\) に対する変化率」と「\(u\) の \(x\) に対する変化率」の積で、「\(y\) の \(x\) に対する変化率」が求まる、というものです。ニューラルネットワークの計算は、まさにこのような関数の入れ子構造になっているため、連鎖律が大活躍します。
誤差逆伝播法のステップ
誤差逆伝播法は、大きく分けて2つのパスから構成されます。
1. フォワードパス(順伝播):
- まず、入力データ \(\mathbf{x}_n\) をネットワークに与え、第1部で説明した順伝播の計算を行います。
- このとき、各層の各ニューロンの入力の合計 \(a_j^{(l)}\) (活性化関数を適用する前の値) や、活性化関数を通った後の出力 \(z_j^{(l)}\) を計算し、これらの値を記録・保存しておきます。これらは後のバックワードパスで必要になります。
- 最終的にネットワークの出力 \(\mathbf{y}_n\) と、それを使った誤差関数 \(E_n\) の値も計算します。
2. バックワードパス(逆伝播):
- ここからが誤差逆伝播法の本番です。出力層から入力層に向かって、誤差に関する情報を伝播させながら、各重みとバイアスに関する勾配を計算していきます。
- ここでは、誤差関数 \(E_n\) の、各層 \(l\) のニューロン \(j\) の活性化入力 \(a_j^{(l)}\) に対する偏微分を \(\delta_j^{(l)} = \frac{\partial E_n}{\partial a_j^{(l)}}\) と定義します。この \(\delta\) が「誤差信号」として伝播していきます。
a) 出力層 (\(l=L\)) での誤差信号 \(\delta_k^{(L)}\) の計算:
前述の通り、多くの一般的な設定(回帰+恒等関数、分類+ソフトマックス/シグモイド関数+交差エントロピー)では、この \(\delta_k^{(L)}\) はシンプルに以下のように計算されます。
$$ \delta_k^{(L)} = y_{nk} - t_{nk} $$
ここで \(y_{nk}\) は出力層の \(k\) 番目のニューロンの出力、\(t_{nk}\) は対応する目標値です。
b) 出力層の重みとバイアスの勾配計算:
出力層のニューロン \(k\) への入力 \(a_{nk}^{(L)}\) は、\(a_{nk}^{(L)} = \sum_j w_{kj}^{(L)} z_{nj}^{(L-1)} + w_{k0}^{(L)}\) でした(\(z_{nj}^{(L-1)}\) は \(L-1\) 層(最後の隠れ層)の \(j\) 番目のニューロンの出力)。
連鎖律を使うと、誤差 \(E_n\) を出力層の重み \(w_{kj}^{(L)}\) で偏微分した値(勾配)は、
$$ \frac{\partial E_n}{\partial w_{kj}^{(L)}} = \frac{\partial E_n}{\partial a_{nk}^{(L)}} \cdot \frac{\partial a_{nk}^{(L)}}{\partial w_{kj}^{(L)}} = \delta_k^{(L)} \cdot z_{nj}^{(L-1)} $$
同様に、出力層のバイアス \(w_{k0}^{(L)}\) に関する勾配は、
$$ \frac{\partial E_n}{\partial w_{k0}^{(L)}} = \frac{\partial E_n}{\partial a_{nk}^{(L)}} \cdot \frac{\partial a_{nk}^{(L)}}{\partial w_{k0}^{(L)}} = \delta_k^{(L)} \cdot 1 = \delta_k^{(L)} $$
c) 隠れ層 (\(l=L-1, \dots, 1\)) への誤差信号 \(\delta_j^{(l)}\) の伝播:
ある層 \(l\) のニューロン \(j\) での誤差信号 \(\delta_j^{(l)}\) は、その一つ下流(出力層側)の層 \(l+1\) の誤差信号 \(\delta_k^{(l+1)}\) を使って計算されます。
ニューロン \(j\) (層 \(l\)) の出力 \(z_{nj}^{(l)}\) は、層 \(l+1\) の複数のニューロン \(k\) の活性化入力 \(a_{nk}^{(l+1)}\) に影響を与えます。
\(\delta_j^{(l)} = \frac{\partial E_n}{\partial a_{nj}^{(l)}} = \left( \sum_k \frac{\partial E_n}{\partial a_{nk}^{(l+1)}} \cdot \frac{\partial a_{nk}^{(l+1)}}{\partial z_{nj}^{(l)}} \right) \cdot \frac{\partial z_{nj}^{(l)}}{\partial a_{nj}^{(l)}} \)
ここで、
\(\frac{\partial E_n}{\partial a_{nk}^{(l+1)}} = \delta_k^{(l+1)}\) (層 \(l+1\) で計算済み)
\(a_{nk}^{(l+1)} = \sum_m w_{km}^{(l+1)} z_{nm}^{(l)} + w_{k0}^{(l+1)}\) なので、\(\frac{\partial a_{nk}^{(l+1)}}{\partial z_{nj}^{(l)}} = w_{kj}^{(l+1)}\) (層 \(l\) の \(j\) から層 \(l+1\) の \(k\) への重み)
\(z_{nj}^{(l)} = h(a_{nj}^{(l)})\) なので、\(\frac{\partial z_{nj}^{(l)}}{\partial a_{nj}^{(l)}} = h'(a_{nj}^{(l)})\) (層 \(l\) の活性化関数の \(a_{nj}^{(l)}\) での微分値)
したがって、層 \(l\) のニューロン \(j\) での誤差信号 \(\delta_j^{(l)}\) は、
$$ \delta_j^{(l)} = h'(a_{nj}^{(l)}) \sum_k w_{kj}^{(l+1)} \delta_k^{(l+1)} $$
と計算できます。これは、「下流(出力層側)の誤差 \(\delta_k^{(l+1)}\) を、結合の重み \(w_{kj}^{(l+1)}\) で重み付けして合計し、それに自分の活性化関数の微分 \(h'(a_{nj}^{(l)})\) を掛けたもの」と解釈できます。
ここが「誤差を逆伝播させる」という名前の由来となる計算です。
d) 隠れ層の重みとバイアスの勾配計算:
\(\delta_j^{(l)}\) が計算できれば、その層の重み \(w_{ji}^{(l)}\)(層 \(l-1\) の \(i\) から層 \(l\) の \(j\) へ)とバイアス \(w_{j0}^{(l)}\) に関する勾配も、b) と同様に計算できます。
$$ \frac{\partial E_n}{\partial w_{ji}^{(l)}} = \frac{\partial E_n}{\partial a_{nj}^{(l)}} \cdot \frac{\partial a_{nj}^{(l)}}{\partial w_{ji}^{(l)}} = \delta_j^{(l)} \cdot z_{ni}^{(l-1)} $$
$$ \frac{\partial E_n}{\partial w_{j0}^{(l)}} = \frac{\partial E_n}{\partial a_{nj}^{(l)}} \cdot \frac{\partial a_{nj}^{(l)}}{\partial w_{j0}^{(l)}} = \delta_j^{(l)} \cdot 1 = \delta_j^{(l)} $$
(ここで \(z_{ni}^{(0)}\) は入力データ \(x_{ni}\) を表します。)
このようにして、1つのデータサンプル \(E_n\) に対する全ての重みとバイアスに関する勾配 \(\frac{\partial E_n}{\partial w}\) を計算することができます。
実際の学習では、ミニバッチ内の各サンプルについてこれらの勾配を計算し、それらを平均したものを最終的な勾配 \(\nabla E(\mathbf{w})\) としてパラメータ更新に用います。
活性化関数の微分がここで活きる!
誤差逆伝播の計算の中で、\(h'(a_j)\) のように活性化関数の微分値が必要になることが分かりました。
例えば、
- シグモイド関数\(h(a) = \frac{1}{1+e^{-a}}\) の場合、微分は \(h'(a) = h(a)(1-h(a))\) です。フォワードパスで計算した出力 \(z_j = h(a_j)\) を使って \(z_j(1-z_j)\) と簡単に計算できます。
- ReLU関数 \(h(a) = \max(0, a)\) の場合、微分は \(a>0\) なら 1、\(a<0\) なら 0 です(\(a=0\) では定義されませんが、実用上は0か1のどちらかにします)。これもフォワードパスでの \(a_j\) の値から簡単に判別できます。
このように、活性化関数の微分が簡単に計算できることも、効率的な学習には重要です。
誤差逆伝播法の利点
誤差逆伝播法が登場する以前は、ニューラルネットワークの勾配を計算するために、各重みを少しずつ変化させて誤差関数の変化を見るような、数値微分に近い方法が考えられていましたが、パラメータの数が多くなると計算量が爆発的に増えてしまい実用的ではありませんでした。
誤差逆伝播法は、たった1回のフォワードパスと1回のバックワードパスで、全てのパラメータに関する勾配を計算できます。その計算量は、おおよそ順伝播の計算量の定数倍程度で済みます。
これにより、パラメータ数が数百万、数千万といった巨大なニューラルネットワーク(ディープラーニングモデル)でも、現実的な時間で学習させることが可能になったのです。
計算量の比較
重みの総数を \(W\) とします。
- 勾配情報を利用しない場合(例えば、各重みを少し動かして誤差の変化を見る数値微分):
各パラメータについて誤差関数を評価する必要があるので、\(W\) 回の順伝播計算が必要。1回の順伝播が \(\mathcal{O}(W)\) とすると、勾配全体の計算に \(\mathcal{O}(W^2)\) かかる。 - 勾配情報を利用する場合(誤差逆伝播法):
1回の順伝播と1回の逆伝播で全パラメータの勾配が計算可能。どちらも計算量は \(\mathcal{O}(W)\) 程度。したがって、勾配全体の計算も \(\mathcal{O}(W)\) で済む。
この効率の良さが、ニューラルネットワークの学習において勾配情報(特に誤差逆伝播法で計算される勾配)が不可欠である理由です。
誤差逆伝播法によって勾配 \(\nabla E(\mathbf{w})\) が計算できれば、いよいよパラメータ \(\mathbf{w}\) を更新して、ニューラルネットワークを賢くしていくステップに進めます。それが次の「パラメータ最適化アルゴリズム」です。
第4部:パラメータ最適化
誤差逆伝播法を使って、誤差関数 \(E(\mathbf{w})\) の各重み \(\mathbf{w}\) に対する勾配 \(\nabla E(\mathbf{w})\) を計算できるようになりました。この勾配は、いわば「誤差という山を下るための最も急な方向」を示しています。この情報を使って、実際に重みパラメータ \(\mathbf{w}\) をどのように更新していけば、誤差関数の値を最小にできるのでしょうか? この問題を解くの最適化アルゴリズム (Optimization Algorithm) の役割です。
停留点の分類
誤差関数をパラメータ \(\mathbf{w}\) で微分した勾配 \(\nabla E(\mathbf{w})\) がゼロになる点 \(\nabla E(\mathbf{w}) = \mathbf{0}\) を**停留点**と呼びます。停留点は、関数が平坦になっている場所で、極小点、極大点、または鞍点のいずれかです。
- 極小点 (Local Minimum): その点の周りでは最も値が小さい点。
- 極大点 (Local Maximum): その点の周りでは最も値が大きい点。
- 鞍点 (Saddle Point): ある方向から見ると極小だが、別の方向から見ると極大になっている点。馬の鞍のような形。
ニューラルネットワークの学習では、これらの停留点のうち、できるだけ値の小さい極小点を見つけたいわけです。
ヘッセ行列と極小点(専門家向け)
最適化問題を解く前にテイラー展開による局所的な近似に出てくるヘッセ行列と極小点の関係を理解しよう。
テイラー展開の局所二次近似
ただし、三次以上の項は省略されている。この式を単純に微分すると
$$
\nabla E \cong \mathbf{b}+\mathbf{H}(\mathbf{w}-\hat{\mathbf{w}})
$$
となり、点\(\hat{\mathbf{w}}\)周りでは誤差関数と勾配のどちらも、これらはいい感じの近似精度になる。
さて、この点\(\hat{\mathbf{w}}\)を極小点\(\mathbf{W}^*\)として、極小点まわりの局所二次近似を見てみよう。このとき、極小点では\(\left.\nabla E\right|_{\mathbf{w}=\mathbf{w}^*}=0\)が成り立つので、線形項が消えて以下のように表される。
このヘッセ行列を幾何的に解釈するために、ヘッセ行列の固有方程式を考える。
$$
\mathbf{H} \mathbf{u}_i=\lambda_i \mathbf{u}_i
$$
固有ベクトル\(\mathbf{u}\)は完全正規直交系をなして、つまり
$$
\mathbf{u}_i^{\mathrm{T}} \mathbf{u}_j=\delta_{i j}=\left\{\begin{array}{l}
1(i=j) \\
0(i \neq j)
\end{array}\right.
$$
が成り立ちます。
ここで、\(\mathbf{w}-\mathbf{w}^*\)を正規直交基底の線形和で表現すると
$$
\mathbf{w}-\mathbf{w}^*=\sum_i \alpha_i \mathbf{u}_i
$$
という形で書ける。これは原点を\(\mathbf{w}^*\)に平行移動して、各軸を固有ベクトルに合わせるように座標変換したものと考えることができます。
よってこの式を使って極小点での誤差関数を置き換えると
$$
\begin{aligned}
E(\mathbf{w}) & \cong E\left(\mathbf{w}^*\right)+\frac{1}{2}\left(\mathbf{w}-\mathbf{w}^*\right)^T\mathbf{H} \left(\mathbf{w}-\mathbf{w}^*\right)\\
& =E\left(\mathbf{w}^*\right)+\left(\sum_i \alpha_i \mathbf{u}_i^T\right) \mathbf{H}\left(\sum_j \alpha_j \mathbf{u}_j\right) \\
& =E\left(\mathbf{w}^*\right)+\left(\sum_i \alpha_i \mathbf{u}_i^T\right)\left(\sum_j \alpha_j \lambda_j \mathbf{u}_j\right) \\
& =E\left(\mathbf{w}^*\right)+\sum_i \alpha_i^2 \lambda_i
\end{aligned}
$$
つまり
振り返ると、誤差関数を幾何的に捉えることを目標に据えていたわけだが、この式より、実はこの座標系における誤差関数の等高線は楕円になるということが言えます。

正定値
すべての\(\mathbf{v} \neq 0\)に対して\(\mathbf{v}^{\mathrm{T}} \mathbf{H} \mathbf{v}>0\)
を満たすとき、その時に限り正定値であると言われる。 そして大事な正定値行列の大事な性質が「すべての固有値が正である」ことが「\(\mathbf{H}\)は正定値」であることの必要十分条件である。ということである。
そして、ここで一番言いたかったことは。点\(\mathbf{w}^*\)におけるヘッセ行列が正定値⇔定常点\(\mathbf{w}^*\)は極小値ということです
極小点の見つけ方
さて、肝心のどのように極小点を見つけるかなのだが、やはり解析的に解をみつけることは困難を極める。なのでここでは、数値的な反復して逐次的に探索していく方法を取ることにする。
この連続な非線形関数の極小点を逐次的に探索するアルゴリズムはたくさん存在するが、ほとんどのテクニックにおいてその基本的なアプローチは同じで
- 初期値\(\mathbf{w}^{(0)}\)を選ぶ
- \(\mathbf{w}^{\tau+1}=\mathbf{w}^\tau+\Delta \mathbf{w}^\tau\)という形で連続的にステップ移動する(ただし\(\tau\)は反復ステップ数)
という2ステップをこなしていく。
つまり、結局勾配の計算が必要になる。
勾配法による最適化
まずイメージとして\(-\nabla E(\mathbf{w})\)はその点から最も減少する方向であるので、それに従って何回か移動を繰り返していけばいつか極小点にたどり着けるのでは?!
という見つけ方で、本当にいろんな方法が存在しています。ここからはその方法をいろいろ見ていきますが、まずはそれらの最適化手法を評価するための基準について整理します。
最適化手法の評価基準
- 大域収束性(満たすor満たさない) 初期値によらず収束するかどうか
- 収束率(一次収束<<超一次収束<<二次収束) 一回の反復で極限までの距離がどのような速度で減少するか
数列\(\{x_k\}\)が極限\(x^*\)にp次収束するとは
$$ \left|x_{k+1}-x^*\right| \leq c\left|x_k-x^*\right|^p \quad(0<c<1) $$ また、超一次収束とは
$$ \left|x_{k+1}-x^*\right| \leq c_k\left|x_k-x^*\right|\left(\lim _{k \rightarrow \infty} c_k=0\right) $$
勾配降下法

一つ目の勾配を用いた極小値を見つける方法は勾配降下法と呼ばれる手法で、最もシンプルな手法です。
勾配降下法
\(\mu\) :学習率 (固定値) \(\tau\) : 更新回数のインデックス
勾配降下法の特徴
- 収束が非常に遅い(一次収束)
- 収束性が初期値の選び方に依存しない(大域的収束性)
- ハイパーパラメータの設定がめんどくさい
- 局所的極小値にハマる
というように、非常に分かりやすい手法だが、実際にはそんなに良いアルゴリズムではない。
共役勾配法

これは勾配降下法の進化版と言える方法で、更新方向の過去の情報も使って決める勾配法
共役勾配法
共役勾配法の特徴
- 収束が勾配降下法に比べ高速
- 収束性が初期値の選び方に依存しない(大域的収束性)
- ハイパーパラメータの設定必要なし
- 局所的極小値にハマる
ニュートン法
ヘッセ行列も使用して最適化を行う方法としてニュートン法がある。
ニュートン法
\(\alpha^{(\tau)}\):ステップサイズ(一次元探索) \(\tau\) : 更新回数のインデックス
ステップサイズの一次元探索とは
誤差関数を更新方向にぶった切った時に最も凹んでいる位置に来るようにステップサイズを決定します。
ニュートン法の特徴
- 収束が非常に速い(二次収束)
- 収束性が初期値に依存する
- ハイパーパラメータの設定必要なし
- ヘッセ行列の逆行列が不安定になる場合がある
- 局所的極小値にハマる
準ニュートン法
先ほどのニュートン法を進化させて、欠点を克服しよう!!
準ニュートン法
逆行列の計算を近似で置き換えます。
$$ \mathbf{w}^{(\tau+1)}=\mathbf{w}^{(\tau)}-\alpha^{(\tau)} \mathbf{H}^{(\tau)} \nabla E\left(\mathbf{w}^{(\tau)}\right) $$ ステップサイズ\(\alpha^{(\tau)}\)は同じく一次元探索で決定する。 逆行列の更新(BFGS法) $$ \mathbf{H}^{(\tau+1)}=\mathbf{H}^{(\tau)}+\frac{\mathbf{y}^{(\tau)} \mathbf{y}^{(\tau) \mathrm{T}}}{\mathbf{s}^{(\tau) \mathrm{T}} \mathbf{y}^{(\tau)}}-\frac{\mathbf{H}^{(\tau)} \mathbf{s}^{(\tau)} \mathbf{s}^{(\tau) \mathrm{T}} \mathbf{H}^{(\tau)}}{\mathbf{s}^{(\tau) \mathrm{T}} \mathbf{H}^{(\tau)} \mathbf{s}^{(\tau)}} $$ ただし、 $$ \begin{aligned} & \mathbf{s}^{(\tau)}=\mathbf{w}^{(\tau+1)}-\mathbf{w}^{(\tau)} \\ & \mathbf{y}^{(\tau)}=\nabla E\left(\mathbf{w}^{(\tau+1)}\right)-\nabla E\left(\mathbf{w}^{(\tau)}\right) \end{aligned} $$
準ニュートン法の特徴
- 収束が速い(超一次収束)
- 収束が初期値に依存しない(大域的収束性)
- 局所的極小値にハマる
- 逆行列を直接計算しない。
勾配法による最適化まとめ

学習時のデータ量の使い方の違い
勾配降下法において、誤差関数は訓練集合に関して定義されるが、それぞれの反復ステップで\(\nabla E\left(\mathbf{w}\right)\)を評価してやる必要があります。
バッチ学習
パラメータの更新にすべての訓練データを用いるのがバッチ学習。更新方法は
- すべての訓練データを用いて地点\(\mathbf{w}^{(\tau)}\)における勾配を求める。(\(E(\mathbf{w})=\sum_{n=1}^N E_n(\mathbf{w})\))
- 新たな探索地点\(\mathbf{w}^{(\tau)}\)を傾きと学習率\(\mu\)を使って更新する。
- 傾きが0となる\(\mathbf{w}\)を見つけるまで1,2を繰り返す。
バッチ学習の性質として、学習結果が安定しやすいが、新たな学習データが追加されるたびに、全データを用いて再度計算を行わなければなりません。
なので、このバッチ学習は全データ数が少ない時に有効です。
ミニバッチ学習
訓練データの中から一部、\(n\)個のデータを取り出してパラメータの更新をするのがミニバッチ学習で、取り出した訓練データのことをミニバッチと呼び、取り出したデータ数\(n\)のことをミニバッチサイズという。更新方法は
- データからランダムに\(n\)個のデータを取り出す
- \(n\)個のデータを用いて地点\(\mathbf{w}^{(\tau)}\)における勾配を求める。\(E(\mathbf{w})=\sum_{n=1}^{n} E_n(\mathbf{w})\left( n<N\right)\)
- 新たな探索地点\(\mathbf{w}^{(\tau)+1}\)を勾配と学習率\(\mu\)を使って更新する
- 1~3を繰り返す。
ミニバッチ学習はニューラルネットワークでよく使われます。
オンライン学習
訓練データの一つを取り出してパラメータの更新をするのがオンライン学習で、以下のように更新を行います。
- N個のデータからランダムに1つのデータを取り出す。
- 1個のデータを用いて地点\(\mathbf{w}^{(\tau)}\)における勾配を求める
- 新たな探索地点\(\mathbf{w}^{(\tau)+1}\)を傾きと学習率\(\mu\)を用いて更新する。
- 1~3を繰り返す。
オンライン学習は結果が不安点になりやすく、一つ一つのデータに対して更新を行うため外れ値にも反応しやすいです。
確率的勾配降下法(SGD)
勾配降下法のオンライン(ミニバッチ)学習バージョンを確率的勾配降下法(SGD)といいます。

| 確率的勾配降下法のメリット | 確率的勾配降下法のデメリット |
|
|
momentum[1986]

momentumとは「運動量」という意味で、物理チックに極小点を探す方法です。更新則は
$$
\begin{gathered}
v^{(\tau+1)} = \alpha v^{(\tau)}-\eta \frac{\partial L}{\partial W} \\
w^{(\tau+1)} = w^{(\tau)}+v^{(\tau)}
\end{gathered}
$$
vは物理で言うところの「速度」に対応し、\(\alpha\)は「空気抵抗」に相当します。つまり、\(\alpha = 0\)ならSGD

Momentumはボールが転がるように動きます
AdaGrad[J.Duchi et al. 2012]

学習率を調整するアルゴリズムとして、学習率を減衰させていくアルゴリズムであるAdaGradを紹介します
更新則は以下のようです
$$
\begin{aligned}
& r^{(\tau+1)}=r^{(\tau)}+\nabla E\left(w^{(\tau)}\right)^2 \\
&w^{(\tau+1)}=w^{(\tau)}-\frac{\alpha}{\sqrt{r^{(\tau+1)}}+\epsilon} \nabla E\left(w^{(\tau)}\right)
\end{aligned}
$$
AdaGradは過去の勾配の二乗和を全て保持しています。そのため、学習を進めれば進めるほど、更新度合いは小さくなります。実際のところ、無限に学習を行ったとすると更新量は0になる。つまり動かなくなってしまいます
これを改善した方法としてRMSPropというのがあります。
RMSProp(2012)
$$ \begin{aligned} r^{(\tau+1)} & =\gamma^{(\tau)}+(1-\gamma) \nabla E\left(w^{(\tau)}\right)^2 \\ w^{(\tau+1)} & =w^{(\tau)}-\frac{\alpha}{\sqrt{r}+\varepsilon}E\left(w^{(\tau)}\right)\end{aligned} $$
Adam[M.D. Zeiler et al. 2015]

AdamはMomentumとAdaGradの融合で、現在最もよく使われている今アツい最適化アルゴリズムです。
RMSPropの改良版でもあり、勾配に関しても以前の情報を指数関数的に減衰させながら伝えることで、次元量の問題に対応しています。
更新則は
$$
\begin{aligned}
& v^{(\tau+1)}=\beta v^{(\tau)}+(1-\beta) \nabla E\left(w^{(\tau)}\right) \\
& r^{(\tau+1)}=\gamma r^{(\tau)}+(1-\gamma) \nabla E\left(w^{(\tau)}\right)^2 \\
& w^{(\tau+1)}=w^{(\tau)}-\frac{\alpha}{\sqrt{r / 1-\gamma^\tau}+\varepsilon} \frac{v}{1-\beta^\tau}
\end{aligned}
$$
論文推奨値は
$$
\begin{gathered}
\beta=0.9 \\
\gamma=0.999 \\
\varepsilon=10^{-8}
\end{gathered}
$$
Adamによる更新過程は、お椀上をボールが転がるような動きをする。Momentumも同じような動きをしていたが、Momentumよりも左右の揺れが軽減されています。
結局どの更新手法がいいの??

5 層のニューラルネットワーク、各層100 個のニューロンを持つネットワーク、活性化関数はReLU を使用
学習の速さで言えばAdaGradが早い感じで、SGDは他の学習手法に比べて遅い。
一般的にはSGDよりも他の三つの方が学習が速いが、全ての問題に対して優れた手法というのは存在せず。得手不得手がそれぞれの手法にある。
今でもSGDが使われている研究もあるし、MomentumやAdaGradも試す価値がある。
Adamは大人気です。
終わりに
この記事では、ニューラルネットワークの基本的な概念から、その仕組み(順伝播)、学習方法(誤差逆伝播法と最適化アルゴリズム)、そしていくつかの興味深い性質や発展的な構造について駆け足で見てきました。
ニューラルネットワークは、まるで生き物のようにデータから学び、賢くなっていく不思議な「関数」です。その背後には、微分や線形代数といった数学が巧みに使われています。
高校生の皆さんには、数学がこんなにもエキサイティングな技術の基礎になっていることを感じていただけたら嬉しいです。専門家の方々には、改めて基本を整理する一助となれば幸いです。
今回学んだことは、ニューラルネットワークの広大な世界のほんの入り口に過ぎません。
- 畳み込みニューラルネットワーク (CNN):画像処理の王様
- 再帰型ニューラルネットワーク (RNN):時系列データ(音声、文章など)の扱いに長けたネットワーク
- Transformer (トランスフォーマー):自然言語処理で革命を起こし、画像処理などにも応用される強力なモデル
- 生成モデル (Generative Models):新しいデータ(画像、文章など)を創り出すGANやVAEなど
など、さらに奥深く、面白いトピックがたくさん待っています。
この記事が、皆さんの知的好奇心を刺激し、ニューラルネットワークや人工知能の世界への第一歩を踏み出すきっかけとなれば、これほど嬉しいことはありません。
ありがとうございました。





