web-dev-qa-db-ja.com

自動エンコーダでバイナリクロスエントロピー損失はどのように機能しますか?

Denseレイヤーのみを使用してVanilla自動エンコーダーを作成しました。以下は私のコードです:

iLayer = Input ((784,))
layer1 = Dense(128, activation='relu' ) (iLayer)
layer2 = Dense(64, activation='relu') (layer1)
layer3 = Dense(28, activation ='relu') (layer2)
layer4 = Dense(64, activation='relu') (layer3)
layer5 = Dense(128, activation='relu' ) (layer4)
layer6 = Dense(784, activation='softmax' ) (layer5)
model = Model (iLayer, layer6)
model.compile(loss='binary_crossentropy', optimizer='adam')

(trainX, trainY), (testX, testY) =  mnist.load_data()
print ("shape of the trainX", trainX.shape)
trainX = trainX.reshape(trainX.shape[0], trainX.shape[1]* trainX.shape[2])
print ("shape of the trainX", trainX.shape)
model.fit (trainX, trainX, epochs=5, batch_size=100)

質問:

1)softmaxは確率分布を提供します。わかった。これは、0〜1の確率で784個の値のベクトルを持つことを意味します。たとえば、[0.02、0.03 ..... 784個までのアイテム]では、784個の要素すべてを合計すると1になります。

2)これらの値でバイナリクロスエントロピーがどのように機能するのか理解できません。バイナリクロスエントロピーは、出力の2つの値に対するものですよね?

9
Whoami

オートエンコーダーのコンテキストでは、モデルの入力と出力は同じです。したがって、入力値が[0,1]の範囲にある場合、sigmoidを最後のレイヤーのアクティベーション関数として使用することは許容されます。それ以外の場合は、最後のレイヤーに適切なアクティベーション関数を使用する必要があります(例:linearこれはデフォルトのレイヤーです)。

損失関数については、入力データの値に戻ります。入力データが のみ ゼロと1の間 (それらの間の値ではなく)binary_crossentropyは損失関数として許容されます。それ以外の場合は、'mse'(平均二乗誤差)または'mae'(平均絶対誤差)などの他の損失関数を使用する必要があります。範囲[0,1]の入力値の場合、通常使用されるbinary_crossentropyを使用できます(例 Keras autoencoder tutorial および このペーパー =)。ただし、予測とラベルの両方がゼロでも1でもない場合(等しいかどうかに関係なく)binary_crossentropyはゼロを返さないため、損失値がゼロになるとは思わないでください。 ここHugo Larochelle のビデオです。ここでは、オートエンコーダーで使用される損失関数について説明しています(範囲[0,1]の入力でのbinary_crossentropyの使用に関する部分) 5:

具体的には、この例では、MNISTデータセットを使用しています。したがって、デフォルトでは、MNISTの値は[0、255]の範囲の整数です。通常、最初にそれらを正規化する必要があります。

trainX = trainX.astype('float32')
trainX /= 255.

これで、値は範囲[0,1]になります。したがって、sigmoidをアクティベーション関数として使用し、binary_crossentropyまたはmseのいずれかを損失関数として使用できます。


真のラベル値(グランドトゥルース)が[0,1]の範囲にある場合でも、なぜbinary_crossentropyを使用できるのか?

トレーニングでは損失関数を最小化しようとしていることに注意してください。そのため、予測が真のラベルと等しいときに、使用した損失関数が最小値(必ずしもゼロに等しいとは限りません)に達する場合、それは許容可能な選択です。これが、次のように定義されるbinrayクロスエントロピーの場合であることを確認しましょう。

bce_loss = -y*log(p) - (1-y)*log(1-p)

ここで、yは真のラベルであり、pは予測値です。 yを固定と見なし、pのどの値がこの関数を最小化するかを見てみましょう:pに関する導関数を取る必要があります(logは自然であると仮定しました計算を簡単にするための対数関数):

bce_loss_derivative = -y*(1/p) - (1-y)*(-1/(1-p)) = 0 =>
                      -y/p + (1-y)/(1-p) = 0 =>
                      -y*(1-p) + (1-y)*p = 0 =>
                      -y + y*p + p - y*p = 0 =>
                       p - y = 0 => y = p

ご覧のとおり、バイナリクロスエントロピーはy=pのとき、つまり真のラベルが予測ラベルと等しく、これがまさに探しているときに最小値を持ちます。

13
today