什么是遗传/进化算法?

这是基於 进化论 而启发出来的一种很特别的 机器学习 技巧。  我最近渐渐明白到它可能是破解 strong AI 的关键。  Ben Goertzel 和我见面的谈话中也特别注重这一方向。  原来 Alan Turing 很早就看到 进化 和 machine learning 之间有明显关系,而现时机器学习的一个很有名的研究者 Leslie Valiant 也在新书 (English version) 中谈论这课题。

进化论

首先,要理解什么是进化论。  举例来说,假设某只动物的基因变异 令牠比同伴有更锋利的爪和牙齿,那么那牠就能吃到同伴吃不到的食物,也能抢到更多异性去交配。  久之,牠的同伴会较少后裔、甚至绝种,而牠的后裔则会越来越强盛。  这就是「物竞天择 适者生存」。

人类的情况有些不同,因为人类有文化 (意即靠语言传授下来的那些知识),所以有些优点不是纯粹由基因可以看出来。  说到这个问题很具争议性,因为涉及优生学等道德议题。  人们喜欢举反例,例如说『这个男生长得不好看 却有很多女朋友』等等,我不想扯得太远。  想想看,人类最强烈的感情,莫过於找不到伴侣传宗接代,而我们得不到异性的青睐 就会很痛苦,或者看到别人有更多「资源 resource」会妒忌,这些都是进化很有力的证据。 人类的感情通常可以用进化解释,这科目叫 evolutionary psychology (进化心理学)。

我个人认为,竞争是生物界以至人类社会的基本状况,我们必须接受并习惯它。  人类在商业、战争、体育、文艺、甚至下棋也是在竞争。   「天行健 君子以自强不息」,那是很好的勉励。

进化学习

以前说过,机器学习的目的就是要在浩瀚的 假设空间 (hypothesis space) 中寻找那些能正确地解释现实的语句。  例如婴孩可能用「有胡子就是爸爸」 来解释身边出现的人。

问题是假设空间太大,我们如同「在禾秆推里找一只针」,单靠 brute force 不是办法。

进化算法就是在很大的空间里 寻找某个 最佳答案 (optimal solution) 的一个很强的技巧。 它把需要寻找的 candidates 模拟成一个「人口」population,任由这些 candidates 在某个人工的环境下竞争, 然后,每次选取得分最高的一小撮样本,让它们「交配」,即 基因重组 (genetic recombination),那样产生新一批的  candidates, 如此逐步推向越来越优秀的 solutions。

举个例子,研究者用进化算法进化出一些电子电路,例如用於音响的滤波器 (filter) ,其 performance 甚至比人手设计的还要优越。  而且,那电路很不规则而且难理解,人们不知道它是如何运作的,有些部分甚至有多馀的元件存在。  那是因为进化的过程中,有时一些表面上没用的「器官」在组合之后或许变有用,所以进化的结果也常保留很多「废物 junk」。

我就是想用这方法去写 Genifer 的学习功能(我们要进化的 candidates 就是那些逻辑句子 logic formulas)。

Algorithm

具体的算法怎样?

  1. 初始时,预备一个 population,可以是随机产生的。
  2. 对每个 candidate 进行 估值 (evaluation),即是让这个 candidate 在人工的世界里生存。  例如我们测试它在所需的功能的表现如何。  那计分的方法叫 objective function 「目的函数」。
  3. 选取表现最好的 N 个 candidates,进行 变种 mutation 或 重组 recombination。  变种是作用在单个 candidate 上的,重组则需要一对 candidates。  那就涉及到我们怎样将设计空间的元素表示为「基因」,於是有所谓 表述 (representation) 的问题。  这编码是要由研究者设计的。
  4. 在评分的时候,可以容许那些 candidates 在环境中互相合作亦同时竞争,那叫 cooperative evolution。   我觉得 Genifer 有需要用这方法,因为在知识库中的每个知识片段,是要和其他知识互相作用,那逻辑系统才能推导出有意思的结果。

这本书(作者的网站免费提供在线阅读)深入浅出地介绍了几个「nature-inspired」算法:

例如这个 基因算法 的程式,用 Ruby 写成,只需短短一页。

实习

那个例子叫 "OneMax",每个个体是一串 0 和 1 的字串,目标是全部变成 "1"。

这个例子特别简单,因为「基因」就是个体的 显形 (phenotype),省略了 基因表述 (gene expression) 这步骤,便於学习。

实际运行时,发生了有趣的现象。  我先试 Ruby,然后把它翻译成 Scala,但奇怪地 Scala 版本的运行没有收敛到完美的结果,而 Ruby 版本很快就达到了。

我把 Ruby 和 Scala 进化的两个 populations 用图像显示出来,每一横列是一个个体。  第一片段是 Ruby「正常」的进化(到结尾时已经进化出第一个完美的纯 "1" 个体):

第二个是我写的 Scala 「不正常」进化:

可见在病态版本,那些孩子逐渐变成一模一样,而且每个也有同样的缺陷(因而显示成垂直线) 。

为什么呢?  Debug 了整整两天,才发现一个把 0 写作 1 的错误,令到那个 point mutation 的函数形同虚设,亦即是说 病态版本 根本缺乏 point mutations。

