遗传算法与进化模拟参数调整实践
1、修改出生率和死亡率,观察这对最终种群数量有何影响。
可以在代码中修改
(出生率)和
RPRD_RATE
(死亡率)的值,然后重新运行模拟代码(如 Listing 2.4 中的代码),通过观察绘图来查看最终种群数量的变化情况。若出生率提高、死亡率降低,种群数量可能增加;若出生率降低、死亡率提高,种群数量可能减少。
DEATH_RATE
2、修改死亡率和出生率参数,观察这对结果有什么影响。
在相关代码中修改死亡率和出生率参数,然后重新运行模拟,观察最终种群数量等结果的变化。如在简单细胞模拟中,修改这些参数后重新运行最后一个笔记本单元格以查看更新后的模拟结果。
3、在一个假设的棋盘游戏中,皇后可以向任何方向移动任意距离,皇后的最大数量限制为棋盘的大小。若棋盘大小为 8,现在要查看绘制皇后初始或随机放置情况的第一段代码。请简述这个场景的主要内容。
该场景描述了要查看皇后在棋盘上的初始随机放置情况,因皇后移动特性,皇后最大数量等于棋盘大小,此例棋盘大小为 8 ,会查看绘制皇后初始放置的第一段代码。
4、调整遗传参数、种群、交叉和变异率,然后重新运行笔记本。
可参照以下步骤操作:
在相关笔记本里,对种群大小、交叉率、变异率等遗传参数进行调整。 如在涉及遗传算法的代码部分,找到对应参数的设置处修改数值。 对于种群、交叉和变异的调整,可改变种群大小、调整交叉和变异的具体操作方式等。 修改完成后保存设置,重新运行整个笔记本以观察调整带来的影响。
5、Open the EDL_3_4_TSP_Operators.ipynb in Colab and run all the cells. Refer to Appendix A if you need assistance. This exercise borrows most of the code from the previous exercise and annotates it with some additional visualizations.
在Colab中打开
笔记本并运行所有单元格。如果需要帮助,请参考 附录A 。本练习借鉴了上一个练习的大部分代码,并添加了一些额外的可视化注释。
EDL_3_4_TSP_Operators.ipynb
6、更改选择和交配算子。尝试使用不同的选择算子,看看哪个对这个问题更有效。
在测试选择算子时,可选择
(锦标赛选择)、
Tournament
(随机选择)、
Random
(最佳选择)、
Best
(最差选择)、
Worst
等算子中的一个,然后从菜单中选择 Runtime -> Run after 来应用更改并重新运行笔记本中其余的单元格。
NSGA2
尝试每个算子后,根据结果判断哪个对该问题更有效。同时,还可以结合调整遗传参数(种群、交叉率和变异率),以及更改选择函数的类型或参数,综合评估不同算子和参数设置对问题求解的效果。
此外,还可以回顾笔记本
并更改选择/交配算子,观察其对进化的影响。
EDL_3_2_QueensGambit.ipynb
7、查看改变算子和超参数(种群、交叉率和变异率)对谱系有什么影响。
可通过以下操作查看影响:
在学习练习中,更改选择和交配算子,尝试每个算子以确定哪个更适合该问题 调整遗传参数(种群、交叉率和变异率)后重新运行笔记本 更改用于进化的选择函数的类型或参数 重新访问笔记本
并更改选择/交配算子,观察其对进化的影响 在 EvoLisa 示例中,调整突变、交叉和种群参数,观察其对进化的影响,看是否能减少达到所选图像更好摹本所需的代数
EDL_3_2_QueensGambit.ipynb
8、重新打开笔记本 EDL_3_2_QueensGambit.ipynb 并更改选择/交配算子,观察这对进化有什么影响。
重新打开该笔记本并更改选择/交配算子,以观察其对进化产生的影响。
9、切换到不同的图像,看看进化算法能在多大程度上复制原始图像。你甚至可以添加自己的图像。
这是一个学习练习,目的是通过切换不同图像以及添加自己的图像,来测试进化算法复制原始图像的效果。
10、更改遗传算子和/或交叉/选择/变异参数,然后重新运行,应该如何操作?
可按以下步骤操作:
调整遗传参数、种群、交叉和变异率,然后重新运行笔记本; 更改用于进化的选择函数的类型或参数; 打开
笔记本,在 Colab 中运行所有单元格,通过 Colab 表单更改选择和交配算子,选择不同的选择算子(如 Tournament、Random、Best、Worst、NSGA2 等)并重新运行剩余单元格; 查看更改算子和超参数(种群、交叉和变异率)对谱系的影响; 重新打开
EDL_3_4_TSP_Operators.ipynb
笔记本,更改选择/交配算子,观察对进化的影响。
EDL_3_2_QueensGambit.ipynb
11、在一段代码中,有一个目标函数,可通过修改某个参数来更改它。现在要求更改该目标函数,然后重新运行代码,查看会产生什么影响。
可通过修改代码中对应的
参数来更改目标函数,它有
equation_form
、
'polynomial'
、
'abs'
三个选项。修改后重新运行代码,会根据新的目标函数生成不同的 X 和 Y 值,绘制出不同的散点图,从而观察到不同目标函数对结果的影响。
'step'
12、在不连续函数逼近任务中,更改各种超参数并重新运行,能否提高不连续函数逼近的性能?
能,将MAX_TIME从5秒改为100秒后,DE方法在逼近阶跃函数时比ES方法性能提升超10倍。
13、增加/减少样本数量,并重新运行笔记本
可按以下步骤操作:
打开 Colab 中的笔记本
,通过菜单选择 Runtime -> Run all 运行所有单元格; 选择相应选项,再次通过选择 Runtime -> Run all 运行笔记本中的所有单元格。
EDL_6_1_MLP_NumPy.ipynb
若运行笔记本时遇到错误,通常是重复运行代码或代码不同步导致的,最简单的解决方法是对笔记本进行出厂重置( Runtime -> Factory reset runtime ),然后再次运行单元格。
14、在 Colab 的两个不同浏览器标签中打开 EDL_6_3_MLP_ES.ipynb 和 EDL_6_3_MLP_DE.ipynb,同时打开上一个项目的笔记本 EDL_6_2_MLP_GA.ipynb。若需要帮助,应该怎么做?
在 Colab 的两个不同浏览器标签分别打开
和
EDL_6_3_MLP_ES.ipynb
,同时可保持
EDL_6_3_MLP_DE.ipynb
打开,若有需要可查看附录 A 获取帮助。
EDL_6_2_MLP_GA.ipynb
15、运行前两个单元格,即pip安装和导入操作,以设置笔记本代码的基础。
可运行以下代码来设置基础:
!apt-get install -y xvfb x11-utils
!pip install gym[box2d]==0.17.* pyvirtualdisplay==0.2.* PyOpenGL==3.1.* PyOpenGL-accelerate==3.1.* mediapy piglet -q
from pyvirtualdisplay import Display
16、向模型中添加卷积层和最大池化层有什么作用?
向模型中添加卷积层和最大池化层,有助于减少需要进化的模型参数总数。
17、在设置用于定义层类型和长度、封装相关超参数的常量时,通常从定义哪些常量开始?
我们从定义总最大层数和神经元、卷积核、池化层等参数的最大最小值的常量开始,如
表示最大层数为 5,
max_layers = 5
、
max_neurons = 128
分别表示最大和最小神经元数,
min_neurons = 16
、
max_kernel = 5
分别表示最大和最小卷积核大小,
min_kernel = 2
、
max_pool = 3
分别表示最大和最小池化层大小。
min_pool = 2
18、在基因序列中添加一种新的Dropout层类型,为构建更强大的卷积神经网络(CNN)模型提供基础,应该怎么做?
在基因序列中添加
层类型虽需付出一定努力,但能为构建更优的 CNN 模型奠定基础。
Dropout
定义了生成
层的函数:
Dropout
def generate_dropout_layer():
part = [DROPOUT_LAYER]
part.append(random.uniform(0, .5))
return part
通过该函数可以生成带有随机丢弃率的
层并添加到基因序列相关部分。
Dropout
19、思考其他形式的进化如何从超参数优化应用到神经进化的权重/参数优化。
之前使用进化算法(EA)的变体,如 粒子群优化 、 进化策略 和 差分进化 ,对深度学习网络的超参数优化有帮助,能比简单的随机或网格搜索算法更好地搜索超参数。
现在将深入探索如何将进化方法直接应用于优化网络参数,从而消除通过网络反向传播误差或损失的需要。
在调整超参数时,使用 进化策略 (ES)和 差分进化 (DE)取得了不错的结果,接下来会将 ES 和 DE 作为神经进化优化器应用到相关问题中。
通过运行不同的代码示例(如
和
EDL_6_3_MLP_ES.ipynb
),对比不同方法对权重的优化情况,观察它们如何从超参数优化拓展到神经进化的权重/参数优化。
EDL_6_3_MLP_DE.ipynb
20、如何使用MNIST手写数字数据集?
可以按以下步骤使用MNIST手写数字数据集:
对于进化优化相关项目:
– 打开 Colab 中的 notebook
EDL_6_5_MNIST_GA.ipynb
– 运行前两个单元格(
和
pip install
)来设置代码基础
import
– 下一个单元格会加载 MNIST 数据集,对值进行归一化并将其放入训练张量
和
X
Y
对于使用 NEAT 进行图像分类的练习:
– 打开 Google Colab 中的 notebook
EDL_10_4_NEAT_Images.ipynb
– 通过菜单选择 Runtime -> Run all 运行所有单元格
– 该 notebook 会加载 MNIST 数据集,仅使用训练数据部分评估基因组适应性
– 数据加载后会进行归一化并显示一个样本数字
21、改变模型超参数,如学习率和批次大小,观察这对训练有什么影响。
超参数调整对模型训练的影响
学习率调整
学习率的作用 :控制模型学习的速度。 学习率大小的影响因素 : 输入数据的方差 模型复杂度
数据方差与学习率的关系
数据方差越高,所需学习率越小。 数据越均匀,支持的学习率越高。
模型复杂度与学习率的关系
调整模型复杂度增加时可能也需要降低学习率。
批次大小与数据步长调整
批次大小和数据步长是相关联的。 如果通过减小数据步长大幅增加数据量,同样需要增加批次大小。
超参数调整对训练时间的影响
改变这些超参数会对训练时间等产生影响。 改变数据量时是否改变批次大小,对完成500个训练周期的训练时间影响显著。
22、在编码器和解码器中添加或移除卷积层。确保自编码器的两侧保持平衡。
自编码器改进操作建议
在对编码器和解码器进行卷积层的添加或移除操作时,应确保 编码器与解码器的结构保持平衡 ,以此来优化自编码器的性能。
23、Open notebook EDL_8_3_EvoAutoencoder.ipynb in Colab. Refer to Appendix A if you need assistance.
在Colab中打开笔记本
。如果需要帮助,请参考附录A。
EDL_8_3_EvoAutoencoder.ipynb
24、Scroll down to the section “Creating Mating/Mutation Operators” and select the next code cell. From the menu select Runtime –> Run before to execute all the previous cells in the notebook. Be patient and wait for the sample training to complete.
向下滚动到“创建交配/变异算子”部分,选择下一个代码单元格。从菜单中选择 “运行” -> “运行之前的所有单元格” 来执行笔记本中之前的所有单元格。请耐心等待样本训练完成。
25、尝试调整学习率和批量大小的超参数,观察这对模型演变有什么影响。
调整学习率和批量大小可使模型训练更高效,得到更好结果。
学习率
控制模型学习速度,需根据输入数据的可变性调整: 数据方差高时,使用较小学习率。 数据更均匀时,可用较高学习率。
调整模型大小时,可能也需降低学习率。
批量大小
需基于输入数据的可变性调整:
数据变化大时,使用小批量大小(16 – 64)。 数据变化小且更均匀时,可增大批量大小。
26、调整和调优变分自编码器(VAE)模型,使其生成最佳版本。
可通过以下方式调整和调优 VAE 模型:
更改各种超参数,重新运行笔记本,观察每个超参数对生成结果的影响; 增加或减少编码器/解码器模型层,重新运行笔记本; 切换重建损失的标志(从均方误差(MSE)切换到二元交叉熵),观察训练差异,由于使用了归一化损失指标,可在不同的重建和统计距离/散度度量之间进行切换和比较。
27、在训练生成对抗网络(GAN)的生成器时,如何降低模式崩溃的可能性?
可以通过以下方法降低模式崩溃的可能性:
找到合适的优化器 调整损失函数 展开生成对抗网络(unrolling GANs) 向对抗性基本事实添加噪声
28、如何减少生成对抗网络(生成器)中的梯度消失问题?
通常,当在深度学习模型中观察到梯度消失时,要审查模型架构并寻找可能导致梯度消失的潜在区域。可以将生成器模型中使用的
激活函数进行更改,如尝试
relu
;还可以调整判别器使用的优化器,例如将判别器的优化器从
LeakyReLU
更换为
RMSprop(.00001)
。
Adam(.00000001, .5)
29、使用时尚MNIST数据集重新运行笔记本,该如何操作?
若要查看此数据集在时尚MNIST数据集上的表现,可按以下代码更改重新运行整个笔记本。还可移除对
函数的调用,以查看模型在数据集中所有类别上的表现。
extract
代码更改如下:
在
文件中:
EDL_9_3_WGAN.ipynb
注释掉以下行:
python from tensorflow.keras.datasets import mnist as data
取消注释以下行:
python from tensorflow.keras.datasets import fashion_mnist as data
30、请翻译以下内容:As you will notice this notebook installs DEAP and will add the required tools and operators to perform GA evolution. Code cells that are not relevant will be hidden but if you want to review their contents just click the link “Show Code” or double click on the cell. Most of the code we have seen before and as always, we will just refer to the relevant code sections.
你会注意到,这个笔记本会安装 DEAP ,并会添加执行遗传算法(GA)进化所需的工具和操作符。
提示:
不相关的代码单元格会被隐藏起来,但如果你想查看其内容,只需点击“显示代码”链接或双击该单元格即可。
我们之前已经见过大部分代码,和往常一样,我们只会提及相关的代码部分。
31、在评估函数中,为了评估模型的适应度,会将个体转换为字符串作为已训练字典的索引,且把值四舍五入到小数点后一位。已知基因序列长度为 5,这样做是为了将训练从无限的探索空间简化为有限的空间。请解释为什么这样做能简化训练空间,以及通过这种方式确定有多少个可能的模型需要测试,还有这样做的好处是什么?
将个体基因值四舍五入到小数点后一位并转换为字符串作为索引,可简化训练的探索空间,从无限变为有限。
以基因序列长度为 5 为例,每个位置有 10 种可能(0 – 9 这 10 个一位小数),所以有
个可能的模型需测试。
10 x 10 x 10 x 10 x 10 = 100000(十万)
这种处理方式的好处是能进化出更大种群且无需重新评估相似个体,因为评估模型耗时较长。
32、将在一个数据集上开发的进化模型重新用于在新数据集上训练生成对抗网络(GAN),这种做法在大小相似的数据集(如MNIST时尚和数字数据集)上是否效果最佳,为什么?
该陈述有一定合理性。
在大小相似的数据集上,由于数据的规模、分布等特征有一定的相似性,复用在一个数据集上开发的进化模型来训练新数据集上的GAN,可能能够借鉴之前模型学习到的一些通用特征和模式,从而在一定程度上加速训练过程,提高训练效率和模型性能。
不过,即使数据集大小相似,数据的具体内容和特征可能仍存在差异,可能需要对模型进行适当的调整和优化,以更好地适应新数据集。
33、This notebook loads the MNIST dataset. We only use the training data portion of the dataset to evaluate the genome fitness over a batch sample. After the data is loaded it is normalized and then a sample digit is displayed. Note, that we are using all 10 classes from the full dataset.
此笔记本加载了MNIST数据集。我们仅使用该数据集的训练数据部分,通过批量样本来评估基因组的适应度。数据加载完成后会进行归一化处理,然后显示一个样本数字。请注意,我们使用的是完整数据集中的全部10个类别。
34、在 Google Colab 中打开笔记本 EDL_11_2_Gym_Setup.ipynb,然后通过从菜单中选择“运行时” -> “全部运行”来运行笔记本中的所有单元格。若过程中需要帮助该怎么做?
若过程中需要帮助,可参考附录 A。在打开指定笔记本后,从菜单选择 “运行时” -> “全部运行” 来执行所有单元格。
35、打开并运行笔记本中提供的所有模拟环境,同时熟悉每个环境的动作和观察/状态空间。
可以通过以下步骤来完成:
运行整个笔记本,可通过菜单中的 “Runtime -> Run all” 或键入 Ctrl + F9 (Windows/Linux)、 Cmd + F9 (Mac)来实现。
对于环境动作和状态空间的查看,在代码中可以通过相关代码来实现。示例代码如下:
import gym
import numpy as np
ENVIRONMENT = 'your_environment_name'
SIMULATION_RUNS = 10
SIMULATION_ITERATIONS = 100
env = gym.make(ENVIRONMENT)
# 打印动作和状态空间
print('动作空间:', env.action_space)
print('状态空间:', env.observation_space)
fitnesses = []
frames = []
for run in range(SIMULATION_RUNS):
state = env.reset()
fitness = 0
for i in range(SIMULATION_ITERATIONS):
action = env.action_space.sample()
state, reward, done, info = env.step(np.argmax(action))
frames.append(env.render(mode='rgb_array'))
fitness += reward
if done:
fitnesses.append(fitness)
break
mediapy.show_video(frames, fps=30)
在运行过程中,第二个最后执行模拟的单元格会运行几分钟,运行时会显示进度条。模拟完成后,会使用
函数在输出中显示短视频片段,可播放视频观察模拟运行情况。
show_video
36、在回顾设置代码后进入NEAT配置环节,该配置中网络的输入数量和输出数量是如何定义的,以及NEAT智能体的输入和输出分别是什么?
在NEAT配置中,网络的输入数量定义为状态或观测空间的大小,输出数量定义为动作空间的大小。NEAT智能体的输入是状态/观测,输出是动作。
37、修改代数和初始后代参数,观察这对结果有什么影响。
可通过以下通用步骤操作:
确定修改参数的代码位置,通常在控制进化过程的函数或配置部分。 逐步修改代数和初始后代参数的值。 每次修改后运行程序并记录结果,如适应度值、种群多样性等。 分析不同参数设置下结果的变化,总结参数对结果的影响。
38、尝试找出能使种群数量增长呈下降趋势的繁殖率和死亡率。
可通过修改繁殖率(
)和死亡率(
RPRD_RATE
)参数,运行代码观察种群数量变化来找出合适数值,如降低繁殖率、提高死亡率可能使种群数量增长下降。
DEATH_RATE
39、修改评估函数以改变返回的健康参数。然后重新运行模拟,看看会有什么影响。
可先修改评估函数中健康参数的计算逻辑,如修改
这部分,之后重新运行模拟,通过观察模拟结果中细胞健康值、繁殖情况、种群数量等指标的变化来确定影响。
cell["health"] *= cell["strength"]/100
40、如何在浏览器中打开示例笔记本 EDL_2_4_Simulating_Evolution.ipynb 以及遇到问题怎么办?
可在浏览器中打开该笔记本,若有需要参考附录 A 获取帮助。
41、将突变率 MUTATE_RATE 修改为 0 到 1 之间的新值。多次尝试此操作,每次更改后重新运行相关程序。观察突变对细胞进化有什么影响。
一般来说,较低突变率可能使进化更稳定但可能陷入局部最优;较高突变率可能带来更多多样性但可能使进化不稳定。
42、在一个进化算法中,修改交叉率和突变率。再次运行进化过程,观察改变每个参数对快速演化出解决方案有何影响。
可在代码里找到设置交叉率和突变率的参数位置进行修改,重新运行程序,观察算法收敛到解决方案所需的时间或迭代次数等指标的变化。
43、打开 EDL_3_2_QueensGambit.ipynb 并运行所有单元格。
应在合适的环境(如 Colab)中打开该笔记本,之后通过菜单选择
来运行所有单元格。
Runtime -> Run all
44、增加或减少推销员需要访问的目的地数量,并在每次更改后重新运行。能为多少个目的地创建解决方案的最大数量是多少?
可尝试增加目的地数量(如增加到 23、25 甚至更多),同时可能需要增加 代数 和/或 种群数量 来寻找解决方案。