はじめに
先のページでは1次元ロジスティック回帰について考察した。ここでは、多次元ロジスティック回帰を取り上げる。
多次元ロジスティック回帰
多分類問題を考える。$N$ 個の $D$ 次元ベクトル $\vec{x}^{\;n},n=1,\cdots,N$ が与えられ、それぞれが ${1,\cdots,K}$ のいずれかのラベルを持つとする。このとき、観測値が従う確率分布モデル $p(c=1,\cdots,K\;|\;\vec{x}\;;\;W,\vec{b})$ を求めたい。ここで、$W,\vec{b}$ はモデルを調節するパラメータである。$W$ は $D \times K$ 行列、$\vec{b}$ は $K$ 次元ベクトルである。各観測値が他の観測値の影響を受けないと仮定すれば、全ての観測値の確率は次式で与えられる。 \begin{equation} L(W,\vec{b})=\prod_{n=1}^{N}\;p(c^{n}\;|\;\vec{x}^{\;n}\;;\;W,\vec{b}) \label{likelihood} \end{equation} これが最大となるように $(W,\vec{b})$ を調節すればよい。計算を容易にするため次式の最小化を考える。 \begin{equation} L(W,\vec{b})=-\sum_{n=1}^{N}\;\ln{p(c^{n}\;|\;\vec{x}^{\;n}\;;\;W,\vec{b})} \label{nll} \end{equation} 上式を負の対数尤度(Negative Log Likelihood:NLL)関数と呼ぶ。確率 $p$ は次式で定義される。 \begin{equation} p(c\;|\;\vec{x}\;;\;W,\vec{b})=\prod_{k=1}^{K}\;(y_k)^{t_k} \label{prob} \end{equation} ここで、$y_k$ は $K$ 次元ベクトル $\vec{y}$ の $k$ 番目の成分、$t_k$ は $K$ 次元ベクトル $\vec{t}$ の $k$ 番目の成分である。$y_k$ は次式で定義される。 \begin{eqnarray} y_k &=& \pi\left(\;f_k\left( \vec{x}; W,\vec{b}\right)\;\right) \label{eprob}\\ \pi(a_k) &=& \frac{\exp{(a_k)}} {\sum_{j=1}^{K}\;\exp{(a_j)}} \label{softmax}\\ \vec{f}\left( \vec{x}; W,\vec{b}\right) &=& W^{T}\;\vec{x} + \vec{b}\label{projection} \end{eqnarray} 行列やベクトルの肩にある $T$ は転置を表す。$\vec{f}$ は $K$ 次元ベクトルであり、$f_k$ はその $k$ 番目の成分を表す。 $\vec{t}$ は、観測値 $\vec{x}$ が持つラベルに相当する成分を1、それ以外の成分を0とする $K$ 次元ベクトルである。 たとえば、ラベル $3$ を持つなら \begin{equation} \vec{t} = (0,0,1,0,\cdots,0)^T \end{equation} となる。式(\ref{softmax})をsoftmax関数と呼ぶ。 $a_k={0,\cdots,9}$としたときのsoftmax関数を下に示す。 次式が成り立つことに注意する。 \begin{equation} \sum_{k=1}^{K}\;\pi(a_k)=1 \end{equation} すなわち、 \begin{equation} \sum_{k=1}^{K}\;y_k=1 \end{equation} ということであり、観測値 $\vec{x}$ はいずれかのラベルに必ず属するということである。 式(\ref{nll})に式(\ref{prob})を代入すると次式を得る。 \begin{equation} L(W,\vec{b})=-\sum_{n=1}^{N}\;\sum_{k=1}^{K} t_k^n\;\ln{(y_k^n)} \end{equation} ここまでの議論をまとめる。
- 式(\ref{projection})を使って、$D$次元ベクトル(観測値)を $K$ 次元ベクトルに射影する。
- $K$ 次元ベクトルの各成分を使って確率(\ref{softmax})を導入する。
- 確率的勾配降下法を用いて対数尤度を最小化し、最適なモデルを決定する。
更新式
確率的勾配降下法については先のページで説明したので、ここでは更新式だけを示す。
式(\ref{nllspecial})を $W$ の成分 $w_{dk}$ で微分する。 \begin{eqnarray} \frac{\partial L}{\partial w_{dk}} &=& -\sum_{n=1}^{N}\;\sum_{s=1}^{K}\;t_{sn}\frac{1}{y_{sn}}\frac{\partial y_{sn}}{\partial a_{sn}}\frac{\partial a_{sn}}{\partial w_{dk}} \end{eqnarray} ここで、 \begin{eqnarray} \frac{\partial y_{sn}}{\partial a_{sn}}&=&y_{sn}(1-y_{sn}) \\ \frac{\partial a_{sn}}{\partial w_{dk}}&=&x_{dn}\;\delta_{ks} \end{eqnarray} が成り立つので、これらを代入すると、 \begin{eqnarray} \frac{\partial L}{\partial w_{dk}} &=& \sum_{n=1}^{N}\;t_{kn}(y_{kn}-1)\;x_{dn} \\ &=& \sum_{n=1}^{N}\;(y_{kn}-t_{kn})\;x_{dn} \end{eqnarray} を得る。ただし、$t_{kn}\;y_{kn}=y_{kn}$ を用いた。同様に $b_k$ で微分すると次式を得る。 \begin{equation} \frac{\partial L}{\partial b_{k}} = \sum_{n=1}^{N}\;(y_{kn}-t_{kn}) \end{equation} いま、$e_{kn}=y_{kn}-t_{kn}$ と置くと \begin{eqnarray} \frac{\partial L}{\partial w_{dk}} &=& \sum_{n=1}^{N}\; x_{dn}\;e_{kn}\; \\ &=& \left(X\;E^T\right)_{dk} \label{update1}\\ \frac{\partial L}{\partial b_{k}} &=& \sum_{n=1}^{N}\;e_{kn} \label{update2} \end{eqnarray} となる。ここで $E$ は $e_{kn}$ を成分とする行列、$X$ は $x_{dn}$ を成分とする行列である。これらより更新式は以下のようになる。 \begin{eqnarray} w_{dk} &\leftarrow& w_{dk} - \eta \; \left(X\;E^T\right)_{dk} \\ b_{k} &\leftarrow& b_{k} - \eta \; \sum_{n=1}^{N}\;e_{kn} \end{eqnarray} この更新式を使って、確率的勾配降下法を実行する。以下に各行列を書き下ろしておく。 \begin{eqnarray} Y &=& \left(\begin{array}{cccc} y_{11} & y_{12} & \cdots & y_{1N} \\ y_{21} & y_{22} & \cdots & y_{2N} \\ \vdots & \vdots & \ddots & \vdots \\ y_{K1} & y_{K2} & \cdots & y_{KN} \end{array} \right) = {\bf \pi}(W^T\;X+B)\label{pi}\\ \nonumber\\[3pt] W &=& \left(\begin{array}{cccc} w_{11} & w_{12} & \cdots & w_{1K} \\ w_{21} & w_{22} & \cdots & w_{2K} \\ \vdots & \vdots & \ddots & \vdots \\ w_{D1} & w_{D2} & \cdots & w_{DK} \end{array} \right)\\ \nonumber\\[3pt] X &=& \left(\begin{array}{cccc} x_{11} & x_{12} & \cdots & x_{1N} \\ x_{21} & x_{22} & \cdots & x_{2N} \\ \vdots & \vdots & \ddots & \vdots \\ x_{D1} & x_{D2} & \cdots & x_{DN} \end{array} \right)\\ \nonumber\\[3pt] B &=& \left(\begin{array}{cccc} b_{1} & b_{1} & \cdots & b_{1} \\ b_{2} & b_{2} & \cdots & b_{2} \\ \vdots & \vdots & \ddots & \vdots \\ b_{K} & b_{K} & \cdots & b_{K} \end{array} \right) \\ \nonumber\\[3pt] T &=& \left(\begin{array}{cccc} t_{11} & t_{12} & \cdots & t_{1N} \\ t_{21} & t_{22} & \cdots & t_{2N} \\ \vdots & \vdots & \ddots & \vdots \\ t_{K1} & t_{K2} & \cdots & t_{KN} \end{array} \right) \\[3pt] E &=& Y-T \end{eqnarray} $B$ は同じ列から構成される $K\times N$ 行列である。 式(\ref{pi})の関数 $\pi$ は先に定義したsoftmax関数であり、行列の各成分に作用させることとする。
実装
pythonを使って実装を行なった。 $K=3$、$D=2$、$N=1500$とした。 すなわち、2次元平面上の3分類問題である。1500個の点を3等分し、各集合に1,2,3のラベルを割り振った。
- 8-9行目:式(\ref{softmax})である。
- 12-13行目:式(\ref{eprob})である。
- 16-21行目:式(\ref{update1}),(\ref{update2})である。
- 24-28行目:誤差を描画する関数である。
- 30-45行目:境界線を描画する関数である。
- 47-57行目:観測値を作る関数である。
- 59-64行目:ラベルを作る関数だる。
- 67-104行目:確率的勾配降下法を実行するコードである。
0 件のコメント:
コメントを投稿