最易懂的进化算法入门:从遗传算法到神经进化

最易懂的进化算法入门:从遗传算法到神经进化

【免费下载链接】ML-From-Scratch Machine Learning From Scratch. Bare bones NumPy implementations of machine learning models and algorithms with a focus on accessibility. Aims to cover everything from linear regression to deep learning. 【免费下载链接】ML-From-Scratch 项目地址: https://gitcode.com/GitHub_Trending/ml/ML-From-Scratch

你还在为复杂的机器学习模型调参头疼吗?是否想让AI像生物进化一样自动优化?本文将用通俗语言解释两种强大的进化算法——遗传算法(Genetic Algorithm)和神经进化(Neuroevolution),通过ML-From-Scratch项目的实例代码,带你掌握让计算机自主"进化"的核心原理。读完本文,你将能够:

  • 理解进化算法的生物学灵感与工作流程
  • 用遗传算法解决字符串匹配问题
  • 实现神经进化自动优化神经网络结构
  • 掌握进化算法的参数调优技巧

进化算法的核心思想

进化算法(Evolutionary Algorithm)是一类受生物进化理论启发的优化方法,通过模拟"物竞天择,适者生存"的自然选择过程,让计算机程序自主寻找最优解。这类算法特别适合解决传统方法难以处理的复杂问题,如高维参数优化、结构设计等。

ML-From-Scratch项目在unsupervised_learning/genetic_algorithm.pysupervised_learning/neuroevolution.py中分别实现了这两种算法。

进化算法的四大步骤

所有进化算法都遵循相似的工作流程,就像生物进化一样:

mermaid

  1. 初始化种群:创建一组随机的候选解(个体)
  2. 评估适应度:衡量每个个体解决问题的能力
  3. 选择与繁殖:让适应度高的个体产生更多后代
  4. 变异:随机改变部分后代的特性,保持多样性

遗传算法:让字符串自动进化

遗传算法(Genetic Algorithm)是最经典的进化算法之一。我们以项目中的examples/genetic_algorithm.py为例,看看如何让计算机通过进化自动生成目标字符串"Genetic Algorithm"。

核心实现原理

遗传算法将每个候选解视为一个"染色体",在字符串匹配问题中,每个字符就是一个"基因"。算法通过以下关键步骤实现进化:

# 初始化种群:创建随机字符串
def _initialize(self):
    self.population = []
    for _ in range(self.population_size):
        individual = "".join(np.random.choice(self.letters, size=len(self.target)))
        self.population.append(individual)

# 计算适应度:字符匹配度越高,适应度越大
def _calculate_fitness(self):
    population_fitness = []
    for individual in self.population:
        loss = 0
        for i in range(len(individual)):
            # 计算字符间的字母表距离
            letter_i1 = self.letters.index(individual[i])
            letter_i2 = self.letters.index(self.target[i])
            loss += abs(letter_i1 - letter_i2)
        fitness = 1 / (loss + 1e-6)  # 损失越小,适应度越大
        population_fitness.append(fitness)
    return population_fitness

交叉与变异:创造新一代

就像生物繁殖一样,遗传算法通过交叉(Crossover)和变异(Mutation)产生新个体:

# 交叉:随机选择交叉点,交换父母基因
def _crossover(self, parent1, parent2):
    cross_i = np.random.randint(0, len(parent1))
    child1 = parent1[:cross_i] + parent2[cross_i:]
    child2 = parent2[:cross_i] + parent1[cross_i:]
    return child1, child2

# 变异:以一定概率随机改变基因
def _mutate(self, individual):
    individual = list(individual)
    for j in range(len(individual)):
        if np.random.random() < self.mutation_rate:
            individual[j] = np.random.choice(self.letters)
    return "".join(individual)

运行效果与参数调优

使用以下参数配置,算法通常能在几百代内找到目标字符串:

target_string = "Genetic Algorithm"
population_size = 100  # 种群大小:100个候选字符串
mutation_rate = 0.05   # 变异率:5%的概率改变每个字符

genetic_algorithm = GeneticAlgorithm(target_string, population_size, mutation_rate)
genetic_algorithm.run(iterations=1000)

运行过程中,你会看到候选字符串逐渐向目标进化:

