図解一覧  ›  ニューラルネット — 計算と学習の仕組み
EPOCH Arc 2 ・ Scene 1「冬を越えた者たち」

ニューラルネット — 計算と学習の仕組み

ニューラルネットの計算と学習の仕組みを、図解によって体感する。

ニューラルネットは対象を数の並びにしてしまう ―― 画像なら画素の明るさ、 メールなら単語の出現回数。すると、「この点は、正解が集まっている側にあるか」という問いになり、 「判断すること=空間を分けること」になる。

おさらい — 1 個の計算点とバイアス

説明
1 個の計算点は 入力に重みを掛けて足し、その値で 0 か 1 を出す。ここまでは Arc 1 の「1 個の計算点」で動かしたとおり。
この節でひとつだけ足すのが バイアス $b$ —— Arc 1 で閾値 $ heta$ と呼んだものを、「つねに 1 を入れる入力への重み」に書き直したもの ($z \ge heta$ を $z - heta \ge 0$ と見る)。こうすると閾値も重みと同じ式で扱え、 この先の節はすべて「重みを直す」だけの話になる
構成図
バイアス $b$ は「つねに 1 を入れる入力」への重み。▲▼ で重みを 0.1 ずつ動かす
式と計算
$$y=\begin{cases}1 & (w_1x_1+w_2x_2+b \ge 0)\\[2pt] 0 & (w_1x_1+w_2x_2+b < 0)\end{cases}$$
入力空間 ($x_1, x_2$) と、いま引けている境界
AND(論理積) XOR(排他的論理和)

多層パーセプトロン(MLP) — 計算点を層にして重ねる

説明
複雑な事象を表現するために、計算点を並べて層にし、層を重ねる。第 $m$ 層の $i$ 番目から、次の層の $j$ 番目へ向かう重みを $w^{(m)}_{ij}$ と書く(前の添字が送り元、後ろが行き先)。 辺の数字が重み、丸の中の数字がその計算点がいま出している値。
構成図
式と計算
出力まで計算した
$m_j = \textstyle\sum_i w^{(1)}_{ij}x_i + b^{(1)}_j$ $y_k = \textstyle\sum_j w^{(2)}_{jk}m_j + b^{(2)}_k$

では、この多層パーセプトロンは「分けられる」か

「おさらい」の節とまったく同じ問いを、同じデータで解かせてみる。 ここでは、青 = $y_1 > y_2$、赤 = $y_1 < y_2$ で境界を分ける。 上の 3 つのつまみ(重み)を動かして、点を正しく分けられるか試してほしい。
青 = $y_1$ が大きい側 / 赤 = $y_2$ が大きい側
AND(論理積) XOR(排他的論理和)
層を重ねたのに、引ける境界は「まっすぐな 1 本」のまま。
重み付きの和は 1 次式。1 次式に 1 次式を代入しても、出てくるのはまた 1 次式だからだ。 $$W_2(W_1\mathbf{x}+\mathbf{b}_1)+\mathbf{b}_2 = (W_2W_1)\mathbf{x} + (W_2\mathbf{b}_1+\mathbf{b}_2)$$ 3 層ぶんの計算が、入力 2 個の 1 次式にぴたりと一致する(上の読み取りに実際の式が出ている)。 だから XOR は、重みをどう動かしても 75% で頭打ちになる。層を積むだけでは表現力は増えない。 —— では、何を足せばよいのか。それが次の節。

活性化関数 — 非線形をはさむと、何が変わるか

説明
前の節で行き止まりになった理由は「重み付きの和は 1 次式」だから。 そこで、層と層のあいだに非線形な関数 $h(\cdot)$ を 1 つはさむ。 中間層の値は、和 $m_j$ をそのまま渡すのではなく $n_j = h(m_j)$ になる。 $h$ を取り替えると丸の中の数字がどう変わるか、入口側の重みを動かすと $m$ ごとどう動くかを見比べる。 「なし(恒等)」は $h$ を入れない状態=前の節そのもの。
前の層の値 x₁x₂x₃ w₁w₂w₃ Σ n₁ 重みを掛けて足す 活性化関数 この層の値
上の図の丸 1 個を開いたところ。重み付きの和を活性化関数に通したものが、その丸の値になる
構成図
式と計算
$$m_j = \textstyle\sum_i w^{(1)}_{ij}x_i + b^{(1)}_j \qquad n_j = h(m_j)$$
なし(恒等) シグモイド tanh ReLU

つまみは $m_1$ に入る 2 本の重み。$m_1$ が動き、$h$ の形に沿って $n_1$ が決まる。 $h$ が「なし」なら $m_1$ と $n_1$ は同じ数のまま。シグモイドなら大きく振っても $0 \sim 1$ に押し込まれる。

同じ XOR を、いまのニューラルネットで分けたところ
いま選んでいる $h(x)$

誤差逆伝播法(Back Propagation) — 出口のズレから重みを直す

説明
重みは最初でたらめで、当然まちがった答えを出す。出口のズレを入口へ配り、そのぶん重みをずらす。これを繰り返すと答えは正解に届く。
いまの活性化関数 なし
構成図
式と計算
1. 入力を置く
$m_j = \textstyle\sum_i w^{(1)}_{ij}x_i + b^{(1)}_j$ $y_k = \textstyle\sum_j w^{(2)}_{jk}m_j + b^{(2)}_k$ $L=\tfrac{1}{2}\textstyle\sum_k (y_k-\hat{y}_k)^2$ $\frac{\partial L}{\partial n_j} = \textstyle\sum_k w^{(2)}_{jk}\frac{\partial L}{\partial y_k}, \qquad \frac{\partial L}{\partial m_j} = \frac{\partial L}{\partial n_j}\cdot h'(m_j)$ $w \leftarrow w - \eta\,\frac{\partial L}{\partial w}$
回した回数(横)と、正解とのズレ $L$(縦)。0 に近づくほど答えは正解に一致する

勾配消失 — 層が深いほど手前へ届かなくなる

説明
「誤差逆伝播法」の節の「5. ズレを上流へ配る」と同じ図を、中間層を増やしながら見る。 丸の中の数が、その計算点に届いたズレ $\partial L/\partial n$。
なし(恒等) シグモイド tanh ReLU
中間層 4 個
構成図

出口では大きかったズレが、入口の層に着くころにはほとんど残らない ―― これが 勾配消失問題。のちに 残差接続が越えることになる。 上の活性化関数を切り替えると、減り方が変わる。

④ 書く — 無料

ニューラルネットを、NumPy だけで書く

パーセプトロンから誤差逆伝播まで自分で書く。書いた勾配が数値微分と合うか、勾配消失がどれだけ効くかを測れる。

Colab で開く →