Genetiskt Programmerad Musik Function Set: play_two, add_space, play_twice, shift_up, shift_down, mirror, play_and_mirror Terminal Set: Notes: C-4, C#4, D-4, D#4, E-4, F-4, F#4, G-4, G#4, A-5, A#5, B-5 Pseudo-Chords: C-Chord, D-Chord, E-Chord, F-Chord, G- Chord, A-Chord, B-Chord Other: RST
Abstrakt Kan man förena artificiell intelligens och musik? De beskrivs ofta väldigt olika, musik är kopplat till känslor och kreativitet medan intelligens oftast beskrivs som det motsatta, rationellt, mer logik i form av algoritmer. Forskningen kring musik är inte liten, dock är det svårt att avgöra vilket system som bäst lyckas representera musik. Därför går den här rapporten inte in på djupet, i mer än ett system, som försökt representera musik. Rapporten bygger på den studie gjord av Brad Johnson och Riccardo Poli;, "{GP}-Music: An Interactive Genetic Programming System for Music Generation with Automated Fitness Raters". I artikeln beskrivs hur deras genetiskt programmerade musiksystem fungerar i interaktion med människa, samt hur det fungerar i samspel med ett neuralt nätverk. Resultaten från körningarna är intressanta och relativt bra, men det finns fortfarande mycket att förbättra. 2
1. Inledning...4 1.1 Vad är genetisk programmering?...4-5 2. Representation av GP...6-10 2.1 Funktioner.6 2.2.Trädstruktur...6-7 2.3 Parametrar 7 2.4 Fitness system.7 2.5 Körningar..8 2.6 Problem och förbättringar...8-9 3. Automatisk rankning 10-12 3.1 Neurala Nätverk...10-11 3.2 Automatisk rankningslista..11-12 3.3 Körningar 12 4. Diskussion..13 5. Referenser..14 3
1. Inledning Dagens forskning kring kombinationen av musik och AI vänder sig främst till att undersöka om en dator kan skapa musik på egen hand. För att kunna skapa musik måste man även kunna avgöra vad som är bra respektive dålig, det är inte något som är helt enkelt för en dator. I en människas öron är musik skapat ur känslor, kreativitet, erfarenhet och ens personliga musik varierar för varje person. Hur ska en dator, som fungerar nästintill tvärtemot människan, kunna skapa musik på egen hand? Det har funnits flera försök till att skapa program som kan generera musik, med olika tillvägagångssätt och resultat. Bland annat så har Biles konstruerat ett musikprogram som använder sig utav genetiska algoritmer för att skapa korta jazzsolon är JamGem. Det fungerar på så sätt att lyssnaren får avgöra om musiken är bra eller dålig, programmet fungerar hyfsat bra, tyvärr blir själva processen för den som får rangordna musiken rätt påfrestande. [1] Ett annat försök till att återskapa musik är EMI [2]. Cope, grundaren till EMI, har utvecklat ett program utefter sin egna kompositionsstil. EMI lyckas känna igen olika musikstilar genom att den får ett tidigare komponerat stycke, som den sedan plocka isär och sen sätta ihop fast annan logisk ordning. Även neurala nätverk har applicerats i ett försök att efterlikna musik, genom att översätta det till formellt språk. Forskning gjort av Kippen (et al.), har man använt sig utav Bol Processorn för att strukturera och översätta musik till formell grammatik [3] Men den här rapporten kommer att fokusera på att se om det går att skapa musik i form av genetisk programmering. Det mesta bygger på artikeln, "{GP}-Music: An Interactive Genetic Programming System for Music Generation with Automated Fitness Raters skriven av Brad Johnson och Riccardo Poli [4]. I artikeln beskriver de hur de har utvecklat ett musikprogram som kan skapa korta musikslingor, bestående av toner och pauser, både med hjälp av människan och utav automatiska rankningssystem. Systemet bygger på en sammansättning av genetisk programmering och genetiska algoritmer, ett system utvecklat av Kozak [5]. Nedan följer en kort grundintroduktion av vad genetisk programmering är. 1.2 Vad är genetiskt programmering? Genetisk programmering är ett sätt att automatiskt generera datorprogram. Det bygger på vår evolutionsteori, Survival of the Fittest [5-6]. I stora drag fungerar genetisk programmering till en början så att man skapar en population av individer, utifrån förbestämda terminaler och funktioner. Terminalerna är det indatavärde man har och funktioner är de möjliga utföranden man kan göra på det värde man har. I genetisk programmering bör man även bestämma vilken struktur man vill att ens individ ska ha, för att bäst kunna lösa problemet. Allt som oftast representeras individerna genom en trädstruktur, men man kan även använda sig utav linjära eller grafiska strukturer. Nästa steg i programmeringen är att man testar sedan sina individer och väljer ut de som fungerar bäst. Fitnessfuntionen, är till för att avgöra hur nära målet individen är, låter de som lyckats bäst föröka sig. Förökningen sker med hjälp av genetiska operatorer och sedan 4
upprepar man proceduren X-antal populationer tills man har fått den absolut bästa populationen. För att få ett så bra resultat som möjligt bör man alltså fundera kring vilka operatorer man bör använda sig utav. De vanligaste genetiska operatorer som används är mutering; då en del av populationen slumpmässigt förändras och ersätts, reproduktion; fördubbling av en individ och korsning; då två individer kapas och byter plats med varandra. Jämförelsen med genetiska algoritmer och genetisk programmering är att man med genetisk programmering kan variera längden, i och med att den kan ta funktioner. Det mesta av den genetiska programmeringen går ut på att avla fram så många individer ur så många populationer som möjligt, på så kort tidsintervall som möjligt. 5
2. Representation av GP-musik GP-musik använder sig som sagt enbart av enkla toner och pauser, vilket är väldigt smart i och med att man då slipper ta hänsyn till faktorer som gör processen av att omvandla och tolka musik till ett musikprogram mycket svårare. Man slipper ta hänsyn till exempelvis vilka typer av instrument man bör ha, vilka olika ljudvågformer som de i sin tur skapar, vilken styrka de har, och så vidare. Musikprogrammet är uppbyggt med en trädstruktur som har terminaler och funktioner. Noterna utgör då terminalerna, medan funktionerna säger hur noterna bör utnyttjas. Noterna som används: C, C#, D, D#, E, F, F#, G, G#, A, A#, H 2.1 Funktioner play_two tar två sekvenser och sätter ihop de till en sekvens add_space tar en sekvens och lägger till en paus efter varje ton, gör att hastigheten kan varieras play_twice tar en sekvens och spelar upp den två gånger shift_up tar en sekvens och höjer varje not i den med ett steg shift_down tar en sekvens och sänker varje not i den med ett steg mirror tar en sekvens och spelar den baklänges play_and_mirror tar en sekvens, spelar den och gör sedan som föregående funktion och sätter ihop de två. 2.2 Trädstuktur Här kan man se en musiksekvens representerat i en trädstruktur, överst skrivet i Lispform: (shift-down (add-space (play-and-mirror (play-two (play-two (play-two (play-two B-5 B-5) (shift-down A-5)) (shift-down A-5)) F-4)))) Figur 1. Exempel på musiksekvens 6
Figur 2. Samma exempel som figur 1, i en trädstruktur. 2.3 Parametrar De parametrar som Poli och Johnson använder sig av är standard parametrar framtagna av Koza. Det baseras på att man använder 16 individer, över 6 generationer. 70 % av dessa de nya individerna uppkommer genom cross-over, 15% muteras och 15% reproduceras. 2.4 Fitness system Det är tänkt att man med hjälp av en fitnessfunktion ska kunna avgöra vad som är bra respektive dålig musik, men hur ska man kunna skriva en matematisk funktion som beskriver ens musiksmak? Poli och Johnsons första lösning till detta var att låta en människa utföra en rankning av varje musiksekvens som genererades och därmed kunna se vilka individer som borde få gå vidare till nästa generation. Användaren får välja att betygssätta musiken på en skala från 1-100 beroende på hur bra man tycker att musiken är. Man får höra en sekvens i taget, för att sedan betygsätta musiksekvensen och användaren får själv avgöra när hon eller han vill går vidare. Det är alltså människan som får fungera som fitnessfunktion. 7
Figur 3. Hur ett GP-musikprogammet kan se ut för användaren 2.5 Körningar I det första steget användes enbart operatorerna play_two och add_space, man använde så små funktioner och terminaler som möjligt. Den körningen var mest till för att se om systemet vad kunde generera, om det verkligen skulle fungera överhuvudtaget. Man valde därför att enbart låta den generera en oktav, inga pseudo-ackord tilläts. Resultatet riktigt dåligt och var dessutom dåligt strukturerat. Till nästa testkörning lades fler funktioner till och det lät plötsligt mycket trevligare. Att man lade till funktionerna resulterade tydligen i att skillnaden mellan den bästa och den sämsta individen slätades ut, vilket kan ha både bra och dåliga effekter i och med att både den sämsta som den bästa individen försvinner helt och hållet. Till nästa försök introducerades psudo-ackord, det innebar att en viss not tillhör ett ackord. Det bör påpekas att det skiljer sig genom att de spelas sekventiellt, inte samtidigt. Pseudoackorden infördes i ett försök att undvika det faktum att sekvenserna biland blir så korta. Pseudo- Chord Corresponding Note Sequence C-Chord C-4,E-4,G-4 D-Chord D-4,F#4,A-5 E-Chord E-4,G#4,B-5 F-Chord F-4,A-5,C-5 G-Chord G-4,B-5,D-5 A-Chord A-5,C#5,E-5 B-Chord B-5,D#5,F#5 Tabell 1. Pseudo-ackord och notsekvenser 8
Man begränsade även noterna till att enbart utnyttja C-dur noter, samtidigt som man ökade djupet från 6 till 9. Resultatet förbättrades anmärkningsvärt, nästintill samtliga körningar fick ett bra resultat. Att man enbart använt sig av C-dur skalan, fick man en bättre ljudmässig sekvens. 2.6 Problem och förbättringar Det som Johnson och Poli insåg från körningarna och genom att titta på användarna när det betygsatte musiken ledde till vissa förbättringar av systemet. För det första insåg de att trots att programmet kan var väl utvecklat, så kan användaren vara den felande länken. Subjektiviteten hos den som sätter betygen, kan variera på hur pass mycket hon/han fokuserar på uppgiften i fråga. Är det enbart en människa som utför betygssättningen dessutom, som i det här fallet, kan processen lätt bli tröttsam och personen i fråga kan snabbt tappa sin koncentration. Långsiktigt sett blir det kanske inte ett så pass bra system som man har tänkt sig från början. Tack vare testkörningarna insåg de även att rankningen mellan generationer inte fungerade. De ändra de i koden, för att undvika fenomenet av att en användare kan få höra samma sekvens två gånger, i två olika generationer, sedan betygsätta samma sekvens fast på två olika sätt. De såg till att alla individer i en generation borde vara betygsatta innan man får gå vidare. Samtidigt kunde man nu gå tillbaka till en tidigare betygsatt generation, om man skulle vilja titta och ändra på den. Ytterliggare ett problem var att vissa sekvenser var för långa eller för korta, därför ändrade de så att användaren själv skulle få bestämma hur långa eller korta sekvenserna skulle få vara. Utifrån den längd som bestämdes, eliminerades, individer som var utanför normen, automatiskt, innan man gick vidare till nästa generation. Ytterliggare en förbättring ljudmässig gjordes, när man ökade från en oktav till två oktaver. Det man ändrade i parametrarna var att införa så kallat Tournament selection, vilket betydde att man kunde jämföra två sekvenser i en typ av utslagning, utan att ta hänsyn till betygsskalan. Detta skulle man senare kunna utnyttja i det neurala nätet, där programmet ska kunna jämföra två sekvenser på egen hand. 9
3. Automatisk rankning Hur ska man nu kunna skapa ett program som skapar musik utan att ha med människoaspekten? Johanson och Poli beslöt sig för att använda sig av neurala nätverk, genom att ha en backpropagation som tränar nätverket. Det är ett flexibelt system som bygger på vikter och kan var ett bra sätt att representerar musik på. I varje kontakt till en nod, har de sin egna specifika vikt, som kan justeras genom backpropagation. Ett nätverk som använder delade vikter, kan en del noder ha samma vikt, detta leder till att vikten kommer att ändras flera gånger under back-propagation. Det här är alltså ett bra sätt att utnyttja då det kommer till genetiskt programmerad musik, där indata inte alltid har lika långa sekvenser. Vikterna kan alltså justeras och ändras så att de passar in i alla nät. Det automatiska rankningssystemet använder en skala på 1-100. 3.1 Neurala nät Figur 2. Hur det neurala nätverket kan se ut Det finns två lager i det automatiska neurala nätet, bottennivån N är närmast indata, och den övre nivån N+1 är närmast utdata. Varje nod i den övre nivån får alltså indata via bottenivån. Level Spread avgör hur många noder som går vidare till nästa nivå, som ni kan se är det 4 stycken i det här fallet. Level Delta avgör, om det är några som överlappar, hur många det då skulle vara. I det här nätverket är det 2 stycken, det vill säga att den första noden på den övre nivån får indata genom noden från den lägsta nivån, medan nästa nod på den övre nivån får indata genom den 10
tredje lägsta nivå noden. Om man minskar värdet på Level Data så ökar överlappningen och korrelationen för noderna mellan de olika nivåerna. Om man istället ökar Level Data desto mer autonomt agerar noderna för de högre nivåerna. Vikterna på de högre nivåerna för Level Spread delas med de undre nivåerna. Detta betyder att vikten är densamma för det första indata som kommer in, till varje övre nod och i backpropagation så modifieras vikterna på den undre noden och alla noder den har kontakt med. 3.2 Automatisk rankningslista Precis som människoanvändaren sker här en bedömning på en skala från 1-100. Original topologin har 5 lager; 3 dolda, två indata och ett utdata lager. Nätverket fungerar så att för varje ny individ som ska evalueras, byggs ett ny nätverk upp, detta eftersom varje sekvens som ska betygsättas varierar i längd. För att hålla nätverket konsistent så lagras och används de delade vikterna i varje nätverk som skapas. Nätverket är byggt så att först skapas en indata nod för varje paus i sekvensen som evalueras. Sedan lagras värdet på den not, i den platsen i sekvensen, till indata noden på följande sätt; För noter delas värdet med 72 och laddas in i noden. Värdet av noten är 13 gånger oktaven, plus notens egna värde, där exempelvis C-0 är 1, C#0 är 2 osv. För pauser laddas a-1 in i noden, -1 hjälper att skilja mellan noter och pauser. Man bör även komma ihåg att det måste skapas tillräckligt många noder för att täcka hela sekvensen, givet efter vilket Level Spread och Level Delta den har. En sekvens på 6 noter/pauser har en Level Spread 4 och ett Level Delta 2, kräver 2 noder. Om det inte blir jämnt, avrundas antalet noder uppåt. Sedan skapas kontakten mellan noderna och fortsätter upp i nätverket tills varje nod har kontakt med alla noder i den högsta nivån. Utdata ger ett värde mellan 0 och 1, som sedan multipliceras med 100 för att få skala 1-100. Man började med ett nät med enbart 1 utdata, men efter att testerna inte gav det resultat man 11
ville ökade man till ett med 7 utdata. Man kan alltså ändra i hur stor utdata man vill ha; 1 eller 7, hur stort Level Spread och Level Delta man vill ha; 1, 2 eller 3. Nätet tränas med hjälp av back-propagation, som justerar vikterna bakåt i lagren från utdatanoden tills den nått indatanoden. 3.3 Körningar Det sista testet från körningarna generade av människorankningen, var till för att kunna skapa en grund att basera träningen av de neurala näten, därför gjorde man en extra stor körning med över tjugo individer i varje population och lät den jobba över tio generationer. Djupet lades till 12. Man började med samma parametrar som i tidigare körningar, men utökade det till 50, 100 och 500 individer. Det ledde till ett väldigt varierande resultat. Det man dessutom hade förutom själva testgruppen, var en kontrollgrupp. Många tester gjordes, med många olika parametrar och de tränades på många olika sätt med hjälp av back-propagation. Det man såg från statistiken var att skillnaden mellan kontrollgrupp och tränade nätverket inte var så stort och musiksekvenserna lät inte så annorlunda om man jämförde, den mänskliga från den automatiserade, sekvensen. 12
4. Diskussion Johanson och Polis egna uppfattning av systemet var att det går att generera korta musikstycken med hjälp av genetiskt programmering, då människan är med och betygsätter. Människoelementet i systemet inte alltid är en fördel, då ett för stort system kan bli för krävande för en användare att betygsätta. De diskuterar även att det finns mycket man kan förbättra i både den automatiska och den människobaserade systemet, som bland annat parametrar, funktioner och terminaler så. Så trots att de har fått ett hyfsat bra resultat finns där fortfarande många brister. Själv anser jag att det är intressant att se att det går att skapa musik med genetisk programmering. Tveksamt om det inte kommer att finnas flera olika användningsområden för GP-musik i framtiden. Det kan till en början vara ett bra sätt att få ingång ens musikaliska kreativitet och se på lösningar i ett nytt ljus. Vår tolkning av musik kan även komma att ändras. Implementerar man exempelvis systemen i musikundervisning kan det kanske kommat att ändra vår grundsyn på hur musik bör skapas? Musik är så pass lättillgängligt idag, kanske kommer skapandet av musik vara lika självklart som lyssnandet, i framtiden. Kombinationen av genetiska och neurala strukturer kan säkert också komma att ändra vår syn på hur man kan utveckla olika system, kan vara till stor hjälp i system som inte alltid har självklara lösningar på problem. Forskningen kring musik visar enkelt vilken bred tolkning som kan göras kring beskrivandet av vad det är och hur man kan skapa musik. Men det kanske är en åtanke man bör ha inför framtiden, att man istället för att begränsa sig till enbart ett sätt, försöker hitta lösningar på ett mer tvärvetenskapligt synsätt. 13
5. Referenser [1] Biles, John A. GenJam: A Genetic Algorithm for Generating Jazz Solos ; Information Technology Department / Rochester Institute of Technology. (1994) http://www.it.rit.edu/~jab/genjam94/paper.html [2] http://www.spectrumpress.com/da-silva-david-cope-and-emi.pdf [3] Bel, B & Kippen, J. (1992). Modelling music with grammars: Formal language representation in the Bol processor. Academic Press, 1992, pp.207-38. http://halshs.ccsd.cnrs.fr/docs/00/03/54/68/pdf/modelling.pdf [4] Bradley E Johanson and Riccardo Poli,"{GP}-Music: An Interactive Genetic Programming System for Music Generation with Automated Fitness Raters", "University of Birmingham, School of Computer Science",1998", ftp://ftp.cs.bham.ac.uk/pub/tech-reports/1998/csrp-98-13.ps.gz, http://graphics.sta nford.edu/~bjohanso/gp-music/tech-report [5] J.R. Koza, F.H. Bennett III, David Andre & Matrin A Keane (1999) Genetic Programming III darwinian invention and problem solving, Morgan Kaufmann Publishers Inc, San Fransisco [6] Russel, Stuart & Norvig, Peter (1995) Artificial Intelligence A Modern Approach. Prentice Hall, New Jersey Musikslingor kan hittas: http://graphics.stanford.edu/~bjohanso/gp-music/ http://www.cs.bham.ac.uk/~rmp/eebic/wsc2/gp-music/gp_music.html/gp-music-autoraters ps.gz. 14