COURSERAで学ぶ機械学習(3週目-2)

Bicepper

こんにちは!Bicepperです。

前回のCOURSERAの「Andrew Ng先生の機械学習」5回目からの続きです。

5回目はこちらからどうぞ!

1回目はこちら

コスト関数

これまでのことを一度まとめてみましょう。

m個のサンプルが入ったトレーニングセットがあるとします。

$$\large トレーニングセット:\{(x^{(1)},y^{(1)}),(x^{(2)},y^{(2)}),\cdots,(x^{(m)},y^{(m)})\}$$

N+1次元のベクトルで表現できます(\(x_0\)を追加)。

\[
x
\in
\left[
\begin{array}{ccc}
x_0 \\
x_1 \\
\cdots \\
x_n
\end{array}
\right] \]

\(x_0\)は必ず1であり、分類問題であるため\(y\)は0か1のどちらかに分類されるという特性を持ちます。

$$\large x_0=1,~~y\in\{0,1\}$$

そして仮説が次の式でした。

$$\large h_θ(x)=\frac{1}{1+e^{-θ^{T}x}}$$

さて、いよいよ\(θ\)をどのように選択するか?の話です。
線形回帰の時はこんなコスト関数を書いていましたね。

$$\large J(θ)=\frac{1}{m}\sum_{i=1}^m \frac{1}{2}(h_θ(x^{(i)})-y^{(i)})^2$$

これを少し書き換えます。

$$\large J(θ)=\frac{1}{m}\sum_{i=1}^m cost(h_θ(x^{(i)}),y^{(i)})$$
$$\large Cost(h_θ(x^{(i)}),y^{(i)})=\frac{1}{2}(h_θ(x^{(i)})-y^{(i)})^2$$

最初の式の\(\frac{1}{2}〜\)以降を\(Cost〜\)の式に置き換えました。

もっと分かりやすくするために、添字を消してしまいましょう。

$$\large Cost(h_θ(x),y)=\frac{1}{2}(h_θ(x)-y)^2$$

これはつまり、\(Cost\)関数が二乗誤差の半分であることを意味します。

このコスト関数は線形回帰なら問題なくうまく行きますが、今我々がやろうとしているのは、ロジスティック回帰です。
もう一度仮説を思い出してください。

$$\large h_θ(x)=\frac{1}{1+e^{-θ^{T}x}}$$

これはかなり複雑な非線形関数であり、非凸関数です。
これをグラフで表現すると、このように非常に多くの局所解を持ったグラフになります。

このような非凸関数に最急降下法を適用しても、最適な局所解に収束する保証はありません。
すなわち、このコスト関数はロジスティック回帰に使えない、ということになります。

では、ロジスティック回帰に使うコスト関数とは、どのようなものでしょうか?
それがこちらです。

\[
Cost(h_θ(x),y)=
\left\{
\begin{array}{ccc}
y=1ならば-\log(h_θ(x)) \\
y=0ならば-\log(1-h_θ(x))
\end{array}
\hspace{15pt} \right\}
\]

\(log\)まで出て来てよく分かりません!
この式だけ見ても何なのか全然わからないので、いつも通りグラフにしてみます。

\(y=1\)だった場合は、\(-log(h_θ(x))\)なので、指数関数の\(-logZ\)になります。
\(h_θ(x)\)が取りうる範囲は0から1の間だけなので、図のように一部を切り取った形になります。

このコスト関数には、面白い特徴があります。
まず、\(h_θ(x)=1\)であり、仮説が\(y=1\)と予測し、実際に\(y=1\)だった場合、コストは0となります。
対数関数とx軸の1が交差する点ですね。実際に\(y=1\)だったわけですから、コストが0になるのは必然です。

ところがもし、\(h_θ(x)\)が0に近付くと、コストが無限大に増加することになります。
これは、仮説が0になると、\(y=1\)になる可能性は0であるということを直感的に読み取ることができます。
あなたが病院に行った時、「あなたが悪性腫瘍を持っている可能性、つまり\(y=1\)となる可能性は0だ」と言われているのと同じです。
つまり、あなたの腫瘍が悪性であることは絶対にない、ということになります。

