人工生命 1.0.0 版釋出,第一個人工生命誕生
Frog | 人工生命
License: Apache 2.0
最近不務正業,擼了個蛙——這是一個人工生命試驗專案,最終目標是建立“有自我意識表現”的模擬生命體,技術架構起源於02年提出的 一個人工腦模型 構思。 這個專案永遠沒有結束的時候,開始於模擬一個簡單的生命體,然後是青蛙、狗......, 結束於有“自我意識表現”的人工腦,或者說,結束於被機器人代替人類的那一天。 專案主頁見: https://gitee.com/drinkjava2/frog
緣起 | Origin
目前人工智慧的進展已經比較完美地解決了模式識別這塊的難題,人臉識別、語音識別已經不弱於人類的水平,而這是我在二十年前感到最困惑的一塊,因為底子差和當時的電腦速度慢。模式識別解決了,剩下的問題就簡單多了,目前距離人工意識的誕生只差臨門一腳了,就是如何在識別的基礎上“理解”這些識別的內容並與人類形成互動的反饋。所以這個專案的重點不在於模式識別,而是在利用模式識別的成果基礎上,訓練神經網路形成條件反射,表現出高等動物才具有的條形反射行為,最終表現為"擁有自我意識"的行為。根據“意識不是一種存在,而是一種現象”原理,如果最終一個系統表現出具有自我意識的行為,即可認為它也是人,應該獲得人權。目前有些人工智慧的研究目的是想讓人工智慧解決一些複雜的人類社會方面的問題如機器翻譯等,則是完全錯誤的目標,不可能成功,因為如果一個系統不能表現出自我意識,它就不能與人類交流,也就不可能具有解決這些問題的能力,表現出來的現象就是通常說的"機器不犯錯,一旦犯錯就是大錯"。另一方面,如果一個系統表現出具有自我意識的行為,它就完全有能力解決世界上所有難題,包括改進它的自身和淘汰人類(因為他是先進生產力的代表)。所以人工智慧的研究重點應該放在人工生命的構建和論理研究,而不是期待短期收益,指望人類可以一直享受人工智慧的大餐是很危險的。模式識別和深度學習的成果只是人工生命的踮腳石和一塊路標而已。人工智慧的“有用”的應用,很可能只是短暫的一段過渡期而已,不用高興得太早,也許都是白忙,給機器人作嫁衣而已,當然,深度學習的成果在將來還是有用的,生物體從來不能象計算機那樣對某個技能反覆訓練上千萬次,達到史無前例的覆蓋度,既使在機器人時代,也是一個有用的技術。
簡單來說,這個專案的目的是試驗和探索神經網路開發的另一個方向,即以實驗為導向,模擬生命進化的過程,按照優勝夯汰、隨機變異、用進廢退這三大原則,一步一步地搭建出從低等到複雜的人工生命體,除了模式識別的成果可以部分引用,原則上不需要很多的數學知識,因為它是由實驗為驅動,而不是由演算法著手來搭建神經網路。
從單細胞進化到多細胞、從青蛙進化到人類,這是一個漫長的、隨機的進化過程,但在超級電腦上跑可能只要幾天時間,就可能得到一個相當不錯的腦模型。當然電腦速度越快、容量越大、環境模擬的越真實,則優勝夯汰後形成的腦結構就越複雜,錯的腦模型都被自然淘汰掉了。從演算法著手搭建,還是從模擬環境著手自動進化,這是建立人工生命的兩個方向,第一個方向有可能走到死衚衕裡,因為它不具備演算法自改進、變異、遺傳(演算法的壓縮)功能,當腦模型複雜到一定地步,可能會超出數學建模的範疇。模擬環境方式的難點則在於環境本身必須足夠複雜、正確。而且必須循序漸進,與腦的進化同步,如果把一群青蛙扔到猴子的模擬環境中,則所有青蛙都會被自然淘汰掉,專案就無法進行下去了,另一個困難是電腦必須非常快,因為它是用序列方式模擬並行,不斷試錯前進的過程。 目前的專案只是搭建了一個框架,語言為Java,利用Swing作圖環境,構建一個500x500象素點的虛擬環境、並模擬一群草履蟲的優勝夯汰,來獲取第一個具備自進化功能的人工生命體,具體腦(即電腦生成的神經網路)的生成、進化演算法還需要以後逐漸加入。歡迎對神經網路感興趣的同學加入這個實驗專案,大家一起來玩,這個專案不需要多少數學知識,重在實踐。
短期目標 | Sort-term Goals
目前它的第一個初步目標是:造出一個真正意義上的人工生命:草履蟲。它必須具備以下前四個特點:
- 腦結構由電腦生成:神經網路由電腦演算法生成,但是電腦演算法僅限於模擬環境,而不是直接參與搭建神經網路,就好象大自然只負責拍死不合格的生命,它從不主動參與設計大腦。
- 腦結構可遺傳:類似於生物的DNA,電腦生成的腦結構(神經網路),可通過簡單的演算法規則描述,並且此演算法規則可以壓縮成較短的片段儲存,並參與到下一代草履蟲的構建。
- 腦結構可變異:演算法規則可以變異,下一代生成的草履蟲在腦結構上與上一代總體相似,但存在部分變異。
- 適應環境:草履蟲能夠在模擬的虛擬環境下存活下來,環境有微小的變化,能夠自適應環境,並一代代生存將適應這種環境的能力遺傳下來。
- 用進廢退:這是一個假想,對於生物來說,存在這樣一種現象,就是用的多的器官,容易發生變異(例如經常嚼檳榔,容易發生口腔癌變),有理由相信這不是偶然現象,而是生物在進化過程中的一個有用的功能,以便於更快地變異,以適應環境,並很可能這種變異會通過遺傳細胞(變異的演算法規則)影響到下一代。
理論 | Theory
為什麼明明是個電腦程式,只要滿足上述前四個特點就可以稱之為"真正"的人工生命? 這一點我不想多說,大家可以百度一下"zhangrex 人工生命"就知道我的觀點了:意識從來就不存在,意識只是一種現象。風吹、樹動和風吹、添衣,都只是現象而已,意識本質上是一種現象,換句話說,只要表現出生命現象的事物,就可以稱其為生命了,不管它是高等還是低等,不管它的物質存在基礎是怎樣的。二十年前我就開始思考人工智慧,提出了“我思我不在”的口號,請 仔細 考慮一下這個觀點,哲學上、理論上對智慧、意識的研究是很無聊的,相當於在研究“無”到底是什麼,不必多糾纏在理論和演算法上。是的,用模擬環境得到的人工神經網路模型,我們確實無法掌控它的演算法是怎樣生成的,但是我們知道,這符合大自然創造生命的規律。
專案架構 | Architecture
這是一個Java專案,分為Application、Env、Frog三個模組: Application模組: 用於專案的啟動、關閉等基礎服務,Windows環境下可以用run.bat來啟動它檢視演示。
Env模組: 目前是一個500x500象素點的虛擬空間,模擬一個生物生存區,用不同形狀的圖形點陣來表達和模擬食物、天敵、障礙等物體,這個虛擬空間由程式設計師全權控制,將隨著Frog的腦進化而不斷調整,變得越來越複雜。
Frog: 這是人工生命的主體,目前起名叫青蛙(Frog),其實叫什麼都一樣。它主要具備以下器官:
- 運動器官: 與運動神經元相連,只有五個動作:上下左右停。
- 進食器官:當Frog與食物的座標重合時,食物會被從Env中刪除,並相應增加Frog的能量值,並激活Frog的進食感覺神經元,隨時間流逝能量將減少,能量耗盡則Frog死亡。
- 視覺器官: 這是腦模型的一部分,在實驗中先固定隨意取腦中心位置(0,0)點附近的神經元區作為視覺區。
- 腦器官: 這即是程式設計師要解決的問題,也是我們要獲取的最終目標。腦模型的生成由電腦優勝夯汰、迴圈迭代進化生成,但這個進化的演算法還是必須由程式設計師來掌控,一步步探索出來,即要防止虛擬環境太複雜,也要避免腦模型不適應環境,生命體全部被淘汰,導致實驗中斷,無法進行下去。
技術細節和構思
- 通過陣列來模擬神經網路,用序列的迴圈來模擬並行晶片運作方式。用Frog的能量多少來衡量是否將它淘汰還是允許它產生後代(下蛋)參與下一輪的測試,因為這個專案的目的是獲取智慧體,與一般的生命遊戲還是有區別的,並不是適者生存就結束了,而是必須完成一系列程式設計師設定好的目標,一步步進化,直到表現出自我意識現象為止。
- 腦模型的生成演算法通過簡單的神經元連線完成,原則上不允行出現任何形式的硬編碼(除模式識別外),因為硬編碼可能會破壞“隨機變異”這一生命特性。
- 為簡化程式設計,暫不考慮引入GPU圖形晶片進行加速, 歡迎能接觸到超級計算機的同學加入,因為隨著虛擬環境的複雜度和神經元數量增多,對電腦速度要求會越來越高。
- 暫選用Java語言實現
專案要實現的短期和長遠目標
- 腦模型和虛擬環境的初步搭建 [腦模型未完成,虛擬環境和生命體誕生的測試已完成,點選run.bat可以檢視執行效果]
- 使腦模型具有視覺功能,如果有食物在它附近,將激發天生條件反射,向食物移動,並獲得進食獎勵 [未完成]
- 引入現成的影象識別演算法,使腦模型具有影象識別功能,根據形狀區分食物和毒物 [未完成]
- 如果誤食有毒食物,將激發天生條件反射,獲得懲罰並扣除能量,天生痛覺區興奮。[未完成]
- 訓練它將受天敵打擊行為與痛覺興奮區發生關聯。[未完成]
- 訓練它將看到“打”這個文字,與打擊行為和痛覺興奮區建立即系。[未完成]
- 訓練它一看到“食物來了”文字,就從窩裡出來找吃的。[未完成]
- 訓練它理解“你”,“我”、“他”文字,只針對“我”相關的指令作出反應。[未完成]
- 訓練它認識數字,會做四則運算[未完成]
- 訓練它認識圓、矩形、會計算面積,學會估算和判斷"大"和"小"[未完成]
- 訓練它認識座標和時間,並按指令行動,如看到"你在9點走到右上角去,等三分鐘後再回來",將遵從指令行動。[未完成]
最終目標
- 擴大它的輸入網格和輸出網格規模,擴大神經元數量,
- 移殖到超級電腦上,由人來同它交流,輸入新的圖形和漢字,糾正它說的錯誤的話
- 移殖到並行晶片硬體上
目前進展和成績
2018.10.21 開始編碼。
2019.03.11 虛擬環境已建好,可以模擬低等生命的遺傳、繁殖、變異、進化現象,但目前只能往一個方向運動,相當於一個最簡單的單細胞生物,還不具備視覺能力,不具備主動找食能力,相當於模擬出了一個無思維的單細胞生物,而不是一個動物。
執行run.bat可以檢視演示。Env.java中的幾個重要引數說明:
- SHOW_SPEED: 調整實驗的速度(1~1000),值越小則越慢。
- EGG_QTY: 每次允許Frog下多少個蛋,每個蛋可以孵出4個青蛙。通常下蛋取值在10~1000之間。蛋儲存著我們測試的結果。實驗的最終目標就是獲得一個蛋。
- FOOD_QTY:食物的數量,食物越多,則Frog的生存率就越高,能量排名靠前的一批Frog可以下蛋,其餘的被淘汰。
下面是這個測試的動畫截圖,有興趣的可以試著自己執行一下:
每步演示的結果(egg)會存檔在根目根目錄下,名為egg.ser,可以刪除這個檔案以從頭開始新的測試。目前萬里長征剛踏上第一步,因為還沒深入涉及腦模型的搭建和條件反射的建立。可以看到有些青蛙跑得飛快,這是自然選擇的結果,因為跑在最前面的吃得多,所以青蛙進化得越跑越快。以後會改正這個bug,要讓最聰明的、會搶食的Frog勝出,而不是讓跑得快的勝出。
期望 | Futures
歡迎發issue提出更好的意見或加入開發組,一起來玩擼青蛙