Шумная потеря тренировки

Я обучаю модель на основе внимания кодер-декодер с размером пакета 8. Я не подозреваю, что в наборе данных слишком много шума, однако примеры взяты из нескольких разных дистрибутивов.

Я вижу много шума на кривой потерь поезда. После усреднения (0,99) тенденция в порядке. Также точность модели неплохая.

Хотелось бы понять, в чем может быть причина такой формы кривой потерь.

шумная потеря поезда  средняя потеря поезда


person DavidS1992    schedule 02.02.2018    source источник
comment
Слишком высокая скорость обучения?   -  person mxdbld    schedule 02.02.2018
comment
Размер партии действительно небольшой, попробуйте использовать 32 образца. Чем меньше образцов в размере партии, тем большее значение придается отдельным образцам, тем сильнее влияние выбросов.   -  person Daniele Grattarola    schedule 02.02.2018
comment
Это модель, основанная на внимании кодера-декодера, поэтому каждый пример на самом деле является очень сложным примером с длинной последовательностью на входе и разным типом и длиной вывода. Большой размер партии не подходит для топовых графических процессоров, но спасибо   -  person DavidS1992    schedule 02.02.2018


Ответы (3)


Я сам нашел ответ.

Я думаю, что другие ответы неверны, потому что они основаны на опыте работы с более простыми моделями / архитектурами. Основным моментом, который меня беспокоил, был тот факт, что шум в потерях обычно более симметричен (вы можете построить среднее значение, а шум будет случайным образом выше и ниже среднего). Здесь мы больше видим путь с низкой тенденцией и внезапные пики.

Как я уже писал, архитектура, которую я использую, - это кодер-декодер с вниманием. Несложно сделать вывод, что входы и выходы могут иметь разную длину. Потери суммируются по всем временным шагам, и НЕ нужно делить их на количество временных шагов.

https://www.tensorflow.org/tutorials/seq2seq

Важное примечание: стоит отметить, что мы делим потери на batch_size, поэтому наши гиперпараметры «инвариантны» по отношению к batch_size. Некоторые люди делят потери на (batch_size * num_time_steps), что преуменьшает количество ошибок, сделанных в коротких предложениях. Более тонко, наши гиперпараметры (примененные к первому способу) не могут использоваться вторым способом. Например, если оба подхода используют SGD с обучением 1.0, последний подход эффективно использует гораздо меньшую скорость обучения 1 / num_time_steps.

Я не усреднял потери, поэтому шум заметен.

P.S. Точно так же размер пакета, например, 8, может иметь несколько сотен входов и целей, поэтому на самом деле вы не можете сказать, что он маленький или большой, не зная средней длины примера.

person DavidS1992    schedule 07.03.2018
comment
заботитесь о том, чтобы уточнить, в чем было решение? не особо ясно из вашего ответа. Кажется, проигрыш все-таки ожидался, раз уж вы не усредняли? Это верно? - person Adam B; 19.06.2018
comment
Я не понял вашего вопроса, пожалуйста, спросите еще раз. Нет решения - потери не усредняются по временным шагам (длина примеров, то есть переменная), поэтому ожидается, что это будет выглядеть так. Более длинные примеры несут большую потерю. Если вы не хотите видеть такой шум, вы можете усреднить каждую партию с помощью sum (length_of_each_example_in_batch). - person DavidS1992; 20.06.2018
comment
Хорошо спасибо. Вот что я понял из вашего ответа. Спасибо за разъяснение. - person Adam B; 21.06.2018

Шумная потеря тренировки, но хорошая точность может быть вызвана следующей причиной:

Локальные минимумы:

Функция может иметь локальные минимумы, поэтому каждый раз, когда ваш градиентный спуск сходится к локальному минимуму, потери / затраты уменьшаются. Но при хорошей скорости обучения модель учится прыгать из этих точек, и градиентный спуск сходится к глобальному минимуму, который и является решением. Вот почему потеря тренировки очень шумная.

кривая

person janu777    schedule 02.02.2018

Вы используете мини-пакетный градиентный спуск, который вычисляет градиент функции потерь только для примеров в мини-пакете. Однако потери, которые вы измеряете, относятся ко всем обучающим примерам. Общие потери должны иметь тенденцию к снижению, но часто они будут идти в неправильном направлении, потому что градиент мини-партии не был достаточно точной оценкой общих потерь.

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

введите здесь описание изображения

Источник изображения

Думайте об этом изображении как о функции потерь для модели только с одним параметром. Мы берем градиент в точке, умножаем на скорость обучения, чтобы спроецировать сегмент линии в направлении градиента (не показано). Затем мы берем значение x в конце этого отрезка линии в качестве обновленного параметра и, наконец, вычисляем потери при этом новом значении параметра.

Если наша скорость обучения была слишком высокой, то мы превысим минимум, на который указывал градиент, и, возможно, закончим с более высокими потерями, как показано на рисунке.

person Imran    schedule 02.02.2018
comment
Обратите внимание, что потери не похожи на случайный шум, это больше похоже на то, что некоторые партии имеют тенденцию к снижению, имея хороший низкий уровень, но некоторые дают очень высокие внезапные пики. Скажите, пожалуйста, принимая это во внимание, считаете ли вы свое объяснение возможным? - person DavidS1992; 02.02.2018
comment
Я так считаю. Некоторые мини-партии будут вести себя хорошо, а некоторые - нет. Подобные графики очень распространены. Однако ваш вариант более шумный, чем большинство, вероятно, из-за вашего небольшого размера мини-пакета и, возможно, скорости обучения, которая немного высока. - person Imran; 02.02.2018