アカデミック

【初学者向け】クロスエントロピーを分かりやすく解説。

この記事では,クロスエントロピーとは何かについてお伝えしていきます。深層学習ではとりあえずクロスエントロピーを使っておけば良いというような風潮がありますが,頭でっかちなニューラルネットワーク使いにならないためにも,しっかりとクロスエントロピーの原理をおさえておきましょう。

クロスエントロピーって結局こんな概念で,背後にこういう仮定を置いているんだよ!

と堂々とお話し(自慢)できることを目標に執筆していきます。分かりやすさを重視しているため,正確性に欠ける表現もありますが大目にみてください。

間違えている箇所がございましたらご指摘ください。随時更新予定です。他のサーベイまとめ記事はコチラのページをご覧ください。

クロスエントロピーとは

【レベル1】
2つの値がどれだけ離れているかを示す尺度。

【レベル2】
[0,1]をとる変数と2クラスラベルにベルヌーイ分布を仮定した場合の負の対数尤度(バイナリクロスエントロピー)

【レベル3】
[0,1]をとる変数と多クラスラベルにカテゴリカル分布を仮定した場合の負の対数尤度(カテゴリカルクロスエントロピー)

機械学習の分類問題でクロスエントロピーを損失関数として利用する場面を想定しています。

レベル1

まず最初は,クロスエントロピーは一種の距離を表す指標だと考えればOKです。多くのDNNは出力と正解ラベルを近づけるようにネットワークを学習しますから,損失関数として出力と正解ラベルの「距離」を定義してあげれば,誤差逆伝播により学習を行うことができます。

レベル2

少し難易度が上がります。実際に数式を用いて考えていきましょう。まずは,上で説明したように,教師あり学習を行うDNNでは$\{ x, y \}$という入力データ$x$と,0か1の値を取る正解ラベル$y$というペアデータが必要になります。今回は,以下のように変数を定めてしまいたいと思います。

\begin{align}
(\boldsymbol{x}, \boldsymbol{y}) &= (x_1, y_1), (x_2, y_2), \cdots, (x_N, y_N)
\end{align}

つまり,$N$個の入力データに対して対応する$N$個のラベルを用意します。そして,DNNは入力データ$\boldsymbol{x}$からラベル$\boldsymbol{y}$を当てるように学習を進めるものとします。$n$個目の入力データに対するDNNの出力は,以下のように示します。

\begin{align}
DNN(x_n)
\end{align}

でも正解ラベルは0か1なんだよね?DNNの出力はそれに揃えなくていいの?

非常によいツッコミです。今回は,最終層はsigmoid関数やsoftmax関数を通して[0,1]となっているものとします。

レベル2の解釈では,ラベルを2つに限定します。例えば,入力データが画像だとした時に,ラベルは「犬」「猫」の2つとするような場合です。このとき,クロスエントロピーとは何を意味するのかというと,「DNNの出力が得られた時に,ラベルが得られる確率にベルヌーイ分布を仮定したときの対数尤度」を示します。

もっと噛み砕いて言えば,ベルヌーイ分布は歪んだコイントスを表す確率分布ですから,DNNの出力が正しいラベルがとなるのはコイントスを通じて決められるものとする,という仮定を置くということです。このコイントスが毎回精度よくラベルを当てられるように,コインの歪み方を変えていこうという行為が,DNNの学習に相当します。

…ん?対数尤度って?

具体的に数式を見ていきましょう。対数尤度は,ベルヌーイ分布の尤度$p(\boldsymbol{y}|f(\boldsymbol{x}))$の対数をとったものです。尤度に関しては,こちらの記事「【初学者向き】ベイズ推論とは?事前分布や事後分布をド素人向けに分かりやすく解説してみます!」をご覧ください。

\begin{align}
p(\boldsymbol{y}|DNN(\boldsymbol{x})) &= \prod_{n=1}^{N} p(y_n|DNN{(x_n)})\\
&= \prod_{n=1}^{N} Bernoulli(y_n|DNN(x_n))\\
&= \prod_{n=1}^{N} \{ DNN(x_n) \}^{y_n} \cdot \{ 1-DNN(x_n) \}^{(1-y_n)}
\end{align}

両辺の負の対数を取りましょう。

\begin{align}
– \log p(\boldsymbol{y}|DNN(\boldsymbol{x}))
&= – \sum_{n=1}^{N}\{ {y_n} \log \{ DNN(x_n) \} + (1-y_n) \log \{ 1-DNN(x_n) \} \}
\end{align}

この右辺の値がクロスエントロピーです。今回のように,ニクラス分類を対象とするときは特にバイナリクロスエントロピーと呼ばれます。

これは,「ラベルが正解ラベルのときはDNNの出力確率値を採用して,ラベルが正解ラベルでないときはDNNの出力確率値の余事象を考える」ということを表しています。こうすることで,DNNは入力データに対して正解ラベルの確率値を出力するように学習することができます。

レベル3

レベル3の解釈では,ラベルを多クラスに拡張します。例えば,入力データを画像としたときに「犬」「猫」「コアラ」「ペンギン」などの複数のラベルを設定する場面を想定します。ここで,ラベルの個数を$K$とします。

すると,先ほどは「表」か「裏」しか出ない歪んだコイントスの確率分布を考えましたが,今回は多クラス分類であるため,「表」「裏」の2クラスでは足りないということに気がつきます。今回は,歪んだ多面サイコロを振る確率分布である「カテゴリカル分布」を仮定します。実際に数式で確認しましょう。

\begin{align}
p(\boldsymbol{y}|DNN(\boldsymbol{x})) &= \prod_{n=1}^{N} p(y_n|DNN{(x_n)})\\
&= \prod_{n=1}^{N} Categorical(y_n|DNN(x_n))\\
&= \prod_{n=1}^{N}\prod_{k=1}^{K} \{ DNN(x_n) \}^{y_{n,k}} \cdot \{ 1-DNN(x_n) \}^{(1-y_{n,k})}
\end{align}

両辺の負の対数を取りましょう。

\begin{align}
&- \log p(\boldsymbol{y}|DNN(\boldsymbol{x})) \notag \\
&= – \sum_{n=1}^{N} \sum_{k=1}^{K} \{ {y_{n,k}} \log \{ DNN(x_n) \} + (1-y_{n,k}) \log \{ 1-DNN(x_n) \} \}
\end{align}

この右辺の値がクロスエントロピーです。2クラス分類のときと比べて,ラベルが多次元になっているだけという違いが確認できます。この場合,特にカテゴリカルクロスエントロピーと呼ばれることもあります。

これも「ラベルが正解ラベルのときはDNNの出力確率値を採用して,ラベルが正解ラベルでないときはDNNの出力確率値の余事象を考える」ということを表しています。こうすることで,DNNは入力データに対して正解ラベルの確率値を出力するように学習することができます。

注意点としては,$y$がラベルを表して$DNN(x)$がDNNの出力値を表しているという点です。これを逆にして,クロスエントロピーを

\begin{align}
– \sum_{n=1}^{N} DNN(x_n) \log \{ y_n \} + (1-DNN(x_n)) \log \{ 1-y_n \}
\end{align}

としてしまう輩がいますが,論外です(かつての私です)。まず,$\log$の中身に二値変数を突っ込んでいる時点でアウトです。中身が0のときに無限大に吹っ飛びます。加えて,上で説明してきたような数学的な背景が破綻します。頭でっかちなニューラルネッターはこのようなトンデモ行為をしがちなので,気を付けたいです(自戒です)。

POSTED COMMENT

  1. Atsushi より:

    はじめまして.突然のコメント失礼します.
    関西圏の大学に通い,信号処理や機械学習を学んでいる大学生です.
    zukaさんのこのブログに出会ったのは少し前なのですが,
    毎度,毎度,意味的な概念を丁寧に教えていただけるので,
    かなり勉強になってます.かゆいところに手が届くという感じでしょうか,とても参考にさせていただいております.

    なかなか,自分と同分野の知識を発信されているブロガーさんは少ないので,つい親近感がわきコメントさせていただきました!
    今後とも,参考にさせていただきたく思います.陰ながら応援しております.

    • zuka より:

      Atsushi様

      コメントありがとうございます!
      まさに仰っていただいた「キャッチー×丁寧さ」は本ブログの信念として掲げているところです。
      今後も,分かりやすさを重視して,極力正確な情報を提供できるように精進していきます。
      励みになります。ありがとうございます!

  2. たいすけ より:

    (10)の下あたりに、これがバイナリクロスエントロピーですとありますが、多クラスなので、カテゴリカルクロスエントロピーになるのではなかったでしたっけ!?

    • zuka より:

      たいすけ様

      ご連絡ありがとうございます.
      おっしゃる通り,全体を通してまずい軸の通し方をしておりました.
      記事を修正しました.
      (値域が[0,1]であればバイナリクロスエントロピーという謎定義をしていたので,ニクラス分類の際にはバイナリクロスエントロピーだという導入に変更しました.また,記事をクロスエントロピー全般に関する内容になるように変更しました.)
      激しい誤植・勘違いでした.ご指摘誠にありがとうございます!

COMMENT

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です