Interaktion med den genetiska algorithmen GenJam - Linköpings Universitet HT 2012
Innehållsförteckning Innehållsförteckning... 1 Inledning... 2 Ordtabell... 2 Vad är en Genetisk Algorithm... 2 IGA, Interaktiv Genetisk Algorithm... 3 Genetic Jammer... 4 Mentorns interaktion med GenJam... 6 Tidsfördröjning... 6 Populationer... 7 Taktpopulationen... 7 Fraspopulaitonen... 8 Genetiska operatorer... 8 Träna GenJam... 8 Diskussion... 9 Referenslista... 11 1
Inledning Genetick Jammer (GenJam) är en Interactive Genetic Algorithm (IGA) som lär sig att improvisera till jazzmusik. Den tar rollen som en jazzmusiker, bredvid sin mänskliga medspelare, och klarar bland annat av att; improvisera egna solon, spela med i melodier, och trade fours med sin partner i chase -refränger. Ordtabell Takt: En tidsenhet med ett bestämt antal slag. Fras: Ett antal takter Vad är en Genetisk Algorithm En genetisk algorithm är en sorts sökmetod och hämtar insperation från evolutionsteoirin, både i terminologi och operatorer för att lösa problem. Algorithmen bygger alltså på att det finns en population av möjliga lösningar till problemet, där varje individ består av kromosomer. Dessa kromosomer representerar var för sig en tänkbar lösning till problemet som ska försöka lösas. Kromosomerna, i sin tur, består utav gener som innehåller kodstränger, precis som inom genetiken, och representerar de minsta byggstenarna inom algorithmen. När den genetiska algorithmen skapar en population inför ett problem som ska lösas, är dess kromosomers gener helt slumpvis utvalda ur problemets sökrymd. Därför är sannolikheten för att kromosomerna inte är en särskilt bra lösning på problemet stor. För att åtgärda detta och påbörja hittandet av den kromosom som leder till den bästa lösningen, anväder sig algorithmen av något som kallas en fitnessfunktion. I fitnessfunktionen utvärderas varje kromosom och blir sedan tillsatt ett bestämt värde. Detta värde blir kromosomens fitness och avgör hur väl anpassat dens lösning är på problemet. Det är här olika genetiska algorithmer skiljer sig mest från varandra, i hur fitnessfunktionen implementeras och fungera, beroende på vilken typ av problem de ska lösa. När kromosomerna i populationen fått ett fitnessvärde går det att göra ett urval. Urvalet görs bland de kromosomer som verkar mest lämpade att finna en lösning på problemet. Dessa utvalda kromosomer lever vidare, och blir föräldranoder, medans de som sållas bort försvinner och raderas ifrån algorithmen. I det är steget skiljers också olika genetiska algorithmer från varandra, men den huvudsakliga uppgiften är att ta bort de kromosomer som har låg fitness och spara de som har hög. Det algorithmen sedan gör är att, med hjälp utav de bevarade kromosomerna, bilda en ny population. Denna population blir då nästa generation av kromosomer. Detta gör den genom att tillämpa något som kallas crossover, vilket innebär 2
att den genetiska koden för två kromosomer korsas slumpvis med varandra och bildar två helt nya kromosomer. Denna process kan då upprepas till dess att en ny generation med lika många kromosomer har bildatas som i den föregångna. När den här crossover-metoden används är det lätt att de nya kromosomerna bli väldigt lika varandra, och för att motverka det använder sig algorithmen av något som kallas mutation. Det mutationen gör är att det finns en procentuell chans för helt slumpmässiga förändringar bland kromosomerna. Precis som mutationer kan ske i den naturliga världen, kan dessa vara av olika slag. Till exempel kan en gen raderas helt och hållet, substitueras av en annan gen, eller sättas in mellan andra gener. Ett litet problem är att mutationen sker slumpvis, och för att hela algorithmen inte ska vara helt slupmässig måste sannolikheten för att en mutationen ska ske vara låg. När allt detta är gjort är grunden för algorithmen gjord och alla steg återupprepas, och det nya kromosomerna blir tillsatt nya fitnessvärden som beräknas och går igenom ett nytt urval för att hitta de som är mest lämpade. Förhoppningsvis kommer det genomsnittliga fitnessvärdet att öka allt eftersom i de nya generationerna tills den kromosom med bäst lösning för problemet har hittats. Horner et al [1993] beskrev en vanlig genetisk algorithm på detta sätt: Initialize the individuals in the population While not finished evolving the population Figure the fitness of each individual Select better individuals to be parents Breed new individuals Build next generation with new individuals elihw IGA, Interaktiv Genetisk Algorithm Som det nämnts ovan skiljer sig de flesta genetiska algorithmer från varandra i fitnessfunktionen. I de vanligaste genetiska algorithmer kodas fitness-värdet in, men detta blir ett problem när man använder sig av en artistisk domän, så som skapandet av musik, bilder eller annan sorts konst. Att skapa en beräknande fitnessfunktion för något som är så olika från person till person, som känslan för vad som ser fint ut eller låter bra, är extremt svårt och i princip omöjligt. Därför kan en genetisk algorithm, som har den uppgiften, använda sig av en Interaktiv Genetisk Algorithm. En sådan algorithm använder sig av en mänsklig mentor som 3
måste uppleva varje individ i populationen och ge kritik som, direkt eller indirekt, avgör vilket fitnessvärde den individen ska bli tillsatt. Detta gör att behovet för att formalisera vad som är artistiskt rätt försvinner, men förflyttar mycket ansvar till den männskliga mentorn, eftersom hen måste uppmärksamma varje enskild individ inom populationen för att sedemera ange ett fitnessvärde. Att gå igenom denna process är väldigt tidskrävande och kräver mycket arbete, och det skapar en fitness bottleneck. Med det menas att det i början är snävt, jobbigt och tar lång tid, men när grundjobbet är gjort finns det massvis med möjligheter. Genetic Jammer Genetick Jammer (GenJam) är en sådan interaktiv genetisk algorithm, som lär sig att improvisera till jazzmusik. Den tar rollen som en jazzmusiker och klarar av att improvisera hela refräng-solon självständigt i realtid, och den klarar av att spela med till sin mänskliga medspelare, som agerar mentor, i chase -refränger där den lyssnar efter fyrtaktsfraser som spelas av den mänskliga mentorn. GenJam mappar vad den hört till sin kromosomstruktur som finns i populationen, muterar dem, och spelar sedan direkt med i nästa takt. GenJam skiljer också från en vanlig genetisk algorithm genom att den har två populationer istället för en. Det finns en population för takt och en population för fras. Individer som finns i taktpopulationen mappar till en sekvens av MIDI-events, och en individ från fraspopulationen mappar till olika takter i taktpopulationen. GenJam kan köras i tre olika lägen; learning, breeding, eller demo. Learning-läget är till för att bygga upp fitnessvärden, och använder sig inte av några genetiska operatorer. En fras väljs slumpvis ut, utan att hänsyn till fitnessvärdet tas, och presenteras för att få feedback av mentorn. I breeding-läget finns de genetiska operatorer som änvänds, och där blir hälften av varje population utbytt och ersatt av ny avkomma innan ett solo presenteras för feedback. GenJam uppträder i demo-läget, och där väljer algorithmen ut fraser med hjälp av en utslagsprocess och tar hänsyn till fras-fitness samt takt-fitness, och feedback ignoreras. 4
Figur 1. GenJams systemuppbyggnad Figur 1 visar GenJams arkitektur och vilka operatorer som finns. För att improvisera till en melodi läser GenJam från en Chord progression file som innehåller de ackord som definierar melodin som spelas, och även den takt samt vilken oktav GenJam ska improvisera i. MIDI Params- filen sätter synthesizerparametrar för olika delar i melodin, vilka innehåller ljudnivå, instrument, platsen i stereofältet, samt flera andra inställningar. Choruses-filen talar om för GenJam när den ska spela solo, vänta på sin mentor då denne spelar ett solo, spela trade fours eller trade eights, eller spela ett riff som sedan tidigare redan är skrivet. GenJam önskar att skapa en illusion under uppförandet att det är en jazzkvintett, med två soloister (GenJam och mentorn) och en rytmsektion, som spelar. Därav kallas ibland gruppen för en Virtual Quintet. Rythm Sequence och Head Sequence är standard MIDI-sekvenser för rytmsektionen och för de förbestämda melodierna. Rythm Sequence-filen innehåller tre till fem bitar av rytmsektionen vilka spelas som akompaniemang till soloisten, och Head Sequence-filen innehåller en harmonidel som GenJam kan använda under första och sista refrängen av låten. Dessa två filer spelas i bakgrunden medans GenJam och mentorn improviserar. 5
Mentorns interaktion med GenJam Mentorns uppgift är att medan GenJam improviserar ett solo, direkt och kontinuerligt ge kritik på vad som spelas. Detta gör mentorn genom att trycka på tangenterna g eller b. Om ingen tangent trycks ner anses det som neutralt. g och b valde Biles (som skapade GenJam) för att det kändes självklart att de representerade good och bad. När mentorn hör något som hen tycker om och anser låter bra, trycker denne ner tangenten g, och det som händer är att fitnessvärdet för takt- eller frasindividerna i respektive population, beroende på vilket som för tillfället spelas, ökar med 1. Varje gång mentorn trycker ner b, för hen anser att det låter illa sker det tvärt om, d.v.s fitnessvärdet för takt- eller frasindividerna minskar med 1. Ett problem som kan uppstå här är att individer som får väldigt mycket positiv kritik kan etableras till den grad att nya väljs bort och inte används. Genom att skapa ett tak för fitness på +30 och -30 elimineras det problemet och gör det då möjligt för mentorn att tunna ut ett lick som används för mycket. När mentorn har lyssnat klart och modifierat alla fitnessvärden, skrivs dessa till populationsfilerna efter det att solot avslutats. Tidsfördröjning Ett problem som kan uppstår när mentorn ska bestämma om det som GenJam improviserar är bra eller dåligt, är att hinna med att bedöma varje takt och fras. Därför finns det en fördröjning inbyggd i mekaniken så att metorn ska ha tid på sig att ge rätt kritik till rätt fras och takt. Detta är gjort genom att tidsfönstret för att ge kritik har blivit förskjutet med två taktslag för varje takt, och förskjutet en hel takt för varje fras. Vad som menas med att det blivit förskjutet två taktsalg för varje takt är att, om mentorn trycker på g eller b under det tredje eller fjärde taktslaget i en takt, så kommer fitnesvärdet för den takten att öka, eller minska beroende på vilken tangent mentorn trycker på, med 1. Kritiken som ges på taktslag ett eller två kommer påverka den föregående takten. Sättet att ge kritik fungerar på samma sätt för en fras, d.v.s om mentorn ger sin kritik på takt 1 av en fras appliceras den på den fras som nyss spelats, och om kritiken ges på takt 2, 3, eller 4 så påverkar den frasen som spelas just nu. 6
Till en början testades ett interface som gav kritiken direkt till den spelande frasen eller takten. Detta misslyckades dock eftersom mentorn inte hann med att bedöma och bestämma om deras kritik hörde till en fras eller en takt. Det är för att undkomma detta som tidsfönstret för att ge kritik åt en fras är satt till en hel takt, då en takt som går i fjärdedelstakt är dubbelt så lång som fördröjningen för att ge kritik åt en takt (som ligger på taktslag 1 och 2, eller 3 och 4). Populationer Taktpopulationen Som nämnts tidigare har GenJam, till skillnad från andra vanlig genetiska algorithmer, två populationer istället för en. En taktpopulation och en fraspopulation. När mentorn ger sin kritik är det de individer som finns i dessa som blir påverkade. Figur 2. En fras och dess takter Figur 2 är ett exempel på en takt- och frasrepresentation. Taktpopulationen består utav 3 takter; takt 11, 38, och 57. Den första siffran, läst ifrån vänster, är takten fitnessvärde. När en mentor ger kritik då GenJam uppträder, är det dessa som ändras. De resteraden åtta siffrorna är individernas kromosom. Kromosomen i taktpopulationen är representerad till åtta stycken events, där varje event är ett åttondels taktslag i en fjärdedelstakt. Dessa event är en nothändelse, sammanlagt finns det tre olika sorters nothändelser, new-note, rest, och hold. Det finns 14 olika sorters events för nothändelsen new-note, kodat till 1-14 vilket kan ses i figur 2. De resterande två nothändelserna, rest och hold, är representerade med 0 respektive 15. Frasen i sin tur består utav dessa takter. 7
Fraspopulaitonen Fraspopulationen består av olika takter. I figur 2 ser vi att frasen innehåller kromosomer, 57 två gånger, 11 och 38. Dessa kromosomer fungerar som pekare till taktpopulationen och pekar då på respektive takt. Fitnessvärdet för frasen är -12, vilket säger oss att frasen inte uppfattats som bra och givits mindre bra kritik av mentorn Genetiska operatorer GenJam initsieras med att alla fitnessvärden sätts till noll och takt- samt fraspopulationerna skapas. Därefter tilldelas taktindividerna sina slumpmässigt valda värden, det vill säga de, 1-14, nothändelser som representeras av kromosomer i taktindividen. Även specialfallen rest och hold, 0 och 15, blir slumpmässigt tilldelade. Sannolikheten för att en nothändelse av typen rest eller hold ska slumpas fram är 5/24, och varje new-note har en sannolikhet på 1/24. Anledning till att rest och hold har en högre sannolikhet att slumpas fram är för att initialpopulationen ska få någon form av rytm. GenJam använder sig av något som kallas modifed tournament selection process där fyra individer väljs ut helt slumpmässigt. Dessa fyra bildar en familj, där de två individer med högst fitnessvärde blir föräldrar och de två med minst fitnessvärde ersätts med avkomman från de två föräldraindividerna efter att de har muterats. Detta innebär att i varje generation kommer hälften av taktpopulationen vara ersatt av nya avkommor, som i sin tur inte kan agera föräldrar i sin egna generation. För att GenJams mentor snabbt ska kunna bedöma och ge kritik skickas de nya taktindividerna in i en fras som blivit slumpässigt utvald baland de åtta försa fraserna som spelas upp för mentorn. De 16 fraser som återstår kommer att genereras som nya fraser på samma sätt som taktindividerna. GenJam består av 48 fraser och 64 taktindivider. Träna GenJam När GenJam genomgår träning, för att bygga generationer och framställa musik som låter bra, körs algorithmen till en början i 3-4 solon som med största sannolikhet kommer låta som ihop kluddade ljudbitar. Detta görs för att skapa samples till populationerna och tilldela de initiala grundläggande fitnessnivåerna. Därefter går det att skifta mellan de olika lägena; breeding och learning, för att det till slut ska börja framställas någorlunda sammansatta solon. Denna session kommer till en början vara tråkig och ganska så frustrerande för mentorn, då nästan 8
alla fitnessvärden kommer vara låga och antalet melodiska intervall tenderar att vara stora. I början kommer det även att dröja innan det framställs nice moments som Biles kallar dem. De första solida fraserna brukar uppstå vid den fjärde eller femte generationen, och en golden generation brukar uppstå vid den tionde generationen. Med det menas en generation där nästan alla fraser låter rimliga. När algorithmen har kommit såhär långt är det möjligt för mentorn att byta från att ge positiv kritik åt något som bara låter musikaliskt, till att bedöma om det låter bra eller inte. Om det i en tidig generation utvecklas en takt som redan då låter bra, kan mentorn bli tvungen att tunna ut ett lick som tidigare blivit positivt bemärkt, genom att straffa det. Detta görs för att takten inte ska bli överanvänd efter en generation eller två. Diskussion Inför den här fördjupningsuppgiften hade jag svårt att bestämma mig för vad jag ville skriva om. Jag fick höra om GenJam och blev väldigt imponerad och fascinerad av vad den kunde åstakomma. Jag själv har spelat musik i många år, och jazz var något som jag tidigt började intressera mig av. Jag har improviserat till andra och vet hur svårt det är. Att GenJam klarade av att agera som en medsolist till en mänsklig jazzmusiker tyckte jag var väldigt häftigt. Därför valde jag att skriva om GenJam och interaktionen med algorithmen. Om man vill få en dator att skapa musik av sig själv, verkar det vara helt rätt att använda sig av genetiska algorithmer. GenJam är den algorithm som bäst lyckas med detta, och anledning till det ligger i mentorns interaktion. Samtidigt som GenJams största limitering också ligger i interaktionen med mentorn. Att agera mentor utgör mycket påfrestingar på den personen i och med att hen måste vara extremt fokuserad och det tar lång tid att få algorithmen att skapa någorlunda bra jazzmusik. Efter Biles låtet olika människor testa GenJam och agera mentorn, upptäckte han att de mentorer som kändes sig mest bekväm i rollen, var antingen jazzintresserade, var musiker, höll på med eller jobbade inom data. Männsikor som saknade dessa attribut blev snabbt uttråkade eller var rädd att fortsätta mer än en låt. Detta ser jag som den strösta nackdelen med GenJam, att den nästan kräver att mentorn som interagera besitter de tre attributen ovanför. För en person som aldrig tidigare hållit på med musik blir det svårare att sätta sig in i, och få känsla för, när man ska ge kritik åt vad. Att om man trycker på g under de första två taktslagen, ger man positivkritik åt den föregående takten osv. 9
Det till trots så verkar ändå GenJam, utifrån från den uppfattning jag fått efter att ha läst om ämnet musikskapande med hjälp av genetiska algorithmer, vara den bästa lösning till att skapa musik artificiellt. Att ha en mänsklig mentor som kontrollerar fitnessvärdena är det som gör GenJam så pass lyckad, men tester har gjorts för att försöka eliminera den mänskliga faktorn genom att implementera en neural fitnessfunktion av strukturen N-M-K. Tyvärr lyckades inte testet framställa något lyckat försök, utan det resulterade i att nätverket hade väldigt svårt att träna sig själv eftersom den fick för mycket träningsdata för att kunna generalisera. Att få GenJam att automatiskt sätta fitnessvärden kräver väldiga dataresurser. Eftersom mentorn spelar en så stor roll i hur väl algorithmen lyckas framställa bra jazzmusik i och med att hen bestämmer fitnessvärdena, är det inte så förvånande att automatiseringen av den processen utgör den största barriären för GenJam. 10
Referenslista J. A. Biles. "GenJam: A Genetic Algorithm for Generating Jazz Solos," In Proceedings of the 1994 International Computer Music Conference, ICMA, San Francisco, 1994 Biles J.A Neural Network Fitness Functions for a Musical IGA (1999) http://igm.rit.edu/~jabics//soco96/soco.html John A. Biles. Life with GenJam: Interacting with a Musical IGA (1999) http://igm.rit.edu/~jabics/smc99/index.html Stuart Russel, Peter Norvig (2010). Artificial Intelligence: A Modern Approach, Third Edition - ISBN-13: 978-0-13-207148-2 11