そろそろ入門しよう!おおざっぱに理解する「人工知能」【後編】

2017.09.20

Lab研究員 内藤

こんにちは。
2回にわたり、今話題の「人工知能(AI)」について、筆者独断の切り口で「わかりやすく」「おおざっぱに」ご紹介する
この記事。前回は「人工知能とは?」という概要をお伝えしました。
前回の記事はこちら

後編の今回はいよいよ、実際に人工知能(ニューラルネット)を使ってデータ予測を行ってみようと思います。

1.人工知能とニューラルネット(前回のおさらい)

前編でもご紹介した通り、人工知能とは人間の脳を模倣したコンピュータのことです。

20170929_1.jpg

人間が何かを認知し、だんだんと理解していくプロセスをネットワークのように表現したものを「ニューラルネット」といい、このニューラルネットを多層に(ディープに)学習していったのがディープラーニングです。この様子をコンピュータで再現していくわけです。
脳に送られる信号として、目からは画像(映像)、耳からは音声、口からは言語がありますね。これらはコンピュータでは扱えないので、すべて数値に変える必要があります。この数値を学習して学習モデルを作り、この学習モデルを使ってさまざまな物事を予測していきます。

20170929_2.jpg

これが人工知能の一連の流れです。
機械学習には、話題のディープラーニングのほかにも、重回帰分析SVMなど、さまざまな方法があります。興味をお持ちの方はぜひ調べてみてください。本記事では、ディープラーニングについてをわかりやすく解説していこうと思います。

2.ディープラーニングの種類

ディープラーニングのニューラルネットワークの種類には、大きく2つあります。CNNRNNです。

20170929_3.jpg

【CNN:Convolution Neural Network】
アメリカのニュース番組とは異なるのでご注意を!
このCNNは、一般的に「畳み込みニューラルネット」と言われています。

CNNは主に画像データ、つまり二次元の矩形データをインプットします。画像を入力したら、その画像が何に分類されるのか?を出力します。Googleの画像検索もこの機能を使っているんですよ。

まずはこちらの図をご覧ください。
20170929_4.jpg

入力した画像をそのまま学習させるのではなく、任意のドット数で圧縮しながら畳んで畳んで中間層(特徴の層)を作っていきます。「畳み込み」という層と、特徴を刈り込んで絞り込む「プーリング」という層が繰り返された(ディープな)構造になっているため、畳み込みニューラルネットワークと呼ばれています。

詳しく知りたい方はこちらの解説と動画がわかりやすくなっているのでご覧ください。
定番のConvolutional Neural Networkをゼロから理解する - DeepAge
https://deepage.net/deep_learning/2016/11/07/convolutional_neural_network.html

【RNN:Recurrent Neural Network】
RNNは、「再帰型ニューラルネットワーク」と言われます。

RNNは、時系列データ自然言語データをインプットします。今IoTの機器類で搭載される話題のセンサーなどのデータは時系列
データにあたるため、私どもYDCの業務とも近い領域といえるかもしれません。RNNは以下のようなニューラルネットの構造になります。

20170929_5.jpg

なかなかイメージしづらいですね。
入力から出力までの流れとしては、
 1.ある時点でのデータで中間層を作る
 2.次のデータを予測し、次のデータとの誤差で中間層を更新する
 3.さらに次のデータで同じことを再帰的に繰り返す
これで中間層を絶えず更新していくというイメージです。ここはのちほど、実際のデータを用いて解説します。

余談として......インプットとして時系列データと自然言語データはまったく異なると思ってしまうかもしれませんが、実は学習や
予測の方法は同じなのです。
 ・数値データの場合→この数値が来たら、次にこの数値を出そう
 ・自然言語データの場合→この文字が来たら、次にこの文字を出そう

3.人工知能で時系列データを予測してみる。

【1.なぜ時系列データの予測にしたのか?】

私どもYDCのお客様である製造業の皆様からも、よくAIの話題が挙がります。時系列データを人工知能で予測できれば、
 ・異常や故障検知の具体的なソリューションにできる
 ・IoTセンサーデータで検査前製品の品質を予測する
 ・難しい重回帰分析などの数式を使わなくても、データ予測ができる
など、製造業のお客様の業務改善に対してインパクトのあるソリューションを生み出せる可能性があるためです。
未来が広がりますよね。

【2.何を行うのか?】

