遺傳演算法有哪些比較直觀的應用呢?
任何需要優化的模型參數求解問題,但是因為參數數量的龐大,用「窮舉法」的成本高昂。這時,遺傳演算法是最佳選擇。遺傳演算法中判據的選擇、變異的設置、初始的數值都很重要,否則很容易被困在局部最優化。
例如:
物流成本最小化問題。
還有,求解憤怒的小鳥!! yay!
http://www.zhihu.com/question/19694251/answer/12881985
下文來自本人博客: 遺傳演算法系列之二:「欺騙」深度學習的遺傳演算法
「欺騙」深度學習
Szegedy et al. (2013) 發現雖然深度學習模型在圖像物體識別任務已經達到甚至超過了人類水平,但深度學習模型很容易被愚弄(fooled)。下圖是論文中的例子,左列的圖經過中間的變換成右列的圖。對我們人類來說,變換前後圖片幾乎沒有變化,判對左列圖片的深度學習模型卻將右列圖片都判錯了。這說明人類和深度學習模型之間的區別還有很多。
Nguyen et al. (2014) 用報告了另一種結果:我們能夠產生一組對人類完全沒有意義的混亂圖片,深度學習模型卻會將它們高分值判斷圖片為某一物體。遺傳演算法便是產生這樣混亂圖片的方法之一。論文中使用了不同的編碼方式,我們介紹在MNIST數據集上的簡單編碼方式。種群中個體代表一張MNIST圖片,個體中一條染色體長25 ×× 25,染色體每一位基因代表了圖片對應位置的像素灰度。個體適應度等於深度學習模型將圖片判讀為一個數字的置信度。下圖就是這種編碼方式產生的結果。我們人類看下圖中的圖片,完全就是一片混沌,但state-of-the-art的深度學習模型卻以超過99.99%的置信度將它們判斷某個數字。
正則表達式生成器
Regex Golf 是一個正則表達式生成競賽。這個競賽給兩堆字元串M和U,要求參數者給出的正則表達式r儘可能地匹配M堆中的字元串,和儘可能地不匹配U堆中的字元串。下圖就是競賽的示意圖。
Bartoli et al. (2014)提出用遺傳演算法解決這個問題。種群一個個體是一顆正則表達式樹,如下圖所示。正則表達樹的葉子節點是一些從M堆字元串抽取的字母和N-grams。正則表達式樹的中間節點是正則表達式的符號,比如「()」、「*」和「?」。
個體對應正則表達式匹配越多M堆字元串,個體適應度應該越大。個體對應正則表達式匹配越多U堆字元串,個體適應度應該越小。因此可以直接用(匹配M堆字元串數量-匹配U堆字元串數量)作為適應度。但這樣的話,得到的正則表達式的長度會很長。為了控制正則表達式長度,適應度應該懲罰長的正則表達式。因此我們可以用下面的適應度,其中w是一個權重,是M堆中匹配的字元串,是U堆中匹配的字元串。
下表是Bartoli et al. (2014)報告的結果。其中 Norvig-RegexGolf 是一種基線方法,GP-RegexGolf是作者提出的方法,GP-RegexExtract是應用在Text Extraction任務上的遺傳演算法。
有人將這種類型的遺傳演算法稱為遺傳編程(Genetic Programming)。種群中一個個體代表一段程序(一段表達式也算一段程序吧),通過遺傳演算法獲得最優的程序,就像演算法自己能夠編寫程序一樣。但目前為止,我看到的所有遺傳編程的個體都是一段表達式或者一段公式,離「演算法能夠編寫程序」差十萬八七里。
機器人路徑規劃
機器人路徑規劃是遺傳演算法很傳統的應用之一,很多地方都有討論。不過對我們這些不搞機器人的人來說,路徑規劃還是蠻有意思的應用。機器人路徑規劃技術, 就是機器人根據自身感測器對環境的感知, 自行規划出一條安全的運行路線。下圖是用柵格表示的機器人路徑規劃環境,柵格是最簡單的路徑規劃環境表示方法。圖中的路線就是機器人的前進路線。
遺傳演算法中的一個個體代表了一條路線。個體染色體有起始點和終止點,起始點和終止之間是機器人的中間停靠點。上圖中的路線可以用下面基因序列表示。個體適應度隨著路線長度增加而減小。有些路線並不合法(比如穿過障礙物),這時候相應個體的適應度需要加一個懲罰項。
應用於機器人路徑規劃的遺傳演算法有很多問題,也就是說有很多改進的空間。比如,變異過程有可能將路線中間點變到障礙物里。我們可以用一些改進的變異操作避免這個問題。Tuncer and Yildirim (2012) 就提出了一種新的變異操作解決這個問題。這個變異操作的大體思路是先將中間點隨機變異,然後檢查變異的中間點是否在障礙物內,如果是則選擇一個附近位置。下圖就是這種變異操作的示意圖。
寫宋詞
這裡介紹一個奇技淫巧——周昌樂等(2010)用遺傳演算法寫宋詞。在這項工作之前,作者已經建立了一個包含情感類別、語法、語義、音韻等要素的元資料庫。種群中一個個體代表了一首詞,不同的基因位是不同詞。個體代表的一首詞的適應度由句法和語義加權獲得。由於我對詩詞沒有啥了解,就不多瞎說了。感興趣的讀者可以直接閱讀論文。下表是論文中報告的結果。
這裡插入一點私貨,談談我對詩詞生成、音樂生成和自動作畫的看法。一開始我是不喜歡這一類的研究的,原因有兩點:1)現在的弱人工智慧根本沒有發展到吟詩作畫的程度,2)這些東西根本沒啥用處好吧。不過後面我的觀點改變了。現在我的觀點是有些研究就是玩啊。這時候我們只需要問有趣嗎,而不需要問有用嗎。反正這個話題那麼有趣,那就繼續玩咯。正是有些研究不是沖著有用,而是沖著好玩去的,科學的未來才有無限可能。
某些蛋疼的例子
當然不是所有問題都適合使用遺傳演算法的。比如很多年前,石三石跟我介紹了一篇國內論文,那篇論文用遺傳演算法優化k-means聚類的k值。你沒有看錯,是k-means聚類演算法的k值。我當時還不相信,覺得那篇論文應該是優化k-means初始化的值。三石同學還和我確認是k-means聚類演算法的k值。他和我對著那篇論文默默吐槽了。我雖然不知道k-means聚類演算法k值的選擇有什麼辦法,但我知道遺傳演算法是絕對不行的。因為我把k值從1到n(n為待聚類的樣本數量)全部試一遍的時間,時間和遺傳演算法的運行時間差不多吧。另外那篇論文的適應度是用 (類間距離的均值)/(類內距離的均值) 衡量的。k設為n時,這個指標肯定是最大的啊。
另外一個例子是用遺傳演算法調神經網路參數。這個例子倒是常見,比如Matlab就是支持。具體做法可以參考這個網頁。遺傳演算法個體中一條染色代表了一組參數,個體適應度等於用這組參數訓練的神經網路在驗證集上準確率。在十幾年前,神經網路和其他分類演算法面對的是小規模的數據。因此訓練和預測的時間比較少,這種方法是適用的。但現在神經網路面對都是大規模的數據,訓練時間很長。有些神經網路需要一天時間訓練,如果遺傳演算法初始種群有100個個體,光是計算這個一百個個體的適應度就需要100天。遺傳演算法調參顯然是不實用的。
最後再次歡迎大家訪問我的博客:遺傳演算法系列之二:「欺騙」深度學習的遺傳演算法
第一次在博客中列參考文獻
Bartoli, Alberto, et al. "Playing regex golf with genetic programming." Proceedings of the 2014 conference on Genetic and evolutionary computation. ACM, 2014.
Nguyen, Anh, Jason Yosinski, and Jeff Clune. "Deep neural networks are easily fooled: High confidence predictions for unrecognizable images." arXiv preprint arXiv:1412.1897 (2014).
Szegedy, Christian, et al. "Intriguing properties of neural networks." arXiv preprint arXiv:1312.6199 (2013).
Tuncer, Adem, and Mehmet Yildirim. "Dynamic path planning of mobile robots with improved genetic algorithm." Computers Electrical Engineering 38.6 (2012): 1564-1572.
周昌樂, 游維, and 丁曉君. "一種宋詞自動生成的遺傳演算法及其機器實現." Journal of Software 21.3 (2010): 427-437.
轉自科學松鼠會!!!!! 科學松鼠會
這是個真實的故事。
從前在海岸邊有一群扇貝在悠哉游哉地生活繁衍著。它們自然是衣食不愁,連房子也有了著落。它們擔憂的只有一件事:每隔一段時間,總有一個人來挖走它
們之中的一部分。當然啦,挖回去幹什麼這大家都知道。但扇貝們不知道的是,這人的家族圖騰是Firefox的圖標,所以他總是選擇那些貝殼花紋長得比較不
像Firefox圖標的扇貝。
這種狀況持續了好幾十萬代。大家應該也猜到扇貝們身上發生什麼事情了:它們的貝殼上都印著很像Firefox圖標的圖案。
可能有些讀者會說:你這不是糊弄我們么,Firefox才有多少年歷史,你就搞了個幾十萬代的扇貝?
確有其事,但是這些扇貝不是真實的,它們在我電腦的內存裡邊生活。它們是一個遺傳演算法程序的一部分,這個程序的目的就是用100個半透明三角形把Firefox的圖標儘可能像地畫出來。
什麼是遺傳演算法呢?
簡單地說,遺傳演算法是一種解決問題的方法。它模擬大自然中種群在選擇壓力下的演化,從而得到問題的一個近似解。
在二十世紀五十年代,生物學家已經知道基因在自然演化過程中的作用了,而他們也希望能在新出現的計算機上模擬這個過程,用以嘗試定量研究基因與進化之間的關係。這就是遺傳演算法的濫觴。後來,有人將其用於解決優化問題,於是就產生了遺傳演算法。
那麼,具體來說,在計算機裡邊是怎麼模擬進化過程的呢?
我們還是以開頭提到的程序為例。
首先,我們知道,生物個體長什麼樣子很大程度上是由染色體上的基因決定的。同樣,如果我們把100個半透明三角形組成的東西看成一個生物個體的話
(為了說話方便,稱為扇貝吧),我們也可以說它的樣子是由這些三角形的具體位置和顏色決定的。所以,我們可以把一個一個的半透明三角形看作是這些扇貝的
「基因」。而組成扇貝的這100個基因就組成了每個扇貝個體的「染色體」(chromosome)。
從下面的圖可以大約看出來這些基因是怎麼決定扇貝的樣子的(為了觀看方便,我們只畫出其中五個三角形):
然後,扇貝們除了生活,當然還要繁衍後代。生物界中的繁衍無非就是父母的基因組合產生新的個體,而在這個程序裡邊我們當然也這麼辦:選擇兩個原有的
扇貝,然後從這兩個扇貝的染色體中隨機選取一共100個基因組成新個體的染色體。如圖所示:(仍然是將扇貝看成是五個三角形組成的)
為了產生新的基因,使基因的種類更多樣化,在組合的時候,新的扇貝的基因有一定的概率發生變異。也就是說,其中的一個透明三角形的位置或者顏色會隨機改變,如圖(仍然是五個三角形……我偷工減料……):
其次,為了使扇貝的樣子向Firefox圖標靠近,我們要給它們加上一點選擇壓力,就是文章開頭故事中提到的那個人的行動:在每一代把最不像
Firefox的扇貝淘汰出去,同時也給新的個體留下生存的空間。怎麼評價這個扇貝像不像Firefox呢?最直接的方法就是一個一個像素比較,顏色相差
得越多就越不像。這個評價的函數叫做「適應函數」,它負責評價一個個體到底有多適應我們的要求。
在淘汰的過程中,為了便於編程,我們通常會在淘汰舊個體和產生新個體的數目上進行適當的調整,使種群的大小保持不變。淘汰的作用就是使適應我們要求的個體存在的時間更長,從而達到選擇的目的。
最後,在自然界中,種群的演化是一個無休止的過程,但程序總要停下來給出一個結果。那麼,什麼時候終止演化輸出結果呢?這就要訂立一個終止條件,滿
足這個條件的話程序就輸出當前最好的結果並停止。最簡單的終止條件就是,如果種群經過了很多代(這裡的「很多」是一個需要設定的參數)之後仍然沒有顯著改
變適應性的變異的話,我們就停止並輸出結果。我們就用這個終止條件。
好了,現在是萬事俱備只欠東風了。定義好基因,寫好繁衍、變異、評價適應性、淘汰和終止的代碼之後,只需要隨機產生一個適當大小的種群,然後讓它這
樣一代代的繁衍、變異和淘汰下去,到最後終止我們就會獲得一個驚喜的結果:(這回是完整的了,圖片下的數字表示這個扇貝是第幾代中最好的)
怎麼樣?雖說細節上很欠缺,但是也算是不錯了。要不,你來試試用100個透明三角形畫一個更像的?就是這樣的看上去很簡單的模擬演化過程也能解決一些我們這些有智慧的人類也感到棘手的問題。
實際上,在生活和生產中,很多時候並不需要得到一個完美的答案;而很多問題如果要得到完美的答案的話,需要很大量的計算。所以,因為遺傳演算法能在相
對較短的時間內給出一個足夠好能湊合的答案,它從問世伊始就越來越受到大家的重視,對它的研究也是方興未艾。當然,它也有缺點,比如說早期的優勢基因可能
會很快通過交換基因的途徑散播到整個種群中,這樣有可能導致早熟(premature),也就是說整個種群的基因過早同一化,得不到足夠好的結果。這個問
題是難以完全避免的。
其實,通過微調參數和繁衍、變異、淘汰、終止的代碼,我們有可能得到更有效的演算法。遺傳演算法只是一個框架,裡邊具體內容可以根據實際問題進行調整,
這也是它能在許多問題上派上用場的一個原因。像這樣可以適應很多問題的演算法還有模擬退火演算法、粒子群演算法、蟻群演算法、禁忌搜索等等,統稱為元啟發式演算法
(Meta-heuristic algorithms)。
另外,基於自然演化過程的演算法除了在這裡說到的遺傳演算法以外,還有更廣泛的群體遺傳演算法和遺傳編程等,它們能解決很多棘手的問題。這也從一個側面說明,我們不一定需要一個智能才能得到一個構造精巧的系統。
無論如何,如果我們要將遺傳演算法的發明歸功於一個人的話,我會將它歸功於達爾文,進化論的奠基人。如果我們不知道自然演化的過程,我們也不可能在電腦中模擬它,更不用說將它應用於實際了。
向達爾文致敬!
比如自動生成宋詞(http://www.jos.org.cn/ch/reader/view_abstract.aspx?file_no=3596)。
應用很多哦,排班、排課、路徑優化、配置優化、生產排程等等優化問題
GA直接應用就是做優化。有人把GA的思想運用到公司管理中,據說也有效果。
推薦閱讀: