Navsezadnje je pa tudi vseeno če termin “AI” kar obdržimo! Kljub temu, da so bile že velike diskusije na temo kateri izraz bi bil (naj)primernejši. Samo poimenovanje reči le ni tako bistveno — labela je vendarle samo labela.

V zadnjih letih je termin “Artificial Intelligence (AI)” celo postal sinonimen za “Machine Learning (ML)”, ki je pa tudi kar sinonimen z “Neural Networks (NN)”, k –atere pa slišijo še na nekaj podimen — kakor konvolucijske, rekurentne in tako naprej.

Ta monopolizacija AI področja je nekako zaslužena, v večih pogledih. Kvalitetni preskok iz “stare, klasične AI” na “nevronske mreže”, je bil tako velik in dramatičen, rezultati toliko večji in boljši kakor prej, da je to nekako razumljivo. Morda celo opravičljivo. Ker dolga “AI zima”, je doživela kar pošteno odjugo, Najmanj odjugo, če ne pomlad. Ki je prej ni bilo od nikoder. Oziroma je bila precej nezaznavna.

Dovolj o “družbenem kontekstu” teh dogajanj!

Tehnični kontekst je mogoče suhoparnejši, a je še zanimivejši. Kaj je, tehnično gledano, strojno učenje (ML), ki naprimer zmaguje v igri Go, se uči šofirati, robotske hoje, igrati poker … dolg seznam?

Tehnični kontekst je klasifikacija podatkov. To so kozli, to so ovce. In sicer na način, da se naprimer računalniku pokaže 1000+ (slik) ovc in 1000+ (slik) koz, ki so vse že prav olabelirane. Kdo je koza in kdo je ovca. Potem pa računalnik (nevronska mreža) zgradi nekakšno datoteko števil s plavajočo vejico, s pomočje katere (te datoteke namreč) je potem naučeni nevronski mreži mogoče ločiti naslednjih milijardo ovc od milijarde koz. Za vsako tako klasifikacijo na dva ali več razredov, druga datoteka števil s plavajočo vejico.

Tipična datoteka števil s plavajočo vejico, ki zna ločevati dobre šahovske poteze od slabih šahovskih, ima 14 megabajtov. S takim fajlom Leela igra nadčloveško dober šah.

Kadarkoli je treba premakniti figuro na šahovnici, Leela “precedi” vsak možen premik v poziciji, skozi to “številsko slamo, dolgo okrog 14 milijonov znakov”. Lahko rečemo tudi, da tisti floating pointi (števila), predstavljajo “uteži v sinapsah njene nevronske mreže”. Ki je pa spet samo nek “podatkovni tip” v računalniškem pomnilniku. Skoraj zagotovo manjši od enega MB. No ja, ali pa par MB, kvečjemu.

Kaj bi bilo, če bi namesto te konfuzne numerične date, ki je človek nič ne razume in ki je nastala preko t.i. strojnega učenja s postopkom t.i. backpropagation, iz t.i. “trening date” – bil tam nek digitalni algoritem, program, ki ga človek vsaj v principu razume?

To bi bilo seveda odlično, ampak kakšen algoritem oziroma program vtakniti tja, da bo vsaj enako dober kakor zbirka numeričnih uteži? Oziroma kateri novi klasifikatorji bi tako postali možni, kjer konvolucijske ali druge nevronske mreže ne opravijo nič?

Na žalost nobena inačica backpropagationa ne da algoritma. Niti približno. Bi bila pa to vsekakor še dosti superiornejša rešitev od “numerične slame”, ki predstavlja “z backpropagation naučeno znanje nevronske mreže”.

Ne “bi”, ampak “je”. Takole, na primeru.

Trening data so podatki o vremenu na Kredarici. Temperatura ob 7.00, skozi leto 2019. Kateri algoritem bi najbolje zadel temperaturo zjutraj ob sedmih, če ve samo zaporedno številko dneva v letu? To vprašanje zastavimo v obliki tabele. lahko bi rekli excelove tabele, z nekako tolikimi vrsticami kot je dni v letu in dvema stolpcema. V prvem stolpcu je zaporedna številka dneva, v drugem pa tempratura v stopinjah Celzija na tisti zaporedni dan leta 2019. “ZSD” se reče prvemu stolpcu. Takle rezultat pride iz AI mašine ven.


Kar pomeni, v človeškem jeziku povedano, da neka sinusna funkcija, ki jo prikazuje algoritem v zelenem in zelena črta na grafu, toliko dobro simulira jutranjo temperaturo na Kredarici. V sivi so pa na grafu dejanske temperature. Povprečno odstopanje 4 stopinje od dejanskega stanja in največ 14 stopinj enkrat med majsko pozebo, ki očitno ni dobro predvidljiva samo iz zaporedne številke dneva. Vseeno, relativno enostavni algoritem iz skrajno pomankljivih podatkov, kar precej zadane, bi se lahko reklo.

