为什么我不能在概率回归任务中使用 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)。
请注意,您还可以将 sigmoid
和 softmax
函数的输出都解释为概率。但请注意:这些只是pseudo-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)。
请注意,您还可以将 sigmoid
和 softmax
函数的输出都解释为概率。但请注意:这些只是pseudo-probabilities,并不代表您的模型在进行预测时的确定性或不确定性。