Ответ 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 как коэффициенты кроссовера и мутации.