機械学習と深層学習 ―C言語によるシミュレーション―

機械学習と深層学習 ―C言語によるシミュレーション―」小高知宏 (著)。
年末年始の休暇に読もうと思って買っておいた本。一応休み中に読了しましたので、備忘録として。
AI (人工知能) がバズワードになっている昨今ですが、35年以上前に当時の通産省が ICOT (新世代コンピュータ開発機構) を設立して、莫大な予算*1を投じて第五世代コンピュータプロジェクトが行われたことを知る人は今はもうあまりいないかも知れません。当時、若かりし頃の私はこのプロジェクトに携わる機会があり、人工知能自然言語処理、並列推論マシンなどの研究開発をしていたことがあります。VAX11 や UNIXProlog を学んだ後に、PSI (Personal Sequential Interface Machine) という逐次推論マシンで動作する SIMPOS (SIM Programming and Operating System) というOSでESPというプログラミング言語を学びました。結局その言語知識は後にあまり役に立つことはなかったのですが、オブジェクト指向をこのときに学んだことで、以降のオブジェクト指向プログラミングを学習するときに大いに助けになったことは事実です。そしてその後、並列推論マシン PIM (Parallel Interface Machine) で動作する PIMOS という OS で KL1 という並列プログラミングを学び、知識ベース/事例ベースを活用した推論エンジンと並列処理などの研究も行っていました。
世間的には成功とは言えなかったかも知れませんが、ここではその点について言及することは止めておきます。
前置きが長くなりましたが、そのAIの中でもここ数年注目を浴びているのが機械学習 (Machine Learning) と深層学習 (Deep Learning) なるもので、それがどういったものなのか知らないのは良くないだろうということで先ず手にしたのが本書です。この手の本は沢山出版されているのでどれを読めばよいのか迷いますが、内容があまり薄っぺらそうなものは避けたいと思ったことと、プログラム例で紹介されているものが珍しくC言語で書かれていることがポイントでした。この分野では Python が圧倒的に多いのですが、C言語というのが懐かしさを覚えました。C言語のコードを読んだり書いたりすること自体があまりにも久しぶりすぎて、基本的なことも忘れており、思い出しながらの勉強となりました。サンプルプログラムはすべてダウンロードできるので楽ちんです。
実行環境はリッチな Visual Studio ではなくあえてシンプルな MinGW をチョイス。MinGW (Minimalist GNU for Windows) は http://www.mingw.org/ からダウンロードできます。GNU とか gcc とか懐かしすぎるw
前半は機械学習の基礎として、演繹的学習と帰納的学習を学べます。この辺の専門書は実は若いころ前述のプロジェクトで論文を書くために読んだことがあります。内容は殆ど覚えていませんけど... そして、教師あり学習から強化学習と進みます。Q-learning (強化学習の具体的方法) で適切な Q-value を獲得することが学習の目標などなど。Q値更新の式は、
Q(s_{t}, a_{t})=Q(s_{t}, a_{t})+\alpha(r+\gamma maxQ(s_{t}+1, a_{t}+1)-Q(s_{t}, a_{t}))
こういった数式をはてなダイアリーで記述する場合は、mimeTeX の機能を利用するので、このブログを書いている途中で mimeTeX の勉強に脱線しちゃいました...
群知能と進化的手法では、粒子群最適化法や蟻コロニー最適化法を学びます。蟻ってすごいなぁ。ここでも強化学習のe-greedy方が採り入れられます。もうほぼ数学そのもの。だんだんと頭痛が... (笑)
進化的手法では遺伝的アルゴリズム (Genetic Algorithm) を学べる。情報を染色体として表現するなど、基本アルゴリズムそのものの難しさもさることながら表現が新鮮。
そしてニューラルネット。これもよく耳にしますがよくわかっていませんでした。人口ニューロンの構成を表現すると、次のようになるらしい。
\large\displaystyle       u=\sum_{i}x_{i}w_{i}-v
z=f(u)
シグモイド関数 f(u)=\frac{1}{1+e^{-u}} は、バックプロバゲーションを利用する場合の伝達関数としてよく用いられます。階層型ニューラルネット、階層型ニューラルネットで広く用いられるバックプロバゲーション、バックプロバゲーションによるニューラルネットの学習あたりから難しくなって頭痛がしてきたw
そして深層学習では、大規模ニューラルネットの問題と畳み込みニューラルネットについて説明されています。畳み込みニューラルネットDeep Learning でも割とポピュラーで画素認識の深層学習として良い方法として知られています。
最後の方では、深層学習の少し実用的な例も挙げられ、バックプロバゲーションの計算手順(出力層の人口ニューロンが複数個の場合)が開設されています。ううむ頭痛が激しくなってきたw
本書は個人的に慣れ親しんだC言語のサンプルがあったので、割と救われた気がしますがもろに数学なので、私にとっては決して簡単な内容ではありません。でもこれにめげず次は Python で書かれたサンプルコードで学べる Deep Learning の本を読もうと思います。

*1:570億円だそうです...