迭代中的秩序、混乱和智慧
陈凯
许多人工智能的具体实现算法(如卷积神经网、细胞神经网、增强学习等)中,都涉及迭代的方法。迭代是一个重复反馈的过程,即不断根据系统的输出结果来调整系统的输入参数,这样就可以从一个或若干个估计值或随机值开始,经过一系列的数据的调整,逐步逼近问题的解。迭代过程中所展现出的复杂性,以及迭代对于解答问题的强大助力,其实可以借助很简单的例子展现出来。
● 兜圈子的神奇迭代
首先来看一段程序代码x=
1/(1-x),注意这不是一个数学方程式,其中的等于号作用是赋值,这段代码的作用是,对于某一个值x,对其进行1/(1-x)的运算,然后将这个值再赋予变量x,不停地反复这样的动作,观察其产生的效果(如图1)。
使用VB,不到一分钟就能完成这个互动的程序,代码简单到只有一行:
Text1.Text=Str(1-1/Val(Text1.Text))
如果不停地点击“迭代”,那么文本框中的值会在2、0.5和-1这三个数字之间不停地跳动。可以这样说,迭代进入到了周期模式,周期中有三个不动点。有趣的是,无论文本框中输入什么值,结果都会进入到有三个不动点的周期模式中去。这个例子是为了让学习者对迭代过程有一个直观的体验。
这里要特别说明一下,虽然很少有人使用VB作为工具来实现机器学习和神经网络的算法,但在讲解某些基础概念,并且需要快速建立一个演示或交互实验的小工具的时候,VB具有实现简易、展示直观的特点。随着学习的深入,尤其是需要频繁用到各种数学工具的时候,还是建议学习者采用Python或Java之类的程序设计语言。
● 迭代兔子的数量天花板
假设有一个岛屿,岛屿上有许多只兔子,兔子不用担心食物,因为每天都有定量的胡萝卜生长出来。兔子有着超高的繁殖率,每过一个月,每两只兔子会生出一只新的兔子。比如说,一开始是10只兔子,到下一个月,会发现多出5只新出生的兔子。但这15只兔子也不是全都可以顺利活过这个月,这里有一个折扣率,其比率和食物的相对充分程度有关,如相对兔子数量食物充分,则折扣率更接近百分百,如相对兔子数量食物不足,则折扣就打得比较多,比如说,用公式1-x/50來计算折扣率,其中的数字50,可认为是每天固定可收获50斤胡萝卜。
于是,得到下一个月的兔子数量的程序代码为:
x=x+0.5*x*(1-x/50)
如果初始时x为10,则下一个月的兔子数量是14。
现在将兔子数量的单位设置为万,假设初始时有0.001万只兔子,同时,胡萝卜的数量单位由斤设置为万斤。然后,将该数按上面的公式进行迭代,并且把每一个月迭代的结果用点阵显示出来,就可以得到既有意思又很有意义的图形(如上页图2)。
一开始,兔子数量增长还不是特别明显,然后忽然有了惊人的转折,数量猛增,直到数量接近50万只的时候,由于食物数量有限,使得折扣加大,兔子的数量便会到达一个再也无法超越的天花板。可以看到,代表兔子数量的点在连成线后弧度很优美,有点像字母“S”,这样就体现出在环境受限定的情况下,生物原本呈指数增长的模式是如何被抑制的,这个图形是生物学家在研究生物增长模式时发现的,被称为逻辑斯蒂曲线。在学习到神经网络激活函数的时候,就会发现这个图形其实与神经元信号传导有着重要的关系。
笔者想到这样的情况,即兔子的活动会影响到胡萝卜的稳定提供,因为兔子的活动会对环境产生破坏,从而影响胡萝卜的生长,兔子越多,胡萝卜产量越少。比如说,在兔子只有0.001万只的时候,胡萝卜的产出可以达到200/0.001即200000万斤,实在是多得吃不完。但如果兔子有4万只,那就只有200/4即50万斤的胡萝卜可产出。将刚才的代码改造如下:
y=x+r*x*(1-x/(200/x))
如果取合适的r值,比如设为1.5,就会产生出有意思的图形(如图3),这些图形貌似有规律,但仔细看,却并没有出现真正重复的模式。如果将r值进行微调,比如把1.5改为1.50001,图像只在初始时比较相似,很快就会有很大的不同,这就呈现出了混沌现象。
● 旁逸斜出的迭代描点器
数学家在研究迭代问题时,发现了一个非常简化的迭代过程:
x=r*x*(1-x)
这同样会产生混沌现象。比如说,将r值设置为4,将x的初始值分别设置为0.2和与0.2非常接近的0.2000001,随着迭代的开始,一开始非常接近的迭代值会在某一时刻忽然“分道扬镳”,数值差异极大,然而又无法寻找到产生这种差异的原因和规律。这个实验现象,在许多和复杂性系统有关的文章和书籍中都能见到,其具体的分析,本文就不再赘述了。但笔者将实验稍微改了一下,将两个迭代过程的每一步迭代结果分别作为画布上的点的x坐标和y坐标,这样就能将混沌效应以二维图形的形式显现出来:
迭代过程1:x=r*x*(1-x)
迭代过程2:y=r*y*(1-y)
程序代码只有9行,并且其中还有好几行也仅仅是换了变量名而已,其功能理解起来非常容易。初始时,两个迭代系统的x值都是0.2,r值都是4,由于初始值完全一样,所以在画布上,每一次描点时,x坐标和y坐标相等,这样就描出了一条斜线(如图4)。
如果初始时r值都取4,第一个x值(将作为画布的x坐标)取0.2,第二个x值(将作为画布的y坐标)取0.2000001,则到第17步时,图像还是一条斜线,但随后,描出的点就仿佛有了自己的意志,开始旁逸斜出了(如下页图5)。
也可以不改变x值,只改变r值,产生出的图像也同样很有意思(如下页图6)。
有的时候,无论迭代多少次,描的点似乎都没有规律;有的时候,迭代次数不多,却能见到显著的规律;有的时候,一开始好像没有规律,等迭代足够多次后,能看出不同位置所描的点疏密情况有一定的规律;而有的时候,也可能一开始仿佛有规律,但越到后面越没有规律。问题是,并不能从输入的初始值,预先推算出在足够多次迭代后将会产生怎样的图形。即便是只有9行代码的简单程序,由于混沌系统中的蝴蝶效应,其可能产生的图形模式究竟怎样,必须亲历整个迭代过程后才可知晓,所以需要花费相当多的时间去探索和发现。
● 迭代中的遗传和进化
将上面的程序进行一下扩充,就得到了一个具有遗传进化能力的图形生成工具(程序实现比较容易,限于篇幅,这里不提供完整的代码)。可以将r值作为遗传基因,将生成某种模式的特殊图像(如6条水平的横线)作为遗传进化的目标,迭代若干次后,观察图像生成的效果是否接近预期目标,如离预期目标较远,则大幅度随机调整获取其他基因,如离目标比较近,则小幅度随机调整作为基因的r值,然后再看哪一种效果更为接近预期目标,这个活动甚至可以设计成一个集体合作的比赛项目(如图7)。
为了找到更恰当的r值以便描出更整齐的横线,就要基于上一次参数的运行效果,对输入的初始参数进行调整,然后再开始尝试新的描点过程,如图7所示,左、中、右三个图形,可选择右图的r值作为遗传基因,然后再小幅度随机调整,生成新的三幅图,然后反复此过程。在这个例子中可发现,如果要在一个迭代系统中快速达到预期目标,所依靠的工具,也恰恰是迭代本身,这也说明了为什么生物体遗传进化中的基因迭代策略会被用于人工智能的多种实现方法中。