Hayami Kaito
← Apps

ニューラルネットワークの学習の可視化

平面上の 2 種類の点を分けるニューラルネットワークが、学習につれて境界を形づくっていく様子を見せます。層やニューロンの数・入力の特徴・活性化関数・学習率を変えて、各ニューロンが何を捉えているかを確かめられます。

エポック
0
重み
18
設定

データ

ノイズ

活性化関数(隠れ層)

バッチの大きさ

学習率

正則化

正則化の強さ

速さ(1 秒あたりのエポック数)

ネットワーク

左の特徴を押すと入力に使うかを切り替えます。各ニューロンの図は、平面の各点でそのニューロンが出す値(青は正、橙は負)です。線は重みで、青は正、橙は負、太いほど絶対値が大きい重みです。

隠れ層2層(最大 4)

入力

出力

4 個
2 個

出力

重みはランダムな初期値です。「学習を始める」を押してください

学習用テスト用
誤差0.5100.511
正解率51%49%

誤差の推移

誤差は、出力と正解(青 +1・橙 −1)の差の 2 乗の半分を点ごとに平均したものです。学習用の誤差だけが下がってテスト用の誤差が上がり始めたら、学習用の点に合わせすぎています(過学習)。

重みはランダムな初期値です。「学習を始める」を押してください

使い方

  • データとネットワークの形を選んで「学習を始める」を押すと、出力の塗り分け(青なら +1、橙なら −1 と判定する領域)が学習につれて点に合っていく様子を見られます。
  • ネットワークの図の左の特徴(x₁・x₂ や x₁² など)を押すと、入力に使うかを切り替えます。隠れ層の数は図の上の − / +、各層のニューロンの数はその層の上の − / + で変えます。
  • 特徴・層・活性化関数・データを変えると、重みを初期化して 0 エポックからやり直します。学習率・正則化・バッチの大きさは、学習の途中でも重みを残したまま変えられます。
  • 「テスト用の点を表示」で、学習には使わない点(ふちが濃い点)も表示します。学習用の点だけに合わせすぎていないかを、テスト用の誤差と正解率で確かめられます。
  • ニューロンの図や重みの線にマウスを重ねると、バイアスや重みの値が出ます。
  • キーボードでは Space で学習の開始 / 一時停止、→ で 1 エポック進みます。
  • 計算はすべてブラウザの中で行い、どこにも送信しません。

しくみ

  1. 各ニューロンは、前の層の出力に重みを掛けて足し、バイアスを加えた値(総入力)を活性化関数に通して出力します(順伝播)。出力層のニューロンは 1 つで、活性化関数は −1〜1 になる tanh です。
  2. 出力と正解(青は +1、橙は −1)の差の 2 乗の半分を誤差とし、誤差を各重みで微分した値(勾配)を、出力側から入力側へ順にさかのぼって求めます(誤差逆伝播法)。
  3. 学習用の点をシャッフルしてバッチの大きさずつに分け、バッチごとに「重み ← 重み − 学習率 × 勾配の平均」と更新します(ミニバッチ確率的勾配降下法)。すべての点を 1 回ずつ使うと 1 エポックです。
  4. 正則化を選ぶと、重みを 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)。図が真っ白なニューロンがそれです。
  • 同じ設定でも、重みの初期値によって結果が変わります。「重みを初期化」で何度か試してみてください。