第1回 Kerasでラクショー! ディープラーニング (1/2)

技術特集

1_tensorflow_keras1_tit

tit_tensorflow_keras

こんにちは、SCSK株式会社 R&Dセンターの古林です。

これから5回にわたり、「ウチでもできた!?ディープラーニング」と題しまして、TensorFlowやKeras等のOSSを活用したディープラーニングの実装方法について解説させていただきます。

なお、記事内で必要に応じてPythonのコードを示すことがありますが、Python自体の機能や構文に関する解説は割愛させていただきますのでご了承ください。

1) コードをいじる前に:ディープラーニング概説

この連載は、ディープラーニングに関心があり、IT系ニュースサイト等の記事をある程度参照されている方を読者として想定しています。

まずはおさらい程度にディープラーニングとは何か・何がうれしいのかについて確認したいと思います。

ディープラーニングとは

ディープラーニングの「ラーニング」は機械学習を指します。すなわち、コンピュータに多数の学習データを与えることで、どんな入力データに対してどう反応すればよいかを学ばせる手法です。

一口に機械学習といっても、膨大な数の手法が存在するわけですが、その中でも特に「ニューラルネットワーク」というモデルを何層にも重ねた「ディープニューラルネットワーク(Deep Neural Network、以下DNNと表記)」という仕組みを用いて実現したものが「ディープラーニング」と呼ばれます。

ディープラーニングが旧来の機械学習手法と比べて優れている点は、大まかに言って「データをとにかく沢山与えれば、それをどう分析するかを勝手に学習してくれる」というところです。

例えばディープラーニングの得意分野のひとつである「画像認識」において、旧来は入力画像がどのようなものか・得たい情報がどのようなものか、ということを考慮して前処理を重ね、画像に含まれる特徴の情報を取り出した上で機械学習を行う必要がありました。

一方、ディープラーニングにおいては、画像のサイズを揃えてRGBの情報をそのままDNNに与える、という極めて単純な下処理でも、かなりの精度を得ることができます。

とはいえ、「あらゆるデータ・あらゆる処理をこなすことのできる万能のDNN」というものは存在しません。

DNNは名前の通り脳の神経細胞(=ニューロン)のネットワークをモデル化したもので、その規模が大きいほど柔軟で複雑な学習が可能なのですが、やみくもに規模を拡げると、学習に時間がかかりすぎる・コンピュータの性能が足りなくなるなどの弊害が生じます。

そこで、規模増大を抑えつつ、より精度を上げられるようなネットワークの構造上の工夫が、世界中の研究者によって日々新しく提案されています。

ディープラーニングはデータが命

前述の通り「データをとにかく沢山与えることで精度を得る」というのがディープラーニングの基本戦略となっています。

従って、ディープラーニングの恩恵を得るには大量の学習データが必要になります。

ディープラーニング向けに学習データを用意するに当たっては、2つの課題が存在します。これらはディープラーニングを行う上での最大の課題にもなり得ることですので、ここでご紹介します。

課題1:いかにして良質なデータを大量に集めてくるか

処理内容の複雑さや求める精度にもよりますが、単純な処理でも千件以上、複雑な処理に対しては数十万件の学習データが必要になる場合もあります。

またせっかくデータの頭数をそろえても、中身が重複していたり処理目的に関係ないようなデータばかりでは役に立ちません。

例えば、画像に写っているのが犬か猫かをディープラーニングで判定したいという場合に、カブト虫の画像を十万枚集めても目的は達成できません。また集めた犬の画像がダックスフンドばかりに偏っていると、その他の犬種に対する認識精度は望めなくなってしまいます。

実務上は、「ディープラーニングで何かしたい」となるきっかけが、「データは溜めているが何かに活用できないものか」という悩みであることが多いと思うので、データ集め自体はあまり問題にならないことも多いかもしれません。

ただし、蓋を開けてみたら有効なディープラーニングができそうなデータではなかった、ということも充分考えられますので注意が必要です。

課題2:収集した大量のデータに対する「アノテーション」をどうこなすか

こんにちのディープラーニングは「教師あり学習」という手法、すなわち、入力データと、それに対応してコンピュータに出力して欲しい出力データの見本(=教師データ)をセットでコンピュータに与えることで、求める挙動をコンピュータに理解させる手法が基本です。

従って、収集した大量のデータをディープラーニングに使うには、セットになる教師データをあわせて準備する必要がでてきます。

犬と猫の画像を判定する例では、個々の画像が実際には犬と猫のどちらなのか、という情報を添えてやる必要があるわけです。

このように入力データに対する教師データを準備する行為を「アノテーション」と呼びますが、このアノテーションはディープラーニングを行う上で最もコストがかかる工程になることが多いのです。

というのはアノテーションの完全自動化は困難だからです。なにしろ、入力データから自動で出力が得られるような仕組みがないからこそ、それをディープラーニングで作ろうとするのですから・・・。

実務上、アノテーションの負荷が低くて済むケースとして、アノテーションと同等の作業をいままで業務として人手でやっており、それをディープラーニングで自動化したいという場合が挙げられます。

これまで手作業で処理された結果が残っていれば、入力データと教師データとして体裁を整えてやるだけでディープラーニングに使用できることもあるからです。

さて、前置きはこのぐらいにして、いよいよディープラーニングの世界に飛び込んでみましょう。