ニューラルネットワークの学習の可視化
平面上の 2 種類の点を分けるニューラルネットワークが、学習につれて境界を形づくっていく様子を見せます。層やニューロンの数・入力の特徴・活性化関数・学習率を変えて、各ニューロンが何を捉えているかを確かめられます。
- エポック
- 0
- 重み
- 18
ネットワーク
左の特徴を押すと入力に使うかを切り替えます。各ニューロンの図は、平面の各点でそのニューロンが出す値(青は正、橙は負)です。線は重みで、青は正、橙は負、太いほど絶対値が大きい重みです。
隠れ層2層(最大 4)
入力
出力
4 個
2 個
出力
重みはランダムな初期値です。「学習を始める」を押してください
| 学習用 | テスト用 | |
|---|---|---|
| 誤差 | 0.510 | 0.511 |
| 正解率 | 51% | 49% |
誤差の推移
誤差は、出力と正解(青 +1・橙 −1)の差の 2 乗の半分を点ごとに平均したものです。学習用の誤差だけが下がってテスト用の誤差が上がり始めたら、学習用の点に合わせすぎています(過学習)。
重みはランダムな初期値です。「学習を始める」を押してください
使い方
- データとネットワークの形を選んで「学習を始める」を押すと、出力の塗り分け(青なら +1、橙なら −1 と判定する領域)が学習につれて点に合っていく様子を見られます。
- ネットワークの図の左の特徴(x₁・x₂ や x₁² など)を押すと、入力に使うかを切り替えます。隠れ層の数は図の上の − / +、各層のニューロンの数はその層の上の − / + で変えます。
- 特徴・層・活性化関数・データを変えると、重みを初期化して 0 エポックからやり直します。学習率・正則化・バッチの大きさは、学習の途中でも重みを残したまま変えられます。
- 「テスト用の点を表示」で、学習には使わない点(ふちが濃い点)も表示します。学習用の点だけに合わせすぎていないかを、テスト用の誤差と正解率で確かめられます。
- ニューロンの図や重みの線にマウスを重ねると、バイアスや重みの値が出ます。
- キーボードでは Space で学習の開始 / 一時停止、→ で 1 エポック進みます。
- 計算はすべてブラウザの中で行い、どこにも送信しません。
しくみ
- 各ニューロンは、前の層の出力に重みを掛けて足し、バイアスを加えた値(総入力)を活性化関数に通して出力します(順伝播)。出力層のニューロンは 1 つで、活性化関数は −1〜1 になる tanh です。
- 出力と正解(青は +1、橙は −1)の差の 2 乗の半分を誤差とし、誤差を各重みで微分した値(勾配)を、出力側から入力側へ順にさかのぼって求めます(誤差逆伝播法)。
- 学習用の点をシャッフルしてバッチの大きさずつに分け、バッチごとに「重み ← 重み − 学習率 × 勾配の平均」と更新します(ミニバッチ確率的勾配降下法)。すべての点を 1 回ずつ使うと 1 エポックです。
- 正則化を選ぶと、重みを 0 に近づける力も加えます。L2 は重みに比例した力で全体を小さくし、L1 は一定の力で小さな重みを 0 にして、使わない入力を切り捨てます。
隠れ層がないと、出力の境界は入力の特徴の 1 次式(x₁ と x₂ だけなら直線)でしか引けません。隠れ層の各ニューロンは前の層の出力を組み合わせた新しい特徴を作るので、層を重ねるほど曲がった境界を表せます。ただし、ニューロンを増やすほど学習用の点の細かなばらつきまで覚えてしまい(過学習)、テスト用の点の正解率が下がることがあります。重みの初期値は −0.5〜0.5 の乱数、バイアスの初期値は 0.1 です。
データ
- 円
- 内側の円(青)と外側の輪(橙)。直線では分けられません。特徴に x₁² と x₂² を足すか、隠れ層を入れると分けられます。
- XOR
- 第 1・第 3 象限が青、第 2・第 4 象限が橙。1 本の直線では分けられない有名な例で、特徴 x₁x₂ を足すか、隠れ層を入れると分けられます。
- ガウス
- 右上(青)と左下(橙)の 2 つのまとまり。直線 1 本で分けられるので、隠れ層がなくても学習できます。ノイズを増やすとまとまりが広がって重なります。
- 渦巻き
- 2 本の腕がからみ合った渦巻き。一番難しいデータで、特徴に sin を足したり、隠れ層とニューロンを増やしたりする必要があります。
点は −6〜6 の正方形に 400 個作り、半分を学習用、残りをテスト用にします。ノイズを増やすと点の位置がずれ、反対の色の領域に入る点が出ます。
活性化関数
- tanh
- -1〜1 になめらかにつぶす。0 を中心に対称なので学習が進みやすい。
- ReLU
- 負なら 0、正ならそのまま。計算が軽く深い層でも勾配が消えにくいが、境界が折れ線になる。
- シグモイド
- 0〜1 になめらかにつぶす。傾きが最大でも 0.25 なので、層を重ねると学習が遅くなりやすい。
- 線形
- 何もしない(恒等関数)。層を何段重ねても全体が 1 つの線形変換になり、直線でしか分けられない。
うまく学習できないとき
- 学習率が大きすぎると、出力が −1 か 1 に張り付いて勾配がほぼ 0 になり、学習が止まります。学習率を下げて重みを初期化してください。
- 学習率が小さすぎると、なかなか誤差が下がりません。
- ReLU では、総入力がずっと負のニューロンは出力も勾配も 0 になり、二度と学習しなくなることがあります(dying ReLU)。図が真っ白なニューロンがそれです。
- 同じ設定でも、重みの初期値によって結果が変わります。「重みを初期化」で何度か試してみてください。