古いバージョンのブラウザーを使用しています。MSN を最適にご利用いただくために、サポートされているバージョンをご使用ください。

素人でもディープラーニングができる「NVIDIA DIGITS」で文字認識をやってみた

ITmedia PC USER のロゴ ITmedia PC USER 2017/01/23
素人でもディープラーニングができる「NVIDIA DIGITS」で文字認識をやってみた: ディープラーニングの説明でよくある図。入力層に画像や音声などのデータを入力し、出力層でそれが何であるか判別する(スライドはNVIDIA Deep Learning Institute 2017の村上真奈氏と森野慎也氏の講座から引用) © ITmedia PC USER 提供 ディープラーニングの説明でよくある図。入力層に画像や音声などのデータを入力し、出力層でそれが何であるか判別する(スライドはNVIDIA Deep Learning Institute 2017の村上真奈氏と森野慎也氏の講座から引用)

 素人でもディープラーニングが使えるようになる講座がある。そんな案内がNVIDIAから届いた。

 ディープラーニングといえば、2016年に囲碁でイ・セドルに勝利した「Alpha Go」や、自動車の自動運転技術に採用されているアルゴリズムだ。

 一般的に、ディープラーニングを自分でいじってみようと思うとPythonなどプログラミング言語の理解や、GPUの用意などハードウェア的な面である程度のハードルがある。

 そういったハードルの高さから「ディープラーニングってよく聞くけれどどんなものなのだろう」と興味を持っても、説明を読む程度で実際に使用するところまでたどり着かない人も多いだろう。

 かく言う私も、プログラミングはJavaの経験が少々あるもののPythonは触ったことがなく、ディープラーニングについては概念図を見てなんとなく理解した気になっていた程度だった。

 そんな中届いた「NVIDIA Deep Learning Institute 2017」の案内を読むと、

・ディープラーニングをこれから始める方を対象に、必要な基本知識について説明

・ディープ ニューラル ネットワークを用いた画像分類を実現するためのワークフローを体験。事前知識はWebブラウザの操作ができること

 といったことが書いてある。なんと、プログラミングの知識がなくてもディープラーニングを体験できるという。

 「素人でも始められるディープラーニング」の講座をNVIDIA Deep Learning Institute 2017で受講してきたので、その内容を紹介しよう。ただ、聞いた内容を忠実に書いたつもりだが私自身もディープラーニングの素人であるから、幾分か表現が厳密ではないところもあるかもしれないのでそこはご容赦いただきたい。

●使うツールは「NVIDIA DIGITS」 しかも学習用環境がクラウド上に

 今回使用するのは「NVIDIA DIGITS」という、学習したいデータセットやモデルの選択など、必要な操作を全てブラウザ上で行えるツールだ。このツールは本来ダウンロードして実行するものなのだが、今回はNVIDIAのオンライン学習サイト「QwikLabs」の無料コースからクラウド(AWS)上に環境が整えられた仮想OSを使用する。そのため、DIGITSのダウンロードの必要もないし、PCにハイスペックなGPUが載っている必要もない。

 本記事で解説する内容はQwikLabsにサインインすれば誰でも体験できるため、やってみたい方はQwikLabsに無料登録、サインインしてみてほしい。

●ディープラーニングって?

 先に、ディープラーニングの基本的な概念を見ていこう。ディープラーニング(≒ディープニューラルネットワーク)は、機械学習の一種である人工ニューラルネットワークの中でも層が多層になっているものを指す。ディープラーニングの図というと下のような図を見たことがある人もいるだろう。

 この図の丸は生物の神経細胞(ニューロン)を模しており、丸どうしをつなぐ線は神経細胞どうしをつなぐ神経線維に対応する。つまり、人工ニューラルネットワークとは生物の神経回路をまねることで機械でもデータを学習しようというアプローチだ。

○人工ニューロンの正体

 では、神経細胞に当たるこの「丸」は具体的に何なのかという疑問が浮かぶ。神経細胞をまねるというから何かしらのオブジェクトだったり、データセットだったりするのだろうかと前はふんわり思っていたのだが、説明を聞いてみると答えは明快。単なる変数だ。

 入力層の各xにそれぞれ「重み」の係数wをかけたものを隠れ層の各yに加算し、各yにまた重み係数をかけたものを出力層zに加算する、という操作を表したものが上記右側の3層のパーセプトロンだ。例えば入力データに白黒画像を使うなら、入力層のxの値は各ピクセルの明度になる。

 つまり、このパーセプトロンは数字の乗算と加算しかやっておらず(他の関数操作が加わる場合もある)、小学生でも理解できる計算式で表せるのだ。この図には入力層、出力層の変数が3つしかないので3つの方程式で表せるが、実際には3つよりもっと多いため、行列を用いることですっきり表せる。

○重みの調整が人工ニューラルネットワークの要

 重みwは初めはランダムに生成されるため、出力層の値は教師データ(正解の値)と比べると当然めちゃくちゃだ。教師データとの誤差が小さくなるよう、ここから重みwの値を勾配降下法などのアルゴリズムを使って調整していく。

 ディープラーニングの学習では、使用するデータを訓練データと検証データに分ける必要がある。訓練データで学習(重みの調整)し、検証データで学習がうまくいったか確認する、という具合だ。検証データはエラー数を確認するだけで、あくまで重みの調整には使用しない。訓練データの学習から検証データでの確認までの一巡を「エポック」と呼び、基本的にエポックを増やすほどエラー数が小さくなる(=正答率が上がる)。

○なぜ検証データを分けるのか→未知のデータに答えられなくなるのを防ぐため

 なぜ検証データを分けるかというと、「過学習」という状態を避けるためだ。過学習は訓練データに対してはよく正答できるが、その他の未知のデータに対してはうまく答えられない状態のこと。従って、エポックを繰り返しても検証データでエラー数が下がらなければ過学習、つまり学習失敗であり、逆に検証データでもエラー数が下がれば学習成功ということだ。

●NVIDIA DIGITSで実際にディープラーニングしてみる

 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を用意する必要はあるが)。

 ディープラーニングは今後もさまざまな分野で活躍すると考えられる技術だ。技術者の人はもちろん、そうでない人もここから一歩を踏み出して、最先端の技術を「学習」してみてはいかがだろうか。

ITmedia PC USERの関連記事

image beaconimage beaconimage beacon