【Aidemy】 ディープラーニングで手書き数字を識別してみよう⑥

前回の続き。
Aidemyの画像認識コース。ちょっと進みが遅いから書くのは少なめで行く…。
ディープラーニング基礎。

深層学習の実践(手書き文字認識を例に)

深層学習とは

分類までの流れ

  1. データを用意
  2. ニューラルネットワークモデルの構築
  3. モデルにデータを与え学習させる
  4. モデルの分類精度を評価

ディープニューラルネットワーク

  • 入力層、出力層、隠れ層からなる
  • 各層の縦に並んだベクトルの一つ一つの要素をノード、次元数をノード数と呼ぶ
  • 出力はクラスラベルに対応する要素が1に、それ以外の値が0になる、one-hotベクトル

データの用意

  • 手書き数字のデータセットであるMNIST
  • 以下のようにダウンロードすることができる
from keras.datasets import mnist

(X_train, y_train), (X_test, y_test) = mnist.load_data()

モデルの生成

  • KerasのSequentialを用いる
from keras import Sequential
from keras.layers import Activation
from keras.layers import Dense
from keras.optimizers import sgd

# インスタンス作成
model = Sequential()
# ユニット数128の全結合層を追加
model.add(Dense(128))
# 活性化関数を追加
model.add(Activation('sigmoid'))
# コンパイル
model.compile(optimizer=sgd, loss='categorical_crossentropy', metrics=['accuracy'])

モデルの学習

  • verbose=1で学習の過程を出力できる
history = model.fit(X_train, y_train, verbose=1, epochs=10)

モデルの評価

score = model.evaluate(X_test, y_test, verbose=1)

モデルによる分類

  • predictメソッドを用いて予測値を取得できる
  • 最後の活性化関数がsoftmaxなどであれば各クラスに属する確率のリストが出力される
  • 以下のようにすることで予測したクラスラベルがわかる
pred = np.argmax(model.predict(X_test[0]))

深層学習のチューニング

ハイパーパラメータ

  • 活性化関数、隠れ層の数・チャンネル数、ドロップアウト率、学習率、最適化関数、誤差関数、バッチサイズ、エポック数

ネットワーク構造

  • 隠れ層の数、隠れ層のユニット数は自由に決められる
  • 隠れ層やユニット数を多くすると多彩な関数が表現できるが、入力層に近い重みを適切に更新するのが難しく学習が進みにくい
  • 理論で裏付けて決めることが難しく、似たような実装例を参考にするなど経験に基づいて決定される傾向がある

ドロップアウト

  • ユニットの一部が学習の0で上書きされる
  • 特定のニューロンの存在に依存できなくなり、より汎用的な特徴を学習するようになる

活性化関数

 sigmoid(x) = \frac{1}{1+e^{-x}}
  • ReLU(ランプ関数)
 
 ReLU(x)=\left\{ \begin{array} xx (x\ge0) \\ 0(x<0) \end{array} \right.

損失関数

  • 学習時にモデルの出力と教師データとの差を評価する関数
  • 誤差逆伝搬法で損失関数を最小化するように重みを更新
  • 二乗誤差:連続値の評価に優れ、主に回帰モデルの誤差関数として使われる
 E=\Sigma^{N}_{i=1}(t_i-y_i)^2
  • クロスエントロピー誤差:二値分類の評価に特化しているため、主に分類モデルの誤差関数として使われる
 E = \Sigma^{N}_{i=1}(-t_ilog{y_i}-(1-t_i)log{(1-y_i)})

最適化関数

  • 重みの更新は誤差関数を書く重みで微分した値を元に更新すべき方向とどの程度更新するかを決める
  • 微分によって求めた値を学習率、エポック数、過去の重みの更新料などを踏まえてどのように重みの更新に反映するかを定めるのが最適化関数

学習率

  • 各層の重みを一度にどの程度変更するかを決めるハイパーパラメータ

バッチサイズ

  • モデルの学習の際に一度に渡すデータの数
  • オンライン学習(確率勾配法):バッチサイズが1の手法
  • バッチ学習(最急降下法:バッチサイズが全データ数の手法
  • ミニバッチ学習上記2つの中間

反復学習

  • モデルの精度を上げるために同じ訓練データを使って何度か学習させること
  • 学習を行う回数をエポック数という