gpt4 book ai didi

machine-learning - 二进制交叉熵损失在自动编码器上如何工作?

转载 作者:行者123 更新时间:2023-11-30 08:23:24 25 4
gpt4 key购买 nike

我只使用Dense层编写了一个普通的自动编码器。下面是我的代码:

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 提供概率分布。明白了。这意味着,我将拥有一个由 784 个值组成的向量,概率在 0 到 1 之间。例如 [ 0.02, 0.03..... 最多 784 个项目],将所有 784 个元素相加得到 1。

2)我不明白二元交叉熵如何处理这些值。二元交叉熵适用于两个输出值,对吗?

最佳答案

在自动编码器的上下文中,模型的输入和输出是相同的。因此,如果输入值在 [0,1] 范围内,则可以使用 sigmoid 作为最后一层的激活函数。否则,您需要为最后一层使用适当的激活函数(例如默认的线性激活函数)。

对于损失函数,它再次回到输入数据的值。如果输入数据在零和一之间(而不是它们之间的值),则binary_crossentropy可以作为损失函数。否则,您需要使用其他损失函数,例如'mse'(即均方误差)或'mae'(即平均绝对误差)。请注意,如果输入值在 [0,1] 范围内,您可以使用通常使用的 binary_crossentropy (例如 Keras autoencoder tutorialthis paper )。但是,不要期望损失值会变为零,因为当预测和标签不为零或不为一(无论它们是否相等)时,binary_crossentropy 不会返回零。 Here是来自Hugo Larochelle的视频他解释了自动编码器中使用的损失函数(关于使用 binary_crossentropy 以及 [0,1] 范围内的输入的部分从 5:30 开始)

具体来说,在您的示例中,您使用的是 MNIST 数据集。因此,默认情况下 MNIST 的值是 [0, 255] 范围内的整数。通常您需要首先对它们进行标准化:

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

现在值将在 [0,1] 范围内。因此,sigmoid 可以用作激活函数,binary_crossentropymse 可以用作损失函数。

<小时/>

为什么即使真实标签值(即真实值)在 [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时,即当真实标签等于预测标签时,二元交叉熵具有最小值,这正是我们正在寻找的。

关于machine-learning - 二进制交叉熵损失在自动编码器上如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52441877/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com