Снижение потерь автоэнкодера

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

Я тренирую модель с более чем 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])

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

Как мне еще снизить убыток? Что я пробовал до сих пор (ни один из вариантов не привел к успеху):

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

person john-mueller    schedule 26.05.2020    source источник


Ответы (1)


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

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

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

person aksoym    schedule 27.05.2020