[0 Closest Candidate: 'qBFvJ 5zOcvAqQ', Fitness: 0.01]
[10 Closest Candidate: 'hUnyc Algorithm', Fitness: 0.12]
[50 Closest Candidate: 'Genetk Algorithm', Fitness: 0.83]
[87 Closest Candidate: 'Genetic Algorithm', Fitness: 1000000.00]

神经进化:让神经网络自我进化

神经进化(Neuroevolution)是进化算法与神经网络的完美结合。不同于手动设计网络结构和调参,神经进化让神经网络像生物一样进化,自动找到最优结构和参数。

项目中的examples/neuroevolution.py展示了如何用神经进化解决手写数字识别问题。

神经进化的工作原理

神经进化将每个神经网络视为一个"个体",通过进化优化网络的权重和结构。核心步骤包括:

  1. 创建初始种群:随机生成多个神经网络
  2. 评估性能:让每个网络在任务上测试,计算准确率(适应度)
  3. 选择与繁殖:保留表现好的网络,通过交叉和变异产生后代
  4. 迭代进化:重复上述过程,直到网络性能达到目标

实现代码解析

首先定义神经网络的基本结构,作为进化的"基因模板":

def model_builder(n_inputs, n_outputs):    
    model = NeuralNetwork(optimizer=Adam(), loss=CrossEntropy)
    model.add(Dense(16, input_shape=(n_inputs,)))  # 隐藏层:16个神经元
    model.add(Activation('relu'))                  # 激活函数:ReLU
    model.add(Dense(n_outputs))                    # 输出层:对应类别数
    model.add(Activation('softmax'))               # 分类输出:softmax
    return model

然后创建神经进化实例,开始进化过程:

# 神经进化参数设置
population_size = 100    # 100个神经网络个体
n_generations = 3000     # 进化3000代
mutation_rate = 0.01     # 1%的参数变异率

model = Neuroevolution(population_size=population_size, 
                      mutation_rate=mutation_rate, 
                      model_builder=model_builder)
model = model.evolve(X_train, y_train, n_generations=n_generations)

进化结果可视化

神经进化训练完成后,项目使用PCA将高维数据降维到2D空间,直观展示进化后的神经网络分类效果:

# 降维并可视化分类结果
y_pred = np.argmax(model.predict(X_test), axis=1)
Plot().plot_in_2d(X_test, y_pred, title="Evolutionary Evolved Neural Network", 
                 accuracy=accuracy, legend_labels=range(y.shape[1]))

通过进化,神经网络在手写数字识别任务上的准确率通常能达到90%以上,完全不需要人工调参!

进化算法的参数调优指南

无论使用遗传算法还是神经进化,参数设置都直接影响进化效果。以下是基于项目经验的调参建议:

参数推荐范围作用
种群大小50-200太小容易陷入局部最优,太大计算量增加
变异率0.01-0.1太小导致进化缓慢,太大破坏优良基因
进化代数100-5000根据问题复杂度调整,设置早停条件
选择压力2-5倍每次选择前20-50%的优秀个体繁殖

总结与应用场景

进化算法是解决复杂优化问题的强大工具,尤其适合以下场景:

  1. 传统优化难题:如旅行商问题、函数优化等
  2. 机器学习调参:自动优化模型超参数
  3. 神经网络设计:神经进化无需反向传播,适合强化学习等场景
  4. 创意生成:如自动生成图像、音乐、文本等

ML-From-Scratch项目提供了进化算法的极简实现,你可以直接修改examples/genetic_algorithm.pyexamples/neuroevolution.py来解决自己的问题。

下一步学习建议

  1. 尝试修改遗传算法的目标字符串,观察进化过程
  2. 调整神经进化的网络结构,增加隐藏层数量
  3. 用进化算法解决一个实际问题:如优化投资组合、设计简单游戏AI

进化算法的魅力在于,它让计算机像大自然一样充满创造力。现在就运行项目中的示例代码,亲眼见证"进化"的神奇力量吧!

如果你觉得本文有帮助,请点赞收藏,关注获取更多机器学习从入门到精通的教程。下期我们将探讨如何将进化算法与强化学习结合,创建能自主学习玩游戏的AI!

【免费下载链接】ML-From-Scratch Machine Learning From Scratch. Bare bones NumPy implementations of machine learning models and algorithms with a focus on accessibility. Aims to cover everything from linear regression to deep learning. 【免费下载链接】ML-From-Scratch 项目地址: https://gitcode.com/GitHub_Trending/ml/ML-From-Scratch

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值