为什么我不能在概率回归任务中使用 softmax?

Why can't I use softmax in regression task for probabilities?

我有一个监督学习任务 f(X)=y,其中 X 是 np.int8 的二维 np.array,y 是 np.float64 的一维数组,包含 probabilities(因此数字介于 0 和 1 之间)。我想建立一个执行回归的神经网络模型,以便预测给定 X 的概率 y。

由于我的网络的输出是一个实数(即输出层有一个神经元)并且是一个概率(所以在 [0, 1] 范围内),我相信我应该使用 softmax 作为激活函数输出层(即输出神经元),以便将网络的输出压缩到 [0, 1]。

由于这是一项回归任务,我选择使用 mean_squared_error 损失(而不是通常用于分类任务并经常与 softmax 配对的 cross_entropy_loss)。

但是,当我尝试拟合 (X, y) 时,损失在各个时期之间根本没有变化并且保持不变。任何想法为什么?由于某种原因,softmax 和 mean_squared_error 损失的组合是否错误?

如果我删除 softmax 它确实有效,但我的模型也会预测我不想要的非概率。是的,我可以稍后自己压扁它,但它似乎不正确。

我的代码基本上是(在删除一些不相关的 EarlyStopping 和学习率调度的额外回调之后):

model = Sequential()
model.add(Dense(W1_size, input_shape=(input_dims,), activation='relu'))
model.add(Dense(1, activation='softmax'))
# compile model
model.compile(optimizer=Adam(), loss='mse')   # mse is the standard loss for regression
# fit
model.fit(X, y, batch_size=batch_size, epochs=MAX_EPOCHS)

编辑:原来我需要 sigmoid 函数来将一个实数值压缩为 [0, 1],正如公认的答案所建议的那样。大小为 1 的向量的 softmax 函数始终为 1。

如您所述,您想执行 regression task。 (这意味着,找到您的输入和所需输出之间的连续映射)。 softmax 函数为 multi-dimensional 个输出创建 pseudo-probability 分布(所有值总和为 1)。这就是为什么 softmax 函数非常适合 classification tasks(预测不同 类 的概率)的原因。

当您想执行 regression task 并且您的输出是 one-dimensional 时,softmax 将无法正常工作,因为对于 one-dimensional 输入它始终是 1。 将 one-dimensional 输入连续映射到 [0,1] 的函数在这里工作正常(例如 Sigmoid)。

请注意,您还可以将 sigmoidsoftmax 函数的输出都解释为概率。但请注意:这些只是pseudo-probabilities,并不代表您的模型在进行预测时的确定性或不确定性。