softmaxとクロスエントロピーとは?ロジットを確率と学習損失に変換する仕組み

執筆 쉬었음.com

softmaxとクロスエントロピーは、マルチクラス分類を行うニューラルネットワークが、複数の候補のうちどのクラスが正解かを確率として表現し、その予測が正解とどの程度異なるかを数値的に評価するための組み合わせです。softmaxは、ロジット(logits)と呼ばれるモデルの生の出力を、合計が1になる確率分布へ変換します。クロスエントロピーは、その確率分布とターゲット分布との差を損失として計算します。学習とは、この損失を小さくするようにモデルの重みを調整するプロセスです。

たとえば、画像を猫・犬・鳥のいずれかに分類するとします。モデルは最初から「猫である確率は70%」のように答えることは多くありません。代わりに、3クラスの比較スコアであるロジットを出力します。softmaxはこれらのスコアを比較可能な確率に正規化し、クロスエントロピーはモデルが実際の正解にどれだけの確率を割り当てたかに応じてペナルティを与えます。この2つをまとめて理解すると、最終出力層、ラベル形式、損失関数の設定に関するよくある混乱を減らせます。

softmax関数は何をするのか?

softmaxは、KK個のクラスに対するロジットのベクトル z=(z1,,zK)z=(z_1,\dots,z_K) を、クラス確率 p=(p1,,pK)p=(p_1,\dots,p_K) に変換する関数です。クラス ii の確率は次のように計算されます。

pi=softmax(z)i=ezij=1Kezjp_i=\operatorname{softmax}(z)_i= \frac{e^{z_i}}{\sum_{j=1}^{K}e^{z_j}}

ここで、指数関数 ezie^{z_i} により、スコアが大きいクラスほど相対的に大きな重みを持ちます。分母は全クラスの指数化されたスコアの合計であるため、すべての出力は0から1の間に収まり、確率の合計は1になります。したがって、softmaxの出力は、入力が各クラスに属する相対的な尤度を単一の確率分布として表します。PyTorchのドキュメントでも、softmaxは各入力要素を0から1の範囲に再スケーリングし、要素の合計を1にするものと説明されています。 docs.pytorch.org

softmaxは、候補が相互排他的である場合に特に適しています。つまり、1つが真であれば、他は正解になり得ない場合です。たとえば、主な動物が猫・犬・鳥のいずれか1つである画像の分類や、文をあらかじめ定義された感情カテゴリのうちちょうど1つに割り当てる場合が該当します。

一方で、softmaxの確率は互いに独立ではありません。猫の確率が上がると、3つの確率の合計を1に保つため、犬または鳥の確率は相対的に下がる必要があります。この特性は、1枚の画像に人物と自転車の両方が写るように、複数のラベルが同時に真となり得るケースには通常適しません。その場合は、各クラスに独立してsigmoidを適用することを検討します。

ロジットと確率はどう違うのか?

ロジットは、最終線形層などのコンポーネントが出力する、正規化されていないスコアです。ロジットは負の値にも1を超える値にもなり得ます。また、クラス間のロジットの合計には特別な意味はありません。たとえば、[2,1,0][2,1,0] は3クラスのロジットの組になり得ますが、確率ベクトルではありません。

ロジットの重要な特性は、絶対値よりもクラス間の差が重要であることです。すべてのロジットに同じ定数 cc を加えても、softmaxの結果は変わりません。

softmax(z)i=softmax(z+c)i\operatorname{softmax}(z)_i= \operatorname{softmax}(z+c)_i

これは、分子と分母の両方に共通因子 ece^c が掛かり、相殺されるためです。したがって、ロジット [2,1,0][2,1,0][102,101,100][102,101,100] は異なる生スコアに見えても、同じsoftmax確率を生成します。softmaxは、スコアの基準点ではなく、候補間の相対的な差を確率に変換します。

クロスエントロピーは何を測定するのか?

クロスエントロピーは、実際のターゲット分布 yy とモデルが予測した分布 pp がどの程度異なるかを示す損失です。基本的なマルチクラス形式は次のとおりです。

H(y,p)=i=1KyilogpiH(y,p)=-\sum_{i=1}^{K}y_i\log p_i

ここで、yiy_i は実際のラベルがクラス ii に割り当てる重みであり、pip_i はモデルがクラス ii に対して予測した確率です。損失が小さいほど、予測分布はターゲット分布に近いことを意味します。自然対数を用いる場合、単位はnatです。

