2-2-1ネットワークによるXOR学習についてClaude Opus 4.5に説明してもらいました。
自分は間違いを指摘したり、構成を整理しました。
2-2-1ネットワークによるXOR学習
2-2-1ネットワークによる完全なXOR関数の学習
重みの進化を詳しく見る前に、最小構成の2-2-1ネットワーク(2入力、2隠れニューロン、1出力)が、4つすべての入力組み合わせで完全なXOR関数を学習する様子を見てみましょう。
完全なXOR訓練セット
(0, 0) → 0
(0, 1) → 1
(1, 0) → 1
(1, 1) → 0
詳細な計算例(反復 0)
与えられた値: 入力 \([x_1, x_2] = [1, 1]\)、目標値 \(t = 0\)、学習率 \(\eta = 0.5\)
ネットワーク図(反復 0)
順伝播
入力層 → 隠れ層 → 出力層
\(x_1, x_2\) → \(h_1, h_2\) → \(y\)
ステップ1 : 隠れ層の活性化を計算
隠れニューロン \(h_1\) について:
$$u_1 = x_1 \cdot 0.36 + x_2 \cdot 0.42 + b$$
$$u_1 = 1 \cdot 0.36 + 1 \cdot 0.42 + (-0.15) = 0.63$$
$$h_1 = \frac{1}{1 + e^{-u_1}} = \frac{1}{1 + e^{-0.63}} = 0.652$$
隠れニューロン \(h_2\) について:
$$u_2 = x_1 \cdot 0.19 + x_2 \cdot 0.51 + b$$
$$u_2 = 1 \cdot 0.19 + 1 \cdot 0.51 + (-0.15) = 0.55$$
$$h_2 = \frac{1}{1 + e^{-u_2}} = \frac{1}{1 + e^{-0.55}} = 0.634$$
ステップ2 : 出力を計算
$$z = h_1 \cdot 0.68 + h_2 \cdot 0.73 + c$$
$$z = 0.652 \cdot 0.68 + 0.634 \cdot 0.73 + (-0.35) = 0.56$$
$$y = \frac{1}{1 + e^{-z}} = \frac{1}{1 + e^{-0.56}} = 0.636$$
ステップ3 : 二乗和誤差を計算
$$E = \frac{1}{2}(t – y)^2 = \frac{1}{2}(0 – 0.636)^2 = \frac{1}{2}(0.404) = 0.202$$
出力勾配の導出
ステップ1 : 誤差関数の微分
二乗和誤差:
$$E = \frac{1}{2}(t – y)^2$$
\(y\) について微分すると:
$$\frac{\partial E}{\partial y} = \frac{1}{2} \cdot 2(t – y) \cdot (-1) = -(t – y) = (y – t)$$
ステップ2 : シグモイド活性化関数の微分
出力はシグモイドを使用:
$$y = \sigma(z) = \frac{1}{1 + e^{-z}}$$
シグモイドの微分は:
$$\frac{\partial y}{\partial z} = y(1 – y)$$
ステップ3 : 連鎖律
連鎖律により、\(z\) に関する勾配は:
$$\delta_y = \frac{\partial E}{\partial z} = \frac{\partial E}{\partial y} \cdot \frac{\partial y}{\partial z}$$
$$\delta_y = (y – t) \cdot y \cdot (1 – y)$$
これが逆伝播で使用する勾配です!
逆伝播
出力誤差 ← 隠れ層勾配 ← 重み更新
\(\delta_y\) ← \(\delta_{h1}, \delta_{h2}\) ← \(\Delta w\)
ステップ4 : 勾配の計算(逆方向パス)
出力層の勾配:
$$\delta_y = (y – t) \cdot y \cdot (1 – y)$$
$$\delta_y = (0.636 – 0) \cdot 0.636 \cdot (1 – 0.636)$$
$$\delta_y = 0.636 \cdot 0.636 \cdot 0.364 = 0.147$$
隠れ層の勾配:
\(h_1\) について:
$$\delta_{h_1} = \delta_y \cdot w_{41} \cdot h_1 \cdot (1 – h_1)$$
$$\delta_{h_1} = 0.147 \cdot 0.68 \cdot 0.652 \cdot 0.348$$
$$\delta_{h_1} = 0.023$$
\(h_2\) について:
$$\delta_{h_2} = \delta_y \cdot w_{42} \cdot h_2 \cdot (1 – h_2)$$
$$\delta_{h_2} = 0.147 \cdot 0.73 \cdot 0.634 \cdot 0.366$$
$$\delta_{h_2} = 0.025$$
ステップ5 : 重みの更新 (学習率 \(\eta = 0.5\))
出力層の重み:
$$w_{41}^{\text{new}} = 0.68 – 0.5 \cdot 0.147 \cdot 0.652 = 0.632$$
$$w_{42}^{\text{new}} = 0.73 – 0.5 \cdot 0.147 \cdot 0.634 = 0.683$$
$$w_{43}^{\text{new}} = -0.35 – 0.5 \cdot 0.147 = -0.424$$
隠れ層の重み:
$$w_{21}^{\text{new}} = 0.42 – 0.5 \cdot 0.023 \cdot 1 = 0.409$$
$$w_{22}^{\text{new}} = 0.51 – 0.5 \cdot 0.025 \cdot 1 = 0.497$$
入力バイアスの重み:
$$w_{31}^{\text{new}} = -0.15 – 0.5 \cdot 0.023 = -0.162$$
$$w_{32}^{\text{new}} = -0.15 – 0.5 \cdot 0.025 = -0.163$$
重要なポイント:
- シグモイド関数 \(\sigma(x) = \dfrac{1}{1 + e^{-x}}\) は値を \((0, 1)\) の範囲に圧縮します
- ランダムな初期重みは高い誤差(0.202)を生成します
- 逆伝播は出力から隠れ層へ逆方向に勾配を計算します
- 各重みの更新式:\(w^{\text{new}} = w^{\text{old}} – \eta \cdot \text{勾配}\)
- これらの更新により反復1の重みになります
インタラクティブトレーニング可視化: 反復 0-10
「次のステップ」をクリックして、ネットワークが段階的に学習する様子を見てみましょう。各順伝播 + 逆伝播で重みが更新される様子を観察します。
反復 0 (初期ランダム重み)
このインタラクティブ図を表示するにはJavaScriptを有効にしてください。
反復 100
XOR学習における誤差と勾配の変化
XOR訓練例: \(x_1=1, x_2=1 \rightarrow t=0\)
この入力パターンでは、ネットワークは出力を0に近づけるように学習します。初期のランダムな重みでは \(y \approx 0.636\) ですが、訓練を通じて \(y \rightarrow 0\) に収束していきます。
XOR学習における誤差と勾配の変化(\(x_1=1, x_2=1, t=0\))
「次の反復」をクリックして、訓練反復ごとに出力 \(y\) が目標値0に近づく様子と、誤差・勾配の変化を観察します。
反復 0
このインタラクティブ図を表示するにはJavaScriptを有効にしてください。
XOR学習の観察ポイント
- 誤差関数 \(E\): 反復を重ねるごとに \(y\) が0に近づき、誤差が減少していきます
- 勾配 \(\delta_y\): 初期は \(y \approx 0.636\) で勾配が大きく、\(y\) が0に近づくにつれて勾配も小さくなります
- 学習軌跡(オレンジ破線): 訓練中の \(y\) の変化の履歴を示しています