我正在使用带有 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 类