ニュース

ディープラーニングによる画像認識の基礎を学べる「NVIDIA Deep Learning Institute 2017」

NVIDIA「DIGITS」を用いた画像分類、物体検出の“最初の一歩”を試す

2017年1月17日 開催

 半導体メーカーのNVIDIAが1月17日にベルサール高田馬場(東京都新宿区)で開催した、GPUとディープラーニングの最新事情を紹介するイベント「Deep Learning Institute」。新しい技術動向やディープラーニングにおけるGPUの採用事例が披露されただけでなく、自動運転などに用いられる画像処理の基礎、画像分類と物体検出の実現方法を学ぶハンズオントレーニングも行なわれた。基調講演などのようすは別記事で伝えているが、ここではそのハンズオントレーニングの内容をお届けする。

機械学習の1手法であるディープラーニングを学ぶ

ディープラーニングを学ぶのに必要な9の前提知識

 同日午後に4時間かけて実施されたハンズオントレーニングに先だって、ディープラーニングの基礎知識が得られる「これから始める人の為のディープラーニング基礎講座」も開かれた。この講座では、ディープラーニングの仕組みやニューラルネットワークの構造、ディープラーニングによる学習作業の流れ、畳み込みニューラルネットワークの概要など、機械学習についての基本的なポイントが解説された。どれも重要なポイント、キーワードばかりだが、そのなかからハンズオントレーニングを受講するに当たってさしあたり知っておくべき項目をピックアップすると以下のとおりとなる。

1.機械学習では、「分類(Classification)問題」(多数の分布値をAグループとBグループに2分する特定の関数を決定する問題)と、「回帰(Regression)問題」(直線的に表れる分布値を特定の関数で近似する問題)を多く取り扱う。

分類問題(左)と回帰問題(右)
分類問題と回帰問題の例
分類問題では、直線で2つに分けられるものだけでなく、複雑な曲線でしか表現できない場合もある

2.ディープラーニングにおける「多層ニューラルネットワーク」は、人間の脳神経やニューロンを模倣した複数の「人工ニューロン」が層状に連なったもの。大まかには「入力層」、複数の「隠れ(中間)層」、「出力層」から構成される。

人工ニューラルネットワーク、多層ニューラルネットワークの構成

3.データは入力層にインプットし、隠れ層を経由して出力層に結果出力される。層から層へは、あらかじめ決められた「重み」に従ってデータが伝達される(順伝播)。

データは左側の入力層から隠れ層を経由し、右側の出力層へと伝達される

4.ディープラーニングでは、学習結果の値をあらかじめ用意した教師(正解)データに近づける(誤差を最小化する)ために、順伝播とは逆の方向にデータの伝達を行ないながら「重み」を調整する(誤差逆伝播法)。

出力層の値を正解データとして用意している教師データと比較
その誤差が最小になるよう重み調整が行なわれる

5.「重み」の値の幅をどれくらいの細かさで変えて試行するか、という「更新量」は、「学習率(Learning Rate)」で調整する。調整方法によっては「最適解(本当の最小誤差)」ではない「局所解」に到達してしまうことがある点に注意。

重みの調整には「(確率的)勾配降下法」が用いられる
更新量を多く取れば重みを大きく変化させることになる。誤差が最小になる重みを探索し、最適解へと近づけていく
重みの初期値や更新量(学習率)によっては、最適解ではなく局所解に陥ってしまうことがある

6.ディープラーニングによる学習の前には、学習用データをできる限り大量に集め、それを「訓練データ(Training data)」と「検証データ(Validation data)」に分ける。

収集したデータは「訓練データ」と「検証データ」に分ける

7.「訓練データ」で学習、重み調整を行ない(この一連の学習単位は「エポック」と呼ばれる)、「検証データ」で現在の学習状況を検証する、という処理手順を繰り返し、正しく学習できているかをチェックしながら進める。

全てのデータを入力して学習と重み調整を繰り返し、そのエポックを重ねていくに従って検証時の間違い率が0に近づくようなら学習はほぼ成功していると言える。エラー数が減らない場合は学習失敗。過学習(訓練データのみに最適化された状態)の疑いがある

