Fire Engine

消防士→ITエンジニア→研究者

非エンジニアによる人工知能と機械学習の話 & scikit-learnで回帰分析もやってみる。

 現在、人工知能(Artificial Intelligence; AI)という言葉が、新聞やWebニュースで見かけない日がないほど盛り上がりを見せています。人工知能は、近年の目まぐるしい発展により、もはや研究の分野だけに留まらず、私たちの身近な生活にまで押し寄せてきています。iPhoneに搭載されている音声対話システムである『Siri』やロボット掃除機の『ルンバ』などはその一例に過ぎません。これからの世界は人工知能によって、どう変わっていくのでしょうか?

 人工知能という名前はよく聞くし、なんかすごいことができるんだろうなーということはわかる。でも実際何ができるの?人工知能って人工で人間の脳のようなものを作るの?という曖昧な理解の方も多いと思います。また、IT関連の勉強している方々の中には、人工知能に興味があるから実際に自分でもやってみたいという方々も多いでしょう。私もその一人であり、興味が抑えきれず、最近人工知能関連の本を読みあさりました。今回は、非エンジニアである私が、最近学んだことをまとめてみました。また、記事の最後には、実例としてPython機械学習ライブラリであるscikit-learnを使って、簡単な回帰分析をやってみました。機械学習を触り始めるのって、そんなにハードルは高くないよっていうお話です。

 下記の目次から興味のあるところだけでも読んでみてください!

目次

人工知能の現状と将来

人工知能とは何か?

 実は、人工知能とは何か?という疑問は、一言で答えられるほど単純な話ではありません。その解釈や定義は人工知能の研究をしている方々の間でも様々です。人工知能の研究でとても有名である東京大学の松尾豊先生の定義では「人工知能とは、人工的につくられた人間のような知能、ないしはそれをつくる技術」とされています。これだけではまだ何のことかピンときませんよね?

 そんな何とも理解しがたい人工知能ですが、すでに世の中には『人工知能を搭載した商品』や『人工知能を使ったシステム』と称されるものが数多く出回っています。それらは本当に人間のような知能を持つと言えるのでしょうか?私は最近の人工知能ブームを受けて、ずっと疑問がありました。ルンバだって人間のように自分で考えているわけじゃないんじゃないか?数多くのインプットされている行動パターンから最適の行動を選択しているだけなんじゃないか?そういった疑問が常にあり、ずっともやもやしていましたが、最近少しずつそのもやもやがとれてきました。どうやら、人工知能の研究には『強いAI』と『弱いAI』という二つの立場が存在するようです。

強いAIと弱いAI

 両者を簡単に説明すると、強いAIというのは人間の知能そのものをコンピュータで実現しようという立場であり、弱いAIというのは、人間のような知能をもつ必要はなく、限定された領域において問題解決や推論ができるコンピュータを作ろうとする立場です。世間ではこの強いAIと弱いAIがごちゃまぜになって議論されているため、よくわからなくなります。

 ここで整理すると、弱いAIというのはすでに開発されており、ロボット掃除機のルンバや人間のチャンピオンを破るまでに発展したチェス・将棋・囲碁人工知能はこれにあたります。一方、強いAIはまだ開発されていません。したがって、「人間のように考えるコンピュータ」はまだできていない。というわけです。そもそも人間が考えるとは何か?というところを突き詰めていくとその知能の原理すら解明されていません。なので、コンピュータに人間のような知能を持たせることは、現時点では不可能ということになります。しかし、人間の脳も平たく言えば電気回路と同じであるため、人間の知能をコンピュータで実現できないわけがないという考え方もあります。このように人間の知能の原理を解明し、それを工学的に実現しようということが強いAIの立場であり、人工知能研究の本来の目的とも言えます。

