【发布时间】:2020-07-09 04:33:54
【问题描述】:
我正在使用带有 Keras 的 MLP,并使用 sgd 进行了优化。我想调整学习率,但它似乎对训练没有任何影响。我尝试了小学习率(.01)和非常大的学习率(高达 1e28),效果几乎不明显。使用非常大的学习率时,我的损失不应该爆炸吗?
我正在使用具有 3 个隐藏层和 sigmoid 激活函数的全连接 NN。 损失是 BinaryCrossEntropy 的一种变体。目标是预测信用违约。训练集包含 500000 个示例,大约有 500000 个示例。 2% 的默认值。测试集包含 200000 行
def loss_custom_w(p):
def loss_custom(y,yhat):
y_l, y_lhat = keras.backend.flatten(y),keras.backend.flatten(yhat)
eps = keras.backend.epsilon()
y_lhat = keras.backend.clip(y_lhat, eps, 1-eps)
return - keras.backend.mean(p*y_l*keras.backend.log(y_lhat) + (1-y_l)*keras.backend.log(1-y_lhat))
return loss_custom
model = keras.Sequential([keras.layers.Dense(n_input), keras.layers.Dense(500, activation = 'sigmoid'), keras.layers.Dense(400, activation = 'sigmoid'), keras.layers.Dense(170, activation = 'sigmoid'), keras.layers.Dense(120, activation = 'sigmoid'), keras.layers.Dense(1, activation = 'sigmoid')])
sgd = keras.optimizers.SGD(lr = 1e20)
model.compile(optimizer = sgd, loss = loss_custom_w(8))
model.fit(x_train, y_train, epochs = 10, batch_size = 1000)
更新: - 我尝试更改激活函数以避免梯度消失,但没有奏效。
问题不在于损失函数(我也尝试了其他损失)。
实际上网络似乎运行良好,以及自定义损失。当我改变 p 的值时,它会做预期的事情。我只是不明白为什么学习率没有影响。分类器也给出了令人满意的结果。
网络设法从两个类别中预测标签。当我使用较大的惩罚值(如预期的那样)时,它可以更好地预测 1 类
【问题讨论】:
-
您能否提供有关您正在使用的数据和一些代码示例的更多详细信息?
-
是的。我正在使用具有 3 个隐藏层和 sigmoid 激活函数的全连接 NN。损失是 BinaryCrossEntropy 的一种变体。目标是预测信用违约。训练集包含 500000 个示例,大约有 500000 个示例。 2% 的默认值。测试集包含 200000 行。
-
感谢您提供更多详细信息。您能否提供您在 keras 中编写的实际代码,或者至少一般情况下它的外观?如果可能的话,您能否将该详细信息添加到原始问题中。我承认我对 Keras 不太熟悉,并且对这个问题的答案比回答它更好奇。如果您提供更多详细信息,其他人应该能够回答。
-
有四个隐藏层,使用'sigmoid'激活,2个输入和输出层可能导致梯度消失。这意味着梯度无法到达主要层。 1-将隐藏层减少到两个或三个隐藏层 2-将激活函数更改为“Relu”。希望对你有帮助。
-
谢谢。我将激活函数更改为 ReLU 以避免梯度消失,但我没有工作(学习率仍然没有效果)。我也试过其他的激活功能,还是没有效果。
标签: keras deep-learning classification learning-rate