Navsezadnje je pa celo vseeno, če tradicionalni termin “AI” kar obdržimo? Kljub temu da je bilo že veliko razprav o tem kateri izraz bi bil zares pravilen in ustrezen. A samo poimenovanje le ni tako bistveno, labela je vendarle samo labela.

V zadnjih letih je termin “Artificial Intelligence (AI)” celo postal sinonimen z “Machine Learning (ML)”, kateri je dalje tudi kar sinonimen z “Neural Networks (NN)” ali “nevronske mreže (NM)” po naše. Te pa slišijo še na nekaj podimen: konvolucijske, rekurentne in tako naprej.

Monopolizacija AI področja s strani nevronskih mrež je zaslužena iz precej razlogov. Že zaradi očitnega kvalitetnega preskoka iz “stare, klasične AI”, ki “komaj da sploh karkoli dela”, na “domala čudežne nevronske mreže”, je ta monopolizacija in sinonimizacija razumljiva. Celo opravičljiva. Dolga “AI zima”, je (šele) z nevronskimi mrežami dočakala kar pošteno odjugo. Najmanj odjugo, če ne pomlad, ki je prej ni bilo od nikoder. Oziroma je bila vsaj precej nezaznavna.

Dovolj političnega konteksta!

Tehnični je suhoparnejši, a je zanimivejši. Kaj je, tehnološko gledano, strojno učenje (ML), ki zmaguje v igri Go, se uči šofirati, se nauči robotske hoje, igrati poker, dajati medicinske diagnoze, obarvati črnobele slike …?

Gre za klasifikacijo podatkov: “to so kozli, tisto so ovce”. In sicer na način, da se naprimer računalniku pokaže 1000+ (slik) ovac in 1000+ (slik) koz, ki so vse že prav razvrščene in označene. Katera je koza in katera je ovca. Potem pa nevronska mreža v računalniku, na podlagi te začetne razdeljenosti, zgradi nekakšno datoteko števil s plavajočo vejico. Rečemo, da se je po učenju na trening podatkih, ponavadi z backpropagation metodo, AI  izurila avtomatsko razločiti vse naslednje milijarde ovc in koz. Zdaj že nekaj let, praviloma na zelo visoki ravni. Kar ni majhna stvar!

Za vsako to klasifikacijo na dva ali več razredov, stoji druga (naučena) datoteka števil s plavajočo vejico. Naučeno, zakodirano v množico decimalnih števil zna naprimer ločevati dobre šahovske poteze od slabih šahovskih potez. Na to se je zvedla šahovska inteligenca. Na 14 megabajtov decimalnih cifer. S takim fajlom Leela igra nadčloveško dober šah.

Kadarkoli je treba premakniti figuro na šahovnici, Leela “precedi” možne premike skozi to “številsko slamo”. Lahko tudi 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” – imeli  digitalni algoritem, program, ki ga človek vsaj v principu razume? In bi nadomeščal kriptično polje milijonov števil?

To bi znalo biti 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, celo kjer konvolucijske ali druge nevronske mreže, s svojo cifrsko kramo ne opravijo nič? Kakor so mogočne, vsemogočne niso.

Na žalost, nam nobena inačica backpropagationa ne da algoritma. Niti približno. Bi bila pa to vsekakor še dosti superiornejša rešitev.

Ne “bi”, ampak “je”. Takole gre, 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.

Skratka. Vreme je dober test, zlasti za razumevanje principa.

Tole je prediktivna koda s 5. slike, ki jo bom zdajle še nekoliko pokomentiral.

001 swp rv14, rv21

  • zamenja podatek o relativni vlažnosti ob 14. minulega dne
  • s podatkom o relativni vlažnosti ob 21. minulega dne. Zakaj bi bilo to dobro?
  • Ker v nadaljevanju algoritma se tako uporabi in AIju je lažje dodat 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, se neha upoštevati s tem, da se ga prekrije s za
    5 povečano relativno vlažnostjo ob 14. uri minulega dne. “AIju se zdi”, da je tista smer
    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
    nekih 10 drugih količin so ketne, s katerimi imamo non-neural-AI privezano.
    Te nastavitve spreminja operater, kakor se mu zdi.

004 hv7 = max(sv7, dan)

  • zdaj se uniči 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 on 14. uri povečana za 5,
    kar je prej prepisalo variablo sv7

005 sv21 = hv7 + 8

  • tudi smer vetra ob devetih je prepisan. Kar mogoče zgleda čudno, a je zelo dobro. AI ve,
    da ne sme overfitat. 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 004 naprej in zdaj se bo ta variabla reciklirala
    skombinirala se bo z zaporedno številko dneva ZSD od včeraj in z vsem drugim, kar se že
    lahko 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
    kakšen dan morda je, kakšen da pa ni tak, da bi bilo to pomembno. Minimum in maksimum sta
    nekolike skriti fork funkciji. Za uporabo drugih dvanajstih eksplicitnih fork funkcij, AI tukaj 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, kakor večerna situacija! 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 to 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 njena upravičenost. V ta namen bo eden naslednjih testov za “Algit ne-nevronsko AI” kaj s kattisa.

Share This