Я реализовал обученную нейронную сеть по генетико 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 это делает.