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

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

多クラスロジスティック回帰における交差エントロピー誤差のヘッセ行列

概要

多クラスロジスティック回帰の続きです。尤度関数から交差エントロピー誤差関数を定義し、その勾配を求めました。ニュートン法を用いて解を数値計算することが目的ですので、今回はさらに微分してヘッセ行列を求めます。

ヘッセ行列を導出

多クラスロジスティック回帰より、交差エントロピー誤差をE(\mathbf w)として、


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

でした。式(1)を\mathbf{w}_{j}で微分したものを\mathbf{H}_{ij}と書けば、ロジスティック回帰における交差エントロピー誤差のヘッセ行列の追記で書いたように、


\displaystyle \mathbf{H}_{ij} = \frac{\partial^{2} E(\mathbf w)}{\partial \mathbf{w}_{i} \partial \mathbf{w}_{j}^{T}} \tag{2}

です。合成関数の微分より、


\begin{eqnarray*}
\displaystyle \mathbf{H}_{ij} &=& \frac{\partial^{2} E(\mathbf w)}{\partial \mathbf{w}_{i} \partial \mathbf{w}_{j}^{T}} \tag{3} \\
&=& \frac{\partial^2 E(\mathbf{w})}{\partial \mathbf{w}_{i}\partial y_{ni}} \frac{\partial y_{ni}}{\partial a_{nj}}\frac{\partial a_{nj}}{\partial \mathbf{w}_{j}^{T}} \tag{4}\\
&=& \sum_{n=1}^{N} y_{ni}(I_{ij} - y_{nj})\mathbf{x}_n\mathbf{x}_{n}^{T} \tag{5} \\
\end{eqnarray*}

です。この計算はロジスティック回帰における交差エントロピー誤差のヘッセ行列の追記でも書いたのですが、考え方が合っているのか自信がない。さらに参考書やネット上の解説では、式(5)のy_{ni}y_{nj}が逆になっていて、どうやったらそういう計算になるのか?ギブアップ。詳しい方いましたら助けてください。ただ、 y_{ni}(I_{ij} - y_{nj})i \ne jでは -y_{ni} y_{nj}ですし、i=jでは y_{ni}(1 - y_{nj})=y_{nj}(1 - y_{ni})なので、値自体は等しいのですが。*1

ということで、ここは相当悩んだ挙げ句解決できなかったのですが、値はどっちにしても等しいということで先に進むことにしました。

さて、勾配は式(1)を\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{6}

でした。このi成分を\mathbf{w}_{j}^{T}で微分したものが\mathbf{H}_{ij}となりますので、求めるヘッセ行列は


\displaystyle \mathbf{H} = \left(
    \begin{array}{cccc}
      \mathbf{H}_{11} & \mathbf{H}_{12} & \ldots & \mathbf{H}_{1K} \\
      \mathbf{H}_{21} & \mathbf{H}_{22} & \ldots & \mathbf{H}_{2K} \\
      \vdots & \vdots & \ddots & \vdots \\
      \mathbf{H}_{K1} & \mathbf{H}_{K2} & \ldots & \mathbf{H}_{KK}
    \end{array}
  \right) \tag{7}

となります。

2クラスの場合と同様に、


\begin{eqnarray*}
\mathbf{R}_{ij} &=&  \left(
    \begin{array}{ccc}
      y_{1i}(I_{ij}-y_{1j}) &  & 0 \\
       &   \ddots &  \\
       0 &    & y_{Ni}(I_{ij}-y_{Nj})
    \end{array}
  \right) \tag{8} \\
\mathbf{X} &=&  \left(
    \begin{array}{ccc}
      x_{11} & \cdots & x_{1D} \\
       \vdots &   \ddots & \vdots  \\
       x_{N1} &    \cdots & x_{ND}
    \end{array}
  \right)  \tag{9}
\end{eqnarray*}

とすれば、


\mathbf{H}_{ij} =  \mathbf{X}^{T} \mathbf{R}_{ij} \mathbf{X} \tag{10}

です。ヘッセ行列が求められましたので、ニュートン法によって多クラスロジスティック回帰の解を求めることができるようになりました。

これを用いた実験結果はこちらです。 www.iwanttobeacat.com


*1:書いた数年後、何に引っかかっていたのか忘れてしまったのでいったん削除