Скорость обучения не влияет
Я использую 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, когда я использую большое значение штрафа (как и ожидалось)
1 ответ
Наконец то я понял. Я не указывал форму ввода в своей модели (оставил аргумент ключевого слова input_shape первого слоя равным "None"). Когда я это указал, это внезапно сработало. Я не совсем понимаю, почему так важно указывать форму ввода.