Shingoの数学ノート

プログラミングと機械学習のメモ

ロジスティック回帰と最尤推定法

今回は意外と難しいロジスティック回帰と最尤推定法について解説します。

最尤推定法についてはこちらをご覧ください。

線形回帰分析と最尤推定法についてはこちらをご覧ください。

また、ロジスティック回帰のコードはこちらをご覧ください。

ロジスティック回帰分析

ロジスティック回帰は、0,1の2値を取るデータを分類する問題を解くときに使用するモデルです。

yiy_iを目的変数、xikx_{ik}を説明変数とすると、ロジスティック回帰は以下のように表すことができます。

yi=11+exp((β0+β1xi1+β2xi2++βKxiK))\begin{aligned} y_i = \frac{1}{1+\exp(-(\beta_0+\beta_1x_{i1}+\beta_2x_{i2}+\cdots+\beta_Kx_{iK}))} \end{aligned}

また、シグモイド関数を以下の式で定義します。

σ(x)=11+exp(x)\begin{aligned} \sigma(x)=\frac{1}{1+\exp(-x)} \end{aligned}

シグモイド関数は0から1の値を取り、以下のような関数です。

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

yi=σ(β0+β1xi1+β2xi2++βKxiK)\begin{aligned} y_i=\sigma(\beta_0+\beta_1x_{i1}+\beta_2x_{i2}+\cdots+\beta_Kx_{iK}) \end{aligned}

シグモイド関数の性質からyiy_iは0から1の値を取るため、0,1の2値を表す確率変数CiC_iを用いて以下のように定義することができます。

P(Ci=1xi1,,xiK)=yiP(Ci=0xi1,,xiK)=1yi\begin{aligned} P(C_i=1|x_{i1},\cdots,x_{iK})&=y_i\\ P(C_i=0|x_{i1},\cdots,x_{iK})&=1-y_i \end{aligned}

上記をまとめると、データiiの実現値をtit_i(0か1の2値をとる)として以下のように書くことができます。(tit_iに0と1を入れると上の式になることが確認できます。)

P(Ci=tixi1,,xiK)=yiti(1yi)1ti\begin{aligned} P(C_i=t_i|x_{i1},\cdots,x_{iK})=y_i^{t_i}(1-y_i)^{1-t_i} \end{aligned}

ロジスティック回帰と最尤推定法

※以下では、文字を太字で書いた場合にはベクトルを表すことにします。(たとえば、x=(x11,x12,,xnK)\mathbf{x}=(x_{11},x_{12},\cdots,x_{nK})を表します。)

この章では、パラメータβ\mathbf{\beta}を最尤推定法を用いて求めます。

その前に、最尤推定法のおさらいです。

(離散確率分布における)最尤推定法は、「パラメータをいろいろ変えて今あるデータで確率を出してみて、確率が最も高いものをもとのパラメータとしよう」という考えのもと推定していきます。当然パラメータは無限の可能性がありいちいち代入していられないので、パラメータを変数とみた関数を考え、確率が最大となるパラメータを最尤推定値とします。このパラメータを変数とみた関数を尤度関数といいます。

パラメータはβ\mathbf{\beta}であることとデータが独立であることを考えると、尤度関数LLは以下のように算出することができます。

L=P(C0=t0,,Cn=tnx,β)=i=1nP(Ci=tixi,β)=i=1nyiti(1yi)1ti\begin{aligned} L &= P(C_0=t_0,\cdots,C_n=t_n|\mathbf{x},\mathbf{\beta})\\ &=\prod_{i=1}^nP(C_i=t_i|\mathbf{x}_i,\mathbf{\beta})\\ &=\prod_{i=1}^ny_i^{t_i}(1-y_i)^{1-t_i} \end{aligned}

このままでは計算しづらいので、対数を取って対数尤度関数を求めます。(対数は単調増加関数なので、尤度関数が最大となるパラメータは対数を取る前と後で変化することはありません。)

logL=i=1n{tilogyi+(1ti)log(1yi)}\begin{aligned} \log L=\sum_{i=1}^n\{t_i\log y_i+(1-t_i)\log (1-y_i)\} \end{aligned}

パラメータβ\mathbf{\beta}の最尤推定値を求めるためには、対数尤度関数が最大となるβ\mathbf{\beta}を求めます。

ここで機械学習では、最適化をする場合は損失関数を定義し、最大化ではなく最小化を目指す慣習があります。

従って、対数尤度関数にマイナスをかけて損失関数を定義します。

E=i=1n{tilogyi+(1ti)log(1yi)}\begin{aligned} E=-\sum_{i=1}^n \{t_i\log y_i+(1-t_i)\log (1-y_i) \} \end{aligned}

この損失関数を交差エントロピー誤差と呼びます。これを最小にするパラメータβ\mathbf{\beta}を求めます。

交差エントロピー誤差について

交差エントロピー誤差を詳しく見ていきます。

データiiの交差エントロピーをEiE_iと書くと、tit_iは0と1しか取らないことから、以下のように書くことができます。

