現場データサイエンティスト奮闘記

とある企業で働くデータサイエンティストの日々のアウトプット

ディープラーニングが画像を分類する仕組み

概要

会社で「ディープラーニングって実際どんな風に動いてるの?知りたい!」と言われたので社内向けに作った資料を記事にしています。

想定読者

エンジニア・データサイエンティストというより、以下のような課題感を持ったビジネス職の人を対象にしています。

  • ディープラーニングという言葉は知っているが、実際にどんな風に動いているか知りたい
  • プログラムは書いたことがないのでシステムの話は理解出来ないが、なんとかエンジニアやデータサイエンティストと会話できるようになりたい
  • 機械学習は大量のデータが必要だとは聞くが、どんなデータがあればいいのか見当がつかないので教えてほしい

課題設定

やりたいことはシンプルで、今見ている画像を任意の種類のカテゴリに分類したいということです。 例えば、ひまわりの画像を植物と分類したかったり、ラーメンの画像を二郎系や中本など見分けたりといった感じです。

この、ものを見分けるというタスクを機械にやらせるための手法として深層学習( Deep Learning )という方法が取られます。 通常、人間が行うようなこのようなタスクを実現するシステムを人工知能( AI )と呼びます。

人工知能( AI )について

AIと言われて素朴に想像するのはドラえもんのような、自ら意思を持ち、自ら考え行動するようなマシンでしょう。 未だフィクションの域を出ないそのようなAIは強いAI、または汎用人工知能などと呼ばれます。

一方、実際に実現しているAIシステムは弱いAIと呼ばれ、これらはある特定のタスクを実行するのみに留まります。

今回紹介する Deep Learning もまた弱いAIの一部です。

なぜ Deep Learning なら画像の分類ができるのか

Deep Learning とは機械学習の1つの手法です。 機械学習とは、データを元に特徴を把握し、物事を予測したり分類したりするシステムのことです。

機械学習が特徴をつかむとはどういうことか

例で示します。 Aというグループに100人がいて、バナナとオレンジどちらが好きかという質問をして、以下のような回答を得たとします。

バナナが好き オレンジが好き
Aグループ 90人 10人

この事実、すなわちデータを元に機械は、「Aグループはバナナを好む人が多い」と認識します。 では、Aグループとよく似た特徴を持つBグループがあるとして、彼らにバナナとオレンジのどちらかを推薦してください、というタスクを機械に課したとします。 ここで機械はAグループがバナナ好きが多いので、それとよく似たBグループにもバナナをオススメした方が好まれる確率が高いだろうと予想します。

これが機械が特徴をつかむ、ということです。 機械にはなぜAグループがバナナを好むのかわかりません。しかし、バナナ好きが多いという事実から類似のグループの好みを類推しているのです。

このような事実(データ)に基づいた推測を行うことを機械学習と呼び、データを多くすることでその予測の精度を高めることで、その妥当性を高めていきます。

機械学習はプログラムよりデータありき

人工知能機械学習)が他のシステムと異なる点は、機械学習はデータありきで開発されるという点です。

通常のシステム開発であれば、実現したいタスクに対して仕様があり、それを実現するプログラムを作成し動作させることで実現します。その結果としてデータが生成され、システム上で表示なりされるものです。

しかし、機械学習においてはプログラムのコードが全く同一のものでも、入力するデータによって精度の高いものができたり、逆に精度が低いものができたりします。 機械学習はその性質上、大量のデータがある程に性能が高まりやすい傾向にあります。従って大量のデータが存在することが機械学習開発における必要条件になります。

また、「Aが0.7以上だったらバナナカテゴリになる」みたいな明確なルールがないのも特徴です。(その分類ルール自体を学習するので) よって、分類や予測の判断基準をコード中に明記できないのもデータありきであるという理由の一つです。 1

機械学習におけるモデルという概念

機械学習において、学習し予測を行う部分をモデルと呼びます。モデルは、下図のような位置づけです。

f:id:kazuki_hykw:20181115145838p:plain

モデルの予想した結果と、予め用意した正解とを比較してなるべく全体の正解率が高くなるように繰り返し調整を行うことを学習するといいます。 2

ここで、モデルが精度を向上させるために2種類のデータが必要なことがわかります。 モデルに入力するデータ(訓練データ)と正解データ(正解ラベル)の2種類がないと学習ができません。 画像の分類で言えば、画像自体が訓練データとなり、その画像の分類ラベルが正解ラベルとなります。最初の正解ラベルは人が用意して上げる必要があります。 3

なぜ Deep Learning を使うのか

Deep Learning とは機械学習の1手法に過ぎず、他にもロジスティック回帰や決定木など手法はたくさんあります。その中でも Deep Learning は他と比べ複雑で、かつ計算のコストも高い(場合によっては何日もマシンを動かし続けないと学習が終わらない場合もあるほど)手法です。そんな手法がなぜ選ばれるのでしょうか。

特徴量について

機械学習には特徴量という概念が非常に重要になります。 機械学習の手法、つまりモデルはたくさん存在しますが、精度を高めるために、「どのモデルが優秀なのか?(どのモデルを使えばいいのか?)」よりも、「どの特徴量を使えばいいのか?」を考えるほうが有用です。 特徴量設計がきちんとなされたデータセットでシンプルなモデルを作ったほうが、下手な凝ったモデルよりも精度が高いという例はいくらでもあります。それほどに特徴量というのは重要なのです。

