ロジスティック回帰①  理論と計算方法

# ロジスティック回帰とは
### 分類問題
機械学習の手法としてよく用いられるロジスティック回帰は、分類問題を解くための手法です。分類問題とは与えられたサンプルがどのクラスに属するかを予測する問題です。例えば、ペンギンのくちばしの長さや体重といったデータから、そのサンプルがどの種類のペンギンかを予測するような問題が分類問題です。分類問題は回帰問題と並び機械学習が対象とする問題の大きなカテゴリの一つであり、二つのクラスに分類する2クラス分類と3つ以上のクラスに分類する他クラス分類の二つに大きく分けられます。

まずは2クラス問題において、分類問題がどのように定式化されるかを考えます。
各データセット$\boldsymbol{x}$（例えばペンギンのくちばしの長さや体重）に対応する正解ラベル$y$（例えばアデリーペンギンかジェンツーペンギンかどうか）は、0または1の離散値で表すこととします。これに対して$\boldsymbol{x}$から計算される予測値$\hat{y}$は0から1の間の連続値（確率）を取るものとし、閾値（多くの場合0.5）を用いてクラス0かクラス1に属するかを判定します。分類問題では、入力$y$が0の場合は予測値$\hat{y}$が1に近い大きな値を、$y$が1の場合は予測値$\hat{y}$が0に近い小さな値を出力するようなモデルを構築することを目指します。


### ロジスティック回帰
ロジスティック回帰では入力$\boldsymbol{x}$に対応する予測値（ここでは確率$\hat{p}$で表します）を次式で表現します。
```math
\begin{align}
\hat{p} &= \frac{1}{1+e^{-(\theta_0 + \theta_1 x_1 + \cdots + \theta_n x_n)}} \\
&= \frac{1}{1+e^{-(\boldsymbol{\theta}^\mathsf{T}\boldsymbol{x})}} \\
&= \sigma(\boldsymbol{\theta}^\mathsf{T}\boldsymbol{x})
\end{align}
```
ここでシグモイド関数$y=1/(1+e^{-x})$を$\sigma(x)$で表しています。シグモイド関数はどんな入力値についても0から1までの値を出力するため、$\hat{p}$がとる値も0から1の間の範囲となります。

ロジスティック回帰でも、前回まで学んだ線形回帰と同様にパラメタ$\theta_1,\cdots,\theta_n$を学習により求めていきます。ロジスティック回帰のコスト関数$J(\boldsymbol{\theta})$は次のようになります。
```math
\begin{align}
J(\boldsymbol{\theta}) &= -\frac{1}{m}\sum_{i=1}^{m}\left( y^{(i)}\log\left( \hat{p}^{(i)} \right) 
+ (1-y^{(i)}) \log\left( 1 - \hat{p}^{(i)} \right) \right) \\
&= -\frac{1}{m}\sum_{i=1}^{m}\left( y^{(i)}\log\left( \sigma(\boldsymbol{\theta}^\mathsf{T}\boldsymbol{x}^{(i)}) \right) 
+ (1-y^{(i)}) \log\left( 1 - \sigma(\boldsymbol{\theta}^\mathsf{T}\boldsymbol{x}^{(i)}) \right) \right)
\end{align}
```
ここで$i$は$i$番目のデータを表す添字であり、全部で$m$個のデータがあることを表しています。教師データ$y^{(i)}$が1の時、$\hat{p}^{(i)}$が1に近ければ近いほど第一項が0に近づき、第二項は常に0になることから式全体では値が小さくなっていきます。一方教師データ$y^{(i)}$が0の場合、第一項は常に0で第二項は$\hat{p}^{(i)}$が0に近いほど0に近づいていき式全体では値が小さくなっていきます。すなわちコスト関数$J(\boldsymbol{\theta})$は教師データと確率$\hat{p}^{(i)}$の誤差を表していることになります。

