機械学習は統計学的な手法から発展してきたこともあり、ベイズの定理による確率論的な定式化が一般的である。しかし、最近流行りのディープラーニングなどを理解しようと思うと、決定論的な立場から定式化しておくほうがわかりやすいと思われる。
僕はこのように理解しているという感想記事です。わかりやすいかはわかりませんが、ざっくりはわかると思います。
教師あり学習の定式化
教師学習とは : 関数に対して、 : 学習データ上の値が与えられた時、
: 関数族(モデル)と : コスト関数を選び、
コスト関数の総和
を最小化(*アルゴリズム)し、かつ任意のテストデータに対しても、
が最小となる(*汎化性)ような、 を選ぶことである。
と定式化してみる。これにより、なにがヒューリスティックに選ぶべきもので、なにがアルゴリズムなどで行うものなのかが明確になり、どこの議論をしているのかがわかりやすくなると思う。
回帰と分類
の値域がの有限部分集合であるとき分類と呼ぶ。それ以外を回帰と呼ぶ。
としておいたほうがわかりやすそう。Wikipediaには値域が連続値って書いてあるけど、階段関数のような非連続な関数に対しても機械学習は行われるはずで、それは分類とは呼ばないはずなので、このように定義しておくのが無難だと思う。
モデルについて
モデルの種類はさまざまである。モデル選びはヒューリスティックであり、学習データや関数によってここを上手く選ぶことが重要である。
モデルとして、線形写像を選べば、線形回帰と呼ばれたり、パーセプトロン(線形での分類)と呼ばれたりする。線形なので、線型写像の近似か、超平面での分類しかできない。
またニューラルネットワークや多層パーセプトロンやCNNやRNNなどもモデルの名前である。これらは素子の数を十分増やせば任意の関数を近似できることが知られている。
どの問題に対して、どのようなモデルが最適化はさまざまな研究がなされているので、機械学習を使う側としてはここの流れを追いかけるのが面白いところである。やってみた!系の記事はどのデーターに対してどのモデルでどのような結果が出たかを見ると良いと思う。
コスト関数について
モデルによってや、問題によって使うコスト関数は変わる。回帰の場合は二乗誤差が使われることがおおく、分類の場合にはクロスエントロピーを使われることが多い。
値域に対して、どのような距離空間を入れるかという話と、学習がしやすいような関数にできるかと言う話がある。
たとえば二乗誤差は直感的にわかりやすい距離であり、またパラメーターが線形の場合は下に凸の関数なので、極小値があることがわかっているので学習に使いやすい。
クロスエントロピーは0付近で無限大の値を取るので、答えを間違った時のペナルティが大きく学習のスピードが早い。
特殊なことをしないかぎりは上記の2つを使うのが良いと思う。(と言いつつ、それ以外を僕はあまり知らない)
コスト関数の最小化について
(*アルゴリズム)のところの話である。ここは主に与えられたデータからどのようにして最適なを最速で探すのかが議論になる。
さまざまな方法が提案されており、最急降下法や確率的勾配法やミニバッチ。まだニューラルネットだとバックプロパゲーションやAdaGradやAdamなどが発明されている。
この分野はアルゴリズムが好きな人は追いかけるとよいと思う。機械学習初心者はここを理解しようとすると大変なことになるので、最急降下法ぐらいを「構成している関数の各パラメーターで偏微分してその値の逆方向にパラメーターをすすめることで、コスト関数の極小値にたどり着くんだろうなぁ」ぐらいの感覚として理解しておくぐらいにとどめ、あとは便利だなぁぐらいでいいと思う(といって僕は逃げます。僕もちゃんとは勉強してないのでわからない。)
汎化性について
汎化性とは、任意のテストデータに対しても、コスト関数が小さくなっていることであり、これはつまり予想が上手く行っている!ことを表す。
ここが機械学習で一番厄介で、理論的に話をすすめるのが難しく、しかし重要なところである。
まず、汎化性には
- モデルの選定
- コスト関数の選定
- 過学習の問題
- 学習最適化
が主な議論対象となる。モデルとコスト関数に関しては上記で見たので過学習と学習最適化について取り上げる
過学習
学習データが少ない時に表現力が高いモデルを選んだ時に起こりがちなのが過学習である。
たとえば、学習データーが5つの点の値のみ与えられていて、モデルを4次元の多項式とすると変数は5個あるので、連立方程式を解くことができ、学習データに関しては完全にフィットすることができてしまう!
これに対する対策として様々なテクニックが考えられており、例えばL2正則化もそれに当たる。これはパラメーターに対して、値を大きくなり過ぎないという制限をつけることで過学習を防ぐことを目的としている。
ほかにはニューラルネットワークではドロップアウトと言われる手法が知られており、これは各素子が50%などの確率で不活性化することにより過学習を防いでいる。
また学習データに対してランダムなノイズをのせることで過学習を防いだりしている。
学習最適化
コスト関数を最小化することは上手くいくが未知のデータに対してうまくいかないことも多い。それが過学習によって成されるケースもあるが、例えばニューラルネットだと各層での役割分担が上手く行っておらず特徴を抽出しきれてないというケースもある。
そこで事前学習を行いパラメーター空間を整理しておくことで、学習を上手くいかせる手法も考えられている。このとき多くは教師なし学習で行われる。
これがディープラーニングの転機になったRBMやAutoencoderによる事前学習である。
データの前処理
機械学習で重要なのは、データセットを上手く作れるかというところが最終的には一番の問題になったりする。大体のローデータは汚いので、それを学習するために綺麗に整えないといけない。また教師あり学習をするときには教師データが必要で、それを準備するのも大変だったりする(エンジニアが大量のネイル画像を分類しなければいけない!)
ここに関してもデータの正規化などでデータを綺麗にしたり、学習データを回転したりノイズをのせることで学習データを増やしたりしている。
まとめ
教師あり学習を決定論的に定式化してみた。すると機械学習ででてくるワードがどこの部分に対しての話なのかが少し明確になったのではないでしょうか。
僕だと、機械学習を使う方に今は興味があるので、モデルの選定や汎化性やデータの前処理に興味があるのでここに関してはある程度理解し、アルゴリズムなどに関しては、Scikit LearnやTensorflowやChainerなどに任せてしまおう!と思うことができる。(後々学びたいとは思っている)
「巨人の肩の上に立つ」じゃないけど、得意なことややれることは人それぞれで、時間も有限なので、効率的に楽しいことをやっていきたい!
その一助になればとお思い、ちょっとざっくりですが、機械学習について説明してみました。そして僕の理解はこんなもんです。
まだまだ機械学習やり始めて間もないので、いろいろ教えていただきたいです。