Как алгоритм geneti c может оптимизировать вес нейронной сети, не зная объема поиска? - PullRequest
6 голосов
/ 14 апреля 2020

Я реализовал обученную нейронную сеть по генетико c алгоритму с оператором мутации, например:

def mutation(chromosome, mutation_rate):
  for gene in chromosome:
    if random.uniform(0.00, 1.00) <= mutation_rate:
      gene = random.uniform(-1.00, 1.00)

И хромосомы изначально инициализируются случайным образом:

def make_chromosome(chromosome_length):
  chromosome = []
  for _ in range(chromosome_length):
    chromosome.append(random.uniform(-1.00, 1.00))
  return chromosome

При выполнении кроссовер, потомство хромосомы могут иметь гены только в интервале [-1, 1], потому что родительские хромосомы также имеют гены только в этом интервале. Когда потомство видоизменяется, оно также сохраняет свои гены в этом интервале.

Кажется, это работает для некоторых проблем, но не для других. Если оптимальные веса нейрона находятся в пределах [-1, 1], то алгоритм geneti c работает, но что, если оптимальные веса нейрона находятся в другом интервале?

Например, если я обучил сеть с использованием обратного распространения с условие завершения ошибки классификации ниже 5%, я могу посмотреть на вес сети и увидеть такие значения, как -1.49, 1.98, 2.01, et c. Мой алгоритм geneti c никогда не мог бы генерировать эти гены, потому что гены инициализируются в [-1, 1], а кроссовер и мутация также не могут генерировать гены вне этого диапазона.

Кажется, мне нужно определить пространство поиска лучше, что-то вот так:

# search space boundaries
S_MIN = -1.00
S_MAX = 1.00

# in mutation()
gene = random.uniform(S_MIN, S_MAX)

# in make_chromosome()
chromosome.append(random.uniform(S_MIN, S_MAX))

Затем я могу установить границы пространства поиска в зависимости от проблемы. Но как мне определить пространство поиска? Эта информация не известна априори и найдена через обучение сети. Но если для обучения требуется, чтобы пространство поиска было известно, я бы остановился.

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

При обратном распространении пространство поиска априори не известно и не имеет значения, но для GA это делает.

Ответы [ 3 ]

4 голосов
/ 20 апреля 2020

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

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

С самого начала исследование является очень агрессивным и делает смелые шаги, так что это может быстро исследовать пространство решения. Тогда, когда области пространства решения, представленные как более перспективные, исследование становится менее смелым в попытке приблизиться к решению.

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

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

Затем политика исследования выберет размер, скорость и степень мутации, чтобы быть изначально агрессивными для широкого изучения. Выбор последующих поколений предпочтет те, которые были ближе к ответу и с менее агрессивной стратегией исследования. Таким образом, последние поколения склонны быть ближе к «ответу», а также с менее агрессивной стратегией исследования и, таким образом, имеют тенденцию к сближению.

В этой статье более формальный обзор концепций.

https://towardsdatascience.com/reinforcement-learning-demystified-exploration-vs-exploitation-in-multi-armed-bandit-setting-be950d2ee9f6

3 голосов
/ 23 апреля 2020

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

"Гены" в этом случае были:

  • Выбор двух или трех входных значений из списка ответов на стандартные фильтры обработки изображений (обнаружение вертикальных границ, низкая контрастность, обнаружение линий и т. Д. c.)
  • Выбор двух выходных соединений из списка стандартных профилей напряжения для каждого двигателя (жесткая рампа / медленная рампа / мгновенно до 0%, 50%, 100%, -50%, -100% и т. д. c.)
  • Выбор соединений между узлами в двухуровневой нейронной системе. сеть, каждый слой имеет только пять узлов. Например, «вход 2 присоединяется к узлу 3 на уровне 1». Разрешается только некоторая доля (30%?) Соединений.

Итак, одна ДНК состояла из двух входных узлов, пятидесяти соединений и двух выходных узлов. Популяция начинается с сотен случайных выборов ДНК, запускает дирижабли, которые обучают выбранные нейронные сети, вычисляют время полета уровня и размножаются. Под породой я имею в виду, что он убивает самую низкую половину очков и создает мутированные копии победителей. Успех произошел.

Теперь, касаемо вашей проблемы.

Вы должны четко понимать, какими могут быть ваши гены. Вот несколько хороших вариантов:

  • Сетевая архитектура, как в приведенном выше рассказе
  • Гиперпараметры для выбивки, скорости обучения, перезапусков, функций потерь и т. Д.
  • Начальные распределения веса, фактически больше параметров, включая некоторые для добавления случайных диких весов.
  • Дикие удары по тому или иному параметру, что означает выбор оси или двух для поиска с дикими значениями или с высокой точностью зерна.

Также помните, что мутация и скрещивание разные. Вы должны позволять дикие мутации иногда. Обычная тактика c для размножения около 70% (сделать копию, поменять местами некоторые гены) и мутировать около 30% (скопировать выжившего и внести случайные изменения).

Как часто бывает с быстрым советом, я Угадаю, что не сказано в вашем описании. Если я совершенно не согласен с тем, что ты делаешь, притворись им на базе; Вы, вероятно, будете тем, кто решит вашу проблему.

0 голосов
/ 23 апреля 2020

Согласно комментарию @ a_guest, я нашел лучшую производительность, используя оператор мутации, который нарушает ген вокруг нормального распределения. Я сделал три теста:

  • возмущающие гены, случайно однородные в пределах [-1.00, 1.00]
  • возмущающих генов в пределах нормального распределения вокруг среднего значения всех генов в хромосоме
  • возмущающих гены в пределах нормального распределения вокруг мутирующего гена

Я назвал тесты № 1, № 2, № 3. Это использует набор данных Iris в сети 4-3-3 с использованием функции активации ReLU. Один прогон на тест не будет значительным, потому что он может быть удачным или неудачным, поэтому на этом графике используется среднее значение между тридцатью лучшими прогонами из выборки из пятидесяти прогонов.

enter image description here

Вы можете видеть, что BP-NN дает хорошую базовую линию для сравнения.

Мой равномерно-случайный оператор мутации попадает в локальные минимумы почти сразу же, потому что не проводится исследование пространства поиска (поскольку гены никогда не могут быть вне [-1, 1], т.е. с моего наивного подхода, с которого я начал этот вопрос).

Гауссовский оператор в среднем по хромосоме хорошо работает, достигая MSE <= 0,1 в 32-ю эпоху (сравните backprop в 50-й эпохе). Гауссовский оператор вокруг мутирующего гена также хорошо работает, достигая того же порога MSE в 26-й эпохе. </p>

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

Если у вас было среднее значение гена 0.00, ген был 0.00, мутировал до 2.00 на крайнем конце, среднее значение гена могло бы измениться лишь незначительно (например, 0.10). В следующий раз, когда появится мутация, ген может быть 2.00, но среднее значение не отошло от 0.00. Возможно, вторая мутация нарушит ген до 2.05 на крайнем конце. Использование гауссовского оператора вокруг гена speci c вместо этого может привести к его изменению на 4.00 на крайнем конце.

Я думаю, что гауссовский оператор мутации с mu = mutating gene и sigma = decreasing as MSE decreases - лучший подход. Я пробовал sigma = 0.7 + MSE, кажется, отлично работает, по крайней мере, для этого набора данных, потому что максимальный MSE составляет около 0,7. Исследовательский фактор уменьшается по мере приближения MSE к 0, что означает более раннюю разведку и более локальную разработку позже. Это также означает, что мне не нужно определять или даже знать объем поиска.

...