NVIDIA DIGITSのホーム画面には「Datasets」「Models」「Pretrained Models」という3つのタブがある。ざっくり言うと、Datasetsに自分が学習させたいデータセットを置き、Modelsには使用するディープニューラルネットワークの種類とDatasetsに置かれたデータセットなどを指定する。
今回のコースでは、手書き文字認識の定番であるMNISTのデータセットを使用した。使用したといっても、あらかじめ仮想OS上に配置されているので自分がやったことはDIGITSにそのパスを教えるくらいだ。
モデルのフレームワークにはディープラーニングで標準的な「Caffe」を使用し、ニューラルネットワークには手書き文字認識で代表的な「LeNet」を選択した。
最後に「Create」を押すとページが遷移し、学習の推移がリアルタイムに表示される。計算のGPUにはクラウド上の「GRID K520」を使用しているようだ。
今回はエポックを10で指定したので、学習→検証を10回繰り返したグラフになっている。青い折れ線が訓練データでのエラー数で、やや上下はあるものの、回数を重ねるごとにエラー数が減少していることが分かる。オレンジと緑の折れ線はそれぞれ検証データの正確性とエラー数だ。検証データでも回数を重ねるごとにエラー数が下がり、上がっていないため、学習は成功したといえる状態だ。
では、ここに検証データから1枚画像を入力してみるとどうなるだろうか? グラフの下に「Test a single image」という項があるので、ここに画像のパスを入力する。そして「Classify One(これを分類する)」を押すと結果が表示された。
左側の図が入力画像で、右側の「Predictions」が今回の学習モデルが予測する画像のラベルだ。「2」が99.35%、続いて「0」が0.62%と、「この画像は2である」という答えが得られた。人間が見てもこの画像は2であると考えられるので、正しく答えられたということだ。自分が指示した通りに学習した機械が正答してくれるというのは、なかなか感動するものだ。
この学習モデルはMNISTのデータセットにはない、少々変則的な数字の画像は認識できるのだろうか。以下のような数字画像のセットを「Test a list of images」に指定し、「Classify Many」を押してみる。
すると、最後の画像以外答えを間違うという結果になった。
学習モデルが答えを間違う時、考えられる改善点がいくつかある。それはデータセットの量、エポック数などいくつかの値(これらをハイパーパラメータという)や、ニューラルネットワークの選択やその部分的なカスタマイズが考えられる。
ディープラーニングというと人間が特に指示しなくてもいい感じに学習してくれる、という勝手な印象が自分の中にはあったが、本当はハイパーパラメータを何度も変えて試し、最適な学習結果が得られるようにチューニングしているエンジニアがいてこそのものなのだということを思い知った。
上記の学習モデルでは、実はMNISTのデータセットの一部しか使用していなかった。そこで今回はデータセットの全てを使用し、さらにデータセット中の画像の白黒反転画像を追加してデータをかさ増ししたデータセットを使用した。エポック数は10のままだが、ニューラルネットワークのLeNetの一部をカスタマイズし、隠れ層での計算量を増加させた。
この学習モデルでは学習推移は下の図のようになる。前の学習モデルと比べてみても、エラー数が訓練データと検証データ共に下がり、正確性が上がっていることが分かる。
では先ほどほとんど正答できなかった画像セットをこのモデルに入力してみるとどうなるだろうか。なんと、今度は1枚目から6枚目までの画像で正答し、最後の画像だけ間違えるという結果になった。
最後の画像も間違ったとはいっても、予測の2番目に「8」が40.83%で挙がっているので学習モデルも少々迷った(?)のだろう。もう少しハイパーパラメータを工夫すれば、全て正答する学習モデルも作れるのかもしれない。
このように、これまでディープラーニングを全く触ったこともなかった素人の自分がディープラーニングの基礎を体験することができた。上記の画像認識はQwikLabsの無料コースで誰でも体験できるし、ここで学んだことを生かしてNVIDIA DIGITSをダウンロードしてローカルで試行錯誤するのもいいだろう(自前でGPUかAWSを用意する必要はあるが)。
ディープラーニングは今後もさまざまな分野で活躍すると考えられる技術だ。技術者の人はもちろん、そうでない人もここから一歩を踏み出して、最先端の技術を「学習」してみてはいかがだろうか。
Copyright © ITmedia, Inc. All Rights Reserved.