特徴量とは、つまり変数なのですが、例を見てみましょう。webサイトのアクセスデータを元に特徴量を作った例を示します。

まずは元データがこんなログだったとしましょう。

id PageViews 滞在時間[sec] ランディングページのカテゴリ
001 10 120 categoryA
002 2 20 categoryC
003 20 653 categoryB
004 11 400 categoryC

これを特徴量設計をします。

id PageViews 滞在時間[sec] categoryA_flag categoryB_flag categoryC_flag
001 10 120 1 0 0
002 2 20 0 0 1
003 20 653 0 1 0
004 11 400 0 0 1

ポイントは、行列のセルの中身をすべて数値データに変えたことです。機械学習では基本的に数値データを使う4ので、このような変換を行います。 id は、ユーザーのidなので除くとして、他の列の PageViews, 滞在時間[sec], categoryA_flag, categoryB_flag, categoryC_flag の項目のことを特徴量といいます。要は行列の列要素のことです。

つまり、良い特徴量設計とは、よりよい変数の選択ができるかということを意味します。

Deep Learning は特徴量を自動で抽出してくれる

とはいえ、どんな変数が効くのかと言われてもそれが分かれば苦労はしないというもの。しかも、今回の課題のような、画像データ(RGB値のような数値)から特徴量を抽出してモデルに投入するようなタスクとなると人力で特徴量のデータセットを作成するのは不可能です。

Deep Learning はこの特徴量の抽出を自動で行ってくれる点において革新的であり、長らく実用化できなかった人工知能を今日ではここまで活用させるに至るほどの技術なのです。

詳しくは説明しませんが、 Deep Learning のモデルの構成は以下の画像の様になっています。

f:id:kazuki_hykw:20181115145818p:plain (出典: ディープラーニング – これだけは知っておきたい3つのこと

データの入力( Input )から予測の出力( Output )に至るまで、複数の層で計算を繰り返すことで特徴量の抽出を行います。 この仕組みは人間の脳のニューロンが電気信号をやり取りする仕組みを模して作られており、ニューラルネットワークといいます。多層のニューラルネットワークを重ねることでより複雑な特徴量の抽出に成功しました。 このようなモデルを 深層学習( Deep Learning と呼びます。

実際に Deep Learning で分類するまでの流れ

実際に分類タスクを行う過程を説明します。

  • 画像データ、アノテーション済み正解ラベルデータの取得
    • 画像とメタデータがセットになっていることが必要です。
  • カラー画像か白黒画像か統一されていることを確認する
    • カラー画像はRGBの3次元、白黒は1次元なのでデータの量が違います。両者が混ざると計算できません。
  • 画像のサイズを統一する
    • 画像のサイズが違うとデータ量が異なります。計算できません
  • モデルを構築する
    • Deep Learning にも CNNだのRNNだの種類が山程あります。タスクに応じて適切なモデルを選択します。
    • なおこの時点で何が最適かは不明なので何度もこの工程に戻ります。
  • 画像を加工する前処理プログラムを書く
    • 汎用性を出すために水平・垂直反転させたりちょっと歪ませたりして元画像を加工したデータも合わせて用意します。
  • 画像データを数値に変換したデータ(このようなデータをテンソルといいます)を作成
  • データをモデルに投入して学習を実行
    • この学習がめちゃめちゃ時間がかかる(数時間〜数日)ので、おとなしく待つか、GCPAWSなどのクラウドサービスに課金して性能の良いPCをクラウドで使います。
  • だいたい初期設定パラメータ(ハイパーパラメータといいます)が悪い感じになるので、ハイパーパラメータを動かしながら何度も学習して調整
    • それでも精度が悪い場合はモデルの構成が悪かったりするので他のモデルも試します
  • 既存のデータに対して良い精度が出たら、未知のデータをモデルに投入して予測結果を見てみる
    • 既存のデータに対して性能が良くても未知のデータでは全く良い結果にならない(過学習といいます)こともあるあるです。モデルの学習に使っていないデータでも予測が成り立つ(汎化性能といいます)か確認する必要があります。

以上がモデルの学習過程です。 実際にプロダクトに組み込むとなれば、更に考慮するべきことが増えますが、今回は割愛します。

参考文献

注釈


  1. たまに聞かれますが、「なぜその判断になったのか」をAIに問うことは本質的にナンセンスです。それが可能であればソースコード中に明記しルール化でき、AIなど使わずとも普通のシステムが実現が可能なのですから。

  2. このとき正解となるデータを用意して学習をしているので、この手法を教師あり学習と呼びます。正解データすら用意せず入力データのみで学習させることを教師なし学習といいますが、一般的に教師あり学習よりも難易度が高く、また実用性も低いので今回は説明を割愛します。

  3. あるデータに対して正解ラベルのような付加情報を付与することをアノテーションと呼びます。機械学習では正解データを用意するために、初歩の段階では人力でアノテーションして正解データを集めるという手法がよく用いられます。

  4. 自然言語処理など数値データ以外は今回は扱いませんので割愛します。