この式は、正解と不正解を0または1に分けるだけの計算ではありません。モデルが正解したかどうかだけでなく、その正解にどれほど自信を持っていたかも反映します。正解クラスに0.51を割り当てた予測と0.99を割り当てた予測は、どちらも最高確率のクラスが正解であれば同じ精度になります。しかし、クロスエントロピーでは後者の損失がより小さくなります。そのため学習では、正解を単に1位にするだけでなく、正解により高い確率を割り当てるようモデルが促されます。

one-hotラベルでは、なぜ式が簡単になるのか?

相互排他的な分類のターゲットは、one-hotベクトルで表現されることがよくあります。3クラスのうち最初のクラスが正解なら、ラベルは [1,0,0][1,0,0] です。ターゲットクラス tt だけが yt=1y_t=1 で、残りは0であるため、クロスエントロピーは次のように簡略化されます。

L=logptL=-\log p_t

つまり、損失は正解クラスに対する予測確率 ptp_t だけで決まります。ptp_t が1に近づくほど、logpt-\log p_t は0に近づきます。反対に、ptp_t が小さくなるほど、損失は急速に大きくなります。この性質により、正解に低い確率を割り当てる予測、特に誤答に非常に高い確信を持つ予測には、学習中に大きなペナルティが与えられます。

理論上、正解クラスの確率がちょうど0なら、log0\log 0 は未定義であり、損失は無限大に発散します。実際のニューラルネットワーク実装では通常、明示的に確率0を生成してから対数を取る方法を避け、ロジットに基づく安定した計算を使用します。

softmaxとクロスエントロピーはどのようにつながるのか?

一般的なマルチクラスモデルの最後の部分は、3つのステップで理解できます。

  1. 最終線形層がクラスロジット zz を出力する。
  2. softmaxがロジットを確率 pp に変換する。
  3. クロスエントロピーが確率 pp とターゲットラベル yy を比較して損失 LL を計算する。

one-hotターゲットの場合、このつながりは次のように展開できます。

L=log(eztj=1Kezj)=zt+logj=1KezjL=-\log\left(\frac{e^{z_t}}{\sum_{j=1}^{K}e^{z_j}}\right) =-z_t+\log\sum_{j=1}^{K}e^{z_j}

この式はsoftmaxクロスエントロピー、またはカテゴリカルクロスエントロピーと呼ばれることが多いものです。第1項の zt-z_t は正解クラスのロジットが大きくなるほど小さくなり、第2項の logjezj\log\sum_j e^{z_j} は競合するすべてのクラスのスコアも考慮します。したがってモデルは、正解クラスのスコアを上げながら、不正解クラスより相対的に際立たせることを学習します。

ここで、softmaxとクロスエントロピーは概念的に区別すべきです。softmaxは出力の表現方法を変える関数であり、クロスエントロピーは学習目標を定量化する損失です。ただし実用的なフレームワークでは、2つのステップが1つの統合損失関数として提供されることが多く、単一の関数のように見える場合があります。

数値による計算から何が分かるのか?

ロジットが [2,1,0][2,1,0] の3クラス問題を考えます。softmaxを適用すると、確率はおよそ [0.665,0.245,0.090][0.665,0.245,0.090] になります。TensorFlowのsoftmaxの例でも、これらのロジットに対して同じおおよその確率が示されています。 docs.pytorch.org

最初のクラスが正解であれば、one-hotラベルは [1,0,0][1,0,0] となり、損失は次のとおりです。

L=log(0.665)0.408L=-\log(0.665)\approx0.408

最初のクラスは3候補中で最も高い確率を持ち、その確率は約0.665であるため、損失は比較的小さくなります。ただし、「小さい」は絶対的な合格基準を示すものではありません。適切な損失の大きさは、クラス数、データの難易度、ラベルの不確実性、損失をバッチ全体で合計するか平均するかによって変わり得ます。

同じロジットで実際には3番目のクラスが正解だった場合、損失は log(0.090)-\log(0.090) となるため、はるかに大きくなります。モデルは3番目のクラスを最も可能性の低い候補と見なしていたためです。このように、クロスエントロピーは予測が誤っているかどうかだけでなく、どの程度の確信を持って誤っているかも敏感に反映します。

確率の順位と損失値をなぜ一緒に考えるべきか?

精度は通常、確率が最大のクラスを1つ選び、それが正解と一致するかを数えます。そのため、最初のクラスが正解であるときの予測 [0.34,0.33,0.33][0.34,0.33,0.33] と、同じく最初のクラスが正解であるときの予測 [0.99,0.005,0.005][0.99,0.005,0.005] は、どちらも1件の正解予測として数えられます。

