Neural Network Consoleは、綺麗なGUIでいいのですが、ノートパソコンなど、小さいモニタで使うと、文字が重なってしまって見づらいときがあります。
そんな時には、GUI表示のスケールを変更することで少し、見やすくなるかと思います。
設定方法は、右上の歯車ボタン(Setup)をクリックし、VIEWタブを選択し、GUI Scaleのスライダを調整することで、GUI全体の表示スケールを変更することができます。
←Deep Learningへ戻る
Neural Network Consoleは、綺麗なGUIでいいのですが、ノートパソコンなど、小さいモニタで使うと、文字が重なってしまって見づらいときがあります。
そんな時には、GUI表示のスケールを変更することで少し、見やすくなるかと思います。
設定方法は、右上の歯車ボタン(Setup)をクリックし、VIEWタブを選択し、GUI Scaleのスライダを調整することで、GUI全体の表示スケールを変更することができます。
←Deep Learningへ戻る
ソニーのNeural Network ConsoleでCPUとGPUの処理を切り替えるのは至って簡単。
あらかじめCUDAはインストールされている必要がありますが、Neural Network Consoleの右上の設定ボタンをクリックします。
次に表示された画面の ENGINEタブを選択し、CPU もしくは GPU を選択すれば、それだけで切り替わります。
GPUにエラーが出なければ(train_errorやvalid_errorは別)、設定が出来ているとのことですが、あまりに実感がないので、サンプルプロジェクトの学習時間の比較を行いました。
プロジェクト | CPU処理 | GPU処理 |
01_logostic_regression | 3秒 | 6秒 |
02_binary_cnn | 50秒 | 7秒 |
LeNet | 4分52秒 | 31秒 |
※CPU:i7-7700K(4.2GHz)、GPU:GeForce GTX1080
やっぱりGPUは早い!
今回は、学習時間が待てるレベルの物を選んで比較しましが、ニューラルネットワークによっては、CPU処理では数時間かかりそうなものもあるので、効果は大きそうです。
←Deep Learningへ戻る
Deep Learningの最適化において、素人ながらLearning Rate(学習率)の値の調整も大事なのかな?と思っているのですが、Learning Rateの値はNeural Network全体の値の設定と、各Afiineでの設定が可能になっています。
Neural Network全体のLearning Rateの値の設定は、プロジェクトを起動している状態で、右上にある、CONFIG をクリックします。
次に右側の Optimizer の部分をクリックすると、↓の画面ではAlphaの部分が学習率の値となります。
ここの表示は使用する更新の式(Updater)によって異なりますが、UpdaterがAdam(デフォルト)の時はAlphaの部分が学習率になります。
他のUpdaterの時(↓の例ではAdagrad)はLearningRateの部分がまさに学習率となります。
このLearningRateの値にさらに、各AfiineのプロパティにあるW.LRateMultiplier、b.LRateMultiplierの値を掛け合わせた値が学習率となります。
つまり、
重みの学習率は LearningRateの値 x W.LRateMultiplier
バイアスの学習率は LearningRateの値 x b.LRateMultiplier
となります。
Updaterの詳細については、ダウンロードしたファイルの中にあるpdfファイル(manual_ja.pdf)に書かれているので、確認すると良いかと思います。
←Deep Learningへ戻る
GUIベースでお手軽にAIのアルゴリズムが構築でいるというソフト【Neural Network Console】がソニーより無償で公開されました。
私は、まだDeep Learningを勉強し始めたばかりなのですが、簡単だという触れ込みなのでまずは試してみました。
動作環境は
・Windows 8.1 / 10 64bit
正式には書かれていませんが、Windows7 64bitでも動作してくれました。
・Visual Studio 2015 C++ 再頒布可能パッケージ
GPUは無くても動作します。(あれば対応させる事も可能)
また、モニタはFull HDサイズぐらいないと厳しいかと思います。
Neural Network Consoleの入手方法は、こちらのページ↓
より、Windowsアプリではじめる をクリックします。
すると、ページが下の方へ移動するので、メールアドレスを入力し、上記に同意して送信をクリックします。
しばらくすると、画面が切り替わるので、送られてきたメールを確認します。
メールには、こんな感じ↓のメールが送られてくるので、Download the Windows Appをクリックして、ファイル(neural_network_console_100.zip、約1GB)をダウンロードします。
メールにも書かれていますが、プログラムを動作さえるにはVisual Studio 2015 C++ 再頒布可能パッケージが必要になります。
https://www.microsoft.com/en-us/download/details.aspx?id=52685
これは、すでにVisual Studio 2015でC++をインストールしてあれば、インストールされているかと思います。
私の場合、Visual Studio 2015→Visual Studio 2017の順でインストールしたところ、Visual Studio 2015 C++ 再頒布可能パッケージ(Visual Studio C++ 2015 Redistributable)はWindowsの設定→アプリと機能で確認しても見つからない状態でしたが、動作してくれました。
次にダウンロードしたzipファイルを解凍します。(解凍後は約2GBになります)
プログラムにインストールそのものは、特に操作する必要が無いのですが、解凍したフォルダを2バイト文字が含まれていない(全角の日本が無い)フォルダに配置する必要があります。
また、Program Filesのような書き込み不可のフォルダでもダメとのこと。
解凍したフォルダ内に実行ファイル(neural_network_console.exe)があるので、これをダブルクリックして実行します。
プログラム起動後に、Visual Studio C++ 2015 Redistributableが入っているか?聞かれるの、入っていいれば、そのままOK、入っていなければ、別途、Visual Studio C++ 2015 Redistributableをインストールしてください。
次にライセンス条項が表示されるので、内容を確認して I Agree を選択し、Applyボタンをクリックします。
すると、このような画面↓が表示されるのですが、あらかじめ用意されているプロジェクト(あらかじめ準備されたニューラルネットワークの構造)が表示されるので、とりあえず
01_logostic_regressin.sdcproj
をクリックしてみます。
このプロジェクトは手書き文字の 4 と 9 を見分けるためのもので、MNISTというデータセットから文字の画像を入手し、4か?9か?を学習して、実際に判別させるためのプロジェクトです。
プロジェクトを起動させると、最初にMNISTから文字の画像データ一式を取得します。
データの入手が終わると、このような画面になります。
まだ、詳細まで理解できていませんが、Input(画像の入力)があって、Affine(画像のアフィン変換かと思いきや、重みを掛けてバイアス足す処理の事のよう)を行って、活性化関数にはSigmoid関数を使い、計算結果と出力の値が最小化されるような処理を行っている
という、シンプルな構成。
次に右上のTraningの下にある▶ボタンをクリックすると、学習が始まります。
Evalutionの下にある▶ボタンをクリックすると、学習データを用いて実際に画像を認識させた結果が表示されます。
ここでは x:image の部分が認識用に使った画像、 y:9 の部分が教え込んだ情報(0だと4の文字、1だと9の文字)、 y’の部分が判定結果になります。
判定結果は0に近いほど4の文字と認識していて、1に近いほど9の文字と認識しています。
この結果で認識が怪しい部分(0.5に近い部分)を抜き出してみると、こんな感じ↓
人の目で見ると126番はあきらかに4だし、203も同様に9にしか見えませんが、このサンプルプロジェクト的には上手く判別できていないようです。
この辺のチューニングが容易に、しかも結果がすぐにわかるのがNeural Network Consoleのプログラムの良いところだと思います。
しかし、結局はDeep Learningの知識は必要になるので、ゼロから作るDeep Learningの本でも読むか?っていう感じです。
また、ソニー製なので、日本語のマニュアルがあるのも助かります。
まずは、解凍したファイル内になったPDFファイル(manual_ja.pdf)に目を通すと良いかと思います。
Neural Network Consoleドキュメント(日本語)
←Deep Learningへ戻る
シグモイド関数を微分するには合成関数の微分を用いて行います。
まず、シグモイド関数
$$f(x)=\frac { 1 }{ 1+{ e }^{ -x } } $$
において
$$u=g(x)=1+{ e }^{ -x }$$
と置くと、
$$y=f(u)=\frac { 1 }{ u } ={ u }^{ -1 }$$
より、合成関数の微分を使って
$$f'(x)=\frac { dy }{ dx } =\frac { dy }{ du } \frac { du }{ dx } \\ =-{ u }^{ -2 }(-{ e }^{ -x })\\ =\frac { { e }^{ -x } }{ { u }^{ 2 } } \\ =\frac { { e }^{ -x } }{ (1+{ e }^{ -x }) ^{ 2 }}$$
となりますが、この先がちょとトリッキーな式の変形を行い、
$$=\frac { { e }^{ -x } }{ 1+{ e }^{ -x } } \frac { 1 }{ 1+{ e }^{ -x } } \\ =(\frac { { 1+e }^{ -x } }{ 1+{ e }^{ -x } } -\frac { 1 }{ 1+{ e }^{ -x } } )\frac { 1 }{ 1+{ e }^{ -x } } \\ =(1-\frac { 1 }{ 1+{ e }^{ -x } } )\frac { 1 }{ 1+{ e }^{ -x } }$$
となります。
ここで
$$f(x)=\frac { 1 }{ 1+{ e }^{ -x } } $$
であるから、
$$f’(x)=(1-f(x))f(x)$$
となるのが、シグモイド関数の微分となります。
例によってPythonのmatplotlibを使ってグラフを書いてみると、
import matplotlib.pyplot as plt
import numpy as np
def sigmoid(x):
return 1 / (1 + np.exp(-x))
x = np.linspace(-10, 10)
#シグモイド関数
y = sigmoid(x)
plt.plot(x, y)
#シグモイド関数の微分
dy = (1 - sigmoid(x)) * sigmoid(x)
plt.plot(x, dy)
plt.show()
途中の計算は、自分一人では解けないな。。きっと。
ニューラルネットワークに出てくる、活性化関数の一つであるシグモイド関数
$$h(x)=\frac { 1 }{ 1+{ e }^{ -x } }$$
この関数の特徴は x = 0, y = 0.5 の点を通り、yの値は0~1の範囲に制限され、xが小さくなるとyは0に漸近し、xが大きくなると1に漸近します。
これをPythonのmatplotlibを使ってグラフを書いてみると、こんな感じ
import matplotlib.pyplot as plt
import numpy as np
def sigmoid(x):
return 1 / (1 + np.exp(-x))
x = np.linspace(-10, 10)
y = sigmoid(x)
plt.plot(x, y)
plt.show()
シグモイド関数を初めて見たのは画像処理でエッジ検出に使う例だったのですが、
「シグモイド関数 エッジ」
と検索したら、トップに出てくるページの記事は、知っている人のだった。
Deep Learningをお勉強していたら、合成関数の微分が出てきたのですが、もう30年ぶりぐらいに見たので、その復習です。
\(y=f(u), u=g(x)\)としたとき、\(y=f(g(x))\)を合成関数とよび、この合成関数を\(x\)に関して微分すると、
$$\frac{ dy }{ dx } =\frac { dy }{ du } \frac { du }{ dx } \\ \quad =\frac { d }{ du } f(u)\frac { d }{ dx } g(x)$$
となります。
合成関数を教わったときは、合成関数の微分は「外側の微分x内側の微分」って覚えてたような。。
試しに\(y=sin({ x }^{ 2 })\)の微分は\(u={ x }^{ 2 }\)と置くと
$$\frac { dy }{ dx } =\frac { d }{ du } f(u)\frac { d }{ dx } g(x)\\ \quad =cos(u)\times 2x\\ \quad =cos({ x }^{ 2 })\times 2x$$
これをPythonのmatplotlibを使ってグラフにしてみると
となり、青の線の微分(傾き)がオレンジ色の線なので、合ってそう。