本文作者将與你分享:算法是如何借鑒大自然中的鳥群、魚群等,來找尋最優解的,以及算法是不是可能自己設計算法。enjoy~
生活工作中,很多時候都是在尋求最優解。
這些待解決的問題,按理說,都有最優解。
而本文作者嶽亞丁博士将告訴你,算法是如何借鑒大自然中的鳥群、魚群等,來找尋最優解的,以及算法是不是可能自己設計算法。
文章要點:
- 哪些問題需要優化算法?
- 設計優化算法時,大自然給了我們什麼啟發
- 舉個例子看優化算法到底啥樣
- 擺脫對大自然的依賴,自創更好的優化算法
算法工程師與他的好友在公園觀魚。一群色彩斑斓的錦鯉在水面翻騰,追逐着遊人們抛下的魚食。
最優決策需要優化算法
:想什麼呢?你不想喂它們嗎?
:我在想,這些魚遊動的軌迹,與魚群算法有多麼的相似。
:這裡也有算法?
:你看,它們時而捕食,時而群聚,時而追随,時而漫遊,最終目的是盡快找到更多的食物,同時又避免可能的風險。魚群算法,正是由此而來啊。
:你說的魚群算法,是指仿生學嗎?
:不是。仿生學主要是借鑒生物界的形态、結構、功能,設計出新的機械、裝置、設備,比如人類受魚類形狀的啟發,設計出水下航行的潛艇;或者通過研究鳥類肢體構造和飛行技能,來改進飛機的性能。
魚群算法,則是受魚群行為的啟發,設計出的一種算法,可以用來找到問題的最優解。
:問題的最優解,是什麼意思?
:我們生活和工作中,很多時候都是在尋求最優解。
比如說,選擇進入哪個行業去工作,怎樣填寫高考志願,怎樣找到自己深愛的伴侶,怎樣在合适時機和地點購房,怎樣在變幻莫測的股市中淘金,怎樣在平衡客戶需求和開發能力之間找到一個成本-效益最佳的項目方案,等等。這些待解決的問題,按理說,都有最優解。
:聽起來,像是在做最優決策。
:是同一個意思。人是智慧生物,是解決問題的高手,有分析、綜合、歸納、推理等能力,有尋找最優解的能力。
但是當面臨的問題規模太大,複雜程度太高,特别是大社會、大工業中的問題,要找到最優解,哪怕記憶力再好、再聰明的人腦也吃不消了,靠直覺、拍腦袋做決策,已經不靠譜,還是需要用計算機來幫忙做這個事情,這時就需要優化算法了。
:計算機算數還是挺快的,聽說都每秒多少億次了,用它做優化,還沒怎麼聽說。所以你讓它模仿魚群?
:計算機比較笨,隻能按照我們人類的指令來做事情,但它最大的特點是算得快,我們可以利用這個特點來做更複雜的事情,包括優化。
勤能補拙嘛。我先通過一個簡單例子,解釋一下計算機是怎麼做優化的,然後再說魚群的事。
:好吧,你說說看。
一種簡單的優化算法
:假設有一個人,在漆黑不見五指的夜裡,獨自登山,目标是山頂,你覺得他應該怎麼做?
:山上不會有斷崖、溪流、野獸吧?
:暫時假定沒有這些危險東西。
:那就隻能四處伸腳試試,感受一下,哪個方向是向上的,就往那個方向走呗。
:是的。這也正是計算機的最簡單的優化算法之一。山頂就是待求的最優解。
從某個坐标點(東經多少度、北緯多少度)出發,算法開始之後,給計算機一個旁邊緊挨着的新坐标點(相當于人往某個方向挪動一步),它算一下,是不是好些(人感覺是不是升高了一點),如果是,計算機就認定這個坐标點更好(人就往這個方向走一步),然後在這個點的基礎上繼續嘗試;否則,就退回來,給它旁邊另一個坐标點算一下(人往另一個方向挪動一步),再試。
就這樣逐步嘗試,走了很多步之後(所幸計算機“走”得挺快),如果發現四處挪動都是下降的方向,就算是到達山頂了。
:是夠笨的,但是聽起來,似乎還是有效的。
:對呀。
:不過,我覺得這裡有一個問題。按照這樣的方案,會不會走到了一個小山包的頂端,甚至一個小土堆上,就以為到山頂了,而實際上真正的山頂還遠着呢?
:你說得對。小山包的頂端,隻是一個局部的最優解,真正的山頂,才是一個全局的最優解。我們當然希望找到後者。上面說的算法還不是一個非常好的算法,它有可能找不到全局最優解。
:還有一個問題:如果能夠通過鞋底感覺到地面的不平,有點傾斜,那就不需要前後左右地伸腿嘗試,而隻要按照鞋底感覺到的往上傾斜的方向走,這樣豈不是更快?
:正是!如果待求問題與目标之間可以表示為一個數學公式,我們一般就可以求出哪個方向是往上傾斜的,然後讓計算機沿着那個方向進行搜索,就更快捷了。
學術界把這種算法叫做“瞎子爬山法”。但是很多情況下,待求問題很複雜,沒法寫出一個數學式子,所以還是得四處伸腳嘗試。
:這也是沒有辦法的辦法了。
:但這樣也好,可以處理更多類型的問題。
例如,學生成績受很多因素影響,包括學生的年齡、性别、學習時長、健康程度、家庭背景等等,但到底是怎樣影響的,我們可能寫不出一個很精确的數學公式來(總不能瞎編一個“數學期考成績 = 年齡x平均每天學習小時數”吧)。
也沒必要去寫,可以通過“伸腿”去試,照樣可以求得最優解,從而得知怎樣才能獲得更高分數。
:最後一個問題:如果真的有斷崖、溪流這些東西,怎麼辦?
:現實世界中,它們當然對爬山人構成阻礙和威脅。計算機做的話,都是在虛拟世界中嘗試,即使突然發現“踩空一腳”,也沒什麼大不了的,照樣可以退回來,不影響後續的逐步搜索。
:這個瞎子爬山法,除了用來爬到山頂,還能用于更複雜的問題嗎?比如說炒股,你前面也提到了的。
:瞎子爬山法難以勝任,其它優化算法恐怕也夠嗆,因為股市數據的随機性太強。當然,也可以試一試,隻要能夠把問題用數值表示出來。
炒股的情況雖然很複雜,但簡略地講,我們的目标,還是希望一段時間内的投資收益最大化;要尋找的,則是應該買哪幾隻股票,買多少股,持有多長時間,等等,這些待求的東西,都是可以表示成一組數值的,就跟上面爬山的情況那樣,那裡是用經緯度坐标值來表示的。
:你是說,把待求的東西表示為一組數(如經緯度、股票倉位),目标是另一個數(如海拔、收益),然後讓優化算法來找出能使目标最大的一組數,對嗎?
:是的,這就是優化算法的本質。
鳥群算法的優勢
:比瞎子爬山法好的優化算法,有哪些?
:還有魚群、鳥群、蜂群、蟻群、螢火蟲、細菌、猴群、布谷鳥、蝙蝠、病毒、免疫系統、生物進化 ……
人們從它們的行為得到啟發,設計了優化算法,很多情況下,它們比瞎子爬山法好。
:嚯!開動物園了。
:也有非生物的,例如,和聲、水滴、螺旋、星系、重力、量子……
:夠多的了。能舉一個例子嗎?我來感受一下比瞎子爬山法好在哪裡。
:就說說鳥群算法吧,它比起魚群算法更簡單一點,也相對容易解釋一點。
:好。
:鳥群算法裡面,假設食物就像蚊蟲,不均勻散落在空中,在某些點更密集。一群鳥在空中盤旋飛翔,想找到那個食物最集中的點,也就是全局最優點。
:有一隻頭鳥帶領它們飛嗎?
:不需要,假定每隻鳥的能力都一樣。每隻鳥的下一步飛翔方向受到三股力量的影響:
- 第一,是當前的飛翔方向,即它自身有一定慣性,會有一股力量想拉着它沿着當前的方向飛。
- 第二,是它自己迄今為止經過的食物最密集的某個點,它對此還有記憶,覺得那個點有戲,于是也會受到那個點的牽引,盡管那個點不一定是全局最優點。
- 第三,假設鳥群之間是有通信聯系的,随時保持溝通,對于整個鳥群迄今為止經過的食物最密集的某個點,每隻鳥都是知道的,于是這隻鳥也有點受那個點的牽引,盡管那個點也不一定是全局最優點。
:這樣的假設,好像還是有道理的,但不知道是否符合實際情況。
:對實際情況,我們可能無法準确知道。但是設計一種算法,隻要借鑒生物的一部分行為,隻要效果好,也就可以了,不一定非要完全符合實際情況。
:然後呢,鳥群怎麼飛?
:每隻鳥受三股力量的牽引,在空中飛翔,會逐漸向最優點靠攏。
飛了一段時間後,估計差不多了,就盤點一下,所有鳥截止到最後時刻經過的食物最密集的某個點,就被認為是全局最優點。
:什麼叫做“認為是全局最優點”?它不是真正的全局最優點嗎?
:不能确保。這樣找到的,仍然可能是局部最優點。要想找到全局最優點,還是需要别的更複雜算法,或者與其它算法結合進行。
例如,在爬山情況下,改為允許犯錯,即使在局部最優點,伸腿嘗試時發生下降,也聽之任之,說不定就能慢慢走出局部最優點,重新找到通往真正山頂的路徑。
:既然都不能确保找到全局最優點,那鳥群算法比瞎子爬山法好在哪裡呢?
:很多情況下,鳥群算法可以更快地找到最優點。這一點,數學上可以證明,大量的實驗和實際的工程應用,也可以證實。
可能是因為有一群鳥在行事,它們之間互相協作,集團智慧高于個體智慧嘛。
信天翁的搜索策略
:這樣比較,好像不太公平哦。我也可以安排很多個瞎子同時爬山的。
:但是瞎子之間沒有通信協作吧。如果允許瞎子之間有協作,那就又有點像是鳥群算法了。
:倒也是。不過,你能否找一個單打獨鬥的情況,一個瞎子,和一個别的什麼,看他們做優化時,誰更厲害?
:是有一些依靠一個個體進行搜索的其它優化算法,隻是很少看到哪份資料中比較過它們誰更厲害,我自己也沒有實驗過。
:你說說看吧。我總覺得瞎子爬山法還有點過于機械,希望還有更聰明的做法。
:如果曠野中的食物稀少,随機分布在一塊很大的區域裡,動物在搜尋它們時,并不一定是完全漫無目的地随機搜索,那樣的效率是比較低的。
科學家們發現,海洋中的掠食者,如皺鰓鲨、黃鳍金槍魚、藍色馬林、旗魚,還有信天翁,它們的搜索方式,有一些很獨特的特征,即:可能沿某個方向走出很遠,才改變方向另搜。
這種搜索方式稱為“列維飛行”,是根據法國數學家Lévy的名字命名的。在相同時間内,列維飛行找到的食物數量,很可能高于随機搜索。可能是千百萬年的進化,使得他們學會了這種搜索方式。
(左圖:随機搜索形成的軌迹 右圖:Levy飛行搜索形成的軌迹)
:哦,這倒有點意思。你們可以讓計算機也學着這麼搜索,快點找到最優解嗎?
:已經有人做了。
當算法自己設計算法
:感覺隻要是要求“最大”、“最小”、“最優”的問題,就可以用優化算法來做了,對嗎?
:基本上可以這麼說。其實,優化算法還可以幫我們更多的忙,它不僅授人以魚,也能授人以漁。
:這是怎麼說?
:就好像一個小學生在做數學題,因為掌握的方法不熟練,或者運用的方法不對,做得很慢,旁邊坐着的老師,就會指點他改進方法。
:嗯,改進學習方法,這很重要,老師、家長、學生們都在說這個事。
:有一類優化算法,就是可以在一個算法正在工作的時候,随時指點這個工作的算法進行改進的。
:神奇。這回優化的是算法的好壞了。
:此外,我們還面臨的一種情況是,已經有很多優化算法,告訴我們如何盡快到達山頂,或者解決别的問題。但優化算法太多了,為什麼不用一個優化算法來幫我們選一個呢?
:是啊。我剛才還在琢磨,你說了一大堆優化算法,但是我真正動起手來,也不知道應該用哪一個。
我總不能每一個都去試一下,那樣也太耗費時間了。如果有一個算法來幫我選出一種好的,就省事了。
:最後,腦洞不妨再開大一點:如果有一種優化算法,它作為母體,能夠自行設計出一個優化算法,使得其在效率上優于所有人工設計出來的優化算法,豈不更妙?
:這……有可能麼?
:隻要待設計的優化算法本身,能夠用數值表示,就好辦了。而且已經有一些這方面的研究,也有一些初步成果,似乎還不錯。當然,這個過程還有很多困難,理論上也尚待突破。
:那以後都不用借鑒大自然、動物的行為,不需要那麼費力地人工地構造那麼多的優化算法了,甚至計算機科學家們都可以失業了,是不是?
:還沒有那麼激進。至少,用于設計優化算法的那些優化算法,我們稱之為“元算法”的,還是需要人工設計的。元算法,是關于算法的算法。
:就不能再加多一層,再另外用一個算法來設計元算法,出現一種關于算法的算法的算法,甚至關于算法的算法的算法的算法?
:你還真問倒我了。學術界好像還沒有人搞這麼多層的,我也不清楚這樣做,帶來的好處有多大。再看看吧。
:我想起來了,打敗世界圍棋冠軍的AlphaGo,據說是向人類學習,借鑒了幾千萬局人工對弈的棋譜。
後來的AlphaGo Zero,擺脫對人類的模仿,左右手互搏,自學圍棋,最後以100:0的戰績打敗它的“前輩”。這個是不是關于算法的算法?
:有一點類似。
:想一想都很恐怖,感覺以後的算法會越來越厲害,它們可以自主設計出算法,比我們人類設計出來的算法更牛,說不定哪天會全面超過人類的智力。
:AI能否超越人類,是一個有争議的話題。今天我們沒時間細聊了,留待下次吧。
:好的。
:還是得感謝大自然的饋贈,啟發了人類設計出這麼多的優化算法,可以用于解決很多的實際問題。就看我們能否很好地利用了。
:就像中醫藥——人處在大自然的環境中,得了病怎麼辦,答案還是在大自然中。
*文中圖片來源于網絡
作者:嶽亞丁
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!