gpt4 book ai didi

python - 在回归(非分类)问题中使用 softmax 作为隐藏层激活函数是否可以接受?

转载 作者:行者123 更新时间:2023-12-05 02:02:02 26 4
gpt4 key购买 nike

我之前为 ML 模型做过手动超参数优化,并且总是默认使用 tanhrelu 作为隐藏层激活函数。最近,我开始尝试使用 Keras Tuner 来优化我的架构,但不小心将 softmax 作为隐藏层激活的选择。

我只见过 softmax 在输出层的分类模型中使用,从未作为隐藏层激活,尤其是回归。这个模型在预测温度方面确实有很好的性能,但我很难证明使用这个模型是合理的。

我看过类似 this one 的帖子其中讨论了为什么它应该只用于输出,但在我的案例中有什么理由吗?我在下面展示整体架构,以供引用。

model = Sequential()
model.add(Dense(648, activation='relu',input_shape=(train_x.shape[1],)))
model.add(Dropout(0.3))
model.add(LayerNormalization())
model.add(Dense(152,activation='relu'))
model.add(Dropout(0.15))
model.add(LayerNormalization())
model.add(Dense(924,activation='softsign'))
model.add(Dropout(0.37))
model.add(LayerNormalization())
model.add(Dense(248,activation='softmax'))
model.add(Dropout(0.12))
model.add(LayerNormalization())
model.add(Dense(1,activation='linear'))
model.compile(loss='mse',optimizer='Adam')

最佳答案

我可能是错的无论是分类还是回归,应该没有区别。从数学上考虑一下。

一般来说,在隐藏层中使用 softmax 并不是首选,因为我们希望每个神经元都相互独立。如果您应用 softmax 那么它们将是线性相关的,因为激活将强制它们的总和等于 1。不代表没用过,可以引用this paper .

假设使用一些高级激活,例如 LeakyReLU,通过使用它神经元将受到控制,因为可以调整 alpha 率。但是对于 softmax,这是不可能的。

现在回到问题,我认为这取决于数据集。模型能够使用 softmax 概括此数据集。但是我不认为它会一直这样。如上所述,您正在使它们彼此线性相关。因此,如果一个神经元学错了东西,那将影响整个网络的泛化,因为其他值也会受到影响。

编辑:我测试了两个模型。对于某些数据,softmax 的效果与 relu 一样好。但实际情况是所有神经元都相互依赖。让它们相互依赖不是应该冒的风险,尤其是在大型网络中。

数据:

X_train = np.random.randn(10000,20)
y_train = np.random.randn(10000,1)
X_test = np.random.randn(5000,20)
y_test = np.random.randn(5000,1)

使用Softmax:

model = Sequential()
model.add(Dense(512, activation='relu',input_shape=(20,)))
model.add(Dense(256,activation='softmax'))
model.add(Dense(512,activation='softmax'))
model.add(Dense(256,activation='softmax'))
model.add(Dense(128,activation='softmax'))
model.add(Dense(1,activation='linear'))
model.compile(loss='mse',optimizer='adam')
model.fit(X_train, y_train, epochs = 16, validation_data= (X_test, y_test))

结果:模型无法学习此数据。它发散并留在与发散相同的区域。似乎一个神经元想要学习,但另一个不让另一个神经元学习。

Epoch 15/16
313/313 [==============================] - 1s 3ms/step - loss: 1.0259 - val_loss: 1.0269
Epoch 16/16
313/313 [==============================] - 1s 3ms/step - loss: 1.0020 - val_loss: 1.0271

使用relu:

model = Sequential()
model.add(Dense(512, activation='relu',input_shape=(20,)))
model.add(Dense(256,activation='relu'))
model.add(Dense(512,activation='relu'))
model.add(Dense(256,activation='relu'))
model.add(Dense(128,activation='relu'))
model.add(Dense(1,activation='linear'))
model.compile(loss='mse',optimizer='adam')
model.fit(X_train, y_train, epochs = 16, validation_data= (X_test, y_test))

# Obviously overfitting but that's not the case.

结果:使用relu 的模型能够学习这两种数据。

Epoch 15/16
313/313 [==============================] - 1s 3ms/step - loss: 0.5580 - val_loss: 1.3091
Epoch 16/16
313/313 [==============================] - 1s 3ms/step - loss: 0.4808 - val_loss: 1.3290

关于python - 在回归(非分类)问题中使用 softmax 作为隐藏层激活函数是否可以接受?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66069636/

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