世に出回っている弱いAIについて

 これまでのところで、現在世に出回っている人工知能は、人間のような知能を持つものではないことがわかりました。それでは何をもって人工知能と呼ばれているのでしょうか?

 それを理解するために、ここで一つ例を挙げます。人間と対話するためのシステムを考えます。例えば、そのシステムには100個のボキャブラリー(返答のパターン)が用意されていて、「こんにちは」と投げかけると、「こんにちは」と返してくれる。しかし、少し高度な質問をすると、たちまち会話が成り立たなくなる。これを人工知能と言えるのか、というとほとんどの人が言えないと答えるでしょう。しかし、システムが持つボキャブラリーの数が1億個になったらどうでしょう?極めて多彩な回答ができ、ほぼ確実に会話が成り立つ状態になれば、その見方も変わってくるでしょう。(実際にiPhoneのSiriは人工知能と称されています)つまり、そのシステムが人工知能と呼ぶかどうかは、そのシステムが人間の知的なタスクをどれだけまねできているかどうかにかかっているように思えます。システムがきちんと人間が行う知的タスクをまねできていれば、そのシステムがあたかも人間のように考えているように見え、それを人工知能と呼んでいるというわけです。

 とはいえ、現在の世の中で人工知能と呼ばれているものには様々なレベルのものが混在しています。システムが人間らしく振る舞う上では、何かしらの『入力』に対して、臨機応変に『出力』が変わることが必要であり、その入力と出力を関連付けるアルゴリズムが非常に重要となります。実際にそのアルゴリズムにごく単純な制御プログラムを搭載しているだけで、マーケティング的に人工知能という言葉を積極的に使っているものもあるでしょう。一方、あとから説明する機械学習や深層学習などの極めて高度なアルゴリズムを利用し、コンピュータがビックデータをもとに自ら学習しているようなものも存在します。

現状、人工知能は人間を超えているのか。

 前述したように本当の意味での人工知能、すなわち人間のように考えるコンピュータというものはまだできていません。人間の持つ知能というものは深遠で、いまだコンピュータのはるか手の届かないところにあります。現時点で開発されている人工知能は、基本的には、決められた処理を決められたように行うことしかできず、例外に弱く、汎用性や柔軟性がありません。

 とはいうものの、一部の領域において人工知能が人間の能力を凌駕していることは認めざるを得ない事実です。2016年3月、Googleが開発した囲碁人工知能「アルファ碁」は、世界トップ級のプロ棋士を破りました。また、金融市場では、すでにコンピュータによる取引が人間を上回っています。株などの高速トレードはどんなに熟練したトレーダーでも数秒はかかりますが、これをコンピュータなら1秒の1億分の1のナノ秒スケールで行うことができるようになってきています。

 このように、現状の人工知能では汎用性がなく、行うことができるタスクは多くありませんが、一部の領域において、人間を超えつつあります。これらの技術革新は、今後の世界の発展に大きく寄与することが期待される一方で、人々の不安も煽っています。

人工知能は人間の仕事を奪うのか。

 人工知能において、社会的な懸念や負の影響についての議論も盛んに行われています。その代表的な話として、人工知能が人間の仕事を次々と奪い取っていくのではないかと心配する声があります。一部のタスクにおいて人間を上回りつつある人工知能の存在は、人間が機械に置き換えられるという想像をかきたてます。さらには、人間の仕事を奪うだけでなく、人類の安全を脅かすといったSFのような近未来に対して警鐘を鳴らす声も少なくありません。

 現在人間が行っている知的作業のうち、今後機械によって代替が可能なものが多くあるのは事実でしょう。例えば、今後さらに自然言語処理が発達すると、コールセンターのオペレータ業務は、機械によって完全に自動化されるでしょう。また、人工知能だけの話ではありませんが、ロボットにより、人間が行う肉体労働も、置き換えられるでしょう。

 ただ、私は、人工知能は人間の仕事を奪うのではなく、人間の働き方を変える。一部では置き換えられたとしても、それ以上に新しい仕事も生む。と考えます。

 こんな興味深い予測があります。「2011年度にアメリカの小学校に入学した子どもたちの65%は、大学卒業時に今は存在していない職業に就くだろう」。(米デューク大学のキャシー・デビットソン)

 この「今は存在していない職業」の多くを人工知能が生むと思います。それは、インターネットが登場したことにより世の中に多くの職業を生み出したことを思い出すと、容易に想像できます。

機械学習による回帰分析