クロスエントロピーはこれらを同等には扱いません。前者は3クラスをほとんど区別できていない一方、後者は正解に非常に高い確率を割り当てています。逆に、最高確率のクラスが不正解である場合も、正解クラスの確率がどれほど低かったかによって損失は異なります。このため、学習では一般にクロスエントロピーを最小化し、評価ではタスク目的に応じて精度などの別個の指標も確認します。

学習損失関数にロジットを直接渡すべき理由は?

多くのディープラーニングフレームワークの統合損失関数は、softmax確率ではなくロジットを入力として受け取ります。たとえばTensorFlowの softmax_cross_entropy_with_logits は、その名前が示すとおりロジットを受け取り、softmaxとクロスエントロピーに相当する計算を内部で行います。ドキュメントでは、すでにsoftmaxを適用した出力を渡さないよう警告しています。 www.tensorflow.org

この規則に反して、モデルの最後にsoftmaxを適用した後、ロジット用の損失関数へその結果を渡すと、確率が意図した1回のsoftmax適用を受けるのではなく、再びロジットとして解釈される場合があります。これにより損失と勾配の意味が変わり、学習設定が不正確になります。損失関数が「内部でsoftmaxを含む」のか、「すでに変換済みの確率を受け取る」のかは、関数名だけでなくAPIの入力契約で確認する必要があります。

推論や表示の目的は異なります。学習後、クラス確率を表示したい場合や、確率ベースの後処理を行いたい場合には、ロジットにsoftmaxを適用できます。重要なのはsoftmaxを決して使わないことではなく、学習損失が期待する入力段階でちょうど1回だけ適用することです。

数値安定性が重要なのはなぜか?

softmaxの式には指数関数と対数が含まれます。ロジットが極端に大きい、または小さい場合、ezie^{z_i} の計算がコンピュータで表現可能な範囲を超え、オーバーフローまたはアンダーフローのリスクが生じます。先に確率を計算してから対数を別々に適用すると、これらの問題に弱くなる可能性があります。

統合損失関数および log_softmax 系の実装では、一般に logjezj\log\sum_j e^{z_j} を安定して計算する方法が用いられます。PyTorchのドキュメントでも、log_softmax はsoftmaxと対数を個別に計算するより優れた数値的特性を持つと説明されています。 docs.pytorch.org

先に説明した定数シフトの性質も、安定化に利用できます。すべてのロジットから最大値 m=maxjzjm=\max_j z_j を引いても、softmaxの結果は変わりません。

softmax(z)i=ezimjezjm\operatorname{softmax}(z)_i= \frac{e^{z_i-m}}{\sum_j e^{z_j-m}}

これにより最大の指数項は e0=1e^0=1 となり、不必要に大きい数値を扱う必要が減ります。ただし本番コードでは、コンポーネントを自分で個別実装するよりも、ロジットに基づくフレームワーク提供の統合損失関数や安定したlog-softmax演算を使用するほうが一般に望ましいです。

ラベルはone-hotベクトルと整数のどちらにすべきか?

ラベル表現は、損失関数の入力契約と関係しています。一般的な形式には、one-hotラベルまたは確率ラベル、スパース整数ラベルがあります。

ラベル形式3クラス中で最初のクラスが正解の場合の例特徴
one-hotラベル[1, 0, 0]クラス数と同じ長さのベクトルで、正解位置だけが1。
確率ラベル[0.8, 0.1, 0.1]要素が非負で合計が1となるターゲット分布。
スパース整数ラベル0正解クラスのインデックスだけを格納する。

one-hotラベルは、基本的なクロスエントロピーの式に直接対応します。スパース整数ラベルは同じ情報をよりコンパクトに格納でき、クラス数が多い場合に便利です。ただし、両形式ではテンソルの形状とデータ型が異なるため、特定の損失関数が要求する形式を使用しなければなりません。

TensorFlowのロジットベースsoftmaxクロスエントロピーのドキュメントでは、ラベルベクトルが有効な確率分布である必要があることを説明し、相互排他的な分類における関連ラベル形式を区別しています。 www.tensorflow.org たとえば、one-hot用の損失関数に単一の整数を直接渡したり、スパース整数ラベル用の関数にone-hotベクトルを渡したりすると、意図した量を計算できない可能性があります。

確率ラベルでは、ちょうど1つのクラスだけが値1を持つという仮定を緩和できます。ただし、これは複数クラスが独立して真となり得るマルチラベル問題と同じ意味ではありません。softmax分類では、確率ラベルも依然として、要素の合計が1となる1つの分布を表します。

バイナリ分類、マルチクラス分類、マルチラベル分類はどう違うのか?

