Подтвердить что ты не робот

Как развить вес нейронной сети в нейроэволюции?

Я новичок в искусственных нейронных сетях и алгоритмах NeuroEvolution в целом. Я пытаюсь реализовать алгоритм NEAT (NeuroEvolution of Augmented Topologies), но описание в оригинальной публичной публикации пропустило метод эволюции веса сети, он говорит: "Вес соединения мутирует, как в любой системе NE, причем каждое соединение либо возмущено, либо нет в каждом поколении".

Я сделал несколько поисков о том, как мутировать веса в системах NE, но не могу найти подробного описания к сожалению.

Я знаю, что при обучении NE обычно алгоритм backpropagation используется для коррекции весов, но он работает только в том случае, если у вас есть фиксированная топология (структура) через поколения, и вы знаете ответ на эту проблему. В NeuroEvolution вы не знаете ответа, у вас есть только функция фитнеса, поэтому здесь невозможно использовать backpropagation.

4b9b3361

Ответ 1

У меня есть некоторый опыт в обучении фиксированной топологии NN с использованием генетического алгоритма ( "Бумага" называется "традиционным подходом NE" ). Для этого мы использовали несколько различных операторов мутации и размножения, и мы выбрали их случайным образом.

Учитывая двух родителей, наши операторы воспроизведения (также могут называть эти операторы кроссовера) включают:

  • Смените либо одиночные веса, либо все веса для данного нейрона в сети. Например, если два родителя, выбранных для размножения, выбирают определенный вес в сети и меняют стоимость (для наших свопов мы произвели два потомства, а затем выбрали тот, который лучше всего подходит для выживания в следующем поколении населения) или выберите конкретный нейрон в сети и замените все веса для этого нейрона, чтобы произвести двух потомков.

  • поменяйте весь вес слоя. Поэтому, учитывая родителей A и B, выберите конкретный слой (тот же слой в обоих) и поменяйте все веса между ними, чтобы произвести два отступления. Это большой шаг, поэтому мы настроили его так, чтобы эта операция была выбрана реже, чем другие. Кроме того, это может не иметь смысла, если ваша сеть имеет только несколько слоев.

Наши операторы мутации работали в одной сети и выбирали случайный вес и либо:

  • полностью заменить его новым случайным значением
  • измените вес на некоторый процент. (умножьте вес на какое-то случайное число между 0 и 2 - практически говоря, мы будем стремиться ограничить это бит и умножить его на случайное число между 0,5 и 1,5. Это приводит к масштабированию веса, так что он не изменяется так же радикально. Вы также можете выполнять такую ​​операцию, масштабируя все веса определенного нейрона.
  • добавить или вычесть случайное число между 0 и 1 в/из веса.
  • Измените знак веса.
  • подмены веса на одном нейроне.

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

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

Конечно, в вашем случае, так как вы также развиваете топологию, некоторые из этих операций воспроизведения выше не будут иметь большого смысла, потому что у двух выбранных родителей могут быть совершенно разные топологии. В NEAT (как я понимаю) у вас могут быть связи между несмежными слоями сети, поэтому, например, вы можете использовать нейрон с 1-го уровня, другой в слое 4, вместо того, чтобы напрямую подавать его на уровень 2. Это делает операции обмена, связанные с все тяжести нейрона сложнее - вы можете попытаться выбрать два нейрона в сети, которые имеют одинаковое количество весов, или просто придерживаться обмена одной весовой сетью в сети.

Я знаю, что, тренируя NE, обычно алгоритм backpropagation используется для коррекции весов

На самом деле, в NE backprop не используется. Это мутации, выполняемые GA, которые обучают сеть в качестве альтернативы backprop. В нашем случае backprop был проблематичным из-за некоторых "неортодоксальных" дополнений к сети, в которые я не буду входить. Однако, если бы backprop был возможен, я бы пошел с этим. Генетический подход к обучению NN определенно, по-видимому, протекает гораздо медленнее, чем, вероятно, будет иметься backprop. Кроме того, при использовании эволюционного метода корректировки весов сети вам необходимо настроить различные параметры GA как коэффициенты кроссовера и мутации.

Ответ 2

В NEAT все делается через генетические операторы. Как вы уже знаете, топология развивается через события кроссовера и мутации.

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

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