Почему скорость обучения приводит к стремительному росту веса моей нейронной сети?


9

Я использую tenorflow для написания простых нейронных сетей для небольшого количества исследований, и у меня было много проблем с весами 'nan' во время обучения. Я пробовал много разных решений, таких как смена оптимизатора, изменение потерь, размера данных и т. Д., Но безрезультатно. Наконец, я заметил, что изменение в скорости обучения сделало невероятную разницу в моих весах.

Используя уровень обучения 0,001 (который я считал довольно консервативным), функция минимизации фактически экспоненциально увеличивает потери. После одной эпохи потери могут возрасти от числа в тысячах до триллиона, а затем до бесконечности («нан»). Когда я снизил скорость обучения до 0,0001, все работало нормально.

1) Почему один порядок величины имеет такой эффект?

2) Почему функция минимизации буквально выполняет функцию, противоположную ее функции, и максимизирует потери? Мне кажется, что это не должно происходить, независимо от скорости обучения.


Подскажите, пожалуйста, как вы инициализировали свои веса?
Химаншу Рай

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

Ответы:


9

Возможно, вы найдете главу 8 « Глубокое обучение» полезной. В нем авторы обсуждают обучение моделей нейронных сетей. Это очень сложно, поэтому я не удивлен, что у вас возникли трудности.

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

Цитата из авторов:

Некоторые проблемы возникают даже при оптимизации выпуклых функций. Из них наиболее известным является плохо обусловленность матрицы Гессе . Это очень общая проблема в большинстве числовых оптимизаций, выпуклая или иная, и более подробно описана в разделе 4.3.1.ЧАС

Обычно считается, что проблема плохой подготовки присутствует в задачах обучения нейронной сети. Плохое состояние может проявляться в том, что SGD «застревает» в том смысле, что даже очень маленькие шаги увеличивают функцию стоимости. [мой акцент добавлен]

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

ε22гTЧАСг-εгTг

гЧАСεεε


2
Мне кажется, что этот ответ на кору предлагает довольно интуитивное объяснение плохой обусловленности гессиана.
Орен Мильман

3

1) Почему один порядок величины имеет такой эффект?

2) Почему функция минимизации буквально выполняет функцию, противоположную ее функции, и максимизирует потери? Мне кажется, что это не должно происходить, независимо от скорости обучения.

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

Вторая причина - это форма функции стоимости. Вы пытаетесь минимизировать значение маленькими шагами, длина этих шагов определяется двумя факторами: градиентом и скоростью обучения. Изображение ваша функция похожа на х ^ 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, вы увидите, как на первом рисунке скорость обучения мала, и поэтому градиент приближается к минимуму, но во втором случае скорость обучения настолько велика, что градиент перемещается дальше на каждом шагу.


1
Что касается второй причины - этот ответ демонстрирует (используя простые функции), когда градиентный спуск может расходиться. Этот ответ также имеет код Python , так что вы можете поэкспериментировать и посмотреть , как спуск ведет себя градиент в различных сценариях ..
Орен Мильман
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.