Python機械学習プログラミング
読み会
第12章
多層人工ニューラルネットワークを一から実装
1
[第2版]
基盤 江口春紀
目次
● 人工ニューラルネットワークによる複雑な関数のモデル化
● 手書きの数字を分類する
● 人工ニューラルネットワークのトレーニング
● ニューラルネットワークでの収束
● ニューラルネットワークの実装についての補足
2
3
人工ニューラルネットワークによる
複雑な関数のモデル化
単層ニューラルネットワークのまとめ
● ADALINEアルゴリズム
4
勾配降下法を使って重み wを更新
しきい値関数
多層ニューラルネットワークアーキテクチャ
● 多層パーセプトロン
5
フォワードプロパゲーションによるニューラルネットワークの活性化
● 多層パーセプトロンの学習
1. 入力層を出発点として、トレーニングデータのパターンをネットワーク経由で順方向に
伝播させ、出力を生成する。
2. ネットワークの出力に基づき、後ほど説明するコスト関数を使って誤差を計算する。
この誤差を最小化することが目的となる。
3. 誤差を逆方向に伝播させることで、ネットワーク内の各重みに対する偏導関数を求め、
モデルを更新する。
6
フォワードプロパゲーションによるニューラルネットワークの活性化
● フォワードプロパゲーション
● ベクトル化
7
8
手書きの数字を分類する
手書きの数字を分類する
● ニューラルネットワークの実際の効果
● バックプロパゲーションの説明を続ける前に、一度ニューラルネットワークの実際の効果
を確かめる。
● 使用するデータセット
● MNIST(Mixed National Institute of Standards and Technology database)
○ トレーニングデータセットの画像 (28×28 ピクセル) : 60,000 サンプル
○ テストデータセットの画像 (28×28 ピクセル) : 10,000 サンプル
○ 各画像のピクセル値が 0~255の値をとるので、-1~1の範囲に正規化して使用する。
9
多層パーセプトロンを実装する
● 実装されたコードの一部
● フォワードプロパゲーション
10
def _forward(self, X):
z_h = np.dot(X, self.w_h) + self.b_h
a_h = self._sigmoid(z_h)
z_out = np.dot(a_h, self.w_out) + self.b_out
a_out = self._sigmoid(z_out)
return z_h, a_h, z_out, a_out
多層パーセプトロンを実装する
● MNISTデータセットのトレーニング
11
>>> nn = NeuralNetMLP(n_hidden=100,
... l2=0.01,
... epochs=200,
... eta=0.0005,
... minibatch_size=100,
... shuffle=True,
... seed=1)
>>> nn.fit(X_train=X_train[:55000],
... y_train=y_train[:55000],
... X_valid=X_train[55000:],
... y_valid=y_train[55000:])
200/200 | Cost: 5065.78 | Train/Valid Acc.: 99.28%/97.98%
コスト
正解率
正解率の差が
開いていっていることが分かる
多層パーセプトロンを実装する
● 正しく分類できなかった数字
12
miscl_img = X_test[y_test != y_test_pred][:25]
correct_lab = y_test[y_test != y_test_pred][:25]
miscl_lab = y_test_pred[y_test != y_test_pred][:25]
fig, ax = plt.subplots(nrows=5, ncols=5, sharex=True, sharey=True,)
ax = ax.flatten()
for i in range(25):
img = miscl_img[i].reshape(28, 28)
ax[i].imshow(img, cmap='Greys', interpolation='nearest')
ax[i].set_title('%d) t: %d p: %d' 
% (i+1, correct_lab[i], miscl_lab[i]))
ax[0].set_xticks([])
ax[0].set_yticks([])
plt.tight_layout()
plt.show()
人が正しく分類するのが難しいものもあることがわかる
13
人工ニューラルネットワークの
トレーニング
ロジスティック関数を計算する
● クロスエントロピー誤差関数
● 正則化項の追加
● ネットワーク内の全ての活性化ユニット tに対して一般化する
14
バックプロパゲーションに対する直感力を養う
● バックプロパゲーション(誤差逆伝播法)
● 多層ニューラルネットワークにおいて、複雑なコスト関数の偏導関数を求める際に
その計算を非常に効率よく行う手法。
● 連鎖律
● 例えばfがuの関数で,uがxの関数であるとき,fをxで微分するには以下のようにする。
連鎖律と偏微分を使い更新する重みを計算していく。
15
バックプロパゲーションによるニューラルネットワークのトレーニング
● フォワードプロパゲーション
16
フォワードプロパゲーションでは、
ネットワークの結合を通じて入力特徴量を順方向に伝搬させる。
バックプロパゲーションではこれを逆方向に伝搬させていく。
バックプロパゲーションによるニューラルネットワークのトレーニング
● 重みの更新
17
勾配に対して逆方向に進み
重みを更新する
ニューラルネットワークでの収束
● バッチ学習
● 学習データxがn個あるときに、n個のデータを全て用いて、損失の平均を計算し学習を行う。
● オンライン学習
● 学習データが入ってくるたびにその都度、新たに入ってきたデータのみを使って学習を行う。
● ミニバッチ学習
● 学習データxがn個あるときに、ランダムな
k個(1<k<n)のサブセットを使い学習を行う。
● 学習率
● 局所解に陥らないように調整をする。
18
まとめ
● 多層人工ニューラルネットワーク
● 複数のニューロンをニューラルネットワークアーキテクチャに結合させて、
より複雑な問題を解くことができる。
● バックプロパゲーションを使った効率的な重みの更新をおこなう。
19

[第2版]Python機械学習プログラミング 第12章