活性化関数を変更して賢い人工知能にしよう

人工知能の精度を上げるためにはニューラルネットワークの設計が大切です。もうひとつの要素として学習に使うデータセットの正規化というのもあるのですが、ここでは取り扱いません。MNISTの手書き数字のデータを使います。

前回のおさらい

前回は下記のようなネットワークになっていたはずです。

model = Sequential()
model.add(Dense(64, activation='relu', input_dim=784))
model.add(Dense(10, activation='softmax'))

model.compile(optimizer='rmsprop', loss='categorical_crossentropy', metrics=['accuracy'])

モデルを構成しているのは2層のネットワークですね。最初に784次元の画像データを、活性化関数ReLUを使って64次元にまで次元数を減らしています。その値をSoftmax関数を通して10次元の出力にしています。細かい活性化関数の解説は別の記事に譲るとして、Softmax関数を通すと、各次元である確率が得られます。少し難しいですね。0である確率が90%、1である確立は2%みたいな感じのデータが得られるのです。

こんな単純なネットワークであるにも関わらず、model.evaluteして実行すると、認識率は95%程度になっています。実行結果の最後に出てきた数値がテストデータで評価した結果の正答率になります。たぶん【0.9573】とか出てきたのではないでしょうか。

学習回数を増やせば賢くなっていく

ここで実行に使ったプログラムは下記のはずです。

model.fit(x_train, y_train, batch_size=100, epochs=2, verbose=1)
score = model.evaluate(x_test, y_test)
print(score[0])
print(score[1])

model.fitで学習データから学習を行って、作成したモデルにテストデータを与えることで精度を出力していますね。ここで重要なのは学習部分です。epochsという謎の値が「2」になっていますが、これが学習回数になります。少し話は変わりますが九九を勉強したことはありますか?あの勉強では繰り返し呪文を唱えることで九九をマスターしていたかと思います。「シクサンジュウロク」とかね。それと同じことで、学習を繰り返すと人工知能も精度が上がるとされています。実際に上がるかどうかはやってみないとわかりません。ただしチャレンジする価値はあります。ここは一気に20回にしてみましょう。

たぶん【0.9758】という値が表示されたのではないでしょうか。たった、これだけのことで2%近くも認識率が改善されてしまいました。すごいですね。難点をあげるとすれば、学習時間が10倍になってしまいました。安心してください、学習に時間が掛かりますが、作成したモデルを使用する時間(認識時間)は増えないのです。

ネットワーク自体の構成を見直しても賢くなっていく

学習回数を増やせば賢くなるというのはわかりました。ただし、それにも限度があることに気が付いたことでしょう。そうです。学習回数を仮に1000回にしても、精度は頭打ちになってしまいます。ここはネットワーク自体の構成を見直さなければならないのでしょう。学習回数は2回という条件での改善策を探しましょう。

とりあえず単純なところで、最初のReLU関数の出力次元数を増やしてみましょう。元の処理では64次元にしていましたが、今回は512次元にまで上げてみます。

model = Sequential()
model.add(Dense(512, activation='relu', input_dim=784))
model.add(Dense(10, activation='softmax'))

実行結果はかなり良好になりました。【0.9742】です。

今度は、ReLUした結果にReLUを実行します。何を言っているんだと思われるかもしれませんが、このようなネットワークにします。

model = Sequential()
model.add(Dense(512, activation='relu', input_dim=784))
model.add(Dense(256, activation='relu'))
model.add(Dense(10, activation='softmax'))

今までのReLUとSoftmaxの間にもうひとつ重ねてあります。ちなみに、追加したReLUはひとつ上の行の結果に対してReLUするので「input_dim」のパラメータを付ける必要はありません。付けるとおかしいことになります。

実行結果は【0.9784】になりました。少し良くなりましたね。このように深い階層のネットワークを作っていくことをディープラーニングと言います。聞いたことがあるのではないでしょうか。数十段のネットワークが実際に使われていますが、もちろんネットワークの段数を増やすということは計算資源を更に要求するということでもあります。数十段クラスのネットワークを開発するときには相当な資金力が要りますね。

まとめ

前回に引き続いてKerasを使った人工知能について学習していきました。実際に使ってみると、なんとなく人工知能の世界と言うものが見えてくるのではないでしょうか。基本的に次元を減らしていく、Softmaxで各分類の確率を求めるという流れで実現できる分野であれば今回の内容でも、人工知能を作っていけるでしょう。

システム開発

Posted by @erestage