ML入門2:機械学習のアルゴリズム色々

機械学習を理解することよりも、使うことを優先して話を進めていきたいと思う。
機械学習のアルゴリズムは用途によって大きく5つに分類できる。
それぞれの特徴を理解した上で、これらの組み合わせで機械学習を実現することになる。

1.回帰分析(Regression)

学習データとの差違が最小となる多項式を求めて、新たに与えられたデータから値を算出する方式。最も単純なのは線形回帰分析(Linear Regression)で「機械学習とは何をしているのか」で示した例がまさにこれに当る。相関関係を単純な数式で表せることが前提条件となる。
非線形回帰分析を行う改良型もあるが、学習データに異常値が含まれていると学習結果の精度が大きく落ちる。どちらが良い悪いという物では無い。

2.教師データありの分類(Classification)

対象がどの分類に含まれるかを判断する。本質的には回帰分析と大きく変わらない。学習データを元に回帰分析によって境界線となる多項式を求め、その多項式で分断される空間のどちら側になるかを算出することで分類する。

3.教師データなしの分類(Clustering)

対象を類似度の高い、いくつかのグループ(クラスタ)に分類する。学習のための教師データを用意する必要が無い。k-meansアルゴリズムがよく使用される。クラスタの所属する円の中心を繰り返し計算で求めていく。いくつのグループに分割するのかは指示する必要があるがグループ数が小さいと計算が収束しなくなる可能性が高い。かといって大きすぎても一つのクラスタが複数に分断される事になる。またクラスタに属せずに孤立するデータが含まれていると計算結果が不正確になりやすく、与えるデータの品質が求められる点は変わらない。

