catalinaの備忘録

ソフトウェアやハードウェアの備忘録。後で逆引きできるように。

機械学習の基本的な概念と歴史を追ってみた

世間ではコンピュータに囲碁、将棋、チェスなどをやらせて人間を破ったなど思考する機械の話題が賑やかですね。
技術的なキーワードでは機械学習やディープラーニングになるのですが、詳しくいことがわからないので色々と調べてみました。
ディープラーニングの基礎となる機械学習について調べてみたので、自分の理解と考えを整理するためにもブログ記事として書いてみようと思います。なのでこのエントリには見落としや勘違いなど、間違いが含まれていると思います。
なお文献によって用語が異なっていたりするので、このブログでも統一がとれていないかもしれません。

着目点

「人間の仕事が機械に取って代わられる」という記事が週刊誌や新聞に掲載されていたりします。本当にそうなのでしょうか?
こうのネタは定期的に出てきていますが、結局のところ機械に置き換えられることによって人間の仕事の質が変化してきただけだと私は思っています。
とはいえ、最近のAI,ディープラーニングなどの技術の中身を知らないまま歴史からの推論だけで決めつけてしまっていてはちょっと勿体ないですし、エンジニアという視点で自分が置かれている環境に影響を与えうる要素に対して意見をもつなら、何かしらの技術的根拠をもとに結論を出したいところです。
今回調べた内容だけでは最近もてはやされているディープラーニングまでたどり着けなかったので、一通り調べてみてそのうえで自分なりの答えを出したいと思います。

そもそも学習とは

まず人間についての学習とは何かという点について、調べてみました。
人間工学などの書籍をあたってみると大きな分類として

  • 自律的学習
  • 帰納的学習
  • 演繹的学習
  • 知識学習

などがあります。

これら学習の概念を整理すると「学習とは"問題解決のために用いる自己の能力"を向上させる手段」
といえます。

ここから安直に考えると「機械学習とは上記の学習を機械で行うこと」と一言になります。しかしそれだけでは私自身の何の学習にもなっていません。
機械学習の歴史をたどって、機械(コンピュータ)に学習させるという点を掘り下げて考えてみます。

機械学習の歴史

図書館で本を借りて色々と調べてみました。
いくつかの文献をあたってみたところ、必ず出てくる有名なものがあるのでここに並べてみます。

それぞれの概要を理解した範囲で簡単に整理してみます

神経回路網アプローチと記号論アプローチ

神経回路網アプローチとは、最近流行のディープラーニングもそうですが、神経網モデルをコンピュータ上で表現し、その神経網に学習をさせようというアプローチです。
対する記号論アプローチは、述語表現やルールとして記述されたモデルによって学習をさせようというアプローチです。
またこれとは別にPAC学習というアプローチもあるようですが、今回の資料だけでは詳細情報は得られませんでした。

神経回路網アプローチ

パーセプトロンニューラルネットワークそしてバックプロパゲーション

パーセプトロンは一つの神経細胞を表します。パーセプトロン複数の入力を受け、複数の出力を行います。
パーセプトロンの入力は入力値に対して重みを掛け、入力の合計値にバイアス値が足されます。これを活性化関数(古くからの実装ではシグモイド関数)に受け渡すことで出力が決定されます。
ここで学習結果は重みの値となります。
このパーセプトロンを組み合わせたものがニューラルネットワーク(NN)と呼ばれるものです。
NNには2種類あって、階層型と相互結合型(再帰型)に大別されます。
現在広く使われているものは階層型NNのようです。
階層型では層の呼び方としてN層ニューラルネットワークなどと呼ばれます。
このとき、入力層、中間層(隠れ層)、出力層の3つの呼び方で入出力が区別されます。
入力にも出力にもあたらない層が隠れ層です。

さて、パーセプトロンに話を戻して、
先にあげたアルゴリズムのままでは何がすごいのかイマイチわからないので、次のような例を考えます。

  1. 2入力1出力のパーセプトロンで、2入力の重みをそれぞれ1とし、バイアスを1.5とした場合
  2. 2入力1出力のパーセプトロンで、2入力の重みをそれぞれ1とし、バイアスを0.5とした場合
  3. 1入力1出力のパーセプトロンで、入力の重みを-1, バイアスを-0.5とした場合

手で計算して真理値表を書くと見覚えのある表になるのですが、このパーセプトロンはそれぞれ、AND,OR,NOTの論理回路になります。
これは重み値とバイアス値がある値をとるとき、基本論理回路(ゲート)として振る舞うことができるということを意味します。
すなわちコンピュータが学習によってコンピュータの基本素子ともいえる論理回路を構成できてしまうということです。
あとは組み合わせ次第でどんな回路も作れますし、加算器や乗算器、シフト回路、果ては記憶素子としてのFF(フリップフロップ)やラッチを作ることだってできそうです。
機械学習の結果で論理回路が構成されるなら、機械学習の結果次第で何でもできる!!
なんとなく機械学習の神経網アプローチってすごい気がしてきました。

