Joe Dumoulin je strokovnjak za strojno učenje jezikov, umetno inteligenco in računalniške aplikacije za podjetja. Začel je kot programer in delal v razvoju in strojništvu. Kako se je njegovo delo razlikovalo od večine programerjev, najbolje predstavi kar sam:
Najlažje vam pojasnim moje delo tako: matematične formule, ki so napisane na papirju, spremenim v programski jezik, ki deluje. Zelo pomembno je razumeti matematiko, ki stoji za programom, če želite uporabiti strojno in globoko učenje kot metodo izgradnje programskega jezika. Ker sem sam začel v matematiki in fiziki, je bilo lažje razumeti določene procese, ki so se razvijali v programskem okolju.
V 90. letih sta se programiranje in družba precej spremenila z rastjo prodaje in uporabe osebnih računalnikov. Programsko okolje, v katerem sem najprej delal, je bilo v Fortranu, kasneje se je bolj začelo usmerjati v C oziroma C++ in potem še Pascal. Nekatere od teh programov še vedno uporabljamo, druge pa smo opustili. Dejstvo je, da sem kariero zgradil tako, da sem znanstvenikom in inženirjem pomagal njihove ideje programsko ustvariti in to vse v C++. Ne pozabite, da programiram že skoraj 35 let (smeh), to je dolgo obdobje, v katerem so se zgodile marsikatere spremembe.
Umetna inteligenca je zelo napredovala v zadnjih desetih letih. Če se spomnim leta 2011, so bili programi strojnega učenja zelo drugačni od programov, ki jih pišemo danes, ravno zaradi rasti globokega učenja in uporabe nevronskih omrežij.
Kako aktivna je potem vloga programerja oziroma človeka pri usmerjanju računalnika?
Naredimo korak nazaj. Globoko učenje je samo del širšega razumevanja strojnega učenja. Torej, globoko učenje je metoda v jeziku strojnega učenja, strojno učenje pa je del v množici umetne inteligence. Gre za enega modernejših pristopov v razvoju umetne inteligence, v programskem okolju, ki je najbolj učinkovit. Teoretično že vemo, da poznamo samo del delovanja te programske sfere, tudi zato veliko upov polagamo v razvoj te smeri. Podobno je v fiziki, kjer znanstveniki teoretično nekaj vedo, da deluje, a še niso uspeli praktično dokazati tega, za to pa potrebujejo čas in veliko dela.
Globoko učenje je najbolj učinkovit pristop za reševanje določenih problemov, kot so razumevanje jezika, govora ali recimo prepoznavanje slik. Če primerjamo starejše načine strojnega učenja in globokega učenja, lahko vidimo prednosti novih metod. Starejše metode so imele težave s tem, da so se programi lahko "učili" do določene mere in prišlo je do "kapice", točke, na kateri dodajanje novih spremenljivk in informacij ni pripomoglo k učenju programa, ta je prišel do "vrha razumevanja."
Kako je to možno?
Sistem se nasiči. Spomnite se samo, kako se vi učite. Začnete brati in se učite eno uro in nove informacije zelo dobro absorbirate, po treh urah že veliko manj, po štirih urah potrebujete kavo, po petih urah pa bi radi dremali. No, večina programov s strojnim učenjem deluje precej podobno, le da ima nasičenost s podatki in tudi če bi jim radi dodali več podatkov, jih bodo sprejeli, ampak se ne bodo ničesar "naučili." Predstavljajte si drevo, veje predstavljajo dodatne spremenljivke, ki jih program mora prepoznati. Dodajate nove veje, ki se slepo končajo, in program vseh teh slepih vej enostavno več ne zmore "razumeti", saj ima vsaka nova informacija manj vpliva na iskanje rešitve, tako kot ima ena veja zanemarljiv vpliv na celotno drevo.
V nekaterih metodah, če imate dovolj znanja o podatkih, ki jih sistem uporablja, lahko programer dopolni razumevanje podatkov in program usmeri, kaj mora iskati in kaj ni pomembno. S tem se lahko izognete določenih slepih vej, program se bo "učil boljše".
Pri globokem učenju pa je drugače, saj več kot boste v sistem vnesli podatkov, bolje se bo učil in razumel. Najboljši primer za to so prevodi in prevajanje. Če imate ogromno parov prevodov, recimo med angleščino in slovenščino, bo program to bolje znal prevesti. V starem načinu ste lahko dodajali na tisoče novih parov prevodov, a se program po določeni točki ni naučil nič novega, prevodi so bili nenavadni. V globokem učenju pa računalnik išče povezave, ponavljanja, "sence", verjetnosti med posameznimi besedami in prevodi, zato je pomembno, da mu damo čim več prevodov, kajti z vsakim parom bo bolje razumel sintakso jezika, kar pa prej ni bilo mogoče.
Zato so prevodi na Google prevajalniku vse boljši?
Točno tako. Lahko je prevesti besedo A, težje pa je prevesti stavek B iz angleščine v slovenščino, saj sta stavek in poved veliko več kot sestavljene besede. Vsaj jezik ima posebnosti, tone in tudi različna razumevanja, tudi dele, ki se sploh ne prevajajo (predvsem tehnični jezik). Stare metode strojnega učenja tega niso znale dobro razumeti, zato niso bile uspešne, globoko učenje pa se zna prilagoditi na vse te posebnosti.
Pomembno je tudi, da programer razume, kako se ti programi "učijo" in da je pravzaprav zelo podobno človeškemu učenju. Študent se lahko uči tako, da prebere odstavek ali stran in potem po spominu napiše povzetek tega. To je zelo učinkovito in si zelo dobro zapomnimo vsebino, tekst pa seveda ni popolnoma enak – je dober povzetek. V globokem učenju obstaja trik, ki ga rad učim ljudi, in sicer ravno na tem primeru, kjer študentom pomagam narediti nevronske mreže tako, da program sam naredi takšen povzetek. Njihovo razumevanje, kako so sami prišli do lastnega povzetka, jim pomaga pri pisanju programa, da bi čim bolj podobno naredil računalnik sam in to je pomembno da razumete vsi – program je tako dober, kot je programer, ki je razumel, kaj bi radi z njim naredili.
Da nadaljujem. Ko boste imeli samo en odstavek, ta programski povzetek nima veliko smisla. Dodate nove odstavke, strani, knjige in ta povzetek bo vse boljši. Jaz bi mu recimo dal nalogo, da prebere vsa dela Friedricha Nietzscheja in potem sestavi stavke. Zanimivo je gledati, kako se program uči, in sicer tako, da gleda položaj črke v razmerju z drugimi črkami. Ne uči se stavkov, saj ne razume, kaj stavki pomenijo, ampak abecedo in vrstni red črk v besedi in program naredi neke vrste svoj jezik, ki je pravzaprav neverjeten.
Katere aplikacije, ki jih že uporabljamo/imamo, bi globoko učenje lahko uporabljale tudi v Sloveniji?
Prevodi jezikov so ena od njih, globoko učenje je trenutno zelo pomembno pri prevajanju. Poleg tega so tudi aplikacije v modernih, sodobnih avtomobilih, npr. pri varnosti, čeprav ne vem, če te uporabljate v Sloveniji, zagotovo pa drži za ZDA, kjer bo večji del vožnje po avtocestah upravljal sam avtomobil, ki bo vedel, kaj storiti. Tehnologija je izjemno nova – ne govorim o neke vrste avtonomnih avtomobilih, a če pomislite, da se npr. vozite po avtocesti, je vožnja zelo običajna. Občasno se morate ustaviti ali upočasniti, a na splošno je vožnja zelo mirna, nima toliko spremenljivk.
Poleg avtomobilov tudi v telekomunikaciji. Veliko večino sistemov, ki povezujejo posamezne uporabnike, bodisi digitalno bodisi preko telefonov vodijo programi, ki so bili ustvarjeni z umetno inteligenco. V tem sistemu se že leta uvajajo različni programi, ki omogočajo vse hitrejše povezovanje in optimizirano delovanje sistema, zato danes praktično ni več klikov, šumov in drugih neprijetnih stvari, ki so se dogajale v preteklosti. Če želite na globoko učenje gledati v praktičnem smislu, gre v resnici za evolucijo sistemov, da bi zagotovili bolj učinkovita orodja. Ko dobiš več podatkov, se več naučiš, stare sisteme je bilo vedno treba usmerjati, popravljati in dopolnjevati. Pri globokem učenju je zelo zanimivo, da ko se enkrat odločiš za množico podatkov, iz katerih program črpa, ni treba narediti veliko popravkov in dopolnjevati programa, da bo lahko delal učinkovito, ni treba ugotoviti, katere so pomembne lastnosti naših podatkov ali recimo posebnosti neke slike. Vi sistemu samo daste na voljo vse piksle slike in se bo s pomočjo pikslov naučil, kaj slika pove.
V globokem učenju ni treba razlagati, kaj so oči, koliko so oddaljene, kaj so ušesa ali kaj podobnega, saj bo računalnik iskal posebnosti v sosledju pikslov in iskal ponovitve. Programer bo naredil številne nevronske mreže, ki bodo iskale posamezne lastnosti obraza. Prva mreža bo iskala odgovor na vprašanje, ali je na fotografiji moški ali ženska, odgovore bo programiral in usmeril sam programer. Druga bo iskala barvo las, tretja bo iskala velikost nosu itd. Teh mrež bo ogromno in ko bodo vse "izpolnjene", bo program začel povezovati rešitve v posamezni mreži, da bo dobil končno rešitev. In seveda, da bo najlažje dobro ločil med spoloma, potrebuje čim več podatkov.
Torej je popolno prepoznavanje obrazov vse večja verjetnost?
Da in ne. Takšen program mora imeti ogromno teh nevronskih mrež in ogromno, res ogromno, podatkov, da bi bil res tako zelo uspešen. Poglejmo tako: imate 100 sadežev in program ste napisali tako, da bo uspel prepoznati pomaranče in jabolka, jih razdeliti v dve množici in se pri tem ne sme zmotiti. Sliši se enostavno in tudi je. Kaj pa če dodate mandarine? Manjše in večje pomaranče? Banane, jagode, jabolka, borovnice, robide in še številne druge sadeže. Program z vsakim novim sadežem dobi novo neznanko in novo skupino podatkov, ki jih mora prepoznati ali pa se vsaj "prepričati", da niso pomaranče. Zdaj pa to spravite na sedem milijard ljudi, na stotine milijard njihovih fotografij, ob različni osvetlitvi, času, kotu in boste lahko počasi razumeli, kako težko je to narediti. Ni nemogoče, je pa težko.
Da lahko ločite sadeže, jih morate ločiti po velikosti, barvi, obliki in recimo teksturi. A dejansko jih boste samo spravili v množice – tukaj je 12 pomaranč, tam pa devet banan. Če bi želeli identificirati vsakega človeka na svetu, morate imeti toliko spremenljivk, da bo od sedem milijard ljudi program prepričan, da je identificiral vas in ne nekoga drugega ali pa dve osebi, ki sta si podobni (problemi dvojčkov so zgodba zase). Na Kitajskem imajo več kot 1,3 milijarde ljudi in oni bi morali, če bi želeli biti uspešni, identificirati vsakega od njih in jih nato povezati z imeni in priimki. Da bi bili uspešni, bi potrebovali nekaj fotografij vsake osebe oziroma čim več, ena sama fotografija ne bi zagotovila uspeha.
Recimo, da iščete terorista: letališče v Frankfurtu vsako leto prečka nekaj milijonov ljudi, po 10.000 na dan, a potencialen terorist prečka to letališče samo enkrat ali dvakrat na leto. Zdaj si predstavljajte, da pridem jaz k vam in vam rečem, da imam program, ki je 99,99 % učinkovit pri prepoznavanju ljudi, terorist pride dvakrat na leto, število ljudi, ki prečka pa je 100 milijonov na leto. Imamo problem, a ne? No, zato je zelo pomembno, da tako programerji kot kupci razumejo, da moramo uporabljati lažne pozitivne rezultate. Bolje je napačno označiti 100 ljudi, da so potencialni teroristi, da se nam ta eden ne izmuzne, kot pa da rečemo, da sem 99,99-odstotno prepričan, da ta pravi terorist NI terorist. Zato so zelo pomembni človeški faktor in človeški prsti pri razumevanju in branju teh podatkov. Brez tega ne bo šlo.
Kaj pa računalniki, ki bodo znali razmišljati sami?
Mislite računalnike, ki se bodo samo zavedali, računalnike, ki bodo razmišljali? To se v našem življenju ne bo zgodilo. Težko si predstavljate, kakšna programska težava je to, res. Omejitve naših računalnikov so precej velike. Mi danes znamo narediti sisteme, ki se lahko na podlagi zunanjih dejavnikov sami prilagajajo – recimo vaš telefon in stolpi, na katere se povezujejo. Ta prehod med stolpi je neverjetno miren, poteka hitro, sistem zaznava, da vaš signal pada in pravi čas preklopi, vi sploh ne boste opazili tega. Signal je zelo šibek in je skoraj čudež, da to dela tako dobro. Tudi vaš senzor za peč se bo prilagajal na temperaturo, saj bo peč aktiviral, ko temperatura pade in obratno. A ti sistemi so zelo omejeni, delujejo na podlagi programskega okolja in variacij, ki smo jih vnesli. Čas, ko bo računalnik ali program identificiral novo spremenljivko, jo pravilno umestil, na novo klasificiral in sprejel odločitev, kako v novem primeru reagirati, je še zelo daleč. Nismo niti blizu in ne bomo še zelo zelo dolgo časa, saj nimamo dovolj računalniško programskih struktur, ki bi omogočale takšno prilagodljivost.
KOMENTARJI (37)
Opozorilo: 297. členu Kazenskega zakonika je posameznik kazensko odgovoren za javno spodbujanje sovraštva, nasilja ali nestrpnosti.