デジタル・デザイン・ラボラトリーな日々

アラフィフプログラマーが数学と物理を基礎からやり直す

ディープラーニング(深層学習)を理解してみる(TensorFlow Playgroundを試す)

はじめに

前回はパーセプトロンを多層にすることで、線型分離可能でない問題を解けることを学びました。
yaju3d.hatenablog.jp

これを視覚として見ながら学びたいということで見つけたのが「TensorFlow Playground」となります。
f:id:Yaju3D:20170624220010p:plain

しかし、初見では何がなんだか分からないので「TensorFlow Playground」のことを書いている幾つかのブログを参考に学んでいきます。

TensorFlow Playgroundとは

TensorFlow Playgroundは、A Neural Network Playgroundとも呼ばれ、Daniel SmilkovさんとShan Carterさんが開発したニューラルネットワークの仕組みを理解するための教育コンテンツです。

TensorFlow Playgroundの日本語訳を書いてくれているのが「TensorFlow Playgroundの仕組み」です。

目的

下図のように青とオレンジの正しい区切りの位置を見つけるということです。
直線だと簡単に分離できる問題もあれば、円形という複雑な問題もあるわけです。
f:id:Yaju3D:20170604230608p:plain

使い方

例題 Circle(円)、Gaussian(ガウシアン)、Exclusive or(排他or:XOR)、Spiral(螺旋)
f:id:Yaju3D:20170626230724p:plain

全体レイアウト

f:id:Yaju3D:20170625120546p:plain

  • ①は、DATA(データ)は例題となります。例題は4つあり初期値は円となっています。
  • ②は、FEATURES(特徴)は、入力するデータの特徴となります。特徴は7つあり初期値は上2つとなっています。
  • ③は、HIDDEN LAYERS(隠れ層)は中間層となります。中間層の数を「+」と「-」ボタンで増減でき初期値は2段となっています。
  • ④は、neurons(ニューロン)は、各隠れ層のノードとなります。
    ※各ノードをマウスオーバーすると⑥で拡大して見れます。ニューロンは重みの影響を受け、重みは線の太さと色で表されます。
    • ④-1が先頭の中間層で初期値は4ニューロンとなります。
    • ④-2が最後の中間層で初期値は2ニューロンとなります。
  • ⑤は、再生ボタンとなります。決定したモデルを実際に動かします。
  • ⑥は、出力結果となります。
  • ⑦は、Test loss(誤差(テスト))とTraining loss(誤差(トレーニング))の数値となります。

実際に動かしてみよう

デフォルト状態で再生してみます。右側の出力結果の平面上に点在したオレンジと青の点々に沿うようにヒートマップの色が変化していく様子が見れるはずです。 そして点々の色とヒートマップの色の分布が互いに近づいてくるに従って誤差の数値が小さくなる様子も確認できるはずです。

青枠⑦のTest loss(誤差(テスト))とTraining loss(誤差(トレーニング))の数値を見ます。これが少ないほど良い結果になります。
Epochが50くらいで図上では分離されていますが、誤差の数値的には0.022とまだあります。
Epochが100くらいで誤差の数値的には0.008くらいまで下がります。
Epochが500くらいまでいくと誤差が0.0001まで下がります。

パラメーターをいじってみる

④-1の先頭の中間層を4ニューロンから3ニューロンに減らしてみます。
f:id:Yaju3D:20170625134326p:plain
これだとあまり変化なく、Epochが500くらいまでいくと誤差が0.0001まで下がります。
さらに2層まで減らすとEpochが1000までいっても収束しません。

今度は、中間層を1つ増やしてみます。
f:id:Yaju3D:20170625145117p:plain
Epochが200くらいまでいくと誤差が0.0001まで下がるので、収束は速くなります。

各パラメーターの説明

TensorFlow Playgroundの日本語訳「TensorFlow Playgroundの仕組み」から一部抜粋します。

