作って遊ぶ機械学習。

~基礎的な確率モデルから最新の機械学習技術まで~

機械学習の4つのアプローチ

おつかれさまです。今日はちょっと趣を変えて、近年のいわゆる「機械学習」という技術のアプローチをカジュアルに少しカテゴリ分けしたいと思います。

といっても、自分はアカデミックの研究者ではなく大量の論文を読み漁るということもほとんどしないので、理論的なバックグラウンドに基づいたソリッドなカテゴリ分けはできません。ここで紹介するのはあくまで、実用上の機械学習技術者から見た視点で「こんな傾向があるかなぁ」くらいの気持ちで書いたものです。 

 

<代表的な4つのアプローチ>

1、最適化(目的関数ベース)

まず始めは最適化手法をベースにした機械学習アルゴリズムです。たぶん一番例が多いんじゃないでしょうか。

ここでは、ある解きたい課題を目的関数によって定式化し、適切な最適化手法を使って解きます。伝統的な線形回帰や線形識別はもちろん、主成分分析(PCA)や非負行列因子分解(NMF)なんかもこの枠組みで解かれることが多く、ほとんどの場合で誤差関数を定義してそれを最小化するというアプローチを取ります。他にはサポートベクターマシンSVM)なんかもマージン最大化という基準にしたがって最適化を行いますね。

この種のアルゴリズムの利点としては、比較的自由に目的関数をデザインして解くことができる点が挙げられると思います。

欠点としては、ある種の複雑な課題に対してはそもそもどうやって目的関数を設定していいかわからない場合があることと、最適化に基づいているので簡単にデータに対してオーバーフィットしてしまうことです。また、予測が「どれだけ確からしいのか」といった、予測に関する不確実性・信頼性に関する情報を上手く扱えないことが多いです。

 

2、深層学習

最近流行っているあれです。一番シンプルな例は(伝統的な)ニューラルネットワークなどで、アイデアとしては、データの表現を多層構造を使って学習することにより、データの次元間にまたがった共通の特徴を高レベルの層でシェアして汎化性能を高めようというものです。画像や音声の認識タスクで性能を発揮するようです。

利点としては、概念が比較的わかりやすいこと、ある特定の課題に対して顕著な性能を発揮していることです。

欠点としては、基本的にものすごい量のデータと計算コストを使用しなければならないことと、アルゴリズムのパフォーマンス向上(モデル設計やチューニング)に系統だった手段がないことです。あと、だいたい単純な誤差関数の最小化とかを基準にするので上の方法と同様オーバーフィットしやすいです。あとは、現状あまり理論面が洗練されていないのも課題です。

 

3、機械学習ライブラリ

これもカテゴリに入れていいのか謎ですが、実際の現場ではよく使われています。Scikit-learn*1などの機械学習ライブラリを駆使して問題を解くという、あらゆる場面で比較的にスピーディーに試せる方法です。

基本的なアプローチとしては、入力データをよく眺めて、特徴量抽出や次元削減などを行い、その結果を識別器にかけるというものです。

利点としては、ややこしい数学の知識などがなくてもプログラミングさえ少しできれば誰でも始められることです。機械学習の入門として、あるいはクイックプロトタイピングとしてお勧めかもしれません。あとは、わりと洗練されたライブラリが世に出回っているので、自分でいろいろアルゴリズムを開発してバグに悩まされるという心配もあまりありません。

欠点としては、解けるタスクが非常に限られていることです。問題自体をデザインすることがほとんどできないので、最大性能もほかのアプローチと比べて限界があります。


4、ベイズ学習

すべての問題を確率モデリングと確率推論の2ステップで解くアプローチです。

基本的には、データの発生プロセスを確率分布を使って物理的・論理的に記述し(モデリング)、計算機を使ったアルゴリズムによって事後分布を計算する(推論)という流れです。上に具体的に挙げたような各アルゴリズムの多くがベイズ化できるほか、ベイジアンノンパラメトリクスと呼ばれる、ガウス過程やディリクレ混合過程などといったベイズ手法ならではのモデルもあります。

このアプローチの利点としては、基本的にはオーバーフィットをしないため*2、少量・多次元のデータでも性能が出やすいことです。 また、確率分布を組み合わせてモデルを自由にデザインできるので、幅広い課題に対してアルゴリズムを与えることができます。

欠点としては、アルゴリズムの導出に多少の数学力を要することと、厳密な計算には非常に計算コストがかかることです。

 

 

 <ベイズ学習の汎用性>

で、自分は完全なベイズ派なので、最後に今一度ベイズ学習の汎用性と、他の3手法との関係性について触れたいと思います。

 

1、ベイズ学習と最適化

ベイズ学習でも最初に挙げた最適化手法をサブルーチンとして使うことは良くあります。というのも、ある種の最適化問題は、ベイズ学習で必要となる積分の近似と等価になるからなんですね。

例えば最尤推定(最小二乗法を使った誤差関数の最小化)なんかも、実はベイズの近似推論に対して極端な仮定を置くことで導かれます*3。主成分分析、非負行列因子分解もベイズ化できるほか、サポートベクターマシンガウス過程の関係性も指摘されています*4

 

2、ベイズ学習と深層学習

ベイズ学習は汎用的なデータ解析の枠組みであるので、もちろん深層学習の多様なモデルをベイズ学習として再定式化することができます。代表的には、ガウス過程を使ったディープなモデル*5があるほか、変分ベイズを使ったオートエンコーダの実装*6もあります。あとは畳み込みニューラルネットワーク(CNN)をベイズの枠組みで焼き直して変分近似で解くといった手法とかもあります*7

さらに,ユニット数が無限のニューラルネットワークガウス過程と等価になります.

深層学習はガウス過程 - 作って遊ぶ機械学習。

 

3、ベイズ学習とライブラリ

ベイズ学習の1つの欠点は、近似推論手法の開発に非常に数学力と手間がかかることです。この手間を省いてくれるものとして、種々の統計確率言語があります。代表的なものにはStan*8があり、モデルの記述さえすればあとは勝手に近似推論アルゴリズムMCMCや変分推論)を実行してくれます。残念ながら、複雑なモデルに対する推論性能は現在のところあまりよろしくないようです。

他にはベイズの枠組みで作られたアルゴリズムがそのままライブラリ化されている場合ももちろんあります。最近人気なのはガウス過程を使ったベイズ的最適化(Bayesian Optimization)で、深層学習のチューニングなんかに使われているようです。

 

- - -

さて、ちょっとした落書きのような記事になってしまいましたが、少しでもたくさんある機械学習技術のアプローチとその関係性がクリアになっていただければ幸いです。

*1:Scikit-learn: http://scikit-learn.org/stable/

*2:PRMLとかではオーバーフィットしないと言い切ってますが、実際の多くの場面では近似アルゴリズムを使うので、近似性能が悪ければオーバーフィットもアンダーフィットも起こり得ます。

*3:最尤推定、MAP推定、ベイズ推論 - 作って遊ぶ機械学習。

*4:Gaussian Process for Machine Learning: http://www.gaussianprocess.org/gpml/

*5:Deep Gaussian Process: http://www.jmlr.org/proceedings/papers/v31/damianou13a.pdf

*6:Auto enoding variational Bayes: https://arxiv.org/abs/1312.6114

*7:Bayesian CNN: https://arxiv.org/abs/1506.02158

*8:Stan: http://mc-stan.org/