8.「畳み込みニューラルネットワーク(CNN)」は、画像認識の分野で用いられることが多い。

「畳み込みニューラルネットワーク(CNN)」の基本的な構成

9.CNNには「AlexNet」「GoogLeNet」「ResNet」といった種類があり、それぞれでニューラルネットワークの構成が決まっている。例えばAlexNetは5層の畳み込み層と3層の全結合層からなる8層で構成される。GoogLeNetは22層からなる。

「畳み込み」は「Convolution」と訳される

 以上の基礎知識を前提として、同イベントの基調講演やセミナーとは別の会場で、「DIGITSで始めるディープラーニング画像分類」と「DIGITSによる物体検出入門」という2つのハンズオントレーニングが開催された。参加者が持ち込んだノートPC上でNVIDIAのディープラーニングシステム「DIGITS」をクラウド経由で利用し、画像認識処理の初歩を学ぶ内容だ。

参加者が自分のノートPCを持ち込んで実践

 トレーニングは、ハンズオンのためのクラウドサービス「QwikLabs」から、AWSなどと連携できる「Jupyter Notebook」にアクセスし、そこに記載されている解説や手順を参考にしながら、講師の説明のもとDIGITSを試す、という流れ。DIGITS自体は、NVIDIAのGPUが搭載されたPCにインストールし、ローカルでディープラーニングの処理を行なえる無償ソフトウェアでもあるが、今回のハンズオントレーニングではAWS(Amazon Web Services)上のGPU搭載サーバーで動作するクラウドサービスとして実行する形となっていた。

ハンズオンの前にあらかじめ「QwikLabs」のユーザー登録を済ませておく
QwikLabsにログイン
QwikLabs内に表示されるリンクから「Jupyter Notebook」にアクセスする

 したがって、参加者のノートPCに、ディープラーニングを加速するNVIDIAのGPUが搭載されている必要はない。最低限のPCスペックとPCスキルさえあれば誰でも参加でき(要事前予約)、ディープラーニングとDIGITSについて確実に理解を深められる。ただし、難解な理論やアルゴリズムの知識は不要とはいえ、あらかじめ先述の機械学習に関する基礎知識を身に付けていないと、作業の手順や意味を把握できず、目的も見失いかねないので注意が必要だ。

データ量とネットワーク構成を変更しながら、画像分類と精度向上の手法を学ぶ

「DIGITSで始めるディープラーニング画像分類」の講師を務めたNVIDIA合同会社 ディープラーニング部 森野慎也氏

 ハンズオントレーニングの前半「DIGITSで始めるディープラーニング画像分類」では、手書き文字を認識するディープニューラルネットワークを作り上げ、徐々に認識精度の改善を図っていくことが目標として掲げられた。複雑な機械学習アルゴリズムを容易に扱えるようにするディープラーニングフレームワークには、オープンソースの「Caffe」を、ディープニューラルネットワークには比較的初期の「LeNet」を、学習用データは多数の手書き文字画像を無償提供している「MNIST」をそれぞれ使用した。

ディープラーニングシステム「DIGITS」の画面
ディープラーニングフレームワーク「Caffe」の概要
「LeNet」のニューラルネットワーク構成

 具体的には、さまざまな筆跡で描かれた「0」から「9」までのモノクロ手書き数字画像を学習用データとして入力し、別途用意したいくつかのテスト用画像で認識精度を確認する。テスト用画像はカラーだったりイラストによる装飾が含まれていたりと、一見して認識が難しそうなものになっている。

入力に使うモノクロ手書き数字の学習用データ
学習後のテストに使う画像はクセのあるものばかり。正しく認識するのは難しそうだ

 学習方法は4パターンが提示された。「最小限のデータで学習」「その6倍量のデータで学習」「反転画像を追加し、2倍量のデータで学習」「ニューラルネットワークの構成を変更して学習」で、データ量や学習の手法によって認識精度にどのような影響を与えるのかを確認できる。

 DIGITSでは大まかに以下の手順で学習を実行する。このハンズオントレーニングでは画像分類を行なうため、データセットとモデルの作成時には「分類(Classification)」を選択することになる。