上側パラメーター
  • Epoch(エポック)は、学習させる回数です。用意された全トレーニングデータをニューラルネットワークに投入しパラメータを更新、修正し終えると機械学習の1サイクル(1エポック)が完了します。 統計モデルの種類が分類の場合、トレーニングデータは500個なので、この500個全部をトレーニングに使い切ると1エポック完了したことになります。
  • Learning rate(学習率)は、一度の学習でどの程度重みやバイアスの値を修正するかの率を表します。学習率が大きいと1度に修正される重み、バイアスの量が大きくなります。 小さくすると重み、バイアスの値を1度に少しだけ修正しようとします。
  • Activation(活性化関数)は、ニューロンの出力をフィルタリングします。tanh、ReLU、Sigmoid(シグモイド関数)、Liner(線形関数)があります。
  • Regularization(正則化)は、過学習を防ぐための仕組みです。None, L1, L2 があります。
  • Regularization rate(正則化項)は、正則化されたニューラルネットワークに対して正則化項を加えることで、より過学習を防ぐようになります。
  • Problem type(統計モデルの種類)は、「Classification(分類)」と「Regression(回帰)」の2種類があります。
    • Classification(分類)は、入力した画像が猫であるか猫でないかを0/1で判断する。分類の図は点々がブルー(+1)かオレンジ(-1)かの二通りの出力結果のデータの分布となります。
    • Regression(回帰)は、得点の値について-1,1だけのとびとびの離散的な値だけでなく、 その間の-0.529や0.29039などの-1から+1までの連続的な中間値も考慮に入れます。入力した画像が猫である確率を求める場合に使います。回帰の図は分類と同様に点々がブルー(+1)かオレンジ(-1)であることには変わりありませんが、白味がかった-1と+1の間の中間の値のデータも含まれます。
左側パラメーター
  • Ratio of training to test data(トレーニングデータの割合)は、「Classification(分類)」が500個、「Regression(回帰)」が1200個のデータのサンプル数となっていますので、例えばトレーニングデータの割合を60%とすると、500個のデータサンプルの内300個をトレーニングデータに、 200個のデータをテストデータに回します。
  • Noise(ノイズ)は、円やガウシアンなどの選択したデータセットに対してかけるノイズ(0〜50まで5刻みで設定)で数値は%単位です。
  • Batch size(バッチサイズ)は、1回の学習(重み、バイアスの更新)を何個のトレーニングデータで実施するかを決める数値です。例えば1エポックで500回学習とした場合にバッチサイズが25にすると、1エポックで20回学習することになります。
  • REGENARATE(再生成)は、データを再生成します。
右側下パラメーター

f:id:Yaju3D:20170626231602p:plain

過学習

過学習が発生すると、十分に小さなTraining loss(誤差(トレーニング))に対して、Test loss(誤差(テスト))が小さくならない現象が発生します。TensorFlow Playgroundで意図的に過学習を起こすことは簡単です。画面左側の「Ratio of training to test data(トレーニングデータの割合)」を10%まで下げてみます。
f:id:Yaju3D:20170626234708p:plain

スライド

例題

Problem type(統計モデルの種類)の「Classification(分類)」だけ他の例題を自分なりにやってみました。
これが正しいわけでもなく、再更新すると違う結果になったりすることもあります。

Gaussian(ガウシアン)

一番単純です。Activation(活性化関数)をLiner(線形関数)にしています。
f:id:Yaju3D:20170626232335p:plain

Exclusive or(排他or:XOR)

XORは線形分離不可能な問題です。特徴量にX1X2があるのでそのまま使っています。
f:id:Yaju3D:20170626233038p:plain

別方法として特徴量は先頭2つでやってみました。Activation(活性化関数)をReLUにすると直角的になります。
f:id:Yaju3D:20170627215236p:plain

Spiral(螺旋)

特徴量を全て使っています。過学習を防ぐためRegularization(正則化)をL1、Regularization rate(正則化項)を0.001にしてます。
なかなかTest loss(誤差(テスト))が下がらなくて、0.008が限界でした。
f:id:Yaju3D:20170626233502p:plain

特徴量を減らして、中間層を増やしてみました。Test loss(誤差(テスト))は、0.006になりました。
f:id:Yaju3D:20170627234331p:plain

参照