出力関数と損失は、クラス数だけを見て選ぶべきではありません。まず、ターゲットイベントが同時に起こり得るかを判断します。実務では次の区別が役立ちます。

問題構造典型的な出力表現典型的な損失
相互排他的なマルチクラス分類猫・犬・鳥のいずれか1つ全クラスに対するsoftmaxsoftmaxクロスエントロピー
バイナリ分類真/偽、承認/拒否1つのsigmoidまたは2クラスsoftmaxバイナリクロスエントロピーまたはsoftmaxクロスエントロピー
マルチラベル分類写真に人物と自転車の両方が含まれるクラスごとのsigmoidクラスごとのバイナリクロスエントロピー

マルチクラス分類では、クラス確率の合計が1になるのが自然です。画像が猫である確率が上がれば、同じ画像が犬または鳥である確率は相対的に下がるべきです。TensorFlowのドキュメントでも、ラベルが相互排他的である場合にsoftmaxクロスエントロピーを使用することと、独立した複数ラベルでは別の設定が必要であることを区別しています。 www.tensorflow.org

マルチラベル分類では、各出力はそれぞれ独立した質問に近いものです。「人物はいるか?」「自転車はあるか?」「木はあるか?」には、すべて同時に「はい」と答えられます。softmaxが合計を1に固定すると、あるラベルの確率を上げることで他のラベルの確率が下がるため、問題構造に適合しないことがあります。各クラスにsigmoidを適用すれば、各項目の確率を独立に扱えます。

バイナリ分類は、両方のアプローチが可能に見えるため特に混乱しやすい分野です。1つの出力にsigmoidを適用すると、正例クラスの確率を直接表現できます。2つのロジットにsoftmaxを適用すると、正例と負例を合計1の2クラス分布として表現できます。どちらのアプローチを選ぶ場合も、ラベルエンコーディングと損失関数はその出力形式に一致していなければなりません。

クロスエントロピーを最小化することは、分布を一致させることか?

ターゲット yy と予測 pp の両方が有効な確率分布である場合、クロスエントロピーはエントロピーおよびKLダイバージェンスとの関係を通じて次のように表せます。

H(y,p)=H(y)+DKL(yp)H(y,p)=H(y)+D_{\mathrm{KL}}(y\Vert p)

ここで、H(y)H(y) は真の分布自体の不確実性を表すエントロピー、DKL(yp)D_{\mathrm{KL}}(y\Vert p) は真の分布 yy と予測分布 pp の差を表すKLダイバージェンスです。学習データのターゲット分布 yy が固定されている場合、H(y)H(y) はモデルパラメータによって変化しません。したがって、この定数を除けば、クロスエントロピーを小さくすることは、yypp の間のKLダイバージェンスを小さくすることと解釈できます。

この解釈は、クロスエントロピーが確率分布の学習目標として広く使われる理由を示しています。モデルには、正解クラスを最上位に置くだけでなく、観測されたターゲット分布に近い確率を配分するよう圧力がかかります。

ただし、この式には前提があります。yypp の両方が確率分布でなければなりません。つまり、各成分が適切な範囲にあり、合計が1である必要があります。ロジット自体は確率分布ではないため、この関係式に直接代入することはできません。ロジットはsoftmaxまたはロジットに基づく統合損失を介して、確率分布の計算につながります。

よくある誤解とエラーは何か?

1つ目は、ロジットは確率であるという誤解です。最大のロジットを持つクラスはsoftmax確率も最大になりますが、ロジット値自体をパーセンテージとして読むことはできません。2対1のようなロジット差がどの程度の確率差に変換されるかは、他のすべてのロジットとともにsoftmaxを適用した後にのみ決まります。

2つ目は、モデルの最後にsoftmaxを追加しなければ分類学習は機能しないという誤解です。ロジットを受け取る統合クロスエントロピー損失を使用する場合、学習中に最終softmaxを明示的に追加しないことは一般的です。これは内部計算と数値安定性を支えます。 www.tensorflow.orgdocs.pytorch.org

3つ目は、softmaxクロスエントロピーはあらゆる分類問題に適しているという誤解です。この損失の組み合わせは、クラスが相互排他的な場合に自然です。1つのサンプルに複数の正解タグが共存できる場合、クラス確率の合計を1に制約するsoftmaxは、データの意味を適切に表現できない可能性があります。

4つ目は、クロスエントロピーと精度は同じ指標であるという誤解です。精度は一般に最大確率の1クラスだけを見ますが、クロスエントロピーは正解に割り当てられた確率全体を反映します。そのため、同じ精度の2つのモデルでもクロスエントロピー値が異なることがあります。これは、学習損失が下がっても精度が各ステップで単調に上がるとは限らない理由の1つでもあります。

