AI活用のための第一歩 - 加賀百万石ですが何か?

AI活用のための第一歩

最近,日本ディープラーニング協会が主催しているジェネラリスト検定(通称:G検定)を受検しました。その資格の主旨は以下の通りです。

ディープラーニングの基礎知識を有し,適切な活用方針を決定して事業応用する能力を持つ人材

結果は合格だったのですが,受検後真っ先に思い浮かんだ感想が「この資格を一般の人が取得して,果たして本当に事業に応用することができるのだろうか」というものでした。

資格試験全般に言えるかもしれませんが,この試験のために詰め込みで勉強したところで人工知能(ここでは機械学習の意)の仕組みは全然分からないですし,実際に応用しようとしたときに,

  • どういう課題設定をすればいいの?
  • どんなデータを用意すればいいの?
  • どんな技術を用いればいいの?

といったことはまったく分からないんじゃないかと感じた訳です。

そういう訳で,G検定を受けてみたものの残念ながら不合格だった人ぐらいの方向けに,そもそも人工知能(機械学習)ってどんなことをしているのか?という視点で,実際のデータを用いながら解説する記事を書いてみたいと思います。

なぜ,G検定で不合格になるくらいの方向けかというと,「G検定を受けてみようと思う程度にはAIに関心があるけど不合格になってしまう人は,たぶんこういった内容を一度かみ砕いておくと試験勉強もしやすくなるだろうな」とか,逆に「G検定は受かったとしても,こういうことを理解しておかないと事業への応用は難しいだろうな」と思うところがあったからです。

例題設定

人工知能技術というと,G検定の勉強を少しでもしたことがある人であれば知っていると思いますが,

  • 推論・探索
  • 知識表現(エキスパートシステム)
  • 機械学習(今はこれ)

という段階を踏んで発展してきました。

前者2つは知識として知っておけばいいレベルだと思いますが,機械学習についてはある程度その仕組みを理解しておかないと,事業への応用はなかなか難しいと思います。そこで,ここでは機械学習ってどんなことをしているのかをざっくりと把握します。

具体的なデータを見ながら理解していくと機械学習の仕組みを理解しやすいと思いますので,ここで何か簡単な例題を設定したいと思います。

よくある分類問題を例題にしてもいいのですが,あまりにも単純すぎるので,ここでは「画像の中から顔を検出する」という問題を設定したいと思います。

ちなみに,実際の事業を前提とした場合に顔検出をしたいようなケースというのは,例えば以下のような応用事例が考えられます。

  • カメラで写真を撮るときに,顔の位置を検出してピントを顔に合わせたい
  • 事前に登録した特定の人を監視カメラで検出する防犯システムを開発したい

ここでは,あくまでも例題として顔検出を行ってみようというだけですので,もし具体的な事業への応用案がある場合は,それを想定しながら続きを読み進めていってください。

機械学習のざっくりした仕組み

さっそくですが,機械学習の基本的な考え方を一言で表現すると以下のようになります。

「何かを入力したときに,何かを出力する」

例えば例題の場合だと,

「画像を入力すると顔の位置を出力する」

ということになります。とてもシンプルなものですね。

数学に慣れている人は「要するに関数じゃん」と思う人もいるかもしれませんが,まさに関数のことです。「xを代入するとyが得られる」というのとまったく同じです。「画像を入れると顔を位置が得られる」というだけです。

ひとことでいうともう終わりなのですが,もう一歩踏み込んで具体的なデータで表現したいと思います。まず「入力する画像」ですが,これは特に難しくないと思います。例えばこんな画像です。

はい,僕の画像認識の記事でよく登場する浜辺美波さんです。石川県出身なので応援したいということでよく登場して頂いています。

※参考記事

この画像を入力データとするときに,じゃあ出力はどんなデータになるでしょうか。ここでは問題設定を単純にするために,まずは「画像の中には顔はひとつしかない」という条件で考えます。

すると,出力結果はこういうイメージになります。

顔を検出できていますね。ただ,これだけだと具体的に何を出力としているか分かりません。この場合の出力すべきデータの例は「赤い四角の左上の角の座標」「四角の高さと幅」です。

さらに詳しく言うと4つの数値が出力になります。左上の角の座標というのは「画像の左端から何ピクセル目か」「画像の上端から何ピクセル目か」の2つで表すことが出来ます。

そして残りの2つは「赤い四角の高さ」「赤い四角の幅」の2つです。合計で4つの数値が得られれば,この赤い四角を書くことができます。

ちなみに「出力すべきデータの」とあえて書いたのには理由があります。それは,赤い四角を書くためには他の方法でも良いからです。例えば「赤い四角の左上の角の座標」「赤い四角の右下の角の座標」を出力データとしても構いません。これでも赤い四角を書くことはできますからね。

ここまでの話を図で表すと以下のようなイメージになります。

