Publisert i bloggen, søndag 5. mars 2023:

AI: Kanon

Kunstig intelligens og maskinlæring har i mange år vært en viktig komponent innen webanalyse og digital markedsføring, som jeg jobber med til daglig. Et typisk eksempel på dette er algoritmer for optimalisering av kampanjer: Har man nok informasjon om hvilken type målretting av annonser som fungerer (og som ikke fungerer), kan man bruke denne informasjonen til å gjøre enda bedre målretting i neste runde.

Men som for de fleste andre er kunstig intelligens en svart boks hvor man på den ene siden putter inn noe data, og på den andre siden får ut et resultat. Uten at man aner så mye om mekanismene som ligger bak.

Så da en del selskapeligheter i romjula 2021 ble avlyst grunnet smitteverntiltak, hva var vel mer naturlig enn å leke litt med dette selv?

Den første problemstillingen jeg stod overfor var mangelen på data. Jeg så derfor for meg en eller annen form for et enkelt spill som ville kreve en kombinasjon av ekspertise og flaks.

Artilleri

Jeg ville selvsagt lage spillet selv, og etter noe grubling kom jeg opp med en god gammel klassiker: Jeg ville lage et kanonspill!

Kanonspill
Denne illustrasjonen er for øvrig laget av kunstig intelligens (DALL·E 2)

Merknad: Prosjektet mitt foregikk fra desember 2021 til februar 2022, og dette blogginnlegget var klart til publisering i slutten av februar 2022. Men da Russland lot det regne missiler over Ukraina 24. februar 2022 fant jeg det ikke passende med et slikt blogginnlegg, så det ble lagt på vent inntil mars 2023.

Jeg gjorde det enkelt som mulig: Man har én kanon og ett mål. Man sikter et sted, fyrer av og håper på det beste mens artilleriet flyr gjennom lufta.

kanonspill-skisse.png

Dette ble kravspesifikasjonen:

Selve spillet

Spillet ble laget med HTML, CSS og JavaScript og kan testes her:
https://ai.hardcode.no/v1.php

ai-kanon-stillbilde

Kunstig intelligens og læring

For å forstå hva kunstig intelligens og maskinlæring dreier seg om kan man bruke et barn som skal lære seg å ta sine første skritt som et eksempel.

Alt dreier seg om prøving og feiling.

Når barnet har forsøkt å slippe taket i bordkanten og ta noen små skritt på stuegulvet, og har gjort dette forsøket kanskje tusen ganger, så vil barnet lære hvilke små justeringer og metoder som fungerer og hvilke som ikke fungerer.

Etter noen uker har kanskje barnet innsett at det å legge vekten for mye bakpå ikke fungerte så bra, og da slutter barnet med akkurat dette. Det utvikler seg en ny generasjon (AI-språk), som har en liten forbedring i forhold til forrige generasjon.

Etter enda flere forsøk med prøving og feiling innser barnet at det heller ikke fungerte å legge vekten for mye forover, så da ekskluderes det også.

Til slutt sitter man igjen med en perfekt gange.

Inndata og utdata, features og labels

På samme måte fungerer kunstig intelligens: Man trenger store mengder forsøk man kan lære av. Hvert forsøk må inneholde noe informasjon om hva man gjorde, samt hva utfallet av dette forsøket ble.

I mitt kanonspill vil x- og y-koordinatene for hvor man sikter/skyter være inndata, samt informasjon om vinden.

Utdata vil være hvorvidt man traff målet eller ikke.

Innenfor kunstig intelligens kalles dette for features (inndata) og labels (utdata).

Et datasett med 7 forsøk vil derfor kunne se slik ut:

Features (inndata) Label (utdata)
x y Vind Suksess
1 507 +4 Nei
326 633 0 Nei
102 638 -6 Nei
310 210 0 Ja
165 408 +18 Nei
399 242 +6 Nei
334 302 +2 Ja
Kanonspill
Datasettet med de 7 forsøkene ser slik ut

Testing med Raspberry PI

For å gjøre mange nok forsøk laget jeg en nettside som ville laste spillet og velge tilfeldige koordinater og fyre av kanonen. Dette gjorde jeg hvert 8. sekund, og for hvert forsøk logget jeg koordinater, vind og treff/bom.

Jeg satte opp en Raspberry PI som helt enkelt bare viste denne nettsiden, og nettsiden startet selv et nytt spill hvert 8. sekund.

I første runde testet jeg med helt tilfeldige koordinater, innenfor den radiusen som det var mulig å skyte fra.

Av 15 691 skudd var det 663 fulltreffere. 4,23 % av skuddene traff målet.

Grafen nedenfor viser akkumulert* treffrate for de første 1000 forsøkene. Det ble treff på 6 % av de første 1000 skuddene, og videre sank dette altså til 4,23 % etter nærmere 16 000 forsøk.

*akkumulert i denne sammenhengen, og også for de andre grafene lenger ned, betyr total treffrate så langt i forsøkene. Denne vil aldri komme opp i 100 %, med mindre man treffer allerede fra første skudd og aldri bommer, men den vil kunne nærme seg 100 %. Bakgrunnen for denne fremstillingen er rent visuell (glidende gjennomsnitt ble først forsøkt brukt).

Enkel læring

Etter å ha avfyrt såpass mange skudd i blinde var det nå på tide med noe enkel maskinlæring.

Jeg brukte de nærmere 16 000 skuddene som læring: Når jeg nå skulle skyte på nytt, valgte jeg helt tilfeldig blant de koordinatene som hadde gitt treff tidligere. Men helt uten hensyn til vind, så det var ikke gitt at det ville gi treff.

Her fyrte jeg av 29 716 skudd, og traff blink på 40,64 % av disse. En klar forbedring fra 4,23 % da jeg skjøt helt i blinde.

