exits

勉強記録

ゼロからDL(2) - 3.6〜4.4.1

ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装

これの続き

前回,日曜日に~とか書いてたのにその後やってないのはまぁ研究がですね.うん.

自分で書いたコードはここ.

3章 3.6から

MNISTを読み込み,表示

mnist_test.py

表示のためにmtplotlibを使うが,エラー.
ここを見て解決.
Python3.4.0, matplotlib1.4.3でplot時にエラーが出る : mwSoft blog

表示できた.5.
f:id:yue82:20161023041341p:plain

ラベル予測

サンプルの重みを使ってMNISTのラベル予測をする.(neuralnet_mnist.py)
通常版とバッチ処理版と.

[ru@ru_pc]ch03 % python3 neuralnet_mnist.py
Accuracy: 0.9352
Accuracy(batch_size=100): 0.9352

わーい.

4章

いよいよ学習.

損失関数

学習のためには損失関数が必要.
交差エントロピー誤差関数を用意する.バッチ処理に対応させる.(loss_funcs.py)

ミニバッチの準備

ミニバッチで学習できるよう,データをランダムに取り出す.(mini_batch.py)
numpy.arrayのこの挙動,とても変な感じがするんだが,そんなことない?

In [1]: import numpy as np

In [2]: x = np.array([[0, 0], [1, 1], [2, 2], [3, 3]])

In [3]: x[[0, 2]]
Out[3]:
array([[0, 0],
       [2, 2]])

行のリストを渡すと,その行だけ残った形のarrayになる.
これを利用してランダムな行を抜き出している.

batch_mask = np.random.choice(train_size, batch_size)
x_batch = x_train[batch_mask]

数値微分

勾配法の準備として,数値微分も実装する.(grads.py)

微分

前方差分だと誤差が大きく,誤差を小さくしようと分母を小さくしすぎると丸め誤差の問題が出てくるため,中心差分を使う.
適当な関数の適当な値で微分してみる.(diff_test.py) f:id:yue82:20161102183725p:plain:w300

これを利用して各点での偏微分ももとめられるが割愛.

勾配

勾配をもとめる.(grads.py)
2変数{ \displaystyle (x_0, x_1)}の場合を想定すると,グリッド上の各点で偏微分を行い,{ \displaystyle (\frac{\partial f}{\partial x_0}, \frac{\partial f}{\partial x_1})} をもとめる.
もとめられたベクトルをグリッド上に並べた図を作ってみる.(gradient_test.py)
f:id:yue82:20161102234235p:plain:w300

元のプログラムでは偏微分計算時にf(x)に渡されるxが(x_0, x_1)ではなく,データ点数次元のx_0やx_1になっている.

def function_2(x):
    print(x.shape)
[ru@ru_pc]ch03 % python3 gradient_method.py
(324,)
(324,)
.
.
(324,)

しばらく悩んだが,転置して,fに正しく(x_0, x_1)を渡すように変更しても全く同じグラフが出た.

x_0, x_1が対称で,グラフの範囲も対称なので行列計算的にたまたま同じ勾配になるっぽい?
意味的にはやっぱり変なので自分のを採用.
びびりながらプルリクも送ってみた.

勾配法

勾配が最小値を指す(正確には,局所的に勾配が小さくなる方向を指す)のを利用する勾配法.
勾配に学習率({\eta},lr)をかけた量ずつ変化させて最小値を目指す.

まずは適当な関数{ \displaystyle f(x_0, x_1)={x_0}^2+{x_1}^2}の最小値を探してみる.(gradient_method.py)

numpyで列ベクトルを得るのはこうするんやね.行は全部(:)で,列は1行目,的な.

In [1]: import numpy as np

In [2]: a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])

In [3]: a[2, 1]
Out[3]: 8

In [4]: a[:, 1]
Out[4]: array([2, 5, 8])

f:id:yue82:20161103005936p:plain:w300

学習率を変えてみると,中心を飛び越えながら近づいたり,変化量が少なすぎてたどり着かなかったりする.
f:id:yue82:20161103010422p:plain:w300 f:id:yue82:20161103010428p:plain:w300

数値微分のとこで結構疲れたので,とりあえずここまで.
つづきは忙しいので12月.

所感