3.ロジスティック回帰

はじめに

ここではロジスティック回帰について見ていく。ADALINEとの違い、そして重要点はなんといってもシグモイド関数の登場である。

活性化関数に非線形であるシグモイド関数を用いることで多層化が意味をなすようになる点で、ディープラーニングにとって重要なものである。

シグモイド関数の意味や成り立ちから、それを用いたロジスティック回帰の学習方法を説明していく。

ロジスティック回帰とは

ロジスティック回帰(logistic regression)

線形分類問題と二値分類問題を得意とする単純ながら強力なアルゴリズム

ADALINEとの違いはただ1つ

シグモイド関数を活性化関数に用いていること

というわけでシグモイド関数について見ていこう。

シグモイド関数の意味

ロジスティックシグモイド(logistic sigmoid)関数とも呼ばれ、これを用いたアルゴリズムなのでロジスティック回帰と呼ばれる。

統計学においても用いられるシグモイド関数。

その形はこのようななめらかな曲線であり、式で表すと

$$h(z)=\frac{1}{1+exp(-z)}$$

これの意味を考えてみよう。

シグモイド関数は確率と密接な関係がある。

オッズ比とロジット関数

確率\(p\)で起こる事象\(A\)がある。この\(A\)が起こる確率\(p\)と起こらない確率\(1-p\)の比\(\frac{p}{1-p}\)をオッズ比と呼ぶ。

このオッズ比に対数をとった、対数オッズ比を考える。

$$logit(p)=log\frac{p}{1-p}$$

これを関数とみなしたものがロジット関数である。

ロジット関数は以下のような形であり、変数である確率\(p\)は0と1の間をとる。

つまり、確率0%〜100%を\(-\infty\)から\(\infty\)の実数全体に変換する関数と捉える事ができる。

この関数を使って、総和\(z\)と対数オッズとの間の線形関係を表すことができる。

$$logit(p)=z=w_0 x_0+w_1 x_1+…+w_m x_m$$

例えば\(z=0\)である時、\(logit(p)=0\)となるのは\(p=50%\)の時である。

\(z=2\)だったら確率\(p\)は何パーセントか?

\(z=-3\)だったら確率\(p\)はとても小さそうだな

てことで、この\(p\)を求めるための関数が欲しい!

ではロジット関数の逆関数を考えよう。

ロジット関数の逆関数=シグモイド関数

$$z=log\frac{p}{1-p}$$

$$e^z=\frac{p}{1-p}$$

$$e^z-pe^z=p$$

$$p=\frac{e^y}{1+e^-y}=\frac{1}{1+e^{-y}}$$

よってロジット関数の逆関数は

$$h(z)=\frac{1}{1+exp(-z)},\left(~exp(-z)=e^{-z}\right)$$

であり、これこそが(ロジスティック)シグモイド関数なのだ。

これにより、\(z\)の値から\(h(z)\)を用いて確率\(p\)を算出できる。

\(z\)がマイナスで小さかったら確率は0%に近づき、

\(z\)がちょうど0なら確率もちょうど50%、

\(z\)が大きければ確率も100%に近づいていく。

シグモイド関数は総和\(z\)を確率へと変換するのだ。

シグモイド関数の特徴と利点

前述のとおり、シグモイド関数の最大の特徴は確率を算出できるようになったことである。

しかし今まで通り確率ではなく○ or ×での分類も可能だ。

シグモイド関数の出力値\(h(z)\)を今までも用いていた閾値関数に入れてみる。

閾値関数は

$$\hat{y}=1~~h(z)\le 0$$

$$\hat{y}=0~~h(z) < 0$$

であった。つまり\(h(z)\)が50%以上なら○、50%未満なら×と分類することであり今まで通り分類も可能である。

シグモイド関数は確率を算出することも○×分類を行うこともできる。

層の深いネットワークでは途中の層では確率で計算を行い、最後の出力で分類で結果表示を行う使い方が考えられる。

そしてシグモイド関数は非線形関数であることも利点の1つである。

