#精度を向上させる
精度を向上するためには、様々な方法があります
①学習するデータ量を増やす
②正則化する
③アンサンブル学習を取り入れる。
主に私が使うのはこの3つの手法です。
今回はそれぞれ精度が向上する理由と、Kerasでの実装例を紹介していきます。
#①学習するデータ量を増やす
当たり前のことですが、多くのデータに目を通せば、もちろん精度は向上します。しかし、インターネットが発達したとはいえ、数万枚の画像データを持ってくるのは厳しいのが現状です。
そこで、データの水増しというのを行います。
MNIST画像を例にとります。
MNIST画像は28×28の画像であることはご存知の通りです。
これに、乱数を用いてのノイズを加算します。
具体的にはこうです。
#xTrainに(60000,28,28,1)のMNIST画像が格納されているとします。
xTrain2 = xTrain + np.random.rand(60000,28,28,1)
xTrain = np.concatenate([xTrain,xTrain2])
軽度のノイズを乗せたところで、人間が数字を見誤ることはほとんどありません。これは、人間の脳を模していると言われる人工知能でも同様です。
しかし、計算する値は若干違ってきます。例えば今まで0.123だったものが、0.126になっているかもしれません。
これは視覚的には大した差ではありませんが、人工知能はこれでも違うデータと認識します。つまり、データが増えたということです!
しかし、この方法では似たような画像が増えるということでもあり、汎化性を失う過学習に陥りかねません。あまり褒められた方法ではないのです。
#②正則化する
これは、AI研究者の中でも意見が分かれる手法ですが、ことCNNにおいては基本的に優秀なので、ここで紹介します。
from keras.layers import BatchNormalization
model.add(BatchNormalization())
これを各層の活性化層の前、もしくは後に挿入するだけです。どちらに挿入するかはあなた次第です。(どっちがいいか、という問題は宗教戦争を招きますので触れません。)
バッチサイズを指定して学習する際に特に効果を発揮します。
あるバッチの中で、平均0、標準偏差1になるように全体の値を調節します。
これは、偏りのないデータを提供することになるので、精度が向上します(たぶん)
出力値があまりに大きくなりすぎるのを防止し、勾配消失・爆発問題をある程度解消します。
データの質を上げる手法とも言えます。
#③擬似アンサンブル学習を取り入れる
アンサンブル学習とは、一つのモデルで答えを導くのではなく、複数のモデルで一度解答を出し、それを統合して全体の解答として出力する方針です。
古来から「三人寄れば文殊の知恵」と言われてきたことを、最先端技術に活かすのです。
ただ、複数のモデルを動かすというのは、モデルの構築、運用の面からしてコスパがいいとは言えません。
そこで、これを擬似的に実装します。
from keras.layers import Dropout
model.add(Dropout(0.25))
このDropout()は、入力された情報の一部を0に置き換えます。ここでは0.25を引数に取ったので、25%が無かったことにされます。
せっかく計算した結果を不意にするような人に見えますが、これはランダムに消去されます。つまり、epochが変わるごとに、消去する情報も変わるということです。ということは、1つのモデルが、epochの数だけ微妙に違うモデルとなることを意味します。
出力された値には、0.25が乗算されます。
これは、強制的に0にするノードを増やしたことで、1つ1つのノードが強力になっているだろう、という概念に基づきます
このようにして、効果的、かつ効率的にモデルの能力を上げることができます。
#最後に
ここまで紹介してきた3つの手法は、基本的な部分です。他にも、モデルに応じて様々な手法が存在します。
回転処理、マスキング、反転処理、ZCA白色化など、枚挙にいとまがありません。
自作したモデルの特性に合わせて、色々な方法を試してみてください!
もしかしたら、思いもよらない方法が、精度向上につながることもあります。
何故そうなるのかを考えてみても面白いでしょう!