couresera

Coursera Machine Learning / week7【学習メモ】

Coursera Machine Learning
Week7【学習メモ】【機械学習】
スタンフォード大学のAndrew Ng氏が手掛ける機械学習講義の学習メモ。

機械学習のスキルと知識を付けるために2020/10/30からスタート。全講義を終えるのに11週間をベース(1日1~2時間ペース?)としていますが、気にせずに理解できているか確認しながら進めていこうと思います。

Ⅰ.Support Vector Machines

Optimization Objective

SVMの概要についてです。
SVMとは、クラスを明確に分けるための決定境界を引く手法です。
以下のグラフがロジスティック回帰とSVMの違いです(青線がSVM)。

グラフが直線に変わっていますね。
SVMの目的関数に\(\lambda\)を入れると、
\(\frac{1}{m} \sum^m_{i=1} [y^{(i)} cost_1 (\theta^{\mathrm{T}} x^{(i)}) + (1 – y^{(i)}) cost_0 (\theta^{\mathrm{T}} x^{(i)})] + \frac{\lambda}{2m} \sum^n_{i=1} \theta^2_j\)
そして、上の式を変形すると、
\(C \sum^m_{i=1} [y^{(i)} cost_1 (\theta^{\mathrm{T}} x^{(i)}) + (1 – y^{(i)}) cost_0 (\theta^{\mathrm{T}} x^{(i)})] + \frac{1}{2} \sum^n_{i=1} \theta^2_j\)
というような式になります。

以下SVMの仮説図。

Large Margin Intuition

SVMのマージンについてです。
SVMのマージンとは、決定境界を引いた時のトレーニングデータとの距離のことを呼びます。SVMの決定境界はこのマージンが大きいです。

SVMの\(C\)はロジスティック回帰の\(\frac{1}{\lambda}\)に対応しています(\(\frac{m}{\lambda}\)をかけるため)。そのため、\(C\)が大きくなるということは、\(\lambda\)が小さくなることと同じ意味と捉えています。

以下SVMでのコスト(誤差)です。
\(y^{(i)}=1\)のとき、\(\theta^{T}x^{(i)}\geq 1\)なら、\(cost_1=0\)
\(y^{(i)}=0\)のとき、\(\theta^{T}x^{(i)}\leq 0\)なら、\(cost_0=0\)
この条件を満たす\(\theta\)を取ると、\(C\)の項は0になります。

結果として、第2の項のみが残るので、その部分を最小化することが目標です。
\(\frac{1}{2} \sum^n_{i=1} \theta^2_j\)

Kernels

カーネル(関数)についての説明です。
カーネルとは、非線形の決定境界を引くための手法です。
カーネルでは持っているデータ\(x\)ランドマークと呼ばれる\(l^{(i)}\)との類似性を\(f_i\)として新たに定義します。今回使用するのはガウシアンカーネルと呼ばれるもので、以下のようにランドマーク\(l^{(i)}\)との近似を計算します。


\({f1 = similarity(x,l^{(1)}) = exp(-\frac{||x – l^{(1)}||^2}{2 \sigma^2})}\)
この式では、\(x\geq l^{(i)}\)なら分子は0に近くなり\(exp\)の-0乗(expの0乗は1)となるので、結果的に\(f_i\geq 1\)となる。
逆に\(x\)と\(l^{(i)}\)が離れていると\(exp\)の分子は大きなものとなるため、\(f_i\geq 0\)となる。

\({f1 = similarity(x,l^{(1)}) = exp(-\frac{||x – l^{(1)}||^2}{2 \sigma^2})}\)の式の\(\sigma\)はガウシアンカーネルのパラメータで、このパラメータを大きくすると、\(l^{(i)}\)から離れるにつれて緩やかに1から0に近づいていき、パラメータを小さくすると、\(l^{(i)}\)から離れるにつれ急速に0から1に近づいてく。以下参考図。

各ランドマークごとに\(f_i\)を求め、それを用いて仮説関数を定義します。
今回は上記の図のように3つのランドマークを設定した場合は、説明変数も\(f_1,f_2,f_3\)と3つ使用します。以下仮説関数の定義。
\(y = 1 \hspace{15pt} if \hspace{15pt} \theta_0 + \theta_1 f_1 + \theta_2 f_2 + \theta_3 f_3 \ge 0\)

\(y = 0 \hspace{15pt} if \hspace{15pt} \theta_0 + \theta_1 f_1 + \theta_2 f_2 + \theta_3 f_3 < 0\)

このように、\(f_1,f_2,f_3\)と説明変数を増やしていくことは\(x^{1},x_1,x^{1}_1\)というように説明変数を増やしてくことになるので、多項回帰となります。

