在回归(非分类)问题中是不是可以使用 softmax 作为隐藏层激活函数?
Posted
技术标签:
【中文标题】在回归(非分类)问题中是不是可以使用 softmax 作为隐藏层激活函数?【英文标题】:Is using softmax as a hidden layer activation function acceptable in a regression (NOT classification) problem?在回归(非分类)问题中是否可以使用 softmax 作为隐藏层激活函数? 【发布时间】:2021-05-10 04:05:51 【问题描述】:我之前对 ML 模型进行过手动超参数优化,并且始终默认使用 tanh 或 relu 作为隐藏层激活函数。最近,我开始尝试使用 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')
【问题讨论】:
你的数据集有多大? 嗯,我有 6 个输入和 1 个输出。用于调谐器的训练样本数量为 100,000,但我总共有超过 8000 万。 【参考方案1】:我可能错了,分类还是回归应该没有区别。用数学方式思考一下。
一般而言,在隐藏层中使用softmax
不是首选,因为我们希望每个神经元彼此独立。如果您应用softmax
,那么它们将是线性相关的,因为激活将迫使它们的总和等于一。不代表从未使用过,可以参考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
【讨论】:
以上是关于在回归(非分类)问题中是不是可以使用 softmax 作为隐藏层激活函数?的主要内容,如果未能解决你的问题,请参考以下文章