陳凱
許多人工智能的具體實(shí)現(xiàn)算法(如卷積神經(jīng)網(wǎng)、細(xì)胞神經(jīng)網(wǎng)、增強(qiáng)學(xué)習(xí)等)中,都涉及迭代的方法。迭代是一個(gè)重復(fù)反饋的過程,即不斷根據(jù)系統(tǒng)的輸出結(jié)果來調(diào)整系統(tǒng)的輸入?yún)?shù),這樣就可以從一個(gè)或若干個(gè)估計(jì)值或隨機(jī)值開始,經(jīng)過一系列的數(shù)據(jù)的調(diào)整,逐步逼近問題的解。迭代過程中所展現(xiàn)出的復(fù)雜性,以及迭代對于解答問題的強(qiáng)大助力,其實(shí)可以借助很簡單的例子展現(xiàn)出來。
● 兜圈子的神奇迭代
首先來看一段程序代碼x=
1/(1-x),注意這不是一個(gè)數(shù)學(xué)方程式,其中的等于號作用是賦值,這段代碼的作用是,對于某一個(gè)值x,對其進(jìn)行1/(1-x)的運(yùn)算,然后將這個(gè)值再賦予變量x,不停地反復(fù)這樣的動(dòng)作,觀察其產(chǎn)生的效果(如圖1)。
使用VB,不到一分鐘就能完成這個(gè)互動(dòng)的程序,代碼簡單到只有一行:
Text1.Text=Str(1-1/Val(Text1.Text))
如果不停地點(diǎn)擊“迭代”,那么文本框中的值會在2、0.5和-1這三個(gè)數(shù)字之間不停地跳動(dòng)??梢赃@樣說,迭代進(jìn)入到了周期模式,周期中有三個(gè)不動(dòng)點(diǎn)。有趣的是,無論文本框中輸入什么值,結(jié)果都會進(jìn)入到有三個(gè)不動(dòng)點(diǎn)的周期模式中去。這個(gè)例子是為了讓學(xué)習(xí)者對迭代過程有一個(gè)直觀的體驗(yàn)。
這里要特別說明一下,雖然很少有人使用VB作為工具來實(shí)現(xiàn)機(jī)器學(xué)習(xí)和神經(jīng)網(wǎng)絡(luò)的算法,但在講解某些基礎(chǔ)概念,并且需要快速建立一個(gè)演示或交互實(shí)驗(yàn)的小工具的時(shí)候,VB具有實(shí)現(xiàn)簡易、展示直觀的特點(diǎn)。隨著學(xué)習(xí)的深入,尤其是需要頻繁用到各種數(shù)學(xué)工具的時(shí)候,還是建議學(xué)習(xí)者采用Python或Java之類的程序設(shè)計(jì)語言。
● 迭代兔子的數(shù)量天花板
假設(shè)有一個(gè)島嶼,島嶼上有許多只兔子,兔子不用擔(dān)心食物,因?yàn)槊刻於加卸康暮}卜生長出來。兔子有著超高的繁殖率,每過一個(gè)月,每兩只兔子會生出一只新的兔子。比如說,一開始是10只兔子,到下一個(gè)月,會發(fā)現(xiàn)多出5只新出生的兔子。但這15只兔子也不是全都可以順利活過這個(gè)月,這里有一個(gè)折扣率,其比率和食物的相對充分程度有關(guān),如相對兔子數(shù)量食物充分,則折扣率更接近百分百,如相對兔子數(shù)量食物不足,則折扣就打得比較多,比如說,用公式1-x/50來計(jì)算折扣率,其中的數(shù)字50,可認(rèn)為是每天固定可收獲50斤胡蘿卜。
于是,得到下一個(gè)月的兔子數(shù)量的程序代碼為:
x=x+0.5*x*(1-x/50)
如果初始時(shí)x為10,則下一個(gè)月的兔子數(shù)量是14。
現(xiàn)在將兔子數(shù)量的單位設(shè)置為萬,假設(shè)初始時(shí)有0.001萬只兔子,同時(shí),胡蘿卜的數(shù)量單位由斤設(shè)置為萬斤。然后,將該數(shù)按上面的公式進(jìn)行迭代,并且把每一個(gè)月迭代的結(jié)果用點(diǎn)陣顯示出來,就可以得到既有意思又很有意義的圖形(如上頁圖2)。
一開始,兔子數(shù)量增長還不是特別明顯,然后忽然有了驚人的轉(zhuǎn)折,數(shù)量猛增,直到數(shù)量接近50萬只的時(shí)候,由于食物數(shù)量有限,使得折扣加大,兔子的數(shù)量便會到達(dá)一個(gè)再也無法超越的天花板。可以看到,代表兔子數(shù)量的點(diǎn)在連成線后弧度很優(yōu)美,有點(diǎn)像字母“S”,這樣就體現(xiàn)出在環(huán)境受限定的情況下,生物原本呈指數(shù)增長的模式是如何被抑制的,這個(gè)圖形是生物學(xué)家在研究生物增長模式時(shí)發(fā)現(xiàn)的,被稱為邏輯斯蒂曲線。在學(xué)習(xí)到神經(jīng)網(wǎng)絡(luò)激活函數(shù)的時(shí)候,就會發(fā)現(xiàn)這個(gè)圖形其實(shí)與神經(jīng)元信號傳導(dǎo)有著重要的關(guān)系。
筆者想到這樣的情況,即兔子的活動(dòng)會影響到胡蘿卜的穩(wěn)定提供,因?yàn)橥米拥幕顒?dòng)會對環(huán)境產(chǎn)生破壞,從而影響胡蘿卜的生長,兔子越多,胡蘿卜產(chǎn)量越少。比如說,在兔子只有0.001萬只的時(shí)候,胡蘿卜的產(chǎn)出可以達(dá)到200/0.001即200000萬斤,實(shí)在是多得吃不完。但如果兔子有4萬只,那就只有200/4即50萬斤的胡蘿卜可產(chǎn)出。將剛才的代碼改造如下:
y=x+r*x*(1-x/(200/x))
如果取合適的r值,比如設(shè)為1.5,就會產(chǎn)生出有意思的圖形(如圖3),這些圖形貌似有規(guī)律,但仔細(xì)看,卻并沒有出現(xiàn)真正重復(fù)的模式。如果將r值進(jìn)行微調(diào),比如把1.5改為1.50001,圖像只在初始時(shí)比較相似,很快就會有很大的不同,這就呈現(xiàn)出了混沌現(xiàn)象。
● 旁逸斜出的迭代描點(diǎn)器
數(shù)學(xué)家在研究迭代問題時(shí),發(fā)現(xiàn)了一個(gè)非常簡化的迭代過程:
x=r*x*(1-x)
這同樣會產(chǎn)生混沌現(xiàn)象。比如說,將r值設(shè)置為4,將x的初始值分別設(shè)置為0.2和與0.2非常接近的0.2000001,隨著迭代的開始,一開始非常接近的迭代值會在某一時(shí)刻忽然“分道揚(yáng)鑣”,數(shù)值差異極大,然而又無法尋找到產(chǎn)生這種差異的原因和規(guī)律。這個(gè)實(shí)驗(yàn)現(xiàn)象,在許多和復(fù)雜性系統(tǒng)有關(guān)的文章和書籍中都能見到,其具體的分析,本文就不再贅述了。但筆者將實(shí)驗(yàn)稍微改了一下,將兩個(gè)迭代過程的每一步迭代結(jié)果分別作為畫布上的點(diǎn)的x坐標(biāo)和y坐標(biāo),這樣就能將混沌效應(yīng)以二維圖形的形式顯現(xiàn)出來:
迭代過程1:x=r*x*(1-x)
迭代過程2:y=r*y*(1-y)
程序代碼只有9行,并且其中還有好幾行也僅僅是換了變量名而已,其功能理解起來非常容易。初始時(shí),兩個(gè)迭代系統(tǒng)的x值都是0.2,r值都是4,由于初始值完全一樣,所以在畫布上,每一次描點(diǎn)時(shí),x坐標(biāo)和y坐標(biāo)相等,這樣就描出了一條斜線(如圖4)。
如果初始時(shí)r值都取4,第一個(gè)x值(將作為畫布的x坐標(biāo))取0.2,第二個(gè)x值(將作為畫布的y坐標(biāo))取0.2000001,則到第17步時(shí),圖像還是一條斜線,但隨后,描出的點(diǎn)就仿佛有了自己的意志,開始旁逸斜出了(如下頁圖5)。
也可以不改變x值,只改變r(jià)值,產(chǎn)生出的圖像也同樣很有意思(如下頁圖6)。
有的時(shí)候,無論迭代多少次,描的點(diǎn)似乎都沒有規(guī)律;有的時(shí)候,迭代次數(shù)不多,卻能見到顯著的規(guī)律;有的時(shí)候,一開始好像沒有規(guī)律,等迭代足夠多次后,能看出不同位置所描的點(diǎn)疏密情況有一定的規(guī)律;而有的時(shí)候,也可能一開始仿佛有規(guī)律,但越到后面越?jīng)]有規(guī)律。問題是,并不能從輸入的初始值,預(yù)先推算出在足夠多次迭代后將會產(chǎn)生怎樣的圖形。即便是只有9行代碼的簡單程序,由于混沌系統(tǒng)中的蝴蝶效應(yīng),其可能產(chǎn)生的圖形模式究竟怎樣,必須親歷整個(gè)迭代過程后才可知曉,所以需要花費(fèi)相當(dāng)多的時(shí)間去探索和發(fā)現(xiàn)。
● 迭代中的遺傳和進(jìn)化
將上面的程序進(jìn)行一下擴(kuò)充,就得到了一個(gè)具有遺傳進(jìn)化能力的圖形生成工具(程序?qū)崿F(xiàn)比較容易,限于篇幅,這里不提供完整的代碼)。可以將r值作為遺傳基因,將生成某種模式的特殊圖像(如6條水平的橫線)作為遺傳進(jìn)化的目標(biāo),迭代若干次后,觀察圖像生成的效果是否接近預(yù)期目標(biāo),如離預(yù)期目標(biāo)較遠(yuǎn),則大幅度隨機(jī)調(diào)整獲取其他基因,如離目標(biāo)比較近,則小幅度隨機(jī)調(diào)整作為基因的r值,然后再看哪一種效果更為接近預(yù)期目標(biāo),這個(gè)活動(dòng)甚至可以設(shè)計(jì)成一個(gè)集體合作的比賽項(xiàng)目(如圖7)。
為了找到更恰當(dāng)?shù)膔值以便描出更整齊的橫線,就要基于上一次參數(shù)的運(yùn)行效果,對輸入的初始參數(shù)進(jìn)行調(diào)整,然后再開始嘗試新的描點(diǎn)過程,如圖7所示,左、中、右三個(gè)圖形,可選擇右圖的r值作為遺傳基因,然后再小幅度隨機(jī)調(diào)整,生成新的三幅圖,然后反復(fù)此過程。在這個(gè)例子中可發(fā)現(xiàn),如果要在一個(gè)迭代系統(tǒng)中快速達(dá)到預(yù)期目標(biāo),所依靠的工具,也恰恰是迭代本身,這也說明了為什么生物體遺傳進(jìn)化中的基因迭代策略會被用于人工智能的多種實(shí)現(xiàn)方法中。