那是一个非常有启发性的 bug,使我学到了,单是 sexual reproduction 还不能做到高效率的进化,原来个体的 point mutations 也有关键的重要性,而我一直误以为 有性生殖 是产生 多样性 (diversity) 的唯一途径。  我依稀记得文献里曾提及这点,但不记得了。  有趣吗?  :)

时间: 2024-10-17 01:52:55

什么是遗传/进化算法?的相关文章

2. Genetic Algorithm(1) ——进化算法

本篇博文讲述基因算法(Genetic Algorithm),基因算法是最著名的进化算法. 内容依然来自博主的听课记录和教授的PPT. Outline 简单基因算法 个体表示 变异 重组 1. 简单基因算法(Simple Genetic Algorithm) Holland's早期的基因算法被认为是“简单的基因算法”或是“权威的基因算法”.(simple genetic algorithm or canonical genetic algorithm) 1. 直接举例说明 问题描述:利用遗传算法求

差分进化算法 (Differential Evolution)

Differential Evolution(DE)是由Storn等人于1995年提出的,和其它演化算法一样,DE是一种模拟生物进化的随机模型,通过反复迭代,使得那些适应环境的个体被保存了下来.但相比于进化算法,DE保留了基于种群的全局搜索策略,采用实数编码.基于差分的简单变异操作和一对一的竞争生存策略,降低了遗传操作的复杂性.同时,DE特有的记忆能力使其可以动态跟踪当前的搜索情况,以调整其搜索策略,具有较强的全局收敛能力和鲁棒性,且不需要借助问题的特征信息,适于求解一些利用常规的数学规划方法所

1. Introduction ——进化算法

本系列博客开始介绍进化算法. 知识内容来源于本人在硕士阶段听的课程以及阅读的文献书籍.算是听课笔记或是读书笔记吧. 博主在国外读的书,可能就中英文混杂了. Outline 什么是进化算法 能够解决什么样的问题 进化算法的重要组成部分 八皇后问题(实例) 1. 什么是进化算法 遗传算法(GA)是模拟生物进化过程的计算模型,是自然遗传学与计算机科学相互结合的新的计算方法. <图片来源于,Frank Neumann, The University of Adelaide> 2. 能够解决什么样的问题

[Evolutionary Algorithm] 进化算法简介

进化算法,也被成为是演化算法(evolutionary algorithms,简称EAs),它不是一个具体的算法,而是一个“算法簇”.进化算法的产生的灵感借鉴了大自然中生物的进化操作,它一般包括基因编码,种群初始化,交叉变异算子,经营保留机制等基本操作.与传统的基于微积分的方法和穷举方法等优化算法(具体介绍见博客[Math] 常见的几种最优化方法中的其他数学优化方法)相比,进化计算是一种成熟的具有高鲁棒性和广泛适用性的全局优化方法,具有自组织.自适应.自学习的特性,能够不受问题性质的限制,有效地

Matlab微分进化算法及优化函数测试

微分进化(Difference Evolution,DE)算法是一种优化算法,据称其比GA(遗传算法)等更为优秀. 借鉴网上实现的DE算法,用Matlab实现了对若干函数优化问题的解法,代码如下: function [] = de_test clear all; close all; clc; %解:X = [0, 0, ...] %nVar = 30 %dims: [-30, 30]     function fitness = sphere(vals)         prod = vals

差分进化算法优化集成参数

一.差分进化的思想 差分进化是在遗传算法的基础上发展而来的,与遗传算法相似,有变异.交叉.选择等操作,但是实现简单,收敛速度快.差分进化的过程是随机生成一个初始化群体,经过交叉.变异.选择三个操作,反复迭代,保留有用的个体,寻找最优解. 差分进化利用了贪婪的思想,在每一次的迭代中,保留最优解.通过当前种群个体跟经过交叉.变异后的个体以适应度值为标准,进行比较,保留最优的个体. (1)初始化 (2)变异 (3)交叉 (4)选择 其中,F是变异因子,用来控制两个随机个体差分向量的缩放程度.CR是交叉

查分进化算法DE

% 差分进化算法程序  function DE        t0 = cputime;  %计时     %% 种群初始化     T = 1000;               % 最大迭代次数      F0 = 0.5;               % 变异率      N = 100;                % 种群大小      D = 10;                 % 每个个体染色体的个数,即所求问题的维数      CR = 0.3;              

差分进化算法-python实现

DEIndividual.py 1 import numpy as np 2 import ObjFunction 3 4 5 class DEIndividual: 6 7 ''' 8 individual of differential evolution algorithm 9 ''' 10 11 def __init__(self, vardim, bound): 12 ''' 13 vardim: dimension of variables 14 bound: boundaries

进化算法期末考试题目

题目: 小吃店的营业情况 某小吃店供应的一种特色点心很受欢迎,小吃店营业时间是上午8时至下午1时,顾客按表1所示规律到达该店.顾客往往是几个熟人一起来用点心的,经过一段时间的观察,每批顾客的人数如表2所示,每位顾客吃点心的份数如表3所示.每位顾客在小吃店的停留时间见表4,如有几个熟人一起进店用点心,则这群顾客在店中的停留时间是其中吃得最慢的顾客所停留的时间. 表1 顾客到达规律 顾客到达时间间隔/min 3 5 6 8 10 概率P 0.3 0.2 0.15 0.2 0.15 表2 每批顾客数