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

问题描述

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

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

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

但是,当我尝试拟合(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)

编辑:事实证明,我需要S型函数将一个实际值压缩为[0,1],这是公认的答案所建议的。大小为1的向量的softmax函数始终为1。

解决方法

如您所说,您要执行regression task。 (这意味着在您的输入和所需的输出之间找到连续的映射)。 softmax函数为多维输出创建伪概率分布(所有值的总和为1)。这就是softmax函数完全适合classification tasks(预测不同类的概率)的原因。

由于您要执行regression task并且您的输出是一维的,因此softmax将无法正常工作,因为对于一维输入,softmax始终为1。 可以将一维输入连续映射到[0,1]的函数在这里很好用(例如Sigmoid)。

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

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...