念のため言っておきますが,出力の4つは当然具体的な数値です。例えば,以下のようなものです。

  • 左上角のx座標=125
  • 左上角のy座標=83
  • 顔の高さ=201
  • 顔の幅=167

ここまでで,機械学習を使ってどのように顔が検出されるかというイメージはできたかと思います。

すると,あと残っている問題は「どうやってそういうモデルを作るか」です。つまり,どういうデータを用意して学習するかということですね。

これは,検出するときと基本的には同じデータの考え方をすれば良いです。具体的には「画像(入力データ)と,その画像内の顔の位置を表す座標データ(教師データ)」をひたすら沢山用意すればいいだけです。

そのような大量のデータセットを用意して学習させれば,「この画像では,ここに顔がある」というのを全データで学習していきます。そうすると,最終的に未知のデータを与えると「この画像ならここに顔がありますね」ということで顔位置の座標を出力してくれるようになります。

機械学習のざっくりとした仕組みは以上です。

なお,上の図ではディープラーニングのネットワーク図を描いていますが,あくまでも例として載せただけで,実際には決定木やSVMなど適切なアルゴリズムを設定します。まぁ画像認識の場合はほぼ間違いなくディープラーニングを使うことになりますが。

もう少し複雑な問題設定

ここまでで,どんな問題だとどんなデータを用意すればいいのか,ある程度イメージは付いたんじゃないかと思います。そのため,顔検出を例題として,もう少し複雑な場合を考えてみたいと思います。

先ほどまでは「画像内に顔はひとつしかない」という条件で考えてきました。では「顔が複数ある場合」にはどうしたらよいでしょうか。

パッと思いつくのは,

「ひとつの顔当たり4つの数値が必要だったから,顔の数だけ増やしてやればいいのでは?」

という感じでしょうか。例えば,顔が3つなら,

「ひとつの顔当たり4つの数値」×「3つの顔」=12個の数値があればよい

ということですね。

これだと「画像によって顔の数が変わるから,ネットワークの形も画像ごとに変わってしまう」という問題が生じてしまいます。

先ほどのネットワークの図を確認してみてください。一番右端には4つの丸(ユニットと言います)がありますが,これが画像ごとに変わってしまいます。そうなると,そもそもネットワークを作ることが出来なくなってしまい,学習してモデルを作ることが出来ません。

ではどうするか。あくまでもこれはひとつの例ですが,「各ピクセルごとに,そこが顔なのか顔以外なのか」を判定するという方法です。つまり,出力の数は「画像のピクセル数」と同じになり,出力のイメージは以下のようになります。

ここで注意しておいて欲しいのですが,この画像は出力をイメージしやすいように元の画像に出力を重ねてヒートマップ調に表示しています。実際の純粋な出力データというのは,「各ピクセルごとに0以上1以下の値」が得られていて,顔の可能性が高い箇所(赤い箇所)ほど1に近く,顔以外の箇所(青い箇所)ほど0に近い値となっています。先ほどのネットワーク図を用いて表現すると,実際の出力データは以下のようなイメージです。

ここで,「Nピクセル目」というのは最後のピクセルのことを意味します。仮に,画像が高さ300ピクセル×幅300ピクセルの場合は,N=300×300=90000となります。

これで,「各ピクセルごとに顔かどうかを0以上1以下で判定する」という問題に置き換えることが出来ましたので,画像内にいくつの顔があろうともひとつのネットワークで対応できます。例えば顔が2つの場合と4つの場合はこのような出力になります。

ではここでも「学習させるときにどんなデータを用意すればいいか?」ということを確認しておきます。

やりたいことは「顔ならば1に近い値,顔以外なら0に近い値を出力する」ということでした。学習用のデータも基本的には同じように考えれば良いです。

具体的にどういうことかというと「顔の部分は1,それ以外の部分は0」となっているデータを用意すれば良いです。イメージとしては以下の画像のようなデータです。

<入力データ>

<教師データ>

白黒でよく分かりにくいかもしれませんが,「黒の部分は0」「白の部分は1」となっているデータを表しています。縦横比は入力データと同じにしてありますので,これは白い部分(=1の部分)が顔を表しているデータになります。

繰り返しますが,各ピクセルごとに「顔ならば1に近い値,顔以外は0」を出力するモデルを作りたいので,学習用のデータは「顔ならば1,顔以外は0」となっているようなデータを用意してやればいいということです。あとは,大量の画像でこういったデータセットを用意して学習させると,ピクセルごとに顔かどうかを判定してくれるモデルを作成できます。

ここで鋭い方は気付いたかもしれませんが,「そもそも画像のサイズって,画像によって違うんじゃないの?」という問題があります。「画像のサイズが異なると,結局ネットワークの入力部分も出力部分もユニットの数が画像によって変わってしまうことになって,モデルが作れないのでは?」ということです。

これについては,事前に画像のサイズを変更しておくことで対応します。例えば,入力も出力も高さ300ピクセル,幅300ピクセルに強制的にサイズを変換してしまうという処理です。この処理を事前に画像に施しておくことで,画像のサイズを統一します。

