損失関数 | BCE Loss (Binary CrossEntropy Loss)

画像二値分類問題 —> マルチラベル分類

バイナリ分類は、猫と犬の分類、スパムの分類など、すべての AI 初心者が接触する問題です...正のサンプルの 1、負のサンプルは y=0 とラベル付けします。例えば、下の写真で、その中に人がいるかどうかを判断します。ここに画像の説明を挿入
この図のラベルは y=1 であり、ラベル y=1 に従ってモデルの出力を設計できます。バイナリ分類にはポジティブ サンプルとネガティブ サンプルしかなく、2 つの確率の合計は 1 であるため、ベクトルを予測する必要はなく、確率値のみを出力する必要があります。損失関数は通常、出力がシグモイド活性化関数を通過した後であり、クロスエントロピー損失関数を使用して LOSS を計算します。つまり、
            LOSS = − ( ylog ( p ( x ) + ( 1 − y ) log ( 1 − p ( x ) ) LOSS=-(ylog (p(x)+(1-y)log(1-p(x)))L O S S=( y log ( p ( x ) _ _+( 1y )ログ( 1 _ _p ( x ) )

ここで、p(x) はモデル出力、y はグラウンド トゥルース ラベルです。

シグモイドとソフトマックスの性質、およびそれらに対応する損失関数とタスク

Sigmoid アクティベーション関数と Softmax 関数についてのより良い説明を見たので、それを共有します
ここに画像の説明を挿入
ここに画像の説明を挿入
バイナリ分類にシグモイド活性化関数と BCE 損失関数を使用する理由; マルチ分類には、Softmax 活性化関数とマルチカテゴリ クロスエントロピー損失関数を使用できます。; マルチラベル分類では、シグモイド活性化関数と BCE 損失関数が使用されます。

深層学習が錬金術ではないことを感じずにはいられません.損失関数、活性化関数、モデル構造はすべて、専門家が統計とターゲット シナリオを組み合わせて設計したものです。

マルチラベル分類タスクの損失関数 BCE

ここで質問を変えさせてください。この写真に誰かが写っていますか、携帯電話はありますか (マルチラベル分類)、この時点で 4 種類のラベルがあります。

ラベル 意味
(0, 0) 写真には誰もいませんし、携帯電話もありません
(0, 1) 写真には誰もいませんが、携帯電話があります
(1,0) 写真には人物が写っていますが、携帯電話はありません
(1,1) 写真には人と携帯電話の両方が写っています

類推すると、 2 n 2^nに拡張することもできます。2nケース (n クラス分類)。明らかに、問題は通常のバイナリ分類からマルチラベル分類に変わりました。マルチラベル分類問題の出力関数と損失関数はどのように定義する必要がありますか?
マルチラベル分類ではカテゴリが複数あるため、単純に値を出力することはできませんが、ベクトルを出力する必要があり、出力を Softmax で [0, 1] の確率値に単純に正規化し、各カテゴリを単純に続けることはできません。確率の合計は 1 になります。**カテゴリは相互に排他的ではないため、同時に表示できます。**シグモイド活性化関数を使用して、出力ベクトルの各要素を個別に確率値に変換できます。
損失関数の場合、比較的単純なアイデアは、クロス エントロピー損失関数を出力ベクトルの各要素に対して個別に使用し、平均値を計算することです。これが、今日話している BCE ですPytorch の公式ソース コードの実装を見てください。
ここに画像の説明を挿入

Pytorch の BCE コードと例

たとえば、モデル出力

>>> import torch
>>> output = torch.randn(3,3)
>>> output
tensor([[-0.8858,  0.3241,  0.9456],
        [ 1.4887,  1.8076, -0.0565],
        [-1.6529, -1.8539,  0.6756]])

まず、出力ベクトルのすべての要素を [0, 1] の間の確率値に変換します

>>> active_func = nn.Sigmoid()
>>> output = active_func(output)
>>> output
tensor([[0.2920, 0.5803, 0.7202],
        [0.8159, 0.8591, 0.4859],
        [0.1607, 0.1354, 0.6627]])

入力データに対応するラベルが

>>> target = torch.FloatTensor([[0,1,1],[1,1,1],[0,0,0]])
>>> target
tensor([[0., 1., 1.],
        [1., 1., 1.],
        [0., 0., 0.]])

BCE損失関数を使用してLOSSを計算する

>>> loss = nn.BCELoss()
>>> loss = loss(output, target)
>>> loss
tensor(0.4114)

要約する

上記の分析の後、BCE は主にバイナリ分類タスクに適しており、マルチラベル分類タスクは複数のバイナリ分類タスクの重ね合わせとして簡単に理解できます。したがって、BCE は、簡単な変更を加えた後、マルチラベル分類タスクにも適用できます。BCE を使用する前に、出力変数を [0, 1] の間で量子化する必要があります (シグモイド活性化関数を使用できます)。上記では、Sigmoid と Softmax の 2 つの活性化関数を深く分析して、それらの統計的性質を調べました. Sigmoid の出力はベルヌーイ分布であり、これはよく二項分布と呼ばれるものですが、Softmax の出力は多項分布として表されます. したがって、Sigmoid は通常、バイナリ分類に使用され、Softmax はマルチカテゴリ分類に使用されます。

おすすめ

転載: blog.csdn.net/Just_do_myself/article/details/123393900