ところが、実際には腫瘍が悪性であると判明したとしましょう。病院で「腫瘍が悪性であることは絶対にない」と言われたのにもです。

これは「間違った判断をした」ということになりますから、このアルゴリズムに対してとても高いペナルティを課す必要があるわけです。
\(h_θ(x)\)が0に近付くに連れて、コストが急激に増加していることから、直感的に理解できますね。

もし\(y=0\)だった場合は、1に近付くグラフになります。

コスト関数の単純化と勾配降下法

ロジスティック回帰に適用できるコスト関数を紹介しましたが、式が2つに分かれていて使いづらいですよね。
これをより単純化し、1行で表現してみましょう。

$$\large Cost(h_θ(x),y)=-y\log(h_θ(x))-(1-y)\log(1-h_θ(x))$$

一見複雑に見えますが、とても簡単です。
例えば\(y=1\)だった場合、\(-(1-y)\log(1-h_θ(x))\)の部分は0になりますから、残るのは\(-\log(h_θ(x))\)だけです。一方\(y=0\)だった場合に残るのは\(-\log(1-h_θ(x))\)ですから、単純化する前の2つの式と一致しますね。

これにより、ロジスティック回帰のコスト関数は以下のように書くことができます。

$$\large J(θ)=-\frac{1}{m}\biggl[\sum_{i=1}^m y^{(i)}\log h_θ(x^{(i)})+(1-y^{(i)})\log(1-h_θ(x^{(i)}))\biggl]$$

このコスト関数を選択する正当性を導くには最尤推定の原理と統計学を使う必要がありますが、本題からズれますので、パスします。
ロジスティック回帰でみんなが使うコスト関数である、ということだけ覚えておけば大丈夫です。

さて、我々の本来の目的は\(θ\)の導出、つまり、最小の\(θ\)を見つけ出すことです。
どのように見つけ出すのでしょうか?
線形回帰の時と同様に、最急降下法に当てはめます。

$$\large θ_j:=θ_j-α\frac{\partial}{\partial θ_j}J(θ_0,θ_1)$$

\(θ\)について偏微分をすればいいわけですから、コスト関数\(J(θ)\)の右辺を代入して偏微分してみます。

$$\large θ_j:=θ_j-α\sum_{i=1}^m (h_θ(x^{(i)})-y^{(i)})x^{(i)}_j$$

なんと、線形回帰の時に見た数式とほぼ同じです。
ロジスティック回帰と線形回帰は同じものなのでしょうか?

この疑問は、仮説の定義がロジスティック回帰のために変化したことを観察すれば解決できます。
線形回帰の仮説は

$$\large h_θ(x)=θ^{T}x$$

でしたが、ロジスティック回帰の仮説は

$$\large h_θ(x)=\frac{1}{1+e^{-θ^{T}x}}$$

であることを思い出してください。

仮説の定義は完全に異なっているため、見かけ上の式が同じであっても、線形回帰とロジスティック回帰は同じものではありません。
線形回帰の時に、最急降下法がうまく機能しているか確認する方法をお伝えしましたが、同じことがロジスティック回帰でも言えます。

高度な最適化

これはちょっと余談ですが、最急降下法を超えてさらにアルゴリズムを最適化できないか?という話です。

もちろん、最小値を探索するアルゴリズムは最急降下法だけではありません。
他にも以下のようなアルゴリズムがあります。

  • 共益勾配法
  • BFGS法
  • L-BFGS法

これら3つのアルゴリズムは「学習率を自分で選ぶ必要がない」や「最急降下法よりも早く収束する」などのメリットがありますが、より複雑であり、学ぶには深い数学の知識と時間を要するためここでは取り扱いません。

どうしても気になる方は是非調べてみてください。