人工知能に数値を渡し、後ろのデータを予測するということを行ってみようと思います。予想イメージは以下の通りです。

20170929_6.jpg

時系列データを少し与え、それ以降のデータを人工知能に予測してもらうイメージです。

【3.どうやって行うのか?】

実際にPythonのライブラリを使ってRNNの人工知能を作ります。使用するライブラリは、前編でもご紹介した「Chainer」を
使用します。

本記事は"おおざっぱに理解"をテーマとしていますので、Tryした内容と結果だけをお伝えします。

・入力データ

日本のある地点の2011年1月1日~2013年12月31日の最低気温です。

20170929_8.jpg

ただ数値が並んでいるだけですね。これをグラフ化するとこのようになります。
20170929_9.jpg

季節によって気温が上がったり下がったりしています。この動きを人工知能で学習します。

・学習

学習は前編でご説明したようにGPUを使って並列処理で高速に学習させていきます。inputのデータを任意の長さで
分割してミニバッチを作り、ひたすら学習させます。

20170929_10.jpg

・予測

どのように予測させるかというと、以下のようなイメージです。

20170929_11.jpg

サンプルデータを渡して、次のデータを予測。先頭のデータを捨てて、次のデータを予測。これを繰り返して予測
していきます。図で見ると案外シンプルな仕組みです。

・予測結果 その1

日本のある地点の2014年1月1日~2014年12月31日の気温のデータを渡して、次の2年間を予測させます。
その結果がこちら!

20170929_12.jpg

予測できているような、いないような......しかも予測値が途中から一定になってしまっています......。

ここで考えられる原因は、
 1.内藤のコードがバグを起こしている
 2.予測の方法が悪い
 3.ニューラルネットのモデルが悪い

1と2の可能性は低い気がするため、3のニューラルネットのモデルを試行錯誤してみることにしました。

・予測結果 その2

先ほどの予測は中間層が3層構造で、各中間層のノードが10でした。以下のようなニューラルネットということです。

20170929_13.jpg

次は、層の数はそのままに、各中間層のノード数を10から100に増やして学習と予測を行ってみます。

20170929_14.jpg

2回目の結果はこちら!

20170929_15.jpg

おお! それらしい予測が出てきました。正しい予測結果というにはほど遠いですが、大きな前進です。

・予測結果 その3

次は思い切って、中間層を増やしてみます。以下のようなイメージです。

20170929_16.jpg

三度目の正直、なるか? その結果がこちら!

20170929_17.jpg

これは! やりました!2年目まで見事的中しています。3年目は少しずれていますが、まあ予測できていると言ってもいいのではないでしょうか。

・予測結果 その4

もしかしたら、少ないデータからも予測できるのでは?とうことで、約3ヶ月分(100日)の気温データのみで以降3年間の予測を行ってみました。

その結果はこちら!

20170929_18.jpg

これは驚きです!!! 3ヶ月分のデータだけで以降3年間の予測ができてしまいました。恐るべし人工知能ですね。

さて、いかがでしたでしょうか。
今回は人工知能を実際に作り、データの予測をさせてみました。予測結果の精度を見るに、ニューラルネットの
モデル構築が大事であるということがわかりました。
ただ、筆者がお伝えしたかったのはそこだけではありません。たとえハードルが高く見える人工知能であっても、
一歩踏み出して作ってみる、挑戦してみることが大事ということです。

Pythonについても、情報がネット上にあふれています。人工知能の実装方法についてもそうです。
いざ作ってみようとすれば、いろいろと調べることになるので自然と技術情報も集まります。ハードルが高いと思って
本や雑誌の情報をインプットし続けるだけでは、いつまでたっても「IoTデータをAIで予測させます」といった曖昧な
話しかできないと考えています。我々YDCも、より実現性の高いご提案を強化していきたいと思っています。

さて、今回の前後編記事でご興味を持っていただけた方は、ぜひ最先端技術である人工知能の実装にTryしてみてください
(ちなみに、筆者がPythonを本格的に組むのは今回が初めてだったりします)。

何度もお伝えしていますが、本記事ではおおざっぱに人工知能を理解していただくために、ソースコード詳細説明は省略しています。
なお、Pythonの開発環境構築については、YDCラボ北山研究員の記事をご覧ください。
https://www.ydc.co.jp/column/0002/02170809.html

2回にわたり、お付き合いいただきありがとうございました!