あとは余談になりますが,上記の2つの結果はあくまでもピクセルごとに顔かどうかを0以上1以下で判定しているだけであって,顔の位置を四角で表現している訳ではありません。おおよその顔の位置を把握したいというだけであればこのままでもいいかもしれませんが,顔ごとに座標を取得したいとなった場合は,さらに追加で処理が必要になります。

この処理は機械学習とは一切関係のない,単なるプログラム上の処理になりますので具体的な処理内容は割愛しますが,実際にやってみるとこのような四角を表す座標を取得することができます。

最後に念のために付け加えておきますが「こんなやり方しなくてもFaster-RCNNとか,別のやり方でいいじゃん」とか思った貴方。この記事で新しく得られることなんてないと思いますので,今すぐブラウザを閉じて下さい(笑)

まとめ

以上,機械学習のざっくりとした仕組みと,例題を用いてどのようなデータを実際に用意したらいいかという事例を見てきました。

顔検出という問題設定は,たとえ同時に複数の顔を検出する場合でもかなり単純な問題です。現実的な問題を解決するためには,もっと複雑なデータを用意したり,かなり入り組んだネットワークを構築したりすることも多いです。

ただ,「入力と出力の対応を考える」という基本的な考え方は,多くの課題で共通します。まずは簡単な問題から実際の業務に応用していって,慣れてきたらどんどん実践的な複雑な問題に取り組んでいくのがいいと思います。

最後になりますが,僕が今まで勉強に使った本をいくつか紹介しておきます。基本的にはG検定をギリギリよりはもう少し余裕をもって受かるレベル,なおかつ実際の事業に応用できるくらいにはちゃんと理解できているレベルになるにはどんな勉強をしたらいいかという方向性で選んでいます。

深層学習 (機械学習プロフェッショナルシリーズ)

これはあちらこちらで良本だと言われているものです(通称:青本)。高校~大学教養レベルの微分・行列・数列の知識があれば概ね読めると思います。数列で添え字がかなり出てくる箇所もありますが,紙とペンで書き下してみると意外と単純な計算をしているだけという箇所が多いので,多少面倒ですが実際に手を動かしながら読んでみることをお勧めします。

「ビジネスへの応用を考えているだけだから,数式を使った勉強まではしなくてもいいかな」と思う人もいるかもしれませんが,可能であればこの本に書かれていることぐらいのレベルでは,ディープラーニングを理解しておいた方がいいと思います。表面的な知識だけだと,実際の事業に応用しようとした際に「さぁどうしよう…」というところで思考が止まってしまうと思います。

深層学習教科書 ディープラーニング G検定(ジェネラリスト) 公式テキスト

これはG検定を受けようとしている,もしくは受けたことがある人であれば知っているかと思います。深層学習について歴史的な経緯からどんな分野で使われているかといった内容を,ざっくりと把握するには便利な本だと思います。ただ,これだけで勉強しているようだと,G検定合格はかなり難しいかと思いますので,上記の青本等のようにもう少し技術的な内容まで踏み込んで勉強しておく必要があると思います。

ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装

これは数式よりも,実際にプログラムを書いて動かしてみることで理論的な部分を理解したいという方にお勧めの本です。「ディープラーニングって何ぞや」というのを数学的に理解したいのであれば,先ほどの青本をきっちりと勉強する方が良いと思います。逆に,「数式なんて見たくもないわ!でも仕組みは知りたい!」という方はこちらの方がいいかと思います。

Neural Network Design (2nd Edition)

こちらは英語の本ですが,勾配降下法などの細かい部分までちゃんと勉強したいという本気の方にはかなりお勧めです。タイトルから分かる通り,ディープラーニングではなくてニューラルネットワークについての本ですが,平易な英語で書かれていて練習用の計算問題や図もついていますので,論文を読む苦労に比べるとかなり簡単に読み進められると思います。僕自身,この本をちゃんと読むことで最適化の手法などについて具体的なイメージを持てるようになりました。

ちなみに,鈍器のように分厚い本です。手元のやつで厚さを測ってみると4.5cmありました…。

深層学習 Deep Learning (監修:人工知能学会)

これは人工知能学会誌の連載を加筆・修正してまとめた本です。これをお勧めする人もいるのですが,そういう人はおそらく人工知能とりわけディープラーニングを本業でやっているような人たちだと思います。人工知能学会誌の連載だっただけあって,正直難しいです。書いていること自体はちゃんと読んでいけば理解はできるのですが,やはり学会員を相手に書いている文章という感じで,単純に用語や言葉遣いが学術寄りになっています。

ここまで紹介してきた本でもまだ物足りないという人であれば読んでみてもいいかと思いますが,「G検定を取得してビジネスへの人工知能の応用を考えていこう」という方にはお勧めはしません。あくまでも,こういう本もありますので,興味があれば読んでみてくださいということで紹介だけしておきます。

スポンサーリンク