Zato, dodamo še datume. Meseci (in dnevi v mesecih poleg tistih v letu), bi morda kaj pomagali.

AI odgovori na štiristolpčno tabelo ARSO podatkov takole:

Povprečna napaka prognoze, je s tem novil algoritmom, ki ga je namesto “numerične slame” izpljunil AI, padla na slabe 3,4 stopinje. Tudi maksimalna napaka je 12 stopinj in to enkrat marca. Kakor je kontraintuitivno, da meseci nosijo nekaj informacije o vremenu, je pa zgodovinsko gledano logično. Človek je mesece tako postavljal, da vsaj nekaj malega o vremenu povedo in danes AI to opazi. Lepo. Sicer AI tudi pravi, da je algoritem aligned manj kot 1 in optimized manj kot 1, tako da prostor za izboljšave v okviru teh istih podatkov morda še je. Samo, mi gremo naprej! Kaj če bi AI povedali, da od konca marca 2019 do 26. oktobra 2019 smo na Kredarici imeli poletni čas? V ta namen naredimo še en stolpec. Za vsak dan povemo še, če je veljal sončni ali premaknjeni čas. 0 oziroma 1 respektivno. Kot rezultat dobimo tole:


Povprečna napaka prognoze je še padla. Maksimalna napaka prognoze pa tudi in se pojavlja enkrat v začetku oktobra. Če komentiram naprimer 5. in 6. vrstico algoritma. Z njima nam AI sporoča, da poletni čas ima definitivno vpliv na temperaturo zjutraj. Plus, kako se ta vpliv računsko lahko zajame. Tista pokončna palčka je logični OR, ki pa ima še stranski učinek – in sicer trunkacijo decimalk. Da so decimalke v temperaturi manj pomembne, to nam (presenetljivo ali ne), ta AI stalno trobi v teh svojih klasifikacijski algoritmih, ki jih štanca. Štanca algoritme namesto “številske slame”, kakor so pri nevronskih mrežah, remember?

Ampak v redu. Kaj če bi mu/ji dali še podatke o temperaturah prejšnji dan ob istem času. Pa relativno vlažnost in smer vetra? Ker takole ga matrat s suhimi koledarskimi podatki iz katerih naj računa fizikalno količino je že nekoliko okrutno, mar ne? Zato torej dodamo še relativno vlažnost od 0 do 1. Hitrost vetra v metrih na sekundo in še smer vetra v radianih glede ne severno smer. Trije dodatni “fizični” stolpci poleg zgolj “matematičnih”, koledarskih stolpcev.


Povprečna dnevna prognoza zdaj zgreši samo še za 2,6 stopinje nekako. Sicer je skoraj vsa težava ostala samo še v začetku in koncu leta, ko je zelo mraz tam gori. Tudi so se “matematični” stolpci v algoritmu začeli nekoliko zanemarjati in se uporabljajo kakor “delovne variable algoritma”. Kar tudi pomeni, da algoritem še ni čisto “aligned”. Neuporabljene spremenljivke se morajo uporabljati kvečjemu kakor delovne zato, da ne pride do overfittinga. Ker kakor je rekel von Neumann – s štirimi parametri naredim slona, s petim parametrom pa že tudi miga z rilcem. Kar ni zelo pretirano. Overfitting je bil in je še problem tudi pri nevronskih mrežah in potencialno bi bil lahko tudi tukaj. Če bi ga ne znali krotiti, se razume. A ga!

Parameter višine snega bi se verjetno splačalo dodati in zimska napaka bi verjetno izginila. Samo, potem bi bilo leto kar prekratko prav zaradi overfittinga. Bi jih vzeli pač vsa leta od 2010 dalje. Plus še druge merilne postaje po Sloveniji in drugje.

Eno stvar smo že še utegnili preizkusiti pri tem vremenu. Služi predvsem za test. Ker druge zadeve nas bolj zanimajo, tole je bolj za golo razlago principa delovanja “non-neural-network” AI. Smo pa dodali še temperaturo in druge podatke za ob 21 uri prejšnjega dne. Pri posledičnem računanju ohlajanja čez noč, zgreši samo še za 1,6 stopinje. Upošteva tudi hitrost vetra in relativno vlago. Kar je dokaj logično. Je pa vprašanje, kakšen smisel bi imelo napovedovati temperaturo za čez 10 ur.

Tole je prediktivna koda s 5. slike, ki jo bomo zdajle še nekoliko pokomentirali.

