スポンサーリンク

「ゼロから作るDeepLearning」を写経してみる(3)「3章ニューラルネットワーク」

Deep Learningを学んでみたいので、以下の本を写経している。


ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装 単行本(ソフトカバー) – 2016/9/24
斎藤 康毅  (著)
3672円

サポートサイト
https://github.com/oreilly-japan/deep-learning-from-scratch

前回は、2章を写経した。AND, NAND OR, XORを、pythonで実装して、面白かった。

http://twosquirrel.mints.ne.jp/?p=17088

今回は、3章 ニューラルネットワーク を写経してみる。

(環境)
Windows8.1
Python 3.5.2
Anaconda 4.1.1 (64-bit)
Jupyter Notebook (ipython) 4.2.0

(1)パーセプトロンからニューラルネットワークへ

パーセプトロン

において、h(x)という関数(活性化関数)を定義して、

活性化関数は、閾値を境にして出力が切り替わる関数で、「ステップ関数」や「階段関数」と呼ばれる。

(2)シグモイド関数(sigmoid function):ニューラルネットワークで用いられる活性化関数のひとつ

h(x) = \frac{1}{1+\exp(-x)} 

ステップ関数の実装

(3)ステップ関数のグラフ

(4)シグモイド関数の実装

ううむ、どうしても、x軸の値がおかしい値になってしまう。

ググっても原因は分からなかった。。。とほほ。

(5)ReLU(Rectified Linear Unit)関数

 h(x) =\begin{cases}x & (x > 0)\\0 & (x \leq 0)\end{cases}

import numpy as np
import matplotlib.pylab as plt

def relu(x):
    return np.maximum(0, x)

x = np.arange(-5.0, 5.0, 0.1)
y = relu(x)
plt.plot(y)
plt.ylim(-1, 6) # y軸の範囲を指定
plt.show()

相変わらずx軸がくるっている。直し方は分からない。。。

(6)多次元配列

行列の内積(こちらが、高校数学でやっていた行列の積で、私にとっては違和感がない)

ニューラルネットワークの内積

このあたりは、元の本の絵を見ないとなんとも、、、

3層のニューラルネットワークの実装

こちらも、絵を見ながら、理解する。

最後の出力層では、活性化関数はσ()で表し、解く問題に応じて決める。

回帰問題では、σは恒等関数

2クラス分類問題では、σはシグモイド関数

多クラス分類では、σはソフトマックス関数を用いるのが一般的。

●実装のまとめ

3.5 出力層の設計

ニューラルネットワークは、「分類問題」と、「回帰問題」の両方に用いることができる。一般的に、出力層の活性化関数は、

分類問題 => 恒等関数(入力値そのままを出力)

回帰問題 => ソフトマックス関数

を用いる。

●ソフトマックス関数

なんともまあ、天からふって湧いたような関数

y_{k} = \frac{\exp(a_{k})} {\sum_1^n \exp( a_{i} ) }

e=2.7182…のネイピア数(自然対数の底)とのことだが、あらためて、不思議な数であるなあと思った。
いろいろな定義があるらしい。。。
https://ja.wikipedia.org/wiki/%E3%83%8D%E3%82%A4%E3%83%94%E3%82%A2%E6%95%B0

●ソフトマックス関数の実装

●ソフトマックス関数の実装上の注意

指数(ある数のべき乗)はすぐに大きな数になってしまうので、コンピュータで計算するときにオーバーフローして、数値が不安定になってしまう可能性がある。その対策方法。

入力信号の最大値cを引くことで、正しく計算できる。

ソフトマックス関数の特徴

3.6 手書き数字認識

MNISTデータセット

0から9までの数字画像(訓練画像60,000枚、テスト画像10,000枚)(28×28のグレー画像で、各ピクセルは0から255の値)

学習と推論

サポートサイト
https://github.com/oreilly-japan/deep-learning-from-scratch

から、dataset/mnist.py (MNISTデータセットのダウンロードから画像データのNumPy配列への変換までをサポートするPythonスクリプト) をダウンロードして、以下のようなファイル構成にしておく。自分は、ch03/ フォルダにいるものとする。

データのダウンロードに10分くらいかかったか。。。

MNIST画像の表示

どうしても、最後の、img_show(img) のところで、エラーになってしまって、画像が表示されない。

サポートサイト
https://github.com/oreilly-japan/deep-learning-from-scratch

のコードをコピペしてもダメ。

しかし、ch03/ フォルダに、mnist_show.py というファイルを作成し、サポートサイトのソースコードをコピペしてから、コマンドプロンプトで、 python mnist_show.py とすると、最後に 5 という画像が表示された。しかし、Windows8.1なので、変な画像表示ソフトが開いて、その画像を保存することなどはできなかった。

まあ、よくわからないけど、ここは飛ばすこととする。

●ニューラルネットワークの推論処理

ネットワークは、入力層を784(=28×28)、出力層を10個のニューロンで構成。

一つ目の隠れ層を50個、2つ目の隠れ層を100個のニューロンとする。

sample_weight.pkl を、ch03/ フォルダにダウンロード

sigmoid(x), softmax(x) 関数などの定義も加えておいて、

本と同様、 Accuracy: 0.9352 と表示された。

なんとか、ニューラルネットワーク自分でも少し触れた感じがしてうれしい!

●バッチ(batch、束)処理

100個ずつ処理することにより、バス帯域の負荷を軽減し、コンピュータが効率よく計算できるようになるらしい。。。

ここの理解はちょっと難しい。。。

ふう。少し疲れたが、やっていてとても楽しい!

(参考)Online Latex Equation Editor – Sciweavers
http://www.sciweavers.org/free-online-latex-equation-editor