機械学習に詳しくなりたいブログ

機械学習や数学について勉強した内容を中心に書きます。100%趣味です。記事は数学的に厳密でなかったり誤りを含んでいるかもしれません。ご指摘頂ければ幸いです。

多クラスロジスティック回帰

今回は、ロジスティック回帰で多クラスの識別をすることを考え、誤差関数とその勾配を求めます。

データ\mathbf{x}が与えられたとき、それがクラスC_kに属する事後確率は、


a_k = \ln (P(\mathbf{x}|C_k)P(C_k)) \tag{1}

として、


\displaystyle P(C_k|\mathbf{x}) = y_k = \frac{\exp(a_k)}{\sum_{j}\exp(a_j)} \tag{2}

と書けました。a_k\mathbf{w}_k^{T}\mathbf{x}でモデル化します。(参考:ソフトマックス関数

いま、訓練データ(\mathbf{x}_1, \cdots , \mathbf{x}_N )(\mathbf{t}_1, \cdots , \mathbf{t}_N )が与えられているとします。\mathbf{t}_nは1ofK符号です。尤度関数は


\displaystyle L(\mathbf{w}) = \prod_{n=1}^{N} \prod_{k=1}^{K} y_{nk}^{t_{nk}} \tag{3}

となります。t_{nk}n番目のデータの正解ラベルで、クラスKに属するなら1、そうでないなら0です。つまり式(3)は、正しく分類されたy_{nk}のみを抽出して積をとっている計算になります。ロジスティック回帰と同様、E(\mathbf{w}) = - \ln L(\mathbf{w})という交差エントロピー誤差関数を定義すれば


\displaystyle E(\mathbf{w}) = - \sum_{n=1}^{N} \sum_{k=1}^{K} t_{nk} \ln y_{nk} \tag{4}

となり、これを最小にする\mathbf{w}が求めるパラメータです。多クラスなので2クラスのロジスティック回帰とは異なり、求めるパラメータ\mathbf{w}はクラス数分存在します。合成関数の微分とソフトマックス関数の微分より、


\begin{eqnarray*}
\displaystyle \frac{\partial E(\mathbf{w})}{\partial \mathbf{w}_i} &=& \frac{\partial E(\mathbf{w})}{\partial y_{nk}} \frac{\partial y_{nk}}{\partial a_{ni}}\frac{\partial a_{ni}}{\partial \mathbf{w}_i} \tag{5} \\
\displaystyle &=& - \sum_{n=1}^{N}\sum_{k=1}^{K} \frac{t_{nk}}{y_{nk}} y_{nk} (I_{ki} - y_{ni}) \mathbf{x}_n \tag{6} \\
&=&  \sum_{n=1}^{N} \sum_{k=1}^{K}t_{nk}(y_{ni}-I_{ki})\mathbf{x}_n \tag{7}
\end{eqnarray*}

となります。I_{ki}は単位行列のki成分です。この式変形はすごい悩んだ。式(5)の書き方があんまりよくない、、というか間違ってるかもしれない。\sum_k{y}_ka_iで微分すると、a_iy_1, \cdots , y_k全てに影響しているので\sum_k \frac{\partial y_k}{\partial a_i}となることも注意。

ここで、t_{nk}k=1,\cdots,Kの中で、いずれか1つのみで1となるから、


\displaystyle \sum_{k=1}^{K} t_{nk} y_{ni} \mathbf{x}_n = y_{ni}\mathbf{x}_n \tag{8}

となります。また、k=iのときのみI_{ki}=1だから


\displaystyle \sum_{k=1}^{K} t_{nk} I_{ki} \mathbf{x}_n = t_{ni}\mathbf{x}_n \tag{9}

です。したがって、


\displaystyle \frac{\partial E(\mathbf{w})}{\partial \mathbf{w}_i} = \sum_{n=1}^{N}(y_{ni}-t_{ni})\mathbf{x}_n \tag{10}

となります。式(10)は入力D次元のベクトルです。

以上より、求める勾配は式(7)の微分を\mathbf{w}_1,\cdots,\mathbf{w}_Kまで並べた



 \left(
    \begin{array}{c}
      \displaystyle  \sum_{n=1}^{N} (y_{n1}-t_{n1})\mathbf{x}_n \\
      \vdots  \\
       \displaystyle \sum_{n=1}^{N} (y_{nK}-t_{nK})\mathbf{x}_n
    \end{array}
  \right) \tag{8}

となり、これはD \times K次元ベクトルです。これを用いて最急降下法で解を求めることができますが、ニュートン法を使うために次回はヘッセ行列を計算したいと思います。