001  swp rv14, rv21

        ## zamenja podatek o relativni vlažnosti ob 14. minulega dne
        ## s podatkom o relativni vlažnosti ob 21. preteklega dne.
        ## Zakaj bi bilo to dobro?
        ## Ker v nadaljevanju algoritma se tako uporabi in AIju je lažje dodati
        ## swap vrstico kakor prilagoditi vse ostale vrstice nadaljevanja.
        ## Ko bo pa algoritem “aligned=1” in “optimized=1” – ta vrstica
        ## ne bo več potrebna in je ne bo.
      002  hv14 *= 4
        ## pomembnost hitrost vetra ob 14 minulega dne za jutranjo
        ## temperaturo poudari tako, da jo pomnoži s 4
      003  sv7 = rv14 + 5
        ## smer vetra ob 7. uri minulega dne, preneha upoštevati s tem
        ## da ga prekrije s za 5 povečano relativno vlažnostjo ob 14. uri
        ## prejšnjega dne. “AIju se zdi”, da je ta smer vetra precej ali čisto
        ## irelevantna. Vsaj kolikor globoko je utegnil premisliti v 20 minutah
        ## in za največ 12 programskih vrstic.
        ## Čas razmišljanja, maksimalna dolgost algoritma in še
        ## kakšnih 10 drugih količin so ketne, s katerimi imamo non-neural-AI
        ## privezano. Vse nastavitve spreminja operater, kakor se mu zdi.
004  hv7 = max(sv7, dan)
        ## zdaj je uničen tudi podatek o hitrosti vetra ob 7. uri včeraj.
        ## Še preden se je sploh rabil.
        ## Očitno ni tako pomemben kakor je pomembna relativna vlaga
        ## ob 14. uri povečana za 5.
005  sv21 = hv7 + 8
        ## tudi smer vetra ob devetih je prepisana. Kar mogoče zgleda čudno,
        ## a je v resnici zelo dobro. AI ve, da ne sme “overfitati”.
        ## S čimmanj naredi čimveč! Kar je manj relevantno, zavrzi!
006  dan = ZSD – sv21
        ## dan v mesecu za včeraj, se delno skriva v hv7 od linije 004
        ## naprej.  Zdaj se bo ta variabla reciklirala
        ## skombinirala se bo z zaporedno številko dneva ZSD od včeraj
        ## in z vsem drugim, kar se že morda skriva v variabli sv21.
007  temp14 = floor(temp14)
       ## strunkira decimalke od temperature ob 14, prejšnjega dne
008  ZSD = min(temp21, dan)
       ## Zaporedna števlka dneva, bo odslej v tej varabli pozabljena,
       ## razen v kolikor je je kaj ostalo v variabli dan
       ## Za kakšen dan morda je, za kakšen dan pa ni pomembno.
       ## Minimum in maksimum sta nekolike skriti fork funkciji.
       ## Za uporabo drugih dvanajstih eksplicitnih fork funkcij, AI ne vidi potrebe
       ## v celem algoritmu.
009  sv21 = temp14 + hv14
       ## smer vetra zvečer je prekrita s temperaturo včeraj popoldne,
       ## v kombinaciji s hitrostjo vetra včeraj popoldne.
       ## Zgleda, da je popoldanska situacija pomembnejša za temperaturo zjutraj
       ## naslednjega dne, od večerna situacije!
       ## Vsaj tako se zdi nenevronskemu AIju.
010  hv21 = 14
       ## v hv21 pride kar konstanta 14.
       ## Skoraj največ kar lahko, glede na tiste zgoraj omenjene verige
       ## s katerimi ima operater priklenjeno AI na skalo – da ji kljuva jetra 😉
011  ZSD = min(hv21, ZSD)
       ## implicitni fork
012  ZSD = min(ZSD, sv21)
        ## implicitni fork
 Potem gre ZSD variabla v predikcijo za temperaturo ob 7 uri zjutraj. V povprečju 1,6 stopinje napačno in največ 6,7 stopinje narobe na prvo februarsko jutro. (Ker za prvi januar ne predvidimo nič, ker kakor nimamo podatka za 31. december 2018. No, nismo ga dali mašini, zato.)
Kaj bi rekli meteorologi na tole? Ne vemo in nas niti ne zanima. Vsaj ne bolj, kakor firbca stoječe za nevronsko mrežo Leela, kaj bi rekel svetovni šahovski prvak za potezo, ki jo Leela ravno namerava narest. (Magnus je ene 500 ELO točk pod Leelo).
Kaj bi programerji rekli na čudno kodo teh algoritmov ki jih piše AI? Nas tudi preveč ne zanima. Pravzaprav še manj.
Aroganca? Definitivno. Vprašanje je samo upravičenost te arogance. V ta namen bo eden naslednjih testov za “Algit ne-nevronsko AI” kaj s kattisa.

 

Share This