はじめに
分類問題の基本
分類問題の基本はデータがプロットされた空間上に境界面を配置することです。
下記の図のように、2種類のデータを分類する際の境界の配置の仕方は一意に定まりません。
このどちらが良い配置の仕方であるのかも、通常は決定できません。
そのため、境界面を決定するための様々な手法が考案されており、よく知るサポートベクターマシンやパーセプトロンなどが存在するというわけです。
上記の例のように、「2次元平面に対する分類境界は1次元の直線」になり、「3次元空間に対する分類境界は2次元の平面」となります。このような分類はめったにありませんが「1次元直線に対する分類境界は0次元の点」ということになります。
一般に「次元空間の分類境界は次元の超平面」というのを覚えておきましょう。超平面というのは、実際には我々の考える平面ではないよという程度の話です。
分類における困難:線形分離不可能
上記の例の画像は、2次元空間上に直線を引くことで分類の境界を配置しています。
この手の問題を線形分離問題と言い、最も単純かつ基本となる問題となります。
データが3次元であれば、境界は2次元平面となり、4次元であれば3次元超平面となります。
一般に次元のデータに対して次元の境界を配置することとなります。
しかし、通常手に入るデータは線形分離ができない場合のほうが多いです。
これが分類問題における一つ目の困難です。
例えば以下のようなデータの配置の場合には、線形分離はできません。
このような問題に対しては、分離の境界を曲線にすることで解決できます。
境界が曲がることを許せば、上記の図も簡単に分類が可能でしょう。
このように曲がった境界も考えることを許せば、
「次元空間の分類境界は次元の超曲面」
ということが出来ます。
非線形な分類問題
曲線、曲面によって境界を定める=空間を捻じ曲げて線形な境界を定める
線形分離ができない問題でも、曲線を用いることで分類ができそうなことが分かりました。実はこの事と等価な考え方があります。そして、その新たな考え方の方が、機械学習を学ぶ上では圧倒的に重要です。それはどのようなことかというと
データがプロットされる空間を捻じ曲げてしまい、捻じ曲げた空間で線形分離する
ということです。
以下の画像で雰囲気を掴んでください。
簡単な例を見ましょう。
1次元に2種類のデータがあります。これは、線上に点を置くことで分類することができません。
そこで、1次元を捻じ曲げて以下のように2次元平面に埋め込んであげましょう。
2次元に埋め込んだことによって、1次元の直線にて分類が可能になりました。
元の空間(1次元)に戻ってくると、2箇所に境界が現れます。
更に実用的な例を見ましょう。
線形分離(直線で分離できない)ができないデータがあります。
通常ならば曲線(例えば円)で境界を定めるところです。
この2次元平面を曲げることを考えましょう。
具体的には青いプロットが谷底になるように上記の平面を曲面にするのです。
曲面は3次元空間に埋め込まれます。
その後、青い点の集団と散らばった赤い点の間に、1枚の平面を差し込んで境界を作れば分離が出来てしまいます。この境界は、元の2次元平面に対しては円状の曲線として現れることとなるでしょう。
まとめると次元の空間に次元の超曲面の境界を設けることは、次元の空間に次元の超平面の境界を設けることで代用できるということです。
素朴な疑問とその回答
ここで疑問に思った方もいるかもしれません。
『確かに「次元の空間に次元の超曲面の境界を設けることは、次元の空間に次元の超平面の境界を設けることで代用できる」のは理解できたが、メリットがわからない』
というところでしょう。なぜなら、上記の代用手続きを行うためには、次元の空間を曲げて次元の空間に埋め込まなければならないからです。
そうすると次元の空間に次元の曲面を引くことと難しさがあまり変わらないように思ってしまいます。
「曲面を考えて分離すること」と「空間を曲げて線形分離すること」の違いは何でしょうか。
次元に自由度がある
まず回答の1つとして、分離問題は基本的に「次元の空間に次元の超曲面の境界を設けること」です。かならず空間に対して1つ下の次元で考えなければなりません。
これを「次元の空間に次元の超平面の境界を設けることで代用する」ということを述べましたが、実は「次元の空間に次元の超平面の境界を設けることで代用する」という方法でも構わないのです。
以下の分離が出来ない1次元データに対して、1次元の棒をぐにゃぐにゃに曲げて3次元に埋め込んでみてください。そして、その3次元空間に2次元平面を設けてデータを分離することだってできるはずです。
つまり、本当のところは、適当な次元の空間に埋め込んでしまってそれより1つ次元の小さな超平面で分離するという問題に置き換えられるのです。
まとめると次元の空間に次元の超曲面の境界を設けることは、次元の空間に次元の超平面の境界を設けることで代用できるということです。
分離できる可能性が上がる
そもそも線形分離できなかった状況ですら、次元を上げることで分離ができるのです。これは驚異的だと感じるでしょう。
そして当然、次元を上げれば上げるほど分離できる可能性は上がります。
次元を上げれば上げるほど、次元を上げた空間では線形分離だとしても、元の空間にとって非常に複雑な境界を設けることができます。次元を上げると、まるで境界を好きな場所に設けることができるかのようです。
ただし、どのような曲げ方をすれば上手く高い次元で良い形になってくれるかは定かではありません。しかし、それでも可能性を上げてくれるのは非常に助かるところです。
うまい曲げ方を見つける
学習とは空間の曲げ方を学ぶこと
データを分離するために、データの空間を捻じ曲げて高次元空間での線形分離問題に変形するということを述べてきました。しかし、どのようにデータの空間を捻じ曲げてあげればいいのか、それは誰にもわからないのです。通常は、データに対して分離境界を決めることを分類問題での学習と言います。
しかし実は、データを線形分離できるようにグニャグニャに曲げて高次元に落とすことこそが分類問題での学習なのです。
線形分離可能な状況になれば境界を決めるのは簡単です。適当に引いても誰でも解けるのです。引くための目安やルールさえ決めてしまえば、境界は簡単に求めることができます。
真の学習の役割は、線形分離ができないような状況で、線形分離ができるような表現を獲得することなのです。
意外にもこのことに注目が集まるようになったのは「ディープラーニング」が出始めてからでした。しかし、この考えは古典的な手法のあらゆるシーンで見られます。
ニューラルネットワーク
初期のニューラルネットワークでは、まさに上記の考えのパラダイムシフトを垣間見ることができます。
ニューラルネット最初期
ニューラルネットの最初期は、入力層と中間層と出力層だけという単純な構成でした。しかも学習を行うのは中間層と出力層の間のみです。
入力層から中間層へのユニット数を増加させることで、データの空間の次元を上げるということを実現しました。このときの次元や、どのような変換をするべきかは議論されず、「適当な」処理が施されていました。
下記の画像は3次元のデータを4次元に拡張し、2クラス分類するニューラルネットです。
そして、中間層と出力層の間の重みを学習することで、分類を行おうという発想でした。
しかしこれだけでも、単なるパーセプトロンでは線形分離のみしか対応できなかったことを解決しました。次元を上げることが、曲線による分離を達成したという例になります。
また、中間層の次元を上げれば上げるほど、分類性能が高くなるという傾向も見られるようになりました。
ニューラルネット中期
ニューラルネットは後に「誤差逆伝搬法」により全ての結合重みを学習可能になります。これは言わば「データをどのように捻じ曲げるべきか」という部分すらも学習できるようになったのです。
本来この段階でそれなりに注目を浴びてもおかしくなかった技術です。すでに多層化するという発想も生まれていました(なぜなら誤差逆伝搬は何層でも適応できるため)。しかし、計算機の性能が追いついておらず、実用化には至りませんでした。
ニューラルネット現在
計算機の性能が爆発的に上がり、現在よく知られているディープラーニングが可能となりました。実際には多層化すると誤差逆伝搬が上手くいかないという問題もあったのですが、事前学習による重みの初期化や、活性化関数の変更により対応できることが知られ、ニューラルネット側の問題もかなり解決されました。
この部分はブログの至るところで説明しているので割愛します。
過学習
高次元へデータを埋め込むことで複雑な分類が可能となったのは良いのですが、手元のデータを分類することに特化しすぎたあまり、未知のデータに対する予測ができなくなるのを「過学習」と言います。
ニューラルネットを使う場合は別途過学習の対策が必要であり、そのために事前に調節しなければならない設計変数(ハイパーパラメータ)が多いことも問題の1つとして挙げられます。
サポートベクターマシン
ニューラルネットが誤差逆伝搬や計算機の困難にぶつかっている間、機械学習で成果を上げたのがサポートベクターマシンです。サポートベクターマシン自体は、線形分離をするための線の引き方を上手に決めるものです(最大マージン分類器とも言う)。
流行った理由として、まず、この最大マージン分類はニューラルネットに比べ非常に汎化性能が高かったのです。最大マージンを取ることは、機械学習ではおなじみとなっている「L2正則化」と同等の効果を持っていました。
更に、今回の話にあるように「データを多次元空間に埋め込み、線形分離する」ということをサポートベクターマシンは容易に実現することができました。その方法はカーネル法として脚光を浴び、カーネル法自体は様々な場所で現在も使われています(最大マージンを考えること以上に、カーネル法のインパクトが大きい。カーネル法が使える形であったことが幸運だった)。
カーネル法は、一切高次元へ埋め込みをしていることを利用者に意識させません。高次元の計算を完全に隠蔽した状態で同等の効果を得られてしまうのです。その様から、カーネル法を使って高次元空間への埋め込みを実現することを「カーネルトリック」などと呼んだりします。
学習においては良い高次元への埋め込みを見つけることが大事です。なぜならそれこそが、線形分離に持ち込むためのキーであるからです。ニューラルネットは次元を適当に上げ、線形分離するところから始まり、更に高次元への変換までも学習に含むことを可能にしました。
サポートベクターマシンは、事実上「無限次元」にデータを埋め込むことで高い性能を発揮できました。無限次元に埋め込んでしまえば、うまい線形分離の方法を見つけられる可能性は非常に高いです。そんなことをすれば過学習が恐ろしいところですが、最大マージンの考えが正則化を含んでいたために、これが絶妙に上手く働いたというわけです。
実際には無限次元でなくとも高次元であれば上手く働きます。そのような変換に心当たりがあればそれを使ったほうが良いです。「ガウシアンカーネル」がカーネル法で好まれるのは、無限次元への変換を実現しており、かつ「再生性」という良い性質を持っているためです。
ガウシアンカーネルが実現している高次元は「再生核ヒルベルト空間」と呼ばれるものの一種です。この言葉を見たら、カーネル法にとって都合の良い(高次元)空間なんだと考えればいいでしょう。
まとめ
学習は線形分離を可能とする、上手い高次元への埋め込みを獲得すること。
高次元へ埋め込むと線形分離がしやすくなる。
ニューラルネットは適当な次元に上げ、更に高次元への変換までも学習に含めることで、分離の性能を向上させた。一方サポートベクターマシンは無限次元への埋め込みを実現し、高い汎化性能で実用化に至った。
ディープラーニングでは更に中間層を増やし、様々な構成にすることで、単に分離ができるだけでなく、意味のあるデータの埋め込み方を見つけることが可能となっています。
ディープラーニングの手法については以下の記事を参考に
サポートベクターマシンについて数式ベースで理解したい方