昨天我們聊到了IGA裡用人類與基因演算法做互動來評估音樂個體,優點是這樣的評估方式可以確保演化的方向可以朝著評分者的主觀喜好前進; 而缺點則是時間成本高且容易產生聽覺疲勞導致演化方向走鐘。
那麼今天我們就來介紹另外一種 基於規則 (Rule-Based) 的適應值函數 (Fitness Function) 要如何設計來幫助我們演化出好聽的音樂。
在Fitness Function裡面包含兩個項目: 規則 (Rule) 以及權重 (Weight)。
Fitness Rule代表的是演化的個體是否符合該項規則;
Fitness Weight代表的則是如果符合該規則,則得到多少分數 (可能為正可能為負)。
舉個例子來說,今天我們要選出手上最強的角色,而我們手上的個體們是
我們可以設定以下的規則與權重:
根據以上的規則與權重,我們可以得到每一個角色的分數,例如:
越前龍馬:
可以變身成超級賽亞人,+35分、
有武器,+40分 (球拍)、
血統優良,+100分 (老爸是武士越前男次郎),
所以龍馬的總和分數為175分。
兩津勘吉:
欠債太多,-100分、
擁有外掛,+50分 (每集都在開掛)、
有個有錢的朋友, +30分 (雖然有兩個但也只算一次分),
所以兩津的總分為 -20分 。
漩渦鳴人:
擁有尾獸之力, +20分 (九尾)
擁有外掛, +50分 (別天嘴、嘴遁-相信我之術)
血統優良, +100分 (老爸四代目火影,妥妥的官二代 + 六道仙人的後代阿修羅轉世),
所以鳴人的總分為170分。
以此類推,根據我們所設定好的規則與權重,我們就可以找出綜合得分最高的角色。
我們把這個觀念延用到作曲上面,首先我們要把音樂評分的規則與權重決定好,而這也是Rule-Based Fitness Function最棘手的部份,原因是音樂的好壞不但非常主觀且相當難被量化,這部份非常仰賴設計者本身的背景知識。目前比較主流的研究的通常是以基於樂理(Music Theory)知識的設計來當作主要的Fitness Rule。
樂理裡面包含了旋律、和聲、音程、和弦、曲式以及音樂結構等等作曲相關概念,由於已經經過長時間的統整且為大部分音樂家所公認的標準,因此以樂理來當作設計Fitness Function的標準能夠很大程度上的讓演化往符合樂理架構的方向前進。例如我們可以針對主旋律每個音之間的音程去依照樂理的建議給分、針對旋律與和弦之間的搭配或是整首樂曲的架構等等。當然除了規則 (Rule) 之外,權重 (Weight) 在Fitness Function也是相等重要的一環,在我們有了樂理當作基本規則後,如何設定每條規則的權重就成了另一個難題。
關於設定權重的部份,一是可以透過經驗法則去調整每一條規則之間所佔的比重並透過不斷修正去達到理想的狀態; 二是可以透過分析一些有名的曲子裡面每一條規則符合的數量,以此反向推斷出每一條規則的重要性並以此當作依據給予權重。簡單一點來說,你認為重要的規則就給予高一點的權重; 有點重要但又還好的就可以給予相對低一點的權重; 而某些規則是你希望音樂裡面絕對不能出現的,就給予一個嚴重的扣分 (Penalty); 某些規則是音樂裡不該常常出現但偶爾又能夠畫龍點睛的,就給予一個低一點的Penalty。當然以上都只是比較High-Level的觀念,實際上的設計還是要仰賴不斷的調整以及內容來決定。
Rule-Based Fitness Function的優勢在於省去了人類參與的時間成本,利用設計好的Fitness Function來幫個體們評分不但快速省時,而且評估的標準可以保持一致性,並不會隨時時間拉長而產生聽覺疲勞導致評分的標準走鐘; 除此之外,針對不同需求可以設計不同的Fitness Function來達成不同目的,例如今天如果希望做出來的音樂主軸為國樂/中國風,就可以在規則設計裡面加入一些五聲音階的設定; 如果希望做出特定作曲家/歌手的風格,也可以去分析該作曲家/歌手常用的一些套路後把他們加進規則裡面已達到模仿該風格的目的。
而缺點就是要設計出好的Fitness Function必須仰賴設計者的背景知識,不但要找到好的規則,也得把每一條規則之間的權重設計好,如果沒有辦法設計出正確的Fitness Function,則無法演化出好聽的音樂。
有了評分的標準之後,接下來要做的事情就是針對所有已經透過交配並產生突變的子代來做評分 (最早的世代裡親代也要接受評分,後面的世代則不用,因為後面世代的親代都是由已經評過分的子代而來),做評分的時候很直觀也很單純,我們一一檢視每一個個體裡面符合了哪幾條規則多少次,在根據權重給予分數,最後加總起來就是該個體的分數 (Fitness Score)。覺得難理解的讀者可以再去複習一下前面我們幫龍馬、兩津以及鳴人評分的過程。
那麼明天,我們來解釋基因演算法作曲最後的步驟: 適者生存不適者淘汰 當作這系列的收尾並把整個流程與方法做個總結,Day 23見。