機械学習とは何か?

 機械学習とは、膨大なデータから、何らかの計算処理によって、そのデータに潜む規則性を見つけ出し、予測や分析に用いる手法の総称です。現在の人工知能の応用は機械学習に属する技術に支えられています。

 機械学習を利用したシステムはすでに世に溢れており、最初の商業的な成功例は、Google検索エンジンです。Googleの情報検索には機械学習にもとづくアルゴリズムが利用されています。また、AmazonやNetflixは、機械学習を利用して消費者の好みにあった商品や映画などを提案しています。

人工知能は意外と簡単に使える?

 人工知能はそれ自体を研究しようとするには、かなりハードルが高いように思えます。しかし、最近では様々な人工知能にまつわるライブラリやAPIが出てきたため、利用するハードルは下がってきています。今回はPythonによる機械学習ライブラリであるscikit-learnを使ってみます。

scikit-learn: machine learning in Python — scikit-learn 0.17.1 documentation

scikit-learnで線形回帰をやってみる

 何かしらの相関関係がある2つの変数(x, y)を考えます。(ここでxは説明変数、yは目的変数などと言われます。)

 線形回帰とは、与えられたデータを直線(もしくは平面、超平面)でフィットさせる手法のことです。フィットさせるアルゴリズムはいくつかありますが、今回は最も基本的な最小二乗法を使った方法を紹介します。

 最小二乗法をかなりざっくり言うと、与えられたデータの1点1点とモデルによる計算値がどれだけずれているかを調べ、すべての点において計算値とのずれ(誤差)を2乗したものを足しあわせて、その和が一番小さくなるように近似しようという感じです。2乗にするのはプラスとマイナスの誤差が打ち消し合わないようにするためです。

 今回はあくまで、scikit-learnを触ってみるのが目的なので、データとして、自ら乱数で作成したものを用います。

 必要となるツールのインストールについては割愛します。また、すべてIPython Notebook上で行っています。

hirotsuru.hatenablog.com

 まず必要となるモジュールを読み込みます。

import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

from sklearn import datasets
from sklearn.linear_model import LinearRegression

最小二乗法を使った回帰分析には、sklearn.linear_modelのLinearRegressionを使うので、個別に読み込んでいます。 次に乱数により100個のランダムデータを作成し、散布図を描きます。

np.random.seed(0)
sample_data = datasets.make_regression(100, 1, noise=30)

plt.scatter(sample_data[0], sample_data[1])

f:id:hirotsuru314:20160527093603p:plain

このような散布図を直線でフィットしてみます。まず、LinearRegressionクラスのインスタンスを作り、lin.fit()の部分でデータを元にモデルを作っています。

lin = LinearRegression()
lin.fit(sample_data[0], sample_data[1])

では、フィットした直線を散布図上に描いてみましょう。

xr = [-2.5, 2.5]
plt.plot(xr, lin.coef_ * xr + lin.intercept_)
plt.scatter(sample_data[0], sample_data[1])

f:id:hirotsuru314:20160527093619p:plain

最後に得られたモデルの係数、切片、決定係数を表示します。ここで、決定係数とは、どれだけうまくフィットができているかを示しており、0から1の値を取ります。

print("係数: ", lin.coef_)
print("切片 : ", lin.intercept_)
print("決定係数 : ", lin.score(sample_data[0], sample_data[1]))

=>
#出力結果
係数:  [ 43.08728116]
切片 :  -2.44254548109
決定係数 :  0.647309178092



 今回はscikit-learnで非常にシンプルな回帰分析をやってみました。機械学習を触り始めるのはそんなにハードルが高くないことが分かったと思います。scikit-learnでもっと高度な分析をやってみたいという方は、英語ですが、scikit-learnのドキュメントには有用な情報がたくせん載っています。

1.1. Generalized Linear Models — scikit-learn 0.17.1 documentation

おわりに

 今回は、人工知能関連の知識のまとめと、機械学習ライブラリを用いた簡単なデータ分析をやってみました。人工知能の分野では、今まさに数十年来のブレイクスルーが起きており、今後も飛躍的な進歩が期待されています。人工知能の進歩は、既存の分野のビジネスチャンスを広げるだけでなく、未開の分野を開拓する可能性も秘めています。したがって、この分野の知識や技術を高めることは、エンジニアとしてひいてはビジネスパーソンとして競争優位に立てるのは間違いありません。これかも私が学んだことを積極的にアウトプットしていこうと思います!

hirotsuru.hatenablog.com