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

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

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

概要

この記事ではロジスティック回帰をニュートン法で解を求めるためのヘッセ行列(二階微分)を求めます。

数値計算のためのヘッセ行列導出

ロジスティック回帰で交差エントロピー誤差E(\mathbf{w})を定義し、その偏微分が


\displaystyle \frac{\partial E(\mathbf{w})}{\partial \mathbf{w}} = \sum_{n=1}^{N}(y_n - t_n)\mathbf{x}_n \tag{1}

であることを確認しました。今回は、ニュートン法によって最適解を求めるため、交差エントロピー誤差のヘッセ行列を求めてみます。(参考:ニュートン法(多変数の場合)

\displaystyle \frac{\partial E(\mathbf{w})}{\partial \mathbf{w}} i番目の要素の、w_jでの偏微分


\displaystyle \frac{\partial}{\partial w_j}\sum_{n=1}^{N}(y_n - t_n)x_{ni} \tag{2}

を考えます。表記がちょっとわかりづらいんですが、x_{ni}は、n番目の訓練データのi次元目の要素を意味しています。


y_n = \sigma(\mathbf{w}^{T}\mathbf{x}_n) = \sigma(g(\mathbf{w})) \tag{3}

とすれば、合成関数の微分を使って


\begin{eqnarray*}
\displaystyle \frac{\partial}{\partial w_j}\sum_{n=1}^{N}(y_n - t_n)x_{ni}  &=& \frac{\partial}{\partial y}\frac{\partial y}{\partial g}\frac{\partial g}{\partial w_j}\sum_{n=1}^{N}(y_n - t_n)x_{ni}\tag{4} \\
&=& \sum_{n=1}^{N}x_{ni}y_n(1-y_n)x_{nj} \tag{5} \\
&=&\sum_{n=1}^{N}y_n(1-y_n)x_{ni}x_{nj} \tag{6}
\end{eqnarray*}

です。(参考:シグモイド関数の微分

\displaystyle \frac{\partial E(\mathbf{w})}{\partial \mathbf{w}} i番目の要素のw_jでの偏微分が式(6)になるのですから、\mathbf{x}D次元ベクトルなら、ベクトルをベクトルで微分の定義


\displaystyle \frac{\partial \mathbf{y}}{\partial \mathbf{x}} = \left(
    \begin{array}{cccc}
      \frac{\partial y_1}{\partial x_1} & \frac{\partial y_1}{\partial x_2} & \ldots & \frac{\partial y_1}{\partial x_n} \\
      \frac{\partial y_2}{\partial x_1} & \frac{\partial y_2}{\partial x_2} & \ldots & \frac{\partial y_2}{\partial x_n} \\
      \vdots & \vdots & \ddots & \vdots \\
      \frac{\partial y_m}{\partial x_1} & \frac{\partial y_m}{\partial x_2} & \ldots & \frac{\partial y_m}{\partial x_n}
    \end{array}
  \right) \tag{7}

より(参考:ベクトルをベクトルで微分の定義とヘッセ行列)、


\displaystyle \frac{\partial^{2} E(\mathbf w)}{\partial \mathbf{w} \partial \mathbf{w}^{T}} = \left(
    \begin{array}{ccc}
      \displaystyle \sum_{n=1}^{N}y_n(1-y_n)x_{n1}x_{n1} & \ldots & \displaystyle \sum_{n=1}^{N}y_n(1-y_n)x_{n1}x_{nD} \\
      \vdots  & \ddots & \vdots \\
      \displaystyle \sum_{n=1}^{N}y_n(1-y_n)x_{nD}x_{n1}  & \ldots & \displaystyle \sum_{n=1}^{N}y_n(1-y_n)x_{nD}x_{nD}
    \end{array}
  \right) \tag{8}

です。これがロジスティック回帰における交差エントロピー誤差のヘッセ行列\mathbf{H}です。

ここで


\begin{eqnarray*}
\mathbf{R} &=&  \left(
    \begin{array}{ccc}
      y_1(1-y_1) &  & 0 \\
       &   \ddots &  \\
       0 &    & y_N(1-y_N)
    \end{array}
  \right) \tag{9} \\
\mathbf{X} &=&  \left(
    \begin{array}{ccc}
      x_{11} & \cdots & x_{1D} \\
       \vdots &   \ddots & \vdots  \\
       x_{N1} &    \cdots & x_{ND}
    \end{array}
  \right)  \tag{10}
\end{eqnarray*}

とすれば、式(8)は


\mathbf{H} =  \mathbf{X}^{T} \mathbf{R} \mathbf{X} \tag{11}

と書くこともできます。\mathbf Rは重み付け行列と呼ばれるようです。なお式(8)と式(11)が等しいことは書き出してみれば簡単に確認できます。相変わらずこういうのに慣れなくて、頭の中で計算できません、、、。

さて、ヘッセ行列が求められましたから、次回これを用いてニュートン法によりロジスティック回帰の解を求めてみたいと思います。なお交差エントロピー誤差は凸関数であり唯一の最小値を持ちます。(参考:ロジスティック回帰における交差エントロピー誤差の凸関数性


(後日追記)

勾配のi番目の要素をw_jで偏微分とかまわりくどいことをしなくても、式(1)をもう一度\mathbf{w}で微分するだけで良いようです。それはまあそうなんですけど。


\displaystyle \frac{\partial^{2} E(\mathbf w)}{\partial \mathbf{w} \partial \mathbf{w}^{T}} = \sum_{n=1}^{N} y_n(1-y_n)\mathbf{x}_{n}\mathbf{x}_{n}^{T} \tag{12}

ヘッセ行列は\displaystyle \mathbf{H} = \frac{\partial^{2} f}{\partial \mathbf{x} \partial \mathbf{x}^{T}}と表記されるので(参考:ベクトルをベクトルで微分の定義とヘッセ行列Matrix calculus - Wikipedia)、\displaystyle \frac{\partial E(\mathbf{w})}{\partial \mathbf{w}}\mathbf{w}^{T}で微分すれば式(12)のように計算できますが、、、そういう考え方でいいのかな?何か勘違いしている点があればご指摘ください。