En av fordelene med å være en halvstudert røver innen maskinlæring, er at når man kommer over en forskningsartikkel på arxiv som man for en gangs skyld kan følge sånn noenlunde, så blir man behagelig overivrig. Man får den følelsen av at dette er helt fantastisk, selv når resten av maskinlæringsmiljøet ikke ser ut til å dele din begeistring.
En artikkel som inspirerte meg på den måten, var denne: How (not) to Train your Generative Model av Ferenc Huszár (http://arxiv.org/abs/1511.05101). Jeg skal prøve å forklare.
Når jeg trener en generativ modell, slik som den jeg trente for å lage vakre blomsterbilder, er det egentlig en sannsynlighetsfordeling jeg er ute etter. (Dette er selvfølgelig for maskinlæringsfolk, jeg har også forstått det etterhvert – men det er ikke helt selvinnlysende heller.)
Det jeg vil, er å fange opp variasjonen i treningsmaterialet. Ideelt sett skulle det være slik at modellen min kunne generere alle mulige blomsterbilder, og ikke noe bilde modellen min kunne generere var noe annet enn en blomst.
Fordelingen som kommer ut av min modell, vil ikke være perfekt. Det vil si, det vil være en “avstand” mellom den ideelle sannsynlighetsfordelingen, og den jeg faktisk har. Jeg putter avstand i gåseøyne, for det merkelige med sannsynlighetsfordelinger, er at man kan ikke egentlig kalle det en avstand. Avstander skal helst følge regelen at att og fram er like langt, men slik er det ikke med sannsynlighetsfordelinger! Det tekniske order for noe som ligner litt på en avstand, men bryter den regelen, er en divergens. I sannsynlighetsregning måler man avstanden mellom to fordelinger med noe som kalles Kullback-Leibler-divergens, eller KL-divergens.
La oss kalle fordelingen av bilder som virkeligheten lager for P. La oss kalle distribusjonen av bilder min modell kan lage for Q. Hva vil det si at det er en stor “avstand” fra P til Q? Det betyr at virkeligheten ganske ofte kan produsere bilder som det er usannsynlig at min modell vil produsere. Og hva betyr en stor avstand andre veien? At noen bilder min modell produserer, ikke er særlig sannsynlig at skal finnes i virkeligheten.
Når man lager en generativ modell, hva er verst? At vi ikke kan generere alle mulige blomster, eller at vi noen ganger lager skrot som ikke ser ut som blomster i det hele tatt? Svaret virker åpenbart. Vi klarer aldri å gjenskape all naturlig variasjon uansett, og det er blomster vi vil ha, ikke skrot. Vi vil minimere avstander fra virkeligheten til vår modell, ikke motsatt, eller hva?
Det er det Ferenc Huszár påstår, og det virker rimelig. Men det er et problem (som han også forklarer): Å trene en generator til å minimere avstanden fra modellen til virkeligheten er vanskelig nok. Andre veien er enda vanskeligere. Det virker umulig å ta sikte på dette målet direkte.
Men det er her GAN kommer inn i bildet. De virker da som de gjør det ganske bra, ikke sant? Hvordan kan det ha seg? Ferenc Huszár hevder (og jeg kan ikke følge all matematikken, men jeg tror han vet hva han gjør!) at et GAN sikter på noe midt i mellom divergensen fra P til Q og fra Q til P. Og han mener at det bør gå an å forskyve det i den ene eller andre retningen, ved ganske enkelt å justere antallet treningseksempler av hver type.
For å repetere fra forrige post: et GAN har to deler, en generator som lager kunstige bilder, og en diskriminator som prøver å se forskjell på ekte og kunstige. Kan det være så enkelt? Kan vi få en mer realistisk generator ganske enkelt ved å gi diskriminatoren flere eksempler på ekte bilder enn kunstige?
Ferenc Huszár advarer om at “denne endringen kan ha negative konsekvenser for algoritmens konvergensegenskaper”. Med enkle ord, vi vet ikke hvor bra det virker i praksis. Å få et GAN til å konvergere kan være utfordrende nok i første omgang, og denne endringen gjør det nok ikke enklere.
Jeg så ham på reddit, og spurte hvorfor han ikke bare hadde prøvd det. (Det er en av de flotte tingene med maskinlæring: man møter på masse veldig dyktige folk, som man kan spørre! Jeg prøver å bruke denne muligheten med ansvar, så vi ikke skremmer dem vekk! Men dette spørsmålet virket uskyldig nok.)
Han sa at han planla å prøve noen av ideene i praksis, men at han stort sett ikke kunne rettferdiggjøre å bruke mye tid på det. Og så, sa han, er det ofte slik at noen andre allerede har gjort noe lignende.
Men jeg er en halvstudert røver, utrustet med Soumith Chintalas DCGAN-kode, og jeg har nok av tid (samt et uansvarlig dyrt grafikkort). Chintalas kode virket som om den hadde få problemer med å konvergere i utgangspunktet, så den tåler sikkert litt utfordringer også. La oss prøve!
For å ha et sammenligningsgrunnlag, brukte jeg samme blomsterdatasett som forrige gang. Det første jeg prøvde var å doble antallet ekte bilder i hver treningsbatch. Etter 250 epoker, ble det slik:
Vel, det ser ikke så verst ut, men ikke så imponerende heller. Var 250 epoker virkelig ikke nok? Uansett må vi prøve andre veien, med dobbelt så mange kunstige bilder. Enda et par timer senere, ble det slik:
Vent litt, dette ser da bedre ut? Det skulle vel være verre? Gjør jeg noe galt her?
Her finner jeg feil nummer en. Funksjonen som skal evaluere hvor bra diskriminatoren gjør det, viser seg å dele på antall eksempler. Bidraget fra positive og negative eksempler var fortsatt 50-50, det var bare at i første eksperiment brukte den færre eksempler for å estimere hvordan ekte bilder skulle se ut, og i det andre brukte den flere bilder for å få et bedre estimat av hvordan kunstige bilder så ut. Ikke rart den gjorde det bedre
Jeg tok et eksperiment til. Denne gangen delte jeg ganske enkelt bidraget fra negative eksempler med to:
Nå begynner det å ligne på noe! Det virker som den lager mer plausible og interessante bilder, gjør det ikke? Denne modellen virker for meg som den beste så langt, selv bedre enn den som trenet fire ganger så lenge.
Men så tenkte jeg: la oss se hvor langt vi kan presse det. Jeg kan jo egentlig trene på så mange kunstige bilder jeg vil – det gir bare et bedre estimat på hvordan kunstige bilder ser ut. Bidraget fra dem kan jeg skalere opp og ned uavhengig av hvor mange det er.
Så jeg kjørte et siste eksperiment, hvor jeg firedoblet antallet kunstige bilder, men skalerte ned bidraget fra dem til en åttendedel i forhold til de ekte. Den tok veldig lang tid å trene. I det jeg gikk til sengs, var jeg litt bekymret, for det så ut som om bildene gikk frem og tilbake i kvalitet en god del, uten å bli så mye bedre i det lange løp.
Når jeg tenkte over det etterpå, så var det antagelig ikke helt harmløst å legge til masse kunstige bilder. En ting var at det forlenget treningstiden kraftig, men jeg glemte også at generatoren bare trener på kunstige bilder. Med dette oppsettet, ble den antagelig litt for sterk, så diskriminatoren ikke klarte å holde følge særlig bra. Kanskje det var grunnen til svingningene i kvalitet også. Den sluttet på en generasjon der ting så noenlunde OK ut:
Men det er fortsatt ikke bedre enn den forrige.