问题描述

在一个100*100的虚拟环境中有960个有机体和50个食物.每隔50步在区域内随机均匀生成50个新食物,同时旧的食物会消失.而有机体由大脑模型和更新模型组成,能够感知最近的食物和移动,同时它会消耗能量需要不断进食来补充能量.通过遗传算法来筛选活的最好的个体,并最终希望得到一个能够良好运作的决策系统(brain model)和能够适应环境,改变决策的更新规则(plasticity model).

Brain Model

由一个类似hopfield network的网络组成.其中有两个位置传感器输入,两个上一次动作输入,以及3个内部神经元,和2个输出神经元,共九个神经元.初始神经元为全零.此外不同于一般的神经网络,这里使用9x9的bias.因此可以表示为r1=torch.sigmoid(r.matmul(w)+b.sum(0)),使用增广矩阵可以提升效率

1
2
3
re=torch.cat([r,ones([m,9])],1)
we=torch.cat([w,b],0)
r2=sigmoid(re.matmul(we))

此外该网络并不一定是全连接的,由一个9x9的连接矩阵M表示是否有连接.还有一个4x1的输入系数矩阵k对输入归一化.

Plasticity Model

这里希望习得一个能够更新权值的规则.在前向神经网络中,一般可以对损失函数进行求导,进而使用BP来更新权值.而在这个问题中,很难设计出一个合理的损失函数来求导,那么怎么计算$\Delta w$呢?干脆设计一个可以计算$\Delta w$的网络,然后交给遗传算法来判断.

Farm

假设这些有机体生活在一个100x100的农场里.这些有机体在农场里生活竞争,然后繁殖进化,最后得到强大的个体.

算法介绍

遗传算法(Genetic Algorithm, GA)是模拟达尔文生物进化论的自然选择和遗传学机理的生物进化过程的计算模型,是一种通过模拟自然进化过程搜索最优解的方法。
其主要特点是直接对结构对象进行操作,不存在求导和函数连续性的限定;具有内在的隐并行性和更好的全局寻优能力;采用概率化的寻优方法,不需要确定的规则就能自动获取和指导优化的搜索空间,自适应地调整搜索方向。
遗传算法以一种群体中的所有个体为对象,并利用随机化技术指导对一个被编码的参数空间进行高效搜索。其中,选择、交叉和变异构成了遗传算法的遗传操作;参数编码、初始群体的设定、适应度函数的设计、遗传操作设计、控制参数设定五个要素组成了遗传算法的核心内容。

作者:短短的路走走停停被抢注啦
链接:https://www.jianshu.com/p/ae5157c26af9
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

遗传算法过程

问题描述

下面通过遗传算法来求解一个简单函数的最优化问题。目标函数,适应度函数为:
$$ sin(x*12)/(1+x) $$

编码

首先要给出求解区域的范围。这里就定为[0,1),然后分成16份。实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
def decode(chromosome):
s=0
j=1/2
for i in range(4):
s+=chromosome[i]*j
j/=2
return s

def encode(x):
x=int(16*x)
chromosome=[]
for _ in range(4):
chromosome.append(x%2)
x=x//2
chromosome.reverse()
return chromosome

def fitness(chromosome):
x=decode(chromosome)
return math.sin(x*12)/(x+1)

初始化种群

因为问题规模比较小,就生成一个规模为4的种群吧。population = [encode(x) for x in np.random.rand(4)]

Tournament selection

竞赛选择法。有两个参数:竞赛规模(tournament size),参加每一次竞赛的个体数量;选择概率p,第一名被选择的概率为p,第二名为(1-p)*p…
这里竞赛规模为2,p为1,因此需要进行4次竞赛。

1
2
3
4
5
6
7
8
def selection(pop,num=4):
fits = [fitness(k) for k in pop]
fits = np.array(fits)
l=[]
for _ in range(num):
selected=np.random.choice(4,2,replace=False)
l.append(pop[fits[selected].argmax()])
return l

Cross