Ei={logyi(ti=1)log(1yi)(ti=0)\begin{aligned} E_i=\left\{ \begin{array}{l} -\log y_i \qquad\quad &(t_i = 1) \\ -\log(1-y_i) \qquad &(t_i = 0) \end{array} \right. \end{aligned}

ti=0,1t_i=0,1のグラフをそれぞれ書いてみると以下のようになります。

ここから、以下のことがわかります。

  • ti=1t_i=1のときは予測確率が1に近いほど損失関数の値が小さい。
  • ti=0t_i=0のときは予測確率が0に近いほど損失関数の値が小さい。

損失関数を最小化するということは、上記を目指すことと一致します。

交差エントロピー誤差の最小化

さて、交差エントロピー誤差が最小となるパラメータβ\betaを求めるため、偏微分していきましょう。

Eβk=i=1nβk{tilogyi+(1ti)log(1yi)}\begin{aligned} \frac{\partial E}{\partial \beta_k} &= -\sum_{i=1}^n\frac{\partial}{\partial \beta_k}\{t_i\log y_i+(1-t_i)\log (1-y_i)\}\\ \end{aligned}

シグマの中身の微分を一つずつ処理していきます。

まずは、βklogyi\frac{\partial}{\partial \beta_k}\log y_iを計算します。

zi=β0+β1xi1+β2xi2βkxikz_i=\beta_0+\beta_1x_{i1}+\beta_2x_{i2}\cdots\beta_kx_{ik}とおくと、yi=σ(zi)y_i=\sigma(z_i)であり、 σ(x)=(11+ex)=ex(1+ex)2=ex1+ex11+ex=(1σ(x))σ(x)\sigma(x)'=(\frac{1}{1+e^{-x}})'=\frac{e^{-x}}{(1+e^{-x})^2}=\frac{e^{-x}}{1+e^{-x}}\cdot\frac{1}{1+e^{-x}}=(1-\sigma(x))\sigma(x) に注意すると、以下のように変形できます。

βklogyi=1yiyiβk=1yiziβkziσ(zi)=1yixik(1σ(zi))σ(zi)=1yixik(1yi)yi=(1yi)xik\begin{aligned} \frac{\partial}{\partial \beta_k}\log y_i&=\frac{1}{y_i}\frac{\partial y_i}{\partial \beta_k}\\ &=\frac{1}{y_i}\frac{\partial z_i}{\partial \beta_k}\frac{\partial}{\partial z_i}\sigma(z_i)\\ &=\frac{1}{y_i}x_{ik}(1-\sigma(z_i))\sigma(z_i)\\ &=\frac{1}{y_i}x_{ik}(1-y_i)y_i\\ &=(1-y_i)x_{ik} \end{aligned}

次に、βklog(1yi)\frac{\partial}{\partial \beta_k}\log (1-y_i)を計算します。計算はほぼ上記と同じです。

βklog(1yi)=11yiyiβk=11yi(1yi)yixik=yixik\begin{aligned} \frac{\partial}{\partial \beta_k}\log (1-y_i)&=-\frac{1}{1-y_i}\frac{\partial y_i}{\partial \beta_k}\\ &=-\frac{1}{1-y_i}(1-y_i)y_ix_{ik}\\ &=-y_ix_{ik} \end{aligned}

以上の計算結果を使うと、交差エントロピー誤差の偏微分は以下のようになります。

Eβk=i=1nβi{tilogyi+(1ti)log(1yi)}=i=1n{ti(1yi)xik+(1ti)yixik}=i=1n(tiyi)xi=i=1n(yiti)xik\begin{aligned} \frac{\partial E}{\partial \beta_k} &= -\sum_{i=1}^n\frac{\partial}{\partial \beta_i}\{t_i\log y_i+(1-t_i)\log (1-y_i)\}\\ &=-\sum_{i=1}^n\{t_i(1-y_i)x_{ik}+(1-t_i)(-y_ix_{ik})\}\\ &=-\sum_{i=1}^n(t_i-y_i)x_i = \sum_{i=1}^n(y_i-t_i)x_{ik} \end{aligned}

とても綺麗な式になりました。

ここから偏微分=0となるβ\mathbf{\beta}を求めたいですが、解析的には解くことができません。

そこで、勾配降下法を用いてβ\mathbf{\beta}を求めます。

勾配降下法は以下の式を使用してβk\beta_kを更新します。α\alphaは学習率です。

βkβkαEβk\begin{aligned} \beta_k \leftarrow \beta_k-\alpha\frac{\partial E}{\partial \beta_k} \end{aligned}

学習率α\alphaを入れないで通常の偏微分を引いてしまうと、引く幅が大きくなってしまい、収束しません。 従って、α=0.01\alpha= 0.01などを入れて引く幅を小さくします。

また、Eβk=i=1n(yiti)xik\frac{\partial E}{\partial \beta_k} = \sum_{i=1}^n(y_i-t_i)x_{ik}はデータ数に依存して大きくなってしまうので、 実際には代わりにデータ数で割った1ni=1n(yiti)xik\frac{1}{n}\sum_{i=1}^n(y_i-t_i)x_{ik}を引くことも多いです。 (定数で割ることは更新幅のみに影響するので問題ありません。) 後ほど紹介するコードではデータ数で割った式で更新しています。

パラメータの更新は、交差エントロピー誤差がほとんど動かなくなったら終了です。

なお、厳密には勾配降下法で求めることができるのは極小値です。最小値であることは、損失関数の凸性を示す必要があります。

ここでは証明しませんが、交差エントロピー誤差は凸であることが知られていますので、勾配降下法で最小値を求めることができます。

実際の結果

勾配降下法を用いてロジスティック回帰を回した結果はこのコードを実行してみてください。

まとめ

ロジスティック回帰と最尤推定法に関してまとめました。

交差エントロピー誤差を知っている方は多いかもしれませんが、 なぜ交差エントロピーが使用されているかは最尤推定法を学ぶと理解できるかと思います。

最尤推定法は統計的手法のあらゆる箇所で使用されているので、今後も紹介できたらなと思います。

Comments

Loading comments...