Coursera講座「Machine Learning」メモ

自分が後で見返す用のまとめです。

このコースはスタンフォード大学のAndrew Ng先生が公開している機械学習の入門コースです。機械学習について勉強するにあたり、まず見ておくといいと思います。無料で視聴することができます。
Coursera講座 機械学習

11週分の内容から構成されます。バックプロパゲーションの部分の説明がとても簡素なので、4週目くらいまでやって、次のゼロから作るDeep Learningを読んでみると、とてもスッキリすると思います。

合わせて読みたいおすすめ教材

  • ゼロから作るDeep Learning: 上のCourseraのコースを途中までやってから読んでみると、スムーズに読み進められます。バックプロパゲーションの仕組みについて計算グラフを使った説明がなされており、その部分がとてもわかりやすいです。
  • はじめてのパターン認識: 少し難しいですが、より数学的な側面から機械学習に触れることができます。数式を全部追ってもいいとは思いますが、さらっと流して読むだけでも多くのことが知れる良い本だと思います。

メモ

機械学習とは
– Arthur Samuel (1959). Machine Learning: Field of study that gives computers the ability to learn without being explicitly programmed.
– Tom Mitchell (1998) Well-posed Learning Problem: A computer program is said to learn from experience E with respect to some task T and some performance measure P, if its performance on T, as measured by P, improves with experience E.

機械学習が対象とする代表的な問題の種類
– 教師あり学習: 入力と出力の正解セットをもとに学習させる。回帰と分類にさらに分かれる。
– 教師なし学習: 正解セットがない。クラスタリングなど。
– その他: 強化学習(状態を持ち、一連の入力によって最終的な出力が得られるシステムを対象とする。入力が直ちに出力と対応しない。囲碁のAIなど。)、レコメンドシステム(おすすめの映画、おすすめの商品)、など。

教師あり学習におけるモデルの表現
回帰、分類、ともに、入力をいくつか受け取って、値を出力する。教師あり学習では、モデルの出力と正解値との食い違いをコスト関数として定義し、それを最小化する問題を解く。回帰では、素直に正解の値との差の2乗和をコスト関数とし、これが小さくなるように学習を進める(2乗和、つまり、L2ノルムを使うのは数学的に取り扱いやすいから、という理由が主であり、L1,L3,etcのノルムでも本質的に問題はない)。分類については、分類の正答率をコスト関数にしてしまうと、モデルのパラメータのわずかな変動では、コスト関数が変化しなくなってしまうので、シグモイド関数を使って、ロジスティック回帰という問題に変換する。これは本質的には、分類の確からしさをコスト関数に反映している。

勾配降下法
モデルを構成するパラメータをそれぞれ少しずつ動かしたときに、コスト関数がどれくらい変化するかを計算できる。すなわち、偏微分が計算でき、最もコスト関数を減少させるために適したパラメータの変化のさせ方がわかるので、その方向へパラメータの移動する、というのを繰り返す。このとき、パラメータの変化の方向がわかるが、どれくらい1ステップで移動するか、というのを決める学習率、というハイパーパラメータが必要である。勾配降下法はGradient Descentと呼ばれ、最もナイーブな関数値最小化法であるが、世の中にはもっと洗練された色々な方法がある。Adam, AdaDelataなど。SGDはStocastic Gradient Descentの略で、一度に全ての教師データを使わずに1ステップを実行する方法のこと。SGDは古い方法だが、いまでも論文などでよく見る方法らしい。

学習率の選択
大きすぎると発散するし、小さすぎると学習が遅い。iterationに対してコスト関数がどのように変化するかをプロットし(学習曲線という)、コスト関数がコンスタントに減少することを確認しながら、0.01, 0.03, 0.1, 0.3, 1, …というように試すと良い。

入力データのスケーリング
入力データの平均と分散を揃えることがよく行われる。これは、勾配降下法がうまく機能するのを助ける。

