#はじめに
この記事はゼロから作るディープラーニング 5章ニューラルネットワークの学習を自分なりに理解して分かりやすくアウトプットしたものです。
文系の自分でも理解することが出来たので、気持ちを楽にして読んでいただけたら幸いです。
また、本書を学習する際に参考にしていただけたらもっと嬉しいです。
#自作ニューラルネットワークに実際に学習させてみた
前回フレームワークなどを使わずにニューラルネットワークを実装し、完成させました。
今回は、前回作ったニューラルネットワークに学習をさせたいと思います。
学習の手順
1, 学習データの数が多い為サンプリングして量を減らす(ミニバッチ処理)
#ミニバッチ取得
batch_index = np.random.choice(train_size, batch_size)#サンプルのインデックス取得
x_batch = x_train[batch_index]# 入力データのサンプルを変数に入れる
t_batch = t_train[batch_index]# 正解データのサンプルを変数に入れる
np.random.choiceで学習用データの中からサンプリングをして、選ばれた学習用データのindexを取得する。
さっき取得したサンプルのindexが入った配列を使って、学習用データの配列からサンプルに選ばれたデータだけを参照する。
2, 勾配を出す
#ミニバッチ取得
batch_index = np.random.choice(train_size, batch_size)#サンプルのインデックス取得
x_batch = x_train[batch_index]# 入力データのサンプルを変数に入れる
t_batch = t_train[batch_index]# 正解データのサンプルを変数に入れる
#勾配を求める
grads = network.slopeing_grad_net(x_batch, t_batch)
前回作ったニューラルネットワークの勾配を求めるクラス関数を使って、勾配を求める。
3, 勾配を元にパラメータのの更新
#ミニバッチ取得
batch_index = np.random.choice(train_size, batch_size)#サンプルのインデックス取得
x_batch = x_train[batch_index]# 入力データのサンプルを変数に入れる
t_batch = t_train[batch_index]# 正解データのサンプルを変数に入れる
#勾配を求める
grads = network.slopeing_grad_net(x_batch, t_batch)
#パラメータの更新
for p in ['W1', 'b1', 'W2', 'b2']:
network.params[p] = network.params[p] - (learning_rate * grads[p])# 勾配降下法で、元パラメータから勾配を引くことで、勾配が示す損失関数の最小化に近く。
勾配はニューラルネットワークの学習でいうと、損失関数を最小化させるための最適変数の方向を表す。
そのため、勾配を引くと、最小の損失関数に近づく。
この作業を何回も繰り返すことで、徐々に損失関数が小さくなっていき、精度が増していく。