機械学習としてニューラルネットワークを利用するためには、学習の結果をパーセプトロンに反映する必要があります。
このために教師アリ学習として扱ったとき、「NNから得られた出力信号」と「期待する結果」とを比較することで誤差を知ることができます。
この誤差をもとに重みを調整すればよいのですが、この計算方法はローゼンブラット式とヘブの学習と呼ばれる式で違っていました。
学習結果の反映のためのパラメータ調整の話になってくると思うので、ここでは複数の方式があるということだけ記しておくことに留めます。

バックプロパゲーションですが、乱暴に概要だけを述べるならば、「学習結果を出力パーセプトロンから入力方向へどんどん遡っていき、中間層(入力でも出力でもない層。隠れ層とも呼ばれる)の誤差を小さくしていく(学習を行う)こと。」といえます。
このバックプロパゲーションがどうやら革命的なことらしく、この技術が登場するまではニューラルネットワークの研究の冬の時代と呼ばれていたらしい。
この技術が登場したおかげで、パーセプトロンを多層にできるようになったとのことです。

NNの実際の応用事例ですが、たとえば画像からのパターン認識などに利用できるようです。
簡単な例では16x16ピクセルのグレースケール画像に示されるアルファベットの認識。
この例では入力は16x16=256次元のベクトルとし、入力層に割り付けます(入力層は256個のパーセプトロン)。
出力層は26種類のアルファベットのいずれか1つなので出力層の26個のパーセプトロンのうち最もよく反応したものを識別結果とする。
などがあります。

私の中でもまだ理解が追い付いていない&疑問が残ったままの要素として、次の2つがあります。

  • NNでは過学習が問題となったようだが、これに対するフォローはどうするのだろう
  • 隠れ層の数はどのようにして決めるのが適切なのだろう

まだ概論しか触っていないので、これらの問題はもっと深い部分で解決しているのかもしれません。

ニューラルネットワークに対する個人的見解

NNは今後もどんどんと進化する可能性はありそうです。
相互結合型(再帰型)のほうも興味深いのですが、今回あたってみた資料では情報が古いせいか相互結合型NNの情報が少ない状態でした。相互結合型NNは結果の収束の判別方法などまだ理解しきれていない点が多いですが、個人的にはすごく興味深い話だと思います。
NNをゼロから実装するのは手間がかかりすぎるので簡単に実験できないかと調べてみたところ、例えばopencvのmlモジュールに含まれていますし、R言語でもNNetパッケージが提供されています。
opencvのmlモジュールでは多層NNが実現できますが、学習結果を可視化する手間がちょっとかかりそうなので、試してはいません。
R言語のNNetパッケージは3層(隠れ層が1個のみ)のNNしか使えないのがちょっと残念ですが、学習結果のNNを可視化するパッケージが某大学の某教授が公開してくれていますので、動作概念を確認するのに利用できました。
R言語での多層NNパッケージも調べればあるのかもしれませんが、それはまたの機会ということで。
NNを試してみて思ったことは、動作検証の方法が統計的手法になりがちなので、いままでやってこなかった統計的手法についても調べていく必要がありそうです。

記号論的アプローチ

ウィンストンのアーチ

「積み木のパーツの中から3つだけ使ってアーチを作れと」言われれば、ブログ書いたりネット見たりしている我々ならすぐにできるものですね。
技術の無駄遣いをする人ならもっととんでもないものをつくってくれるかもしれませんが。
アーチの回答ですが、人間がやるとすれば次のような解が導き出されます

  1. 柱を2個立てる
  2. 柱の上に何かを1個載せる

これを使って「コンピュータにアーチの概念を学習させる」という論文が「ウィンストンのアーチの概念の学習」と呼ばれるものです。

概念は非常に分かりやすく直観的なものでした。
直方体や円柱、三角などの積み木を意味ネットワークと呼ばれるグラフで表現し、ノードを積み木の属性、ノード間のつながりで積み木の関係を表現します。
このグラフがアーチの概念を表すまで正の例、負の例を与えて学習をさせるというものです。
興味深いのは、神経網的アプローチで神経細胞の出力を数値で表すのに対し、こちらはmust,notなどの論理式で表すということでした。
負の例の中でもニアミスは概念を学習するうえで非常に重要な位置をしめているとのこと。
上記の人間がやる例でも見落としになっていますが「柱同士がくっついていてはダメ」という概念を学習によって得られるとしています。
柱同士がくっついている負の例(touchというノード間のつながりをデータとして与える)を与え、帰納的に学習させるというものでした。

ウィンストンのアーチ自体は帰納的にコンピュータに概念を学習させるという良い例だと思います。
この方法論をそのまま再現しても意味はありませんが、論理的な学習手順のアプローチの基本原理として非常に参考になる例でした。
問題点もわかっていて、ニアミスは良い学習になるが、学習済みモデルとの差が1要素のみであることなど制約は大きいです。
この理論を発展させたものが決定木であり、決定木を弱識別機として多数組み合わせたものがランダムフォレストです。

決定木

決定木は与えられた訓練事例から、事例の正負を判断するための木を使ったアルゴリズムです。
アルゴリズムとしては

  • ハントの Concept Learning system
  • クィンランの ID3
  • C4.5

