Я использую MLP с Keras, оптимизированный с sgd. Я хочу настроить скорость обучения, но она никак не влияет на тренировки. Я пробовал как малые скорости обучения (0,01), так и очень большие (до 1e28), и эффекты едва заметны. Не должна ли моя потеря взорваться при использовании очень большой скорости обучения?
Я использую полностью подключенный NN с 3 скрытыми слоями и функцией активации сигмоида. Потеря - это вариант BinaryCrossEntropy. Цель состоит в том, чтобы предсказать кредитный дефолт. Учебный набор содержит 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 класс, когда я использую большое значение штрафа (как и ожидалось)