Снижение потерь автоэнкодера - PullRequest
1 голос
/ 26 мая 2020

В настоящее время я пытаюсь обучить автоэнкодер, который позволяет представлять массив длиной 128 целочисленных переменных до сжатия 64. Массив содержит 128 целочисленных значений в диапазоне от 0 до 255.

I обучайте модель с более чем 2 миллионами точек данных каждую эпоху. Каждый массив имеет такую ​​форму: [1, 9, 0, 4, 255, 7, 6, ..., 200]

input_img = Input(shape=(128,))
encoded = Dense(128, activation=activation)(input_img)
encoded = Dense(128, activation=activation)(encoded)

encoded = Dense(64, activation=activation)(encoded)

decoded = Dense(128, activation=activation)(encoded)
decoded = Dense(128, activation='linear')(decoded)

autoencoder = Model(input_img, decoded)
autoencoder.compile(optimizer='adam', loss='mse')

history = autoencoder.fit(np.array(training), np.array(training),
                    epochs=50,
                    batch_size=256,
                    shuffle=True,
                    validation_data=(np.array(test), np.array(test)),
                    callbacks=[checkpoint, early_stopping])

Я также загружу график c, показывающий обучение и процесс проверки: График потерь при обучении

Как я могу снизить потери в дальнейшем. То, что я пробовал до сих пор (ни один из вариантов не привел к успеху):

  1. Более длительная фаза обучения
  2. Больше слоев

1 Ответ

2 голосов
/ 27 мая 2020

Конечно, нет волшебных c вещей, которые вы могли бы сделать, чтобы мгновенно уменьшить потери, так как это очень специфическая проблема c, но вот несколько уловок, которые я мог бы предложить:

  • Уменьшить размер мини-партии. Меньший размер пакета сделает градиент более шумным при обратном распространении. Сначала это может показаться нелогичным, но этот шум при градиентном спуске может помочь спуску преодолеть возможные локальные минимумы. Подумайте об этом так; когда спуск шумный, это займет больше времени, но плато будет ниже, когда спуск будет плавным, это займет меньше времени, но установится на более раннем плато. (Очень обобщенно!)
  • Попробуйте заставить слои иметь единицы с порядком расширения / сжатия. Таким образом, вместо использования 128 слоев единиц подряд, сделайте это от 128 до 256. Таким образом, вы не будете заставлять модель представлять 128 чисел с другим пакетом из 128 чисел. Вы могли бы иметь все слои со 128 единицами, что могло бы теоретически привести к автокодированию без потерь , где вход и выход буквально одинаковы. Но на практике этого не происходит из-за характера градиентного спуска. Это похоже на то, как если бы вы случайно начали где-то в джунглях и пытаетесь пройти через них, следуя за опережением (отрицательный градиент), но то, что у вас есть опережение, не означает, что вы можете достичь того места, куда вы направляетесь. Итак, чтобы получить значимую информацию из вашего дистрибутива, вы должны заставить вашу модель представлять информацию с меньшими единицами измерения. Это упростит работу по градиентному спуску, потому что вы устанавливаете предварительное условие; если он не может достаточно хорошо кодировать информацию, он понесет большие потери. Так что вы вроде как понимаете , чего вы хотите от модели.
  • Абсолютное значение функции ошибок. Вы пытаетесь снизить свои потери, но с какой целью? Вам нужно, чтобы go около 0, или вам просто нужно, чтобы он был как можно ниже? Поскольку по мере уменьшения вашего скрытого измерения потери увеличиваются , но автоэнкодер сможет лучше улавливать скрытую репрезентативную информацию данных. Потому что вы заставляете кодировщик представлять информацию более высокого измерения информацией более низкого измерения. Таким образом, чем ниже скрытое измерение, тем больше автокодировщик будет стараться извлекать наиболее значимую информацию из ввода, потому что у него ограниченное пространство. Таким образом, даже если потери больше, распределение улавливается более грамотно. Так что это ваша проблема, если вы хотите что-то вроде уменьшения шума на изображениях, go с более высокими размерами кодирования, но если вы хотите сделать что-то вроде обнаружения аномалий, лучше попробовать меньшие размеры, не полностью уничтожая репрезентативную емкость модель.
  • Это немного больше оловянная фольга мой совет, но вы также пытаетесь сдвинуть свои числа вниз, чтобы диапазон был от -128 до 128. У меня - не так точно- заметил, что некоторые активации (особенно ReLU) работают немного лучше с такими входами.

Я надеюсь, что некоторые из них сработают для вас. Удачи.

...