WVJ*_*Joe 3 python keras softmax
我之前对 ML 模型进行过手动超参数优化,并且总是默认使用tanh或relu作为隐藏层激活函数。最近,我开始尝试使用 Keras Tuner 来优化我的架构,并意外地将softmax作为隐藏层激活的选择。
我只见过softmax在输出层的分类模型中使用,从未作为隐藏层激活,尤其是回归。该模型在预测温度方面具有非常好的性能,但我很难证明使用该模型的合理性。
我看过类似这样的帖子,其中讨论了为什么它应该仅用于输出,但是我的情况有什么理由吗?我将整体架构展示如下,供参考。
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')
Run Code Online (Sandbox Code Playgroud)
我可能是错的,无论是分类还是回归,都不应该有什么不同。从数学上考虑一下。
一般来说,softmax在隐藏层中并不是首选,因为我们希望每个神经元彼此独立。如果您应用softmax,那么它们将呈线性相关,因为激活将迫使它们的总和等于 1。这并不意味着它从未被使用过,您可以参考这篇论文。
假设使用一些高级激活,例如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)
Run Code Online (Sandbox Code Playgroud)
使用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))
Run Code Online (Sandbox Code Playgroud)
结果:模型无法学习该数据。它发散并停留在发散时的同一区域。似乎一个神经元想要学习,但另一个神经元不让另一个神经元学习。
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
Run Code Online (Sandbox Code Playgroud)
使用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.
Run Code Online (Sandbox Code Playgroud)
结果:模型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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
643 次 |
| 最近记录: |