線形関数\(h(z)=cz\)で多層化を行った場合、

\(y(x)=h(h(h(x)))=c^3x\)となり、これは\(c=c^3\)とすれば単層でも表現できることになる。

つまり線形関数では多層化が意味をなさない。

非線形関数のおかげで多層化による複雑モデルの構築ができることも頭に入れておこう。

シグモイド関数の利点は学習における最適化での勾配計算でも登場する。

ということでロジスティック回帰の学習を見ていこう。

ロジスティック回帰における学習

学習とは重みの設計である

ロジスティック回帰での重みの更新を見ていこう。

最尤推定によるコスト関数

ADALINEでは誤差平方和のコスト関数を定義し、これを最小になるよう重みを更新していった。

ロジスティック回帰では最尤推定を用いる。

最尤推定とは観測された事象の確率(=尤度)が最大となるようにパラメータを決めることである。

そこで尤度Lを定義する。

$$L(w)=P(y|x;w)=\Pi^n_{i=0}P(y^i|x^i;w)=\Pi_{i=0}^n(h(z^i))^{y(i)}(1-h(z^i))^{1-y^i}$$

これを最大化することを考えるのだが、微分を考える際、対数関数の方が容易に計算ができるし、微分しても最大となる点も変わらないため対数をとる。

$$l(w)=\log L(w)=\sum_{i=0}^n [y^i \log h(z^i)) +(1-y^i) \log (1-h(z^i))]$$

これを対数尤度関数と呼ぶ。

この最大化はマイナスをつけたものの最小化と同じ。よって最小化したいコスト関数を

$$J(w)=-l(w)=\log L(w)=\sum_{i=0}^n [-y^i \log h(z^i)) -(1-y^i) \log (1-h(z^i))]$$

とする。

この式の意味を理解すべく個々の学習データで正解ラベルyの場合分けをして考えると、

$$J(h(z),y;w)=-y\log (h(z))-(1-y)\log(1-h(z))$$

$$J(h(z),y;w)=-\log (h(z))~(y=1)$$

となる。

サンプルが\(y=1\)に属していることを正しく予測した場合\(h(z)=1\)に近づくので、コストは0に近づく。同様に,\(y=0\)であると正しく予測した場合は、\(h(z)=0\)へ行くのでコストも0に行く。

ただし、予測が間違っていた場合、コストは無限大に向かう。

つまり、尤度関数によるコストとは、

予測を間違えたら徐々にコストを引き上げるペナルティである。

コスト関数の勾配

ADALINEとアルゴリズムの流れは変わらない。

ただ、活性化関数とそれを用いるコスト関数が変わる。

コスト関数の勾配を計算しよう。結論はこうなる。

$$\Delta J(w)=\sum_i(y^i-h(z^i))x_j^i$$

これはADALINEでのコスト関数\(J(w)=\frac{1}{2}\sum_i(y^i-h(z^i))^2\)の勾配と同じである。

よって重みの更新式は

$$w:=w+\Delta w_j=w-\eta\sum_i(y^i-h(z^i))x_j^i$$

となる。

ADALINEアルゴリズムとの違い

違いはたった2つ。その2つを書き換えるだけでロジスティック回帰になる。

1つ目は活性化関数を線形活性化関数からシグモイド関数にする点。

2つ目はADALINEとの違いはコスト関数\(J(w)\)を新しいコスト関数\(J(w)=\sum_{i=0}^n [-y^i \log h(z^i)) -(1-y^i) \log (1-h(z^i))]\)にする点。

ここまでアルゴリズムが変化しないのは、コスト関数の勾配がADALINEと等しいため学習方法が等しくなるという結果のおかげである。

まとめ

シグモイド関数と確率の関係、シグモイド関数を用いた最尤推定によるコスト関数、そのコスト関数を用いたロジスティック回帰の学習方法を見てきた。

いよいよ次はニューラルネットワークである。

→次のニューラルネットワークの記事へ

付録

なぜロジスティック回帰のコスト関数の勾配とADALINEのコスト関数の勾配が等しいのか