4.ベイジアンフィルタ(Bayesian Filter

Classificationの一つだが、回帰分析ではなく統計的な手法(ベイズ理論)により確率を求めることで分類を行う。全ての特徴に対する特定の特徴の発生頻度を元にして、個々の特徴が存在する時にその分類となる確率を計算する。実データのもつ個々の特徴を元にこの確率を積分することで、どの分類になるかを判断する。
全体の特徴の種類が増えると計算結果となる確率の差が小さくて誤判定が増えたり、全体的に出現頻度の低い特徴に判断結果が引っ張られたりと、学習データの質に大きく左右される。

5.ニューラルネットワーク(neural network)

Classificationの一つだが、神経細胞を単純化して模したニューラルネットワークで計算を表現する。実質的にはひとつのニューロンがひとつの線形回帰分析機となる。これを複数組み合わせてニューラルネットワークを構成することで、複数の線形回帰分析による複雑なルール学習が可能になる。欠点は学習のための計算量が大幅に増えてしまうこと。

番外1.遺伝的アルゴリズム(genetic algorithm)

番外として遺伝的アルゴリズムを加えておく。学習結果となるパラメータ(遺伝子パターン)をランダムに生成し、それぞれを評価関数の元で競わせる。より良い結果を出した遺伝子パターンを残してそれらをランダムにシャッフルする事を繰り返して、最も適した遺伝子パターンを求める物。遺伝子パターンや評価関数の設計が難しく、適切な方法をプログラマが提示する必要があり、また計算量も膨大になってしまう。
現在の機械学習において遺伝的アルゴリズムが話題にあがる事は少ないので番外としておく。

番外2.ディープラーニング(Deep Lerning)

現状ではバズワードだと思っているので、番外扱い。
複数の機械学習(一般的にはニューラルネットワークを使っているが、ニューあっルネットワークに限らない)を階層的に、あるいは並列的に組み合わせて使用することで、より高度で複雑な事象の学習を可能にしようとする試み。コンピューターの高性能化、低価格化によって可能になってきた。

ML入門1:機械学習とは何をしているのか?

機械学習とMachine Lerningについて情報収集中なので、せっかくだから整理しつつ残していきたいと思う。

機械学習とは何をしているのか?

機械学習が何をしているのかというと実は非常にシンプルなことをしています。下のようなグラフがあったとき直線(回帰直線)を引いたりしませんでしたか?あるいは大学で最小二乗法による回帰直線を求める方法を学びませんでしたか?機械学習がやっていることは、まさしくその回帰直線を求めて、与えられたXからYを求める方程式を作成し、新たなXが与えられたときにYの値を予想する事です。

regresion1
例えば上の散布図のように与えられたサンプルデータに対する破線を求めるのが機械学習です。そして学習結果であるy=0.7482x+14.612の計算式を用いて、新たに与えられた値に対してyを求める事で結果を予想するわけです。勿論これは極端に単純かした場合の話で、実際の機械学習では二次元はなく十数次元~数千次元にもなります。図示することなど到底不可能なレベルです。でもどれだけデータの次元数が増えて複雑に見えても、内部的に行っていることはこの延長線上にあります。

この事を踏まえると機械学習に出来ること、出来ないこと、なぜ与えるデータが重要なのか理解も容易になります。

機械学習に出来ること、出来ないこと

機械学習では学習させるデータの質が非常に重要になります。これを提供できるか否かが、機械学習で出来るか否かに直結しています。

異常値が含まれていたり、学習サンプルデータが偏っていたり、相関関係の薄いデータが紛れていたりすれば、学習結果となる数式は容易に異なった物になります。十分な量の、質の高いサンプルデータを必要とします。

regresion1

上の図のように異常値を一つ加えただけで、学習結果が変わってきます。x値が小さいときには10近く大きな数字が出るようになってしまいました。このような異常値は学習させる前に取り除く必要があります。これは二次元のグラフだから異常値と言うことがわかりやすいのですが一般的に機械学習に使うデータは数十次元にも及ぶので異常値を取り除くだけでも高い数学的知識を求められます。

万が一の時にデータを失わないために

今データ保存用に使っていたHDDが壊れたので、参考までに書き綴ってみる。

もちろんデータを失うような失態は犯していない。Windows 7.0以降で提供されている記憶域プールの機能を使い、手元のUSBドライブを組み合わせて双方向ミラーを構成していたからだ。ただし万が一もう一台HDDが壊れればデータを失う事になった。薄氷を踏む思いで、いくつかの対策を済ませ、ひと心地つけているところだ。

良くある勘違いに、パソコンが壊れてデータが失われた原因を、パソコンが古くなった事にする人が居る。でもこれは本質から外れている。確かにパソコンに限らず古くなれば壊れる確率が上がるのは真理だ。でも新品だから壊れないという保証があるわけでもない。

次に良くある勘違いに、DVDやCD、時にはUSBメモリにバックアップしてあるから大丈夫という人が居る。DVDやCD、USBメモリといった記憶メディアだって壊れる事があるのだ。バックアップした記憶メディアを頻繁に読み込んでチェックしているならともかく、バックアップして何年もそのままなら、いざという時に読み込めるかなんて分かりやしない。

データが壊れることを防ぐ唯一の方法は、複数の方法で同じデータを保存しておき、それらが破損していないことを定期的に確認することだ。最初の例では複数の方法での保存すらしていないし、2番目の方法では破損していないか定期的に確認できていいなかったりする。実は「破損していないことを定期的に確認する」というのは凄く難しい。

そこでお勧めするのが記憶域プールの活用だ。USB HDDを二台以上用意して記憶域プールを作成し双方向ミラーかパリティに設定しておけば、何も意識しなくとも常に複数のディスクにデータが保存される上に破損していないか常時チェックしてくれる。ディスクの空き容量が少なくなったら三台目を追加すれば、簡単に容量も増やせる。記憶域プールの作り方は説明しない。そんなのググればすぐに見つかるからね。

記憶域プールは双方向ミラーで作るのがお勧めだ。HDD 2台でも構成できる。パリティは容量を大きく使えてお得に思えるかもしれないが、実は速度低下というデメリットもあるし、最低3台のHDDが必要なのでお勧めしない。

でも記憶域プールも完璧じゃない。誤操作で削除した場合は、複数のHDDに保存されている両方のデータが削除されてしまう。そこで、僕の場合はその上でさらにMicrosoftの提供するOneDrive上に1TBほどの容量を借りて、定期的にデータをコピーしている。最近は無料でも借りれる容量が増えてきているので、無料枠で収まるように厳選してコピーしても良いだろう。One DriveをWebDAVと言う機能をつかって、普通のドライブと同じように使うことも出来るので、コピー操作は簡単だ。

わざわざインターネット上にOneDriveとかGoogleDrive借りてまで・・・と思うかもしれないが、自宅が災害に遭う可能性だってある事を忘れてはならない。別の場所に置いておかないと、パソコンが被災したときに全部一緒に失われてしまう。これを防ぐためには、まったく別の場所に複製をおいておく必要がある。またOneDriveやGoogleDriveなどは、DVDなどの記憶メディアに較べて極めて信頼性が高いのでデータが破損する可能性が低い。だからデータが破損していないかチェックする手間を省くことが出来るのもメリットだ。

信頼性が高いならOneDriveやGoogleDriveにデータを預けておくだけでよいのではないかって?MicrosoftやGoogleが倒産して、突然サービスが利用できなくなるかもしれないでしょ?