陳凱
許多人工智能的具體實現算法(如卷積神經網、細胞神經網、增強學習等)中,都涉及迭代的方法。迭代是一個重復反饋的過程,即不斷根據系統的輸出結果來調整系統的輸入參數,這樣就可以從一個或若干個估計值或隨機值開始,經過一系列的數據的調整,逐步逼近問題的解。迭代過程中所展現出的復雜性,以及迭代對于解答問題的強大助力,其實可以借助很簡單的例子展現出來。
● 兜圈子的神奇迭代
首先來看一段程序代碼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值作為遺傳基因,然后再小幅度隨機調整,生成新的三幅圖,然后反復此過程。在這個例子中可發現,如果要在一個迭代系統中快速達到預期目標,所依靠的工具,也恰恰是迭代本身,這也說明了為什么生物體遺傳進化中的基因迭代策略會被用于人工智能的多種實現方法中。