1.学習データセットを作成する
2.学習モデルを作成し、学習を開始する(訓練と検証)
3.学習済みモデルをテスト(推論:inference)する

「分類(Classification)」用のデータセットを作成する
赤枠部分がデフォルトから変更した箇所。ハンズオン用にあらかじめ用意されているMNISTの既存の学習用データを取り込む
データセットの作成処理が走り始める
次に「分類(Classification)」用のモデルを作成する
赤枠部分がデフォルトから変更した箇所。エポック数には10を指定
ニューラルネットワークはLeNetを使用
モデル作成の処理が走り始める
モデル作成(学習)が完了したら、その画面でテスト用画像を指定し、認識処理を試す
「2」と思われる画像だが、この段階では誤認識されているようだ
ニューラルネットワークの各層での処理内容を確認することもできる
学習の経過と結果はこのようにグラフ表示される
複数のテスト用データをリストから読み込むことも可能

 DIGITSでの学習中(モデル作成時)は、訓練データを入力して得られた結果と教師データとを突き合わせた時の間違い率(Loss)、検証データを入力した結果の間違い率と正解率(Accuracy)の3つの値がグラフ表示され、学習状況をリアルタイムに把握できるのが特徴だ。エポックが進むにつれ間違い率が0へと近づき、正解率が100%に近づくグラフが描かれれば学習はほぼ成功となる。4パターンすべてを試した際のテスト画像の認識結果例は以下のとおりとなる。

4パターンの学習方法それぞれでの認識のされ方

 2パターン目の「6倍量の学習用データで学習」以降は、最初に作成したデータセットとモデルをコピー(Clone)して作業するため、パラメータ変更などいくつかの手順を省略してすばやく次の学習パターンに移ることができる。上記の結果を見ると、新たなパターンの学習用データが増えると認識率も向上・変化することがお分かりいただけるはずだ。

 4パターン目の「ニューラルネットワークの構成を変更して学習」では、Caffeのニューラルネットワークの定義ファイルを直接編集し、活性化関数(その層からの出力値を決める関数)を加え、畳み込み層のフィルター(画像分割数など)をいくつか変更している。この変更ももちろんDIGITS上ででき、変更前後のネットワーク構成を視覚化して確認することも可能だ。

LeNetの右側に見える「Customize」からネットワーク構成を参照・変更できる
Caffeのニューラルネットワークの定義ファイル「prototxt」の中身を見ているところ
「Visualize」ボタンを押すとニューラルネットワークの構成が可視化される

 4パターン目の学習の結果、最初はほとんど誤って認識していた数字も正しく認識された。依然として「7」は誤認識しているようだが、全てを正しく認識できるようにするには、さらなるネットワークの構成変更やパラメータの調整、エポック数の変更、学習データの量や質を変えるといった最適化が必要になると考えられる。

 今回は、あくまでもディープラーニングによる画像認識の初歩を学ぶものであるため、個々の隠れ層でどのようにデータを扱うか、重み付けの調整をどのようにするか、といった細かなアルゴリズムにはほとんど言及されなかった。すでに述べたように学習用データの手書き数字画像もMNISTを利用しており、参加者は事前準備に手を煩わせることなく、ディープラーニングを試すためのDIGITSの使い方と、大まかな学習の流れを理解することに集中できる。

クジラの写真を用いた4パターンの物体検出方法を学ぶ

「DIGITSによる物体検出入門」の講師を務めたNVIDIA合同会社 ディープラーニング部 村上真奈氏

 ハンズオントレーニングの後半「DIGITSによる物体検出入門」では、衛星から撮影した洋上の写真から、クジラと思われる部分のみを検出するディープニューラルネットワークを作り上げるという目標が設定された。ディープラーニングフレームワークには前半と同じく「Caffe」を、ニューラルネットワークには全8層のCNN「AlexNet」を、学習用データには「Right Whale Recognition」が提供している写真を使用した。また、物体検出の方法として以下の4つの手法が提示された。

 1.画像全体のスキャン+CNN
 2.候補領域の検出+CNN
 3.「FCN(Full Convolutional Network)」を使用
 4.NVIDIA独自の「DetectNet」を使用

 1つ目の「画像全体のスキャン+CNN」は、1枚の全体写真をいったん等間隔のグリッド状に分割し、分割画像(パッチ)を全てCNN(AlexNet)に入力してクジラと思われる箇所を検出する「スライディング・ウィンドウ」と呼ばれる方法。2つ目の「候補領域の検出+CNN」は、最初に写真全体から候補領域を探索し、クジラと思われる箇所についてのみCNNに入力する方法だ。ただし、今回は時間の関係から2つ目の演習は行なっていない。