正規方程式: Regular Expression
線形のモデルで、コスト関数にL2ノルムを使うのであれば、解析的なパラメータの求め方が存在する。繰り返し計算が不要で、学習率の選択も必要ない。ただし、途中でパラメータの数分の大きさをもつ行列の逆行列を計算する必要があり、パラメータの数が増えると、計算が難しい。10^5を超えるあたりから、勾配降下法を使うことを検討し始め、10^6あたりでは、勾配降下法を使うしかなくなる。

非線形のモデルの簡単な実現
変数がいくつかあった時に、それらの2乗の変数を合成したり、2つの変数の積を新たに変数として合成したりして、加えることができる。

モデルの正則化
変数の数が増えすぎると、過学習に陥りがちである。対策として、パラメータの2乗和をコスト関数に組み入れて、パラメータの絶対値が大きくならないような力を働かせると過学習を抑制できる。これをRegularization/正則化という。

ニューラルネットワーク
1つ以上の隠れ層をもつニューラルネットワークは、非線形のモデルの表現が可能である。ニューラルネットワークの学習も、基本的には線形モデルのものと同じで、コスト関数の最小化を行う。全てのパラメータは、少し変化するとコスト関数に影響を与えるはずで、コスト関数が最もよく減少する方向にパラメータを動かす。このとき、偏微分を効率よく計算する方法が、バックプロパゲーションである。

データセットの分割
訓練データ、バリデーションデータ、テストデータに分ける。訓練データを学習に使う。正則化の強さといったハイパーパラメータの最適化の指標にバリデーションデータにおけるコスト間数値を使う。最も良い結果を出したハイパーパラメータのセットで学習されたモデルが、最終的に未知のデータに対してどれくらいの精度で推論ができるかを見るときにテストデータを使う。

Under-fitting / Over-fitting
– Under-fitting: モデルが単純すぎて説明力が不足している。ハイバイアス。訓練データ、テストデータ両方でコスト関数が低下しない。対策は、正則化を弱める、非線形の変数を合成するなどして変数を増やす、隠れ層を増やすなどしてパラメータを増やす。
– Over-fitting: 過学習の状態。ハイバリアンス。訓練データではコスト関数が低下するが、テストデータでは低下しない。対策は、正則化を強める、変数を減らす、パラメータを減らす、学習データを増やす。

Precision / Recall
分類において、たとえば、ガンの患者を判別する、というような問題だと、そもそもガンになる人が1%もいないときに、モデルがもし全ての人をガンでないと判定したとしても、正答率は99%になる。こういった類の分かり難さを排除するために、Precition=TP/(FP+TP)とRecall=TP/(FN+TP)が役に立つ。これらはトレードオフの関係にあり、例えば、判別の閾値を下げることでRecallをあげることができたとしても、その場合、Precisionが低下する。
– TP = True Positive
– FP = False Positive
– TN = True Negative
– FN = False Negative

PrecisionとRecallに、指標が二つに別れてしまうと、コスト関数とは違って一意な最適化ができなくなる。そこで、F1スコアというのがよく使われる。単純な平均と比べると、低い方により引っ張られやすい性質があり、両方がそれなりに高い時に良いスコアとなる。F1スコア=2*Precision*Recall/(Precision+Recall)で計算できる。もっとも、幾何平均とか他の方法もありうるが、F1スコアは多くの場合でうまくいくので良く使われる。

訓練データの数
モデルが十分複雑で、ハイバイアスとなり得ない状態なら、大量の訓練データを用意することは精度上昇のための良い方法の一つである。もっとも、データを集める前に、その変数だけで、その分野のエキスパートがある程度自信を持って正解を予想できるか、ということを考えるのも重要である。

サポートベクタマシン(SVM)
分類問題に使う。ロジスティック回帰とほぼ同じコスト関数を持つが、少し変更を加えることで、決定境界(decision boundary)が訓練データから最大のマージンを取るように計算される。正則化パラメータ1/lambdaの代わりにCを使う(Cを小さくすることで過学習を抑制できる、つまり、多少学習データを仕分けきれなくても滑らかな決定境界を形成する)。非線形カーネルを用いない(線形カーネルの)サポートベクタマシンは、ロジスティック回帰による分類と典型的には同じ性能をもつ。サポートベクタマシンがそれより優れるのは、ガウスカーネル(利用される非線形カーネルのほとんど)のような、非線形カーネルを用いる場合。非線形カーネルは、例えば、訓練データをランドマークとして、それらと判別したい入力データの距離をガウス関数に入れる。学習自体はライブラリに任せるのが良い。ガウス関数の広がりを大きくすると、過学習が起きにくくなる、つまり、多少学習データを仕分けきれなくても滑らかな決定境界を形成する。また、変数の平均と分散をそろえるフィーチャースケーリングはやるべきである。

