Метод обучения нейронной сети
Я изучал нейронные сети в последнее время. Я объясню свою цель: я пытаюсь научить монстров ходить, стоять, в основном выполнять действия, которые "вознаграждают" их (максимизируют фитнес-функцию). NN получает входные сигналы от датчиков и выводит мышечную активность. Проблема сводится к обучению веса и уклонов нейронов. Моя проблема в том, что я не уверен, правильно ли я все делаю, и с нейронными сетями я могу ошибиться и никогда не узнать об этом. Поэтому я объясню, что я делаю в целом, и если вы заметите ошибку, пожалуйста, исправьте меня!
1) Я создаю нейронную сеть с нейронами, которые используют гиперболическую передаточную функцию тангенса.
2) Создайте популяцию случайных "хромосом", каждая из которых содержит массив двойников в виде генов (весовые коэффициенты и смещения в NN), длина массива равна количеству весовых коэффициентов и смещений в NN. Гены имеют нижний и верхний предел, обычно [-2,2], в котором их случайное значение генерируется при инициализации и мутации.
Для каждого поколения:
3) Для каждой хромосомы я обновляю веса NN и проверяю монстра на 5000 кадров. Каждые 10 кадров сетевые выходы генерируются с помощью сенсорного входа. Выходные значения представляют собой двойные значения, нормализованные до [0,1], и они контролируют "мышцы" (пружины) в теле, изменяя их нейтральную длину в соответствии с этим значением. Фитнес-значение рассчитывается.
4) Выполните операторы Генетического алгоритма - сначала создайте перекрестные переходы с вероятностью ~0,4, затем мутируйте с вероятностью ~0,1, в зависимости от длины хромосомы. Мутация рандомизирует ген до значения между некоторым нижним и верхним пределом. Элитарность - два лучших решения остаются неизменными для следующего поколения.
Повторяйте до достижения поколений>maxGenerations или max fitness.
Я не уверен в некоторых вещах в моем коде: должен ли быть предел для весов и уклонов? если да, это ограничивает потенциальные результаты, которые может достичь NN. Если нет, то как я могу инициализировать значения и мутировать? Я боюсь, что добавление случайного значения в качестве мутации застрянет в локальной оптиме, как восхождение на гору. Без ограничений будет уменьшено количество параметров, которые я должен учитывать при инициализации всего, что приятно!
Является ли гиперболический тангенс хорошим выбором? Почему или почему нет?
Нужно ли нормализовать входные данные датчика? если да, то между какими значениями?
Кроме того, я не уверен, что делаю ошибку, выводя двойное значение для сгибания вместо двоичного - выше 0,5 - это сгибание, меньше - освобождение, может быть вариант, когда сейчас я просто использую значение как сгибание количество.
Не рассматривайте ошибки в моем коде как причины плохих результатов, потому что я проверял много раз и внедрил XOR, который работал отлично.
Я был бы очень признателен за любую помощь, спасибо!
1 ответ
Я предполагаю, что вы имеете в виду Нейронные сети с прямой связью, т. Е. Соединенные между собой слои нейронов.
Можно использовать гиперболический тангенс или сигмовидную функцию. Просто убедитесь, что они непрерывны и выводимы в своей области. В противном случае алгоритм обучения (градиентный спуск) может некорректно возвращать ошибку обратно в первые слои.
Вы должны нормализовать каждый вход в любой диапазон, например [-1,+1] или [-std,+std], используя zscore. Поэтому значения ваших входных данных будут иметь аналогичный вес в функции принятия решения.
Вы не указываете цели своих выходов, если они являются дискретными или с плавающей запятой.
Интересно, как FFNN контролируется, с какими данными вы тренируете свой алгоритм?