こちらのアルゴリズム帰納的に概念を学習させるモデルで、画像処理ライブラリなどに含まれていたりします。

決定木は与えられた事例集から、それを識別するための概念による分類を行うために利用できます。
例えば、ある有名キャラクターを概念的に識別することを考えると

  • 性別(o女性,x男性)
  • 髪の色(o金,xピンク,x緑)
  • 髪の長さ(oロング,xショート,xなし)
  • 肌の色(o肌色,x茶褐色)

などと識別するための木を作ることができます。これが概念の木(=決定木)そのものになります。
先のキャラクターの例で考えたとき、あるキャラクターそのものを言い当てられるのは当然として、そのキャラクターと同様の特徴をもつ母集団全体の性質を決定木は示していることになります(女性、金髪、ロング、肌色)。
また、決定木の高速化に大きく寄与していると考えられるアルゴリズムとして「エントロピーや情報獲得率を考慮した木の構築」が挙げられます。
これは特徴を言い当てて答えを絞り込むために、「何を優先的にチェックすべきか」を学習によって獲得していることに相当します。
エントロピーとその正規化について考えると、学習のデータセットにデータベースでいう主キーに相当するものが含まれていたりすると、その主キーのみで全てが決定できるため、情報量が最大となってしまい、期待した決定木が生成できません。
言葉でいうと「場合の数」が多い概念(髪の色を500種類に分類した など)が優先されてしまうということですね。
(これは学習データセットに対する識別率は100%だが、汎用性は皆無な木が生成されてしまうことになります。)
そのため、エントロピーの正規化した情報獲得率とも呼ばれる方法が利用されるようです。

ファジィ理論

バブル崩壊と叫ばれていたころ、家電製品でどこもかしこもファジィファジィと謳っていたのを記憶しています。
父に聞くと「ふつうの機械はON/OFFしかできないけど、ファジィなら「いい塩梅」に調整してくれるんだよ」と答えてくれたのを覚えています。
今回図書館で借りた本だけでは詳しい情報は得られませんでしたが、父の教えてくれた答えは「だいたい合っている」気がします。

ファジィ理論ではこのような「だいたい合っている」が示す範囲を「ファジィ集合」と「メンバシップ関数」で特性づけた集合で表すそうです。
メンバシップ関数がその集合に属す度合を示します。
ファジィ集合は集合演算が定義されていますが、一般的に呼ばれる集合(クリスプ集合)とは若干異なるものです。

今回あたった資料では概念だけしか紹介されていませんでしたので、概念イメージのみに留めます。
私が理解した範囲でのファジィ制御の概念として、
あるアナログ入力値に対して上記の「ON/OFFしかできない」と「いい塩梅」の制御を行ったときの概念イメージを表現したとき

  • ON/OFFのみでは、制御範囲は理想的なステップ応答のような矩形になる
  • いい塩梅では、目標値を中央とした分布(メンバシップ関数で変わる)に属するファジィ集合に応じた制御

となりそうです。
実際の家電制御では計算量が増えてしまう分布からの計算ではなく三角形近似などで十分であるケースがほとんどのようです。

ファジィ理論ニューラルネットワーク

人工知能の概論と歴史を駆け足で追ってみましたが、ファジィ理論ニューラルネットワークを組み合わせることでもっと効率的な学習が行えるかもしれませんね。
と思ってネットで調べてみたらありました。ファジィ・ニューラルネットワークというらしいです。まんまですね。

感想・今後の展望

今まで理屈を知らなかったものを知るということは非常に楽しいものです。
また、新しい知識を得てもまたわからないことが出てくるのでそれはそれで楽しいものです。
最近話題の機械学習はもっぱらニューラルネットワークが基礎的技術となっていますが、試しにR言語でnnetパッケージ動かしてみたところ、結果がわかりにくすぎる状態でした。(学習結果のネットワークを見てもそれが期待する結果なのかどうか判断できない)
学習結果の尤もらしさを人間が客観的かつ迅速に判断する仕組みづくりがどこかで必要なんじゃないかなぁと思います。
それがいわゆる統計的アプローチにつながっていくのだろうと予想しています。
神経回路網的アプローチに対する記号論的アプローチでは述語表現や概念グラフが学習結果として現れるので、学習結果を人間が確認するのも簡単そうです。
しかしながら、今回は単純な例しか考えませんでしたが、複雑な学習になってくると学習結果の確認すること自体が現実的ではない巨大な概念グラフになってしまうでしょう。
色々と調べて考えてみた結果、ビッグデータデータマイニングと騒がれたときと類似した問題解決手法とそれぞれの課題が見えてきました。
また、根底にある考え方として2種類(記号アプローチと神経アプローチ)のアプローチがありましたが、それぞれアプローチは異なるものの、どこかで一本の糸につながりそうでつながらない状態です。
まだ考えの整理が追い付いていない部分が多々ありますが、自分なりに考えてみて、色々やってみたいと思います。

今回はアルゴリズム機械学習人工知能の仕組みと歴史を中心に調べましたが、次回は少し趣向を変えて統計的アプローチ周りを見てみたいと思います。
具体的には統計的決定論と呼ばれるものですね。ベイズとかマルコフとか。