5つ目は、単一の損失値だけでモデルの良し悪しを判断するという誤りです。クロスエントロピー値はクラス数、タスクの難易度、ラベル形式、集約方法の影響を受けます。同じタスクと設定における変化、検証データ上の損失、タスクに適した別個の評価指標を合わせて考えるほうが適切です。

モデルを設定する前に何を確認すべきか?

softmaxとクロスエントロピーを適用する前に、次の質問を順番に確認すると役立ちます。

  1. 各サンプルには正解クラスがちょうど1つありますか? ある場合、softmaxベースのマルチクラス分類が候補です。複数ラベルが同時に真となり得る場合は、まずクラスごとのsigmoidとバイナリ損失を検討します。
  2. モデルの最終出力はロジットですか、それともすでに確率ですか? ロジットは制約のない生スコアであり、確率は正規化された値です。統合損失がロジットを期待するなら、事前にsoftmaxを適用しないでください。
  3. ラベル形式は損失関数と一致していますか? one-hotまたは確率ベクトルを受け取るのか、整数インデックスを受け取るのかを確認します。形式に加えて、バッチ次元とクラス次元の位置も確認してください。
  4. 学習と推論の目的を区別していますか? 学習中は安定したロジットベースの損失で計算します。推論中は、確率を表示する必要がある場合や確率ベースのルールを適用する場合にsoftmaxを使用します。
  5. 損失と評価指標を別々に解釈していますか? クロスエントロピーは確率予測の質を反映する学習目標であるのに対し、精度は最終的な選択がターゲットと一致するかを測定します。タスクに応じて両方を合わせて解釈してください。

このチェックリストは特定のライブラリに限定されません。ただし、実際のAPI名が似ていても、ロジット・確率・整数ラベルのどれを入力として期待するかは異なることがあります。実装の直前に、使用する関数の公式ドキュメントで入力形式と内部活性化関数を含むかどうかを確認してください。

結論:確率変換と損失計算を役割ごとに理解する

softmaxは複数のロジットを合計1の確率分布に変換し、相互排他的なクラスの相対的な尤度を表します。クロスエントロピーは、その予測分布とターゲット分布との差を損失として計算し、正解に低い確率を割り当てる予測により大きなペナルティを与えます。one-hotターゲットでは、損失は logpt-\log p_t に簡略化されるため、正解クラスの確率を高めるという学習目標が明確になります。

実務では、softmaxとクロスエントロピーを別々に計算しないことがよくあります。代わりに、ロジットを受け取る統合損失関数を使用します。これにより、数学的な目標を保ちながら、より数値的に安定した計算が可能になります。ただし、この組み合わせが最も自然なのは、問題構造が「正解がちょうど1つのマルチクラス分類」である場合です。出力と損失を選ぶ際には、クラス数を考える前に、ラベルが相互排他的かどうか、損失関数がどの入力を期待するかを確認することが重要です。

よくある質問

softmaxとクロスエントロピーは常に一緒に使う必要がありますか?

必ずしもそうではありません。複数の相互排他的なクラスから1つを選ぶ分類タスクでは、一般に組み合わせて使用されます。ただし、複数の項目が同時に真となり得るマルチラベル問題では、通常、クラスごとのsigmoidとバイナリクロスエントロピーを使用します。

学習中は、モデルの最終層にsoftmaxを直接入れないほうがよいですか?

使用する損失関数によります。ロジットを受け取る統合クロスエントロピー関数を使用する場合は、先にsoftmaxを適用せず、ロジットをそのまま渡す必要があります。必要な計算は関数内部で処理されます。

クロスエントロピーが0とは何を意味しますか?

one-hotターゲットでは、正解クラスに確率1が割り当てられたとき損失は0です。有限のロジットで計算するモデルでは、通常、確率は厳密に1になるのではなく、1に非常に近い値になります。

精度が高くてもクロスエントロピーが高いことはありますか?

はい。精度は予測確率が最も高いクラスが正解かどうかを確認しますが、クロスエントロピーは正解クラスに割り当てられた確率の大きさも反映します。予測が正しくても、正解クラスの確率が低ければ損失は比較的大きくなることがあります。

スパース整数ラベルとone-hotラベルの違いは何ですか?

スパース整数ラベルは正解クラスのインデックスだけを格納します。一方、one-hotラベルは正解位置が1、それ以外の位置がすべて0のベクトルです。同じ分類タスクでも、使用する損失関数が求める形式を選んでください。