子どもに「プログラミングと人工知能の違いって何?」と聞かれたので、説明。
鶴亀算
鶴亀算とは、「鶴と亀がそれぞれ何匹かいます。頭が h 個、足が f 本だとする。この時、鶴が x 匹、亀が y 匹か答えよ。」という問題。
この問題をどうやって解くか?
(a)普通のプログラミング
この問題であれば、
h = x + y ; f = 2*x + 4*y ;
の関係が成り立つけど、コンピュータは自動的に連立方程式を解いてくれるわけではない。このため、問題から
h = x + y ; // アルゴリズムを考える作業... f/2 = x + 2*y ; よって y = f/2 - h ; // 解き方 = アルゴリズム x = 2*h - f/2 ;
こういう問題を解く考え方・手順をアルゴリズムという。
これを実際のコンピュータで動かすために、例えば C 言語で書いてみる。
#include <stdio.h> void main() { double h , f , x , y ; scanf( "%lf%lf" , &h , &f ) ; // 頭と足の数を入力 x = 2 * h - f / 2 ; y = f / 2 - h ; printf( "鶴=%lf\n" , x ) ; printf( "亀=%lf\n" , y ) ; }
このように、アルゴリズムを実際のプログラム言語で書くことが、プログラミング(コーディング)。プログラマーは、アルゴリズムを考えプログラムを作る人。あえてプログラマの仕事を分類するなら、アルゴリズムをや、どうプログラムを動かすのか設計するのがシステムエンジニア、その設計に沿ってプログラムを書くのがコーダ。
人工知能
最近は、碁の世界で、プロ棋士を人工知能のコンピュータが勝ったと、ニュースになって「人工知能」という言葉がもてはやされているけど、20年ほど前に研究されていた人工知能と、最近のディープラーニングとか機械学習といったキーワードで説明されている「人工知能」はまるっきり違うものである。例え話で言うなら、昔の人工知能は「論理的思考の左脳」を作ることを目指していた。一方、最近の機械学習の人工知能は「直観的思考の右脳」とみなすことができる。
(b)論理的思考の人工知能(左脳的人工知能)
鶴亀算でいうならば、問題から以下の方程式が与えられたら
h = x + y ; f = 2*x + 4*y ;
既知変数が、h , f で、未知変数が x , y だから、連立方程式を自動的に解いて、x , y を答えてくれるようなシステム。
(c)直観的思考の人工知能(右脳的人工知能)
最近の機械学習とかを、極端に簡単な表現をすると…
脳の神経細胞(ニューロン)の動きを真似する神経細胞網(ニューラルネットワーク)を作っておき、
h=2,f=6,x=1,y=2...間違い h=2,f=6,x=1,y=1...正解 h=3,f=8,x=1,y=1...間違い h=3,f=8,x=2,y=1...正解 :
というような、正解や間違いを大量に与えることで、x,yの関係を覚えていくのが機械学習。連立方程式を解く訳ではないので、学習が不十分だと、ほとんど正しい答えを答えるけど、たまに間違えるという状態の時もある。
最近の碁のシステムは、これらの組み合わせ
最近の碁などでの人工知能の活躍は、これらのプログラミングがうまく組み合わせることができるようになったから。例えば、石を打つ時に、石の配置を管理するのが(a)普通のプログラミング。石を打つ時に「ここはもっと深く先読みが必要かな?」、「ここは石の配置からいい手かな?」といった判断(静的評価)に(c)機械学習による人工知能を使う。さらに先読みすべきかの点数が高いものを選んで、その先の手を打った場合の石の配置の点数を集計して、先読みした場合の評価(動的評価)を行うのが、(b)論理的思考の人工知能のテクニック。