Her er de første 1000 skuddene for denne læringen (blå) sammenlignet med de første 1000 skuddene med helt tilfeldige koordinater (rød):

Beste gjetning

Men var det mulig å forbedre dette enda mer? Det burde vel være mulig å få en treffrate på mer enn 40 %?

I neste runde valgte jeg å inkludere vind, samtidig som jeg gjorde det litt vanskeligere for meg selv ved å ikke bruke de 45 000 tidligere forsøkene som læring. I stedet startet jeg helt med blanke ark.

Hadde jeg skutt og truffet under samme vindforhold innenfor samme forsøksrunde benyttet jeg de samme koordinatene igjen. Da var jeg garantet å treffe.

Hadde jeg ikke truffet under samme vindforhold skjøt jeg igjen i blinde, med håp om å lære noe.

Jeg kalte denne metoden selv for «best-guess».

Jeg gjorde dette i tre forsøksrunder, og disse flatet ut med en treffrate fra 40 % til 80 %. Her vist med grønne grafer:

Beste gjetning med splitt

Etter de tre forsøksrundene med «best-guess» gjorde jeg noen modifikasjoner.

Hvis jeg hadde skutt tidligere under samme vindforhold og truffet, var jo saken grei, da var det bare å bruke samme koordinater som tidligere.

Men der jeg med «best-guess» hadde valgt å skyte i blinde, valgte jeg nå i halvparten av forsøkene å skyte på koordinater som hadde gitt treff med andre vindforhold, men da de som hadde gitt mest like vindforhold.

Jeg hadde kanskje ikke truffet noe som helst med 10 m/s medvind, men jeg hadde truffet med 8 m/s medvind, og da kunne jeg bruke det.

Dette gjorde jeg i hele 14 forsøksrunder, med 1000 skudd i hver runde.

Dette ga alt fra 30 % til 89 % treffrate på de første 1000 skuddene.

Her er markert i svart, sammen med random (rød), enkel læring (blå) og beste gjetning (grønn):

Neural networks

Disse forsøkene kan defineres som enkel maskinlæring, som er en gren av kunstig intelligens. Selv om algoritmene er veldig simple dreier det seg om å gjøre datamaskiner i stand til å lære fra og utvikle atferd basert på empiriske data.

Sommeren 2022, noen måneder etter forsøkene beskrevet overfor, testet jeg med nevrale nettverk. Siden spillet mitt er nettbasert fant jeg det mest naturlig å ta i bruk Brain.js. Jeg har gjort noen innledende forsøk, men det gjenstår å få satt dette mer i system.

  1. Kort fortalt henter jeg ut mange tidligere forsøk (både forsøk med treff og forsøk med bom) og gir dette som trening til Brain.js.
  2. Deretter gir jeg en rekke koordinater til Brain.js og lar algoritmene predikere sannsynligheten for treff for hver av de.
  3. Og til slutt benytter jeg de koordinatene med høyest sannsynlighet for treff.

Når jeg får satt dette mer i system blir dette presentert i et eget blogginnlegg.

Relatert innhold

Are og Ida på date

Bloggen

Paid and organic last click
Are og Ida på date
Kunstig intelligens
Vekst- prosjektet
Da Outlook stjal ikonet mitt
Sen eller tidlig påske?
Koordinater i SVG
Påstand: Corner er mål
Vestfold-Rogaland kalkulator
Twitter og VM på ski
My New Year's Resolutions
Et bilde sier mer enn tusen ord
Rogaland blir nye Vestfold
På størrelse med Vestfold
Datoformat i Excel og Google Analytics
what3words Hvilke tre ord?
Covfefe will make America great again
Om domenenavn og firmanavn
Fotballfrue: Jeg tar innpå deg
Sakte-TV: Se gresset gro
Sakte-TV: Se maling tørke
Første generasjon iPapp har kommet
Jukselapp fotografering
Det sorte hullet cookies disabled
Høysesong for kjipe annonser
Om analsex og popups
Rotasjon av vindsymboler
Hvor mye er Fotballfrue verdt?
Slik tar du et screenshot
Nyttige husketrekanter
Enklere utregning med kryssmultiplisering
Min egen lille adventskalender
Logge antall likes på Facebook
Hva er sitemap.xml?
Hva er robots.txt?
Responsivt design
Webscraping med PHP
Jeg sammenligner epler og pærer
Scalable Vector Graphics
Google Analytics API: Hente data
Google Analytics API: Muligheter
HTML5: Video
Big Data
Cookies: Hvordan det brukes
Cookies: Hva er det?
Excel i to vinduer
CRM-systemet «Kontor»
Gigantisk timelapse
Hva er jQuery?
Overvåke ReadyNAS DUO med PHP
Favicon - ikonet i adressefeltet
Animert heading på hardcode.no
CSS -sprites
Komprimere PNG-bilder
Redesign av hardcode.no
Klikkbar flash uten clickTAG
Relevans har stor verdi
Alle har wide- screen i 2013
Markedsandeler nettlesere 2010
Internet Explorer-vindu i feil størrelse
Hvor stor er en piksel?
Markedsføring og kundelojalitet
Flash-versjoner
Vestre Sylling og Øverskogen JFF
Sidevisninger, besøk og brukere
Widescreen kommer
Hvor brede bør sidene være?
Fortsatt lese hele saken?
Lese hele saken nå?
Første møte med AdWords
Bort med IE6
Utviklingen på nettleserfronten
Nyttige jukselapper
Nye Sylling.no
Klær med egen logo?
Værdata fra yr.no
Logodesign trender i 2008
Gmail grimaser
Google Analytics
Publiseringssystemet Outpost
Hardcode.no relanseres
Publiserings -systemet