[ディープラーニング] 多クラス分類問題

About

2クラス分類問題 (classification problem) とは、与えられたデータが\(N_c\) 個のクラスのどれに属するかを判別する問題です。

キーワード

  • 訓練データ (training data)
  • テストデータ (test data)
  • 誤差関数 (error function) /損失関数 (loss function)

訓練データ

訓練データとして、入力 \({\mathbf{x}} \in {\mathbb{R}^n}\) とその入力が属するクラス \(c \in \{1,2,\cdots,m\}\) のペアが与えられます。

\[\{ ({{\mathbf{x}}_1},{c_1}),({{\mathbf{x}}_2},{c_2}), \cdots ,({{\mathbf{x}}_N},{c_N})\} \]

クラス \(c\) から正解のクラスの成分が \(1\) で他はすべて \(0\) であるベクトル

\[{{\mathbf{t}}_k} = {[0, \cdots ,\underbrace 1_{{c_k}}, \cdots ,0]^T}\]

を作成します。

\[\{ ({{\mathbf{x}}_1},{{\mathbf{t}}_1}),({{\mathbf{x}}_2},{{\mathbf{t}}_2}), \cdots ,({{\mathbf{x}}_N},{{\mathbf{t}}_N})\} \]

目標関数

ニューラルネットワークは出力層のニューロン数をクラス数と同じ \(m\) 個とし、活性化関数はソフトマックス関数を採用します。
各出力値 \({y_1},{y_2}, \cdots ,{y_m}\) を入力が与えられたとき、そのクラスである条件付き確率 \(p(c = 1|{\mathbf{x}}),p(c = 2|{\mathbf{x}}), \cdots ,p(c = m|{\mathbf{x}})\) と解釈します。



そして、ニューラルネットワークが表現する関数を \(f(\mathbf{x};\mathbf{w})\) としたとき、以下の関数 \({f^*}\) に近似できるよう重み \(\mathbf{w}\) をうまく調整することを目指します。

\[{f^*}({\mathbf{x}}) = {\mathbf{t}} = {[0, \cdots ,\underbrace 1_c, \cdots ,0]^T}\]

サンプル \(1\) 個の場合

ニューラルネットワークの出力 \({\mathbf{y}}\) は各クラスに属する確率を意味したので、入力 \({\mathbf{x}}\) に対して、正解クラス \(c\) である確率は以下のようになります。

\[p(c = t|{\mathbf{x}}) = \left\{ {\begin{array}{*{20}{l}}
{{y_1}}&{(c = 1)} \\
{{y_2}}&{(c = 2)} \\
\vdots &{} \\
{{y_m}}&{(c = {N_c})}
\end{array}} \right. = \prod\limits_{c = 1}^{{N_c}} {{y^c}} \]

サンプル \(N\) 個の場合

訓練データ \({{\mathbf{x}}_1},{{\mathbf{x}}_2}, \cdots ,{{\mathbf{x}}_N}\) は独立であることを仮定しているので、訓練データ全体の正解率は次のようになります。

\[p(c = t|{\mathbf{x}}) = \left\{ {\begin{array}{*{20}{l}}
{{y_1}}&{(c = 1)} \\
{{y_2}}&{(c = 2)} \\
\vdots &{} \\
{{y_m}}&{(c = {N_c})}
\end{array}} \right. = \prod\limits_{c = 1}^{{N_c}} {{y^c}} \]

これを\({\mathbf{w}}\) の関数として見たものを 尤度関数 (likelihood function) といいます。
尤度関数の最大化、つまり正解率の最大化が目標です。
対数関数は単調増加関数なので、尤度関数を最大化するという目標は、対数をとった尤度関数の最大化と同値です。
これを対数尤度関数といいます。

\[\log \prod\limits_{k = 1}^N {\prod\limits_{c = 1}^{{N_c}} {{y_{kc}}^{{t_{kc}}}} } = \sum\limits_{k = 1}^N {\sum\limits_{c = 1}^{{N_c}} {{t_{nk}}\log {y_{kc}}} } \]

対数尤度関数を最大化するという目標は、符号を反転した対数尤度関数の最小化と同値です。
これを損失関数とします。

\[L({\mathbf{w}}) = – \sum\limits_{k = 1}^N {\sum\limits_{c = 1}^{{N_c}} {{t_{nk}}\log {y_{kc}}} } \]

出力層のデルタ

逆伝播法の記事で紹介しますが、逆伝播を実行する際に損失関数に対して、ニューラルネットワークの出力に関する偏微分係数

\[\delta _1^{(L)} = \frac{{\partial {E_N}}}{{\partial {u_1}}},\delta _2^{(L)} = \frac{{\partial {E_N}}}{{\partial {u_2}}}, \cdots ,\delta _m^{(L)} = \frac{{\partial {E_N}}}{{\partial {u_m}}}\]

を計算する必要があるため、ここで求めておきます。

\[\delta _j^{(L)} = \frac{{\partial {E_N}}}{{\partial {u_j}}} = – \frac{{\partial {E_N}}}{{\partial {u_j}}}\sum\limits_{k = 1}^N {\sum\limits_{c = 1}^{{N_c}} {{t_{nk}}\log {y_{kc}}} } = \sum\limits_{k = 1}^N {\sum\limits_{c = 1}^{{N_c}} {\frac{{{t_{nk}}}}{{{y_{kc}}}}\frac{{\partial {y_{kc}}}}{{\partial {u_j}}}} } = \sum\limits_{k = 1}^N {\left( {\frac{{{t_{nk}}}}{{{y_{kj}}}}\frac{{\partial {y_{kj}}}}{{\partial {u_j}}} + \sum\limits_{c \ne j}^{{N_c}} {\frac{{{t_{nk}}}}{{{y_{kc}}}}\frac{{\partial {y_{kc}}}}{{\partial {u_j}}}} } \right)} \]

出力層の活性化関数はソフトマックス関数であるから、\(\frac{{\partial {y_k}}}{{\partial {u_j}}} = {y_k}(1 – {y_k})\) となる。よって、

\[\begin{gathered}
\sum\limits_{k = 1}^N {\left( {\frac{{{t_{nk}}}}{{{y_{kj}}}}\frac{{\partial {y_{kj}}}}{{\partial {u_j}}} + \sum\limits_{c \ne j}^{{N_c}} {\frac{{{t_{nk}}}}{{{y_{kc}}}}\frac{{\partial {y_{kc}}}}{{\partial {u_j}}}} } \right)} \hfill \\
= \sum\limits_{k = 1}^N {\left( {\frac{{{t_{nk}}}}{{{y_{kj}}}}{y_{kj}}(1 – {y_{kj}}) + \sum\limits_{c \ne j}^{{N_c}} {\frac{{{t_{nk}}}}{{{y_{kc}}}}\left( { – {y_{kc}}{y_{kj}}} \right)} } \right)} \hfill \\
= \sum\limits_{k = 1}^N {\left( {{t_{nk}}(1 – {y_{kj}}) – ({N_c} – 1){t_{nk}}{y_{kj}}} \right)} \hfill \\
= \sum\limits_{k = 1}^N {\left( {{t_{nk}} – {t_{nk}}{y_{kj}}} \right)} \hfill \\
\end{gathered} \]

コメントを残す

メールアドレスが公開されることはありません。