このコスト関数が最小となるパラメタを求めるわけですが、線形回帰における最小二乗法のようなパラメタを直接求める方法はなく勾配降下法のように繰り返し計算によりパラメタを求めることになります。コスト関数$J(\boldsymbol{\theta})$の微分を求めていくのですが、その準備としてまずはシグモイド関数$\sigma(x)$の微分を考えます。
```math

\begin{align}

\frac{\partial}{\partial x}\sigma(x)
&= \frac{\partial}{\partial x} \left( \frac{1}{1+e^{-x}} \right) \\
&= -\frac{-e^{-x}}{(1+e^{-x})^2 } \\
&= \frac{e^{-x}}{(1+e^{-x})^2} \\
&= \frac{1}{1+e^{-x}}\frac{e^{-x}}{1+e^{-x}} \\
&= \frac{1}{1+e^{-x}} \left( 1-\frac{1}{1+e^{-x}} \right) \\
&= \sigma(x)(1-\sigma(x))
\end{align}
```
すなわちシグモイド関数の微分はシグモイド関数自身を使って表すことができます。
この性質と、[線形回帰①]((https://qiita.com/892noske/items/99a34a6dedb6d7ac2c94))でも出てきた線形代数の公式を用いて、コスト関数$J(\boldsymbol{\theta})$の微分は次のようになります。
```math
\begin{align}
\frac{\partial}{\partial \boldsymbol{\theta}}J(\boldsymbol{\theta}) 
&= -\frac{1}{m}\sum_{i=1}^{m}\left( y^{(i)} \frac{1}{\sigma(\boldsymbol{\theta}^\mathsf{T}\boldsymbol{x}^{(i)})} \frac{\partial}{\partial \boldsymbol{\theta}}\sigma(\boldsymbol{\theta}^\mathsf{T}\boldsymbol{x}^{(i)})
-(1-y^{(i)}) \frac{1}{1-\sigma(\boldsymbol{\theta}^\mathsf{T}\boldsymbol{x}^{(i)})} \frac{\partial}{\partial \boldsymbol{\theta}}\left(1-\sigma(\boldsymbol{\theta}^\mathsf{T}\boldsymbol{x}^{(i)})\right)
\right) \\
&= -\frac{1}{m}\sum_{i=1}^{m}\left(
y^{(i)} \frac{1}{\sigma(\boldsymbol{\theta}^\mathsf{T}\boldsymbol{x}^{(i)})}\sigma(\boldsymbol{\theta}^\mathsf{T}\boldsymbol{x}^{(i)})
\left( 1- \sigma(\boldsymbol{\theta}^\mathsf{T}\boldsymbol{x}^{(i)}) \right)
 \frac{\partial}{\partial \boldsymbol{\theta}}
\left( \boldsymbol{\theta}^\mathsf{T}\boldsymbol{x}^{(i)} \right)
-
(1-y^{(i)})
\frac{1}{1-\sigma(\boldsymbol{\theta}^\mathsf{T}\boldsymbol{x}^{(i)})}
\left(-\sigma(\boldsymbol{\theta}^\mathsf{T}\boldsymbol{x}^{(i)})\right)
\left(1-\sigma(\boldsymbol{\theta}^\mathsf{T}\boldsymbol{x}^{(i)})\right)
\frac{\partial}{\partial \boldsymbol{\theta}}
\left( \boldsymbol{\theta}^\mathsf{T}\boldsymbol{x}^{(i)} \right) 
\right) \\
&= -\frac{1}{m}\sum_{i=1}^{m}\left(
y^{(i)}
\left( 1-\sigma(\boldsymbol{\theta}^\mathsf{T}\boldsymbol{x}^{(i)}) \right)
\boldsymbol{x}^{(i)}
+
\left( 1- y^{(i)} \right)
\sigma(\boldsymbol{\theta}^\mathsf{T}\boldsymbol{x}^{(i)})
\boldsymbol{x}^{(i)}
\right) \\
&= \frac{1}{m}\sum_{i=1}^{m}\left(
\sigma(\boldsymbol{\theta}^\mathsf{T}\boldsymbol{x}^{(i)})
-
y^{(i)}
\right)
\boldsymbol{x}^{(i)}
\end{align}
```
コスト関数およびその微分が計算できたため、これらの式から線形回帰の場合と同様にロジスティック回帰においても、最適なパラメタ$\boldsymbol{\theta}$を求めることができます。

### 多クラス分類
ロジスティック回帰は2クラス分類だけでなく、ペンギンデータセットのような3クラス以上の他クラス分類にも適用することができ、多項ロジスティック回帰あるいはソフトマックス回帰と呼ばれます。2クラス分類の場合、教師データは0か1の1つの値で、モデルの出力である確率$\hat{p}$も1つの値でしたが、他クラス分類では教師データは次元がクラス数だけあるベクトル（正解となるクラスに対応する要素のみ1、それ以外の要素は0）で考えます。また確率$\hat{p}$も各クラスに対して算出され、全クラスの確率の合計は1となります。すなわち多項ロジスティック回帰を定式化すると次のようになります。
```math
\begin{align}
s_{k}(\boldsymbol{x}) &= \boldsymbol{\theta}_k^\mathsf{T}\boldsymbol{x} \\
\hat{p_k} &= \frac{e^{s_{k}(\boldsymbol{x})}}{\sum_{j=1}^{K}e^{s_{j}(\boldsymbol{x})}}
\end{align}
```
* $s_{k}(\boldsymbol{x})$はスコアと呼ばれ、入力データ$\boldsymbol{x}$がクラス$k$に属する可能性がどれだけあるかを示しています。正規化されていないためデータは0から1の範囲度とは限りません。
* $\boldsymbol{\theta}_k$はスコアを算出するためのパラメタであり、各クラス毎に別々に定義されます。
* $\hat{p_k}$は$\boldsymbol{x}$がクラス$k$に属する確率を表し、スコアをソフトマックス関数で正規化することで計算されます。

これらの式において$K=2$とすると2クラス分類となり、先程の2クラスの場合のロジスティック回帰と等価になります。

多項ロジスティック回帰のコスト関数は交差エントロピーとも呼ばれ次の式で表されます。
```math
\begin{align}
J(\boldsymbol{\Theta}) = -\frac{1}{m}\sum_{i=1}^{m}\sum_{k=1}^{K} y_k^{(i)} \log(\hat{p_k}^{(i)})
\end{align}
```
このコスト関数でも、先程と同様に正解となるクラスの確率が1に近く他のクラスの確率が0に近いほど値が小さくなっていきます。また$\boldsymbol{\Theta}$が大文字となっているのは各クラスに対応するパラメタ$\boldsymbol{\theta}_k$を$K$個集めたものがコスト関数のパラメタになっていることを意味しています。

多項ロジスティック回帰のコスト関数の微分も先程と同様に計算され下記の通りとなります。

```math
\begin{align}
\frac{\partial}{\partial \boldsymbol{\theta_k}}J(\boldsymbol{\Theta}) 
= \frac{1}{m}\sum_{i=1}^{m}\left(
\hat{p_k}^{(i)}
-
y_k^{(i)}
\right)
\boldsymbol{x}^{(i)}
\end{align}
```

コスト関数及びその微分を定式化することが出来たので、次回は実際のデータを使ってロジスティック回帰、多項ロジスティック回帰を実行していきます。