采用Uniform Crossover。每一个基因点位都有相同的概率被选择。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
def crossover(p1,p2):
l=[]
for i in range(len(p1)):
p=np.random.rand(4)
chromosome=[]
for j in range(4):
if p[j]<0.5:
chromosome.append(p1[i][j])
else:
chromosome.append(p2[i][j])
l.append(chromosome)

p = np.random.rand(4)
chromosome = []
for j in range(4):
if p[j] < 0.5:
chromosome.append(p1[i][j])
else:
chromosome.append(p2[i][j])
l.append(chromosome)
return l

mutation

每一个基于位都有0.1的概率发生变异。

1
2
3
4
5
def mutation(pop):
for i in range(len(pop)):
for j in range(len(pop[i])):
if np.random.rand(1)<0.1:
pop[i][j]=1-pop[i][j]

结果

把以上内容结合起来,种群迭代10代

1
2
3
4
5
6
7
8
9
10
11
12
13
population = [encode(x) for x in np.random.rand(4)]
print(population)
recorder=[]
for _ in range(10):
recorder.append((selection(population, 1)[0]))
parent1 = selection(population, 2)
parent2 = selection(population, 2)
population = crossover(parent1, parent2)
mutation(population)

best=selection(population, 1)[0]
print([[decode(rec) for rec in recorder]])
print([fitness(rec) for rec in recorder])

假设

机器学习很大程度上就是在建立一个模型F,使得F(X)能够很好地描述Y.即求F,$F(X)=Y$.并且有可以证明神经网络能够以任意精度模拟任意函数.这被称为万能近似定理(universal approximation theorrm).听上去挺牛逼的,但实际很普通,因为有许多别的方法可以达到这一效果,最简单地可以使用多项式展开来逼近.

所以问题的关键不是具备万能近似这个能力,而是如何快速有效地达到效果.SVM过慢,多项式展开会特征爆炸也过慢,而深度神经网络可能过拟合因而无效.不同模型在实现近似的时候气作用方式,效果都是不一样的.
我的假设是任何一种模型,乃至训练方法,会产生不同的形状.

SVM

比如高斯核的SVM会在支持向量附近的空间中产生一块圆形的区域.

神经网络

对于线性模型,可以用一个超平面进行划分.而更复杂的模型就很难解释究竟是怎么工作的.一种解释办法是,多层神经网络进行了多次空间的划分和变换.尽管他们都有近似的能力,但是他们对同一问题的学习速度和效果会有不同.

做一个比喻.数据在空间中有特定的分布,这就好像是一个具有某种形状的模板,或者说是一个锁.而学习任务就是要生成一把要钥匙来打开它.而不同的模型和方法就是做钥匙的材料.如果你选择用木头来削出一把钥匙只要手艺好,也不是不可能,但是一定很费力.

怎么理解?

基于上面的假设,可以从材料的特点入手.对抗样本是一个很好的方法.

神经网络是多孔洞结构

一些实验表明,可以通过修改极少的像素就可以导致分类器出错.这说明在一个分类为1的特征附近也存在其他分类的特征.就好像海绵一样,中间有很多的孔洞通向其他分类.

其本身也具备特定的形状

尽管我们是希望神经网络能够形成特定的形状,但是它本身也会产生一些形状.即使用不同的训练集,甚至是不同的网络结构,攻击样本都能取得良好的效果.因为一些攻击样本是独立于特定网络的.

有偏好

令神经网络学习某一特征最常用的办法就是增加数据.但是这很有可能是错误的,并不是出现的次数多就会引起关注.一些实验表明神经网络倾向于局部纹理特征,而非全局特征.

总结

我认为理解神经网络最好的办法就是了解它的特性,而非权值可视化.通过构造一些特殊的特征,或者对原始图像进行修改然后分析网络的变化.通过对抗样本,消除特定特征等方式使神经网络发生根本性变化(输出不同的分类).那么这种方法就是神经网络所具备的特定.

相关领域: 对抗样本,sensitivity analysis.