Я использую tenorflow для написания простых нейронных сетей для небольшого количества исследований, и у меня было много проблем с весами 'nan' во время обучения. Я пробовал много разных решений, таких как смена оптимизатора, изменение потерь, размера данных и т. Д., Но безрезультатно. Наконец, я заметил, что изменение в скорости обучения сделало невероятную разницу в моих весах.
Используя уровень обучения 0,001 (который я считал довольно консервативным), функция минимизации фактически экспоненциально увеличивает потери. После одной эпохи потери могут возрасти от числа в тысячах до триллиона, а затем до бесконечности («нан»). Когда я снизил скорость обучения до 0,0001, все работало нормально.
1) Почему один порядок величины имеет такой эффект?
2) Почему функция минимизации буквально выполняет функцию, противоположную ее функции, и максимизирует потери? Мне кажется, что это не должно происходить, независимо от скорости обучения.
Ответы:
Возможно, вы найдете главу 8 « Глубокое обучение» полезной. В нем авторы обсуждают обучение моделей нейронных сетей. Это очень сложно, поэтому я не удивлен, что у вас возникли трудности.
Одна из возможностей (помимо ошибки пользователя) заключается в том, что ваша проблема крайне плохо обусловлена. Методы градиентного спуска используют только информацию о первой производной (градиент) при вычислении обновления. Это может вызвать проблемы, когда вторая производная (гессиан) плохо обусловлена.
Цитата из авторов:
Авторы предоставляют простой вывод, чтобы показать, что это может быть так. При использовании градиентного спуска функция стоимости должна измениться (на второй порядок) на
источник
Есть две основные причины. Первый: вы не используете те же данные на первом этапе, что и на втором. Если на первом этапе модель изучает эти значения и попадает в локальный минимум, то, скорее всего, это приведет к большей потере для новых значений.
Вторая причина - это форма функции стоимости. Вы пытаетесь минимизировать значение маленькими шагами, длина этих шагов определяется двумя факторами: градиентом и скоростью обучения. Изображение ваша функция похожа на х ^ 2. Если ваши значения близки к 0, градиент будет меньше, чем в дальнейшем, но если ваша скорость обучения велика, то вместо того, чтобы приблизиться к 0, вы на самом деле увеличиваете ошибку, потому что ваша новая точка основана на оценке и Скорость обучения ниже 0, чем ваш предыдущий шаг. И это может случиться несколько раз.
Взгляните на эту ссылку: http://www.statisticsviews.com/details/feature/5722691/Getting-to-the-Bottom-of-Regression-with-Gradient-Descent.html
Если вы видите цифры с альфа 0,01 и альфа 0,12, вы увидите, как на первом рисунке скорость обучения мала, и поэтому градиент приближается к минимуму, но во втором случае скорость обучения настолько велика, что градиент перемещается дальше на каждом шагу.
источник