「画像全体のスキャン+CNN」による物体検出の手法
「Right Whale Recognition」の画像データはあらかじめ分割され、ラベル付けされたものを使用
Jupyter Notebook上で実行した「画像全体のスキャン+CNN」でのテスト結果。上の画像がテスト用画像としてランダムで選ばれたもので、下の画像が検出結果となる。何回かテストしたが、精度は高くなく、クジラ以外の波しぶきの部分などがクジラとして判定されてしまうこともある。また、結果出力までに10秒以上かかっており、実用性は低い
「候補領域の検出+CNN」という手法も紹介した。こちらはCNNに通すデータが少なくなるため、検出速度かなり高速化される

 3つ目の方法では、畳み込み層×5と全結合層×3という構成のAlexNetのニューラルネットワークをカスタマイズし、全ての層を畳み込み層にして学習する。つまり全結合層はなくなり、最初から最後まで畳み込みニューラルネットワーク(全畳み込みネットワーク=Full Convolutional Network)とするものだ。

Full Convolutional Networkによる物体検出の方法
「FCN(Full Convolutional Network)を使用」したテスト結果。高い精度でクジラの場所を特定しているが、それでもまだ波しぶきを誤検出することが多い。結果出力までの実行時間は1~2秒程度と高速

 そして最後の4つ目は、NVIDIA独自に作成したニューラルネットワーク「DetectNet」を用いた方法。GoogLeNetをベースにカスタマイズされたもので、誤差が算出される部分が2カ所ある「マルチタスクロス」構成。1つはクジラと思われる箇所の座標(回帰問題)、もう1つはそれがクジラかそうでないか(分類問題)に関する誤差で、その2つをマージして誤差が最小になるよう最適化されるネットワークなのだという。

「DetectNet」を用いた物体検出の方法
「NVIDIA独自のDetectNetを使用」したテスト結果。波しぶきなどに惑わされることなく、正確にクジラの位置を検出している。ただし、実行時間は数秒~10秒余りとさほど高速ではないようだ

 以上4パターンの検出方法のうち、最も高速なものでも1~2秒ということで、例えばクジラを人物やクルマなどに置き換え、自動運転に用いるリアルタイム物体検出のアルゴリズムとして使うのは難しい。しかし、ニューラルネットワークの種類・構成によって認識のされ方やスピード、メリット・デメリットがさまざまに異なることに気付けるだろう。

これからDIGITSやディープラーニングを学びたい人に

 今回開催されたハンズオントレーニングは、DIGITSの使い方を学ぶという目的も含まれたディープラーニング入門者向けのセミナーであり、これからDIGITSやGPUディープラーニングを使った画像認識を学びたい、あるいはディープラーニングの基礎的な仕組みを知りたいという人に適している。

 逆に言うと、ここで学んだことが即、新しいAIソリューションや自動運転車の開発に繋がるわけではない。実用性の高いディープラーニングによるアルゴリズム開発には、より高度で実践的なセミナーに参加してノウハウを得たり、NVIDIAのパートナー企業らが提供するソリューションを利用したりすることが不可欠だろう。

 こうしたハンズオントレーニングを含むイベントはたびたび開催されている。昨今は人気が高く、予約を取るのさえ難しい場合もあるようだが、無料か比較的安価な受講料に設定されているため、個人の趣味あるいは会社業務の一環として気軽に参加できるのではないだろうか。GPUを用いた高速で強力なディープラーニングの実力を体感しつつ、人工知能への取り組みを加速させたいなら、ぜひNVIDIAのWebサイトでイベントスケジュールをチェックしてほしい。