Скорость обучения не влияет

Я использую MLP с Keras, оптимизированный с помощью sgd. Я хочу настроить скорость обучения, но, похоже, это никак не влияет на тренировку. Я пробовал небольшие скорости обучения (0,01), а также очень большие (до 1,28), и эффекты едва заметны. Разве моя потеря не должна резко возрасти при использовании очень большой скорости обучения?

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


person R B    schedule 28.03.2020    source источник
comment
Не могли бы вы предоставить более подробную информацию об используемых вами данных и некоторых примерах кода?   -  person jawsem    schedule 28.03.2020
comment
да. Я использую полностью подключенную сетевую сеть с 3 скрытыми слоями и функцией активации сигмовидной кишки. Убыток - это вариант BinaryCrossEntropy. Цель состоит в том, чтобы предсказать дефолт по кредитам. Учебный набор содержит 500000 примеров, из них ок. 2% дефолтов. Набор тестов содержит 200000 строк.   -  person R B    schedule 28.03.2020
comment
Благодарю за дополнительную информацию. Можете ли вы предоставить реальный код, который вы написали в keras, или, по крайней мере, в целом, как он выглядит? И, если возможно, вы можете добавить эту деталь к исходному вопросу. Признаюсь, я не слишком знаком с Керасом, и мне было больше любопытно ответить на этот вопрос, чем отвечать на него. Если вы предоставите более подробную информацию, кто-то другой сможет ответить на него.   -  person jawsem    schedule 28.03.2020
comment
Есть четыре скрытых слоя, которые используют «сигмовидную» активацию, при этом 2 входных и выходных слоя могут привести к исчезновению градиента. это означает, что градиент не может достигать основных слоев. 1- уменьшите скрытый слой до двух или трех скрытых слоев 2- измените функцию активации на «Relu». Надеюсь, это поможет тебе.   -  person Matin Shokri    schedule 28.03.2020
comment
Спасибо. Я изменил свои функции активации на ReLU, чтобы избежать исчезновения градиентов, но у меня не получилось (скорость обучения по-прежнему не влияет). Я также пробовал другую функцию активации, но все равно никакого эффекта.   -  person R B    schedule 28.03.2020
comment
Не уверен, что действительно возвращает ваш return loss_custom, поскольку вы, кажется, не определяете loss_custom где-либо в своей функции. В любом случае попробуйте сначала со стандартной двоичной перекрестной потерей энтропии (не сильно отличается от вашей, за исключением p) и со всеми sigmoid до relu (кроме последнего слоя); если это сработает, вы будете знать, что проблема в вашей индивидуальной потере   -  person desertnaut    schedule 29.03.2020
comment
Предсказывает ли ваша модель метки обоих классов? 2% против 98% - это очень несбалансированно. Возможно, ваша потеря не изменится, потому что для всех уровней обучения результат будет одинаковым.   -  person Ach113    schedule 30.03.2020


Ответы (1)


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

person R B    schedule 02.04.2020