Скорость обучения не влияет - PullRequest
0 голосов
/ 28 марта 2020

Я использую 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 класс, когда я использую большое значение штрафа (как и ожидалось)

1 Ответ

0 голосов
/ 02 апреля 2020

Наконец я понял. Я не указал форму ввода в моей модели (оставил аргумент ключевого слова input_shape первого слоя равным None). Когда я указал это, это внезапно сработало. Я не очень понимаю, почему указание формы ввода так важно.

...