SVMの使い所
– 変数が学習データに比べてずっと多いとき(変数10000 / 学習データ10~1000): ロジスティック回帰か線形カーネルのSVM, 非線形のモデルをトレーニングするほど十分なデータがない
– 変数が少なく(1~1000)学習データがほどほど(10~10000)のとき: ガウスカーネルのSVM
– 変数が少なく(1~10000)学習データが多い(50000~)とき: 変数を合成して追加した上で、ロジスティック回帰か線形カーネルのSVM, ガウスカーネルのSVMは計算に時間がかかるため
– ニューラルネットワークはこれらのどの場合も適合しうるが、訓練に時間がかかる。また、SVMはグローバルに最適値が求まることが証明されている。

K-meansクラスタリング
クラスタリングは教師なし学習である。K-meansはクラスタリングで最もよく使われるアルゴリズムの一つである。アルゴリズムは、初期値としてk個のクラスタ重心を持ち、①データセットを最寄りのクラスタ重心に割り当てる、②クラスタ重心の位置を更新する、のステップの繰り返しを行う。

K-meansの初期化
最もよく使われ、良い性能を示す方法として、ランダムにk個のデータをデータセットから選び、クラスタ重心とする方法がある。ただし、初期値によって収束する解が異なることがある(すなわち局所解に陥ることがある)ので、50-1000回程度の初期値のセットをK-meansにかけ、得られるコスト関数が最小となるものを、最終的な結果とすると良い。kが10以下のとき、これは特に重要であるが、それよりずっと多い時には、初期値にはあまり依存しないことがわかっている。

クラスタの数kの選び方
本質的に、幾つが最適化というのは一意には決定し得ない。ひとつにはElbow法と呼ばれるものがある。kを横軸に、コスト関数をプロットして、減少が緩慢になった折れ目(ひじ)のところが良いkとする方法。ただし、明確な折れ目がプロットに現れないことはよくある。もう一つの決め方は、マーケティングの要件などクラスタリングした後の用途の要件から決める方法である。例えば、S/M/Lの3種類で分けたい、など決まっている場合。kはデータセットの数より大きくすることはない。

次元削減
変数が多すぎるとき、関係がある変数同士をまとめることで次元が削減できる。メモリ、ディスクの要件を削減でき、機械学習において学習を効率的に進めるのに役に立つ。また、可視化しやすくなる。

主成分分析(PCA)
次元削減で使う。高次元のデータをより低次元の空間に射影する。射影前後の各データセットの距離の2乗和が最小となるように主成分を順に決定する。PCAの前にはフィーチャースケーリングが必要である。PCAを実行するには、共分散行列($X・X^T$)の固有ベクトルを計算すれば良い。固有値が大きい順に順位の高い主成分となる。

どの順位の主成分まで使うか
k個(k<N)の主成分ベクトルとデータセットを使うと、k次元に射影されたデータセットが得られる。これは、射影された分、分散が小さくなっている。kを決めるために、元のデータの分散と比べて、例えば99%を保持するような順位まで取る、というようなことが行われる。

PCAを教師あり学習に使う
教師あり学習の入力にPCAを使うと、高速化が期待できる。ただし、注意点として、教師データのみを使って主成分を求める必要がある。射影に必要な式もパラメータの一つとみなせるため。また、PCAを使わないで学習させることを初めにやっておくほうが良い。もしかするとPCA無しでもうまくいくかもしれないし、そのときには削減後の次数を決めるために時間を割く必要がなくなる。

[続きがあるので、いづれ追記します]