以下の図は、\(\theta\)の値が決まっており、トレーニングデータの例として\(x\)が\(l^{(1)}\)の近くにあったときの仮説がどう答えを出すのかを説明しています。
まず、\(x\)が\(l^{(1)}\)の近くにあるということは、\(f_1\geq 1\)となる。\(x\)と\(l^{(2)}\)、\(l^{(3)}\)との距離を見ると遠く離れているため、\(f_2\geq 0\)\(f_3\geq 0\)となる。これをすでに分かっている\(\theta\)と合わせて仮説関数の式に当てはめたときに、上記の式と照らし合わせ、\(y=1\)か\(y=0\)かを判断する。

次にランドマークの選び方とSVMのパラメータについてです。
ガウシアンカーネルの場合だと、ランドマーク\(l^{(m)}\)は、\(x^{(m)}\)のデータをそのまま使用します。そして、\(f_m\)のデータ数を計算します。

最後に、SVMを使用するときの分散とバイアスのトレードオフについてです。
おさらいとして、\(C\)は\(\lambda\)の逆数\(\frac{1}{\lambda}\)です。
\(C\)の値が大きい場合、つまり\(\lambda\)の値が小さい時と同じで、正則化をあまり使用しないことを意味します。そうすると、バイアスが低く分散が大きいという仮説が立てられる傾向があります。つまり、オーバーフィット(ハイバリアンス)になりやすいです。
\(C\)の値が小さい場合、つまり\(\lambda\)の値が大きい時と同じで、正則化を強めることを意味します。そうすると、バイアスが高く分散が小さくなり、アンダーフィット(ハイバイアス)になりやすいです。

ガウシアンカーネルを使用する場合は、ガウシアン(正規分布)を表すパラメータの\(\sigma\)を決める必要があります。\(\sigma\)が大きいと正規分布の広がりが大きくなり、類似性が検出されやすく、アンダーフィット(ハイバイアス)しやすくなります。\(\sigma\)が小さいと正規分布の広がりが小さくなり、類似性が検出されにくくなるため、オーバーフィット(ハイバリアンス)しやすくなります。

Using An SVM

SVMを使用する時について。

特徴数\(n\)が多くて、トレーニングセットの\(m\)が少ない場合は線形カーネル(線形の決定境界)を使用する方が望ましい。理由として、大量のデータがないときに非線形カーネルを使用するとオーバーフィットするため。

線形カーネルを使用する時にやるべきことは以下の二つがメインです。
・パラメータ\(C\)を決まる。
・類似度関数を選択する。つまり、線形(リニア)カーネルか非線形カーネルかを選ぶ。
線形カーネルの場合は\(\theta^{T}x\)を使用。

ガウスカーネル(非線形)を使用する場合にやるべきことは以下。
・パラメータである\(\sigma^{2}\)をを選ぶ。
・カーネル関数あるいは類似度関数を実装する必要があるものもある。

また、ガウシアンカーネルを使用する前に、Fearture Scalingを行います。
以前学習したのと同じように、特徴量間で差があると計算結果に影響がでてしまうためです。

特徴量の数とデータ数から選ぶアルゴリズムは以下のようになる。

特徴量の数 データ数 アルゴリズム
約1万 10~1000 ロジスティック回帰/カーネルなしSVM
1~1000 10~5万 ガウシアンカーネルSVM
1~1000 5万以上 ロジスティック回帰(特徴量を増やす)/カーネルなしSVM

ニューラルネットワークは上記のとき、精度はまあまあ良いが訓練スピードが遅い。
ロジスティック回帰とカーネルなしSVMはセットになっているが、アルゴリズムが似ているためほぼ同じような振る舞いをする。しかし、SVMは非線形の問題に対してカーネルを使ってこそのものですね。

おまけ

カーネルのないSVM(つまり、線形カーネル)は、\(\theta^{T}x\)のみに基づいて出力を予測するため、ロジスティック回帰と同様に、線形/直線の決定境界を出力します。

ガウスカーネルを使用することで、モデルの複雑さが増し、データの適合不足を回避できます。

以下課題のデータをアレンジ。
パラメーター\(C\)は、誤って分類されたトレーニング・サンプルのペナルティーを制御する正の値なので、これを大きくしてすべてのサンプルを正しく分類できるようにSVMに指示してみます。

\(C=1\)のとき

\(C=100\)のとき

\(C=1000\)のとき

こうしてパラメータ\(C\)を高くしていくと、SVMは正しく分類してくれますね。

さいごに

今回はSVMについて学習しました。ニューラルネットワークと同じくらい難しかったと思います。先生はSVMは難しいので、うまくライブラリを使いながら実装していく方が良いと話されていました。まさにその通りだと思います。

次回は教師なし学習です。ここまで教師あり学習だったので、どんなものなのか楽しみです。
それでは、引き続き頑張っていきましょう!