Я попал в ситуацию, когда веса моей нейронной сети не сходятся даже после 500 итераций. Моя нейронная сеть содержит 1 входной слой, 1 скрытый слой и 1 выходной слой. Это около 230 узлов на входном слое, 9 узлов на скрытом слое и 1 выходной узел на выходном слое. Я хотел знать, выполняю ли я условие ранней остановки (скажем, прекращение обучения нейронной сети после 100 итераций). Какое влияние это окажет на модель?
Также хотелось бы узнать, что является отраслевым стандартом для обхода, если веса в нейронной сети не сходятся?
Ответы:
Есть ряд вопросов, которые нужно задать:
Что вы можете дать на пути эфемерид? Можете ли вы рассказать нам что-нибудь о природе данных?
Вы можете создать градиентное дерево нейронных сетей.
Вы спросили, что произойдет, если вы остановитесь рано.
Вы можете попробовать себя. Запустите 300x, где вы начнете со случайными инициализированными весами, а затем остановитесь на указанном количестве итераций, скажем, 100. В этот момент вычислите свою ошибку ансамбля, ошибку обучающего подмножества и ошибку набора тестов. Повторение. После того, как у вас есть 300 значений, чтобы сказать вам, в чем заключается ошибка, вы можете получить представление о вашем распределении ошибок, пройдя 100 итераций обучения. Если хотите, вы можете попробовать это распределение на нескольких других уровнях обучения. Я предлагаю 200, 500 и 1000 итераций. Это даст вам представление о том, как меняется ваше SNR с течением времени. График отношения SNR к числу итераций может дать вам представление о «скалах» или «достаточно хороших». Иногда бывают скалы, где ошибка падает. Иногда ошибка допустима в этот момент.
Требуются «относительно простые» данные или «довольно удача», чтобы ваша система последовательно сходилась менее чем за 100 итераций. Оба из них не о повторяемости и не являются обобщаемыми.
Почему вы думаете с точки зрения сближения весов, а не ошибки ниже определенного порога. Вы когда-нибудь слышали о парадоксе голосования? ( ссылка ) Если у вас есть циклические взаимодействия в вашей системе (например, обратная связь в нейронных сетях), вы можете столкнуться с парадоксами голосования - связанными изменениями. Я не знаю, является ли один только вес достаточным показателем для конвергенции сети.
Вы можете думать о весах как о пространстве. Он имеет более 3-х измерений, но это все еще пространство. В «центроиде» этого пространства находится ваш «наиболее подходящий» регион. Вдали от центроида менее подходит. Вы можете думать о текущих настройках ваших весов как об одной точке в этом пространстве.
Теперь вы не знаете, где на самом деле «хорошо». То, что у вас есть, это местный «склон». Вы можете выполнить градиентный спуск к местному «лучше», учитывая, где сейчас находится ваша точка. Он не говорит вам «универсальный» лучше, но местный лучше, чем ничего.
Итак, вы начинаете итерацию, спускаясь вниз к этой долине лучшего. Вы повторяете, пока не решите, что все готово. Может быть, значение ваших весов велико. Может быть, они подпрыгивают повсюду. Может быть, вычисление «занимает слишком много времени». Вы хотите быть сделано.
Так как же узнать, достаточно ли вы хороши?
Вот быстрый тест, который вы могли бы сделать:
Возьмите 30 одинаковых случайных подмножеств данных (например, по несколько процентов от каждого) и переобучите им сеть. Это должно быть намного быстрее. Наблюдайте, как долго они сходятся, и сравнивайте это с историей конвергенции большого множества. Протестируйте ошибку сети для всех данных в этих подмножествах и посмотрите, как это распределение ошибок соотносится с вашей большой ошибкой. Теперь увеличьте размеры подмножества до 5% от ваших данных и повторите. Посмотрите, чему это вас учит.
Это вариант оптимизации роя частиц (см. Ссылку), смоделированный тем, как пчелы принимают решения на основе разведки.
Вы спросили, что происходит, если веса не сходятся.
Нейронные сети являются одним из инструментов. Они не единственный инструмент. Есть и другие. Я бы посмотрел на использование одного из них.
Я работаю с точки зрения информационных критериев, поэтому я смотрю как на вес (количество параметров), так и на ошибку. Вы можете попробовать один из них.
Есть несколько типов предварительной обработки, которые могут быть полезны. Центр и Масштаб. Поворот с использованием основных компонентов. Если вы посмотрите на собственные значения в ваших основных компонентах, вы можете использовать правила построения графика, чтобы оценить размерность ваших данных. Уменьшение размера может улучшить сходимость. Если вы знаете что-то о «базовой физике», вы можете сгладить или отфильтровать данные, чтобы удалить шум. Иногда сходимость связана с шумом в системе.
Я нахожу идею сжатого ощущения интересной. Это может позволить радикальную выборку некоторых систем без потери обобщения. Я хотел бы взглянуть на некоторую статистику повторной выборки начальной загрузки и распределение ваших данных, чтобы определить, является ли и на каком уровне дополнительной выборки обучающий набор становится репрезентативным. Это дает вам некоторую меру "здоровья" ваших данных.
Иногда хорошо, что они не сходятся
Вы когда-нибудь слышали о парадоксе голосования? Вы могли бы думать об этом как о двоюродном брате с большим количеством в двустороннем тупике. Это петля. В парадоксе голосования с двумя людьми первый человек хочет кандидата "А", в то время как второй хочет кандидата "Б" (или не-А или такой). Важной частью является то, что вы можете думать об этом как о петле.
Петли важны в нейронных сетях. Обратная связь. Рекурсия. Это позволило персептрону решать XOR-подобные проблемы. Это создает циклы, и иногда циклы могут действовать как парадокс голосования, где они будут продолжать менять вес, если у вас было бесконечное число итераций. Они не должны сходиться, потому что важен не индивидуальный вес, а взаимодействие весов в цикле.
Замечания:
Использование только 500 итераций может быть проблемой. У меня были NN, где 10000 итераций было едва достаточно. Количество итераций, которое должно быть «достаточно», зависит, как я уже указывал, от данных, NN-топологии, функций передачи узлов, функции обучения / обучения и даже компьютерного оборудования. Вы должны хорошо понимать, как все они взаимодействуют с вашим количеством итераций, прежде чем сказать, что было «достаточно» или «слишком много» итераций. Другие соображения, такие как время, бюджет и то, что вы хотите делать с NN, когда вы закончите обучение, также должны быть учтены.
Chen, RB, Chang, SP, Wang, W. & Wong, WK (2011, сентябрь). Оптимальные экспериментальные конструкции с помощью методов оптимизации роя частиц (препринт), получено 25 марта 2012 г., http://www.math.ntu.edu.tw/~mathlib/preprint/2011-03.pdf
источник
Мне трудно сказать, в чем может быть ваша проблема. Один момент, который следует учитывать, - это конкретная реализация, которую вы используете Конкретно, какой алгоритм оптимизации. Если вашей сети требуется очень много времени, чтобы сходиться, и вы используете некоторую форму стохастического градиентного спуска (или мини-пакет), то это может быть случай, когда ваша сеть находится на плато (область, где функция энергии / ошибки очень плоская так что градиенты очень низкие и, следовательно, сходимость).
Если это так, пожалуйста, проверьте величину градиентов, чтобы увидеть, если это так. Существует несколько различных методов решения этой проблемы, например добавление импульса к градиенту.
Для подробного обзора приемов и приемов торговли, посмотрите на эту (обязательно прочитанную) статью Яна ЛеКуна .
источник
Убедитесь, что ваши градиенты не выходят за пределы или возможно также, что градиенты становятся нулевыми. Это обычно известно как взрыв градиентов и исчезающие проблемы градиентов.
Одним из возможных решений является использование адаптивного оптимизатора, такого как AdaGrad или Adam.
Я столкнулся с подобной проблемой во время обучения простой нейронной сети, когда начинал работать с нейронными сетями.
Несколько ссылок: https://en.wikipedia.org/wiki/Vanishing_gradient_problem https://www.youtube.com/watch?v=VuamhbEWEWA
источник
У меня было много наборов данных, которые медленно сходились - вероятно, потому что входные данные были сильно коррелированы.
Я написал свой собственный анализатор C ++ NN, и с его помощью я могу варьировать скорость обучения для каждого веса. Для каждого веса на каждом ребре я делаю две вещи, которые помогают некоторым.
Сначала я умножаю каждую скорость обучения на равномерно распределенное случайное число из [0,1]. Я предполагаю, что это помогает с проблемой корреляции.
Другой трюк в том, что я сравниваю текущий градиент с предыдущим градиентом на каждом ребре. Если градиент едва снижается в процентном соотношении, то я умножаю скорость обучения для этого края до 5.
У меня нет особых оправданий ни для одного из этих трюков, но они, кажется, работают довольно хорошо.
Надеюсь это поможет.
источник