Mi az intelligencia? Gondolkodás, tanulás, döntéshozás. Hogyan lehet megállapítani, hogy valami az, vagy sem? Ami az emberhez eléggé hasonló.
Erre Alan Turing azt a játékot találta ki, hogy van egy kérdező, és van egy-egy gép másik végén egy nő, és egy férfi. A kérdezőnek ki kell találnia azt, hogy melyik gép mögött ül a nő, és melyik mögött a férfi. A férfinek el kell hitetni a kérdezővel, hogy ő a nő, azaz a megtévesztésre törekszik, a nőnek pedig meg kell győznie a kérdezőt, hogy ő. Ezt a játékot aztán módosítják úgy, hogy a férfit számítógépre, és nőt emberre cserélik. Az volt az elképzelés, hogy amikor már nem tudja eldönteni a kérdező, hogy ki az ember, vagy a gép, akkor a gép már intelligens.
A mesterséges intelligencia témájában nagyot ugorva, már csak azért is, mert ez egyfajta gyorstalpaló akar lenni, és én is csak ennyire merültem bele eddig, a szakértői rendszerek kialakulásával érdemes kezdeni. Ezek a rendszerek már a mesterséges intelligencia kategóriájába tartoztak, és arra valók voltak, hogy segítsenek a döntéshozatalban. Ezek programozásánál már arra törekedtek, hogy a program az emberi gondolkodásmódhoz hasonló legyen. Ezek a rendszerek még egy szűk területre korlátozódtak, eleinte leginkább az orvostudomány, illetve pl. az ásványok keresésére, stb.
Ha pl. elkezd valaki beszélni egy edzővel, aki nagyon ért a sporthoz, akkor megfigyelheti, hogy az tanácsokat, alapelveket fog sorolni. Tehát a szakértők alapelveket állítanak fel. Ezek a rendszerek is azon alapultak, hogy alapelveket állítottak fel, majd tesztelték, hogy az adatok mely alapelveknek feleltek meg, és ez alapján hoztak valamiféle döntést.
A szakértői rendszereknél aztán az volt a fejlődés útja, hogy nem szigorú alapelveket kezdtek felállítani, hanem amolyan bizonytalan, zavaros (fuzzy) elveket, amelyektől a rendszerek gyorsabbak, és jobbak lettek, mivel megfigyelték azt is, hogy az emberi szakértők sem annyira szigorú szabályokat alkotnak, mert olyan kifejezéseket használnak, mint a gyakran, szinte soha, néha, általában, stb... Nyilván azért, mert mindig van kivétel, és így mindig csak egy általános kijelentést tudnak megfogalmazni, az alapelveikben.
Ezek a fuzzy (zavaros) elvek is az ember, illetve a szakértők gondolkodásának pontosabb leképezését jelentették, ez által kialakult a számítás a szavakkal, illetve a fuzzy elvek. A szakértői tanácsot nem az elvek szigorával, merevségével alakítják ki, hanem inkább sok ilyen (fuzzy) vagy laza elv használatával.
Ha megnézed a természetet, akkor azt is láthatjuk, hogy az intelligencia az evolúció során alakult ki. A mesterséges intelligencia használja az evolúció elméletét is, és saját magát ilyen módszerrel fejleszti. Tehát a tovább lépés az volt, hogy már nem csak az emberi gondolkodást utánozták le, hanem az ember agyának a felépítését (legalábbis hasonlót, mert azt még mindig nem tudjuk pontosan hogyan működik), és működését is, és így alakult ki a mesterséges neuron hálózat is, amely segítségével a mesterséges intelligencia már tanulásra is képes lett.
Ez a rendszer már önmaga többfajta alapelméletet talál ki, ezeket teszteli, hatékonyság szerint kiválasztja, és amely a hatékonyabb, azt fejleszti tovább, miközben a saját kódját is átírja. Legalábbis, ha jól értettem, a néhány órás tájékozódásom során.
Egy önvezető autó programozása akár 100 millió sort is jelenthet. Egyrészt ez már nagyon nagy feladat lenne az ember számára, másrészt a program meg annyira lelassulna, hogy nem lenne elég gyors a "reflexe" az önvezetéshez. Ilyenkor használjuk a gépi tanulás funkciót.
A mesterséges intelligencia felépítése a következő. A mesterséges intelligencia (Artificial Intelligence) a fő halmaz, amiben a gépi tanulás (Machine Learning) csak egy részhalmaz, abban a neurális hálózat (neural networks )megint egy részhalmaz, és abban van a mélytanulás (deep learning) részhalmaza. Tehát ezek külön dolgok is, illetve egymás részhalmazai. Ebből láthatod, hogy többféle mesterséges intelligencia rendszer lehet, többféle működéssel, mélységgel, az egyszerűbbtől a bonyolultig.
A gépi tanulási rendszer neuronokból áll, amelyek egymáshoz kapcsolódnak különféle rétegekben. Ez a rendszer az agy felépítését utánozza. A mélytanulási módszer egy nagy méretű ilyen neurális hálózattal dolgozik.
Akkor folyattassuk a gyakorlattal. A mesterséges intelligencia programozását a SCRATCH programmal fogjuk megtanulni.
Ezzel, illetve ehhez hasonló programmal már foglalkoztunk az 5. részben a mobil app-ok készítésénél. Érdemes ott is átnézni a dolgokat. Ott a MIT app inventor-t használtuk, ami nagyon hasonlít, a Scratch-hez, sőt, kapcsolat is van közöttük, de míg azzal gyakorlati mobil alkalmazásokat is lehet csinálni, a scratch inkább csak tanulásra van, leginkább kisebb gyerekeknek.
Mindenesetre ez egy olyan magas szintű programozási nyelv, ahol kódok helyett puzzle darabkákat kell összeilleszteni. Logika így is kell hozzá, nem is kevés, csak a kódolást egyszerűsíti le, és így gyerekek is hamarabb elsajátíthatják.
Tehát keressük fel a https://scratch.mit.edu honlapot, amiről azt állítják, hogy a használatához egyébként nincs szükség regisztrálni se, de az AI (mestersége intelligencia) "szerszámkészlethez csak regisztrációval lehet hozzáférni! Ezért hát csatlakozz a honlapba! Csak az e-mail címedet kell megadnod, egy jelszót, meg válaszolni olyan pár kérdésre, hogy hány éves vagy, majd meg kell erősítened a csatlakozást, és máris hozzáférsz a dolgokhoz!
Most csináljál valami kezdő projektet! Az oldalon be tudod állítani a magyar nyelvet!
Ha sikerült valami igen primitív dolgot csinálni, és nagyjából már tudod hogyan kell összeilleszteni a puzzle darabkákat, akkor most nézd meg ezt a videót. Van gépi magyar felirat alatta, ha beállítod!
https://www.youtube.com/watch?v=EjbHXMzeX4c&t=7s
Persze ez most itt nagyon le van egyszerűsítve, mert egy komolyabb programnál, pl. fontos lehet az alapelvek sorrendje, és stb. de ezekről majd később, most a lényeget próbáljuk megérteni.
Részetesebben:
A mesterséges intelligencia motor létrehozása három fázisból áll,
1. Train,
2.Learn
3.Test és Make.
Az egyes fázisokra a kék gombra kattintva válthatsz.
A projekt az utasítások megmondják, hogy mikor kell továbblépni az egyes fázisokra.
Train:
A Train szakaszban példákat gyűjthetsz arra vonatkozóan, hogy mit szeretnél megtanulnítani a számítógéppel.
Minden egyes ilyen dolognak gyűjtő van.
TANULJ ÉS TESZTELJ!
Ha elegendő példát gyűjtött össze, készen áll arra, hogy felhasználja őket a gép.
A betanítási folyamat elindításához kattints az Új gépi tanulási modell betanítás gombra!
A folyamat időtartama a projekt típusától és számától függ. A képprojektek tovább tartanak, mint a szöveges projektek (mert a számítógépek számára sokkal nehezebb megérteni a képeket, mint a szöveget ill. számokat). Minél több példa van, annál tovább tart a képzés. És néha az ML számítógép-szerver elfoglalt, és egy kicsit tovább tart. Az edzési folyamat 30 másodpercig tarthat, de néhány percig is eltarthat. Ha nem gyűjtöttél össze elég példát, nem fogod látni a Train new machine-t tanulási modell gomb. Térjél vissza a Train fázishoz további példák alapelvek hozzáadásáért!
Végül az elkészült motort betölthetted egy scratch, vagy egy MIT APP inventor2 mobilapplikáció projektedbe. Az utóbbi azért jobb, mert tényleges mobilapplikáció készítésénél fel tudod majd használni.
Van hangfelismerő, sőt, talán, ha jól emlékszem hangutánzó program elkészítésére is lehetőség, ahol a gyerekek a mesterséges intelligencia etikai részein is elgondolkozhatnak, mivel eg ilyen alkalmazással rendesen vissza is lehet élni.
Most kattints erre (itt is be tudod állítani a magyart) és projektregisztráció nélkül próbáld ki!:
A program értelemszerűen végig vezet a dolgokon. Az ékezetes betűket ne használd!
https://MachineLearningForKids.co.uk/
Azt gondolom, hogy a mesterséges intelligencia (AI) témaköreben a javascriptben fogok tovább ismerkedni:
https://www.w3schools.com/ai/ai_javascript.asp
Képfelismerést viszonylag könnyen el lehet sajátítani:
https://www.w3schools.com/ai/tryit.asp?filename=tryai_ml5_intro
A neurális hálóról bővebben:
https://www.youtube.com/watch?v=e85wLBtLyYY
https://openai.com/blog/chatgpt/
Tud magyarul, bármiről kérdezheted, elég sok mindent tud, de persze nem mindent.
Elképzeltem egy fizikai golyós modellt annak érdekében, hogy könnyebben megértsük a mesterséges intelligencia neurális hálózatának a működését.
Egy fényképfeldolgozó neurális háló működésének modellezése golyós bemutató eszközzel.
Ez a modell egy olyan rendszert próbál fizikailag modellezni, ahol képeket mutatunk a mesterséges intelligenciának, és a feladata az, hogy egy valószínűséget megadva megállapítsa, hogy a képen zebra van, vagy sem.
A modell alapja egy döntött asztal, amelyen golyók gurulnak felülről lefelé. A vasgolyók egy feltételezett kép pixeleinek bemeneti (input) jeleit szimbólizálják. 10 golyónak van hely az asztal felső részében az indítóállomáson, tehát 10 pixel-es a kép, amelyen egy zebrát akarunk felismertetni, de csak akkor van "zebra" a képen, ha minden második pixelben van golyó. Természetesen a valóságban ennél több pixelre van szükség.
A golyók útjában lefelé, egymás alatt több rétegben Y formájú akadályok sorai vannak elhelyezve. Ezek a neuronokat szimbolizálják, amelyekről a golyók a következő alsóbb rétegben lévő akadálysorra pattanhatnak, és a továbbpattanásnál mondjuk azt, hogy az adott neuron aktiválódik, tüzel. A több, egymás alatt elhelyezett akadályok sorai alkotják a (rejtett) rétegeket, így alakul ki a neuronháló. Az, hogy a golyók az alsóbb rétegek felé bármelyik akadályról bármelyik akadályra pattanhatnak, vagy akár el is akadhatnak az akadályban, a neuronok közötti kapcsolatokat és az aktivációs folyamatot jelenítik meg. A mélytanulás lényege, hogy több ilyen rejtett réteg van egymás után. Minden réteg a bemeneti adat egyre absztraktabb jellemzőit tanulja meg. Például egy képfelismerő hálózat első rétegei talán egyszerű éleket vagy sarkokat ismernek fel, míg a későbbi rétegek már komplexebb formákat, például orrot vagy szemet azonosítanak. Az első akadályréteget nevezzük a bemeneti neuron rétegnek, ami fogadja ezeket az adatokat, azaz a golyókat. Az Y alakú akadályok elforgathatóak, ez a kialakítás mutatja be a súlyozást. Az akadályok beállítása, azaz a súlyozás szabályozza azt, hogy hogyan terjed az információ az alsóbb rétegek felé a hálózatban. A neurális hálóban minden kapcsolat determinisztikus, azaz matematikai szabályok szerint történik, míg a példákban a golyó pattogása több fizikai véletlenszerűséget is hordozhat.
Az Y alakú akadályokról nem csak tovább pattanhat lefelé a golyó, hanem a szárai között a golyó csapdába is kerülhet. Ez annak az analógiája, hogy ha kicsi súllyal, erővel érkezik a jel a neuronhoz (akadályhoz), akkor arról nem pattan tovább, azaz a neuron nem aktiválódik, nem tüzel.
Ez a csapda jelenti a küszöb-alapú aktivációs függvény (Activation Function, azaz lépcsőfüggvényt): Ha túl lassú vagy gyenge a golyó érkezése, akkor a csapdában a golyó elakad (nem aktiválódik a neuron) . Ez a nemlineáris lépés teszi lehetővé a neurális háló számára, hogy nagyon komplex összefüggéseket is megtanuljanak.
A küszöb alapú aktiváció célja, hogy csak az erős információ menjen tovább. Nem minden bejövő "jel" (golyó energiája) elég fontos ahhoz, hogy tovább haladjon a következő rétegbe. A valódi neurális hálózatokban a jelek numerikus értékek (például 0.0–1.0). A mi golyós metaforánkban amikor golyó túl lassan, gyengén, vagy rossz szögből érkezik egy akadályhoz, az azt jelenti, hogy a bemenő adatból származó információ nem volt elég releváns ahhoz, hogy az adott neuron jelentősen aktiválódjon, vagyis hogy tovább pattanjon róla a jel.
A küszöb biztosítja, hogy csak a lényeges információ jusson tovább. A kevesebb neuron aktiválása, kevesebb "zajt jelent", ez mellett pedig azok a neuronok, amelyek kimaradnak, használhatók, más feladatra, tehát spórolunk is a neuronokkal.
Ha nem lenne küszöb (vagy bármilyen aktivációs függvény), akkor minden golyó, bármilyen gyenge is lenne az energiája, tovább menne a következő rétegbe. Ez a hálózatot "telítené" irreleváns adatokkal, és nehezebb lenne tanulni. A hálózatnak sokkal nehezebb lenne megtalálnia a valódi mintázatokat a sok "zaj" között jobban befolyásolná a rendszert a kisebb, véletlenszerű ingadozások. Tehát a küszöb (és általában az aktivációs függvények) bevezetése elengedhetetlen ahhoz, hogy a neurális háló hatékonyan és célzottan tudjanak tanulni és döntéseket hozni, kiszűrve a lényegtelent és fókuszálva a fontosra.
Az Y alakú akadályok alsó szárán egy apró mágnest lehet csúsztatni, ami egy finomhangolást jelent abból a célból, hogy a vasgolyó könnyebben legyen csapdázva, vagy sem, azaz a neuron aktiválódjon, vagy sem. Ez a finomhangolás a torzítás (bias).
Kimenet:
Az asztal legalja úgy van kialakítva, hogy a golyók vagy a jobboldalán, vagy a baloldalán gyűlhetnek össze. Ez szimbolizálja a kimenetet.
Ha több golyó gyűlik össze a "Zebra" oldalon, azaz mondjuk a jobb oldalán, mint a "Nem Zebra" oldalon, azaz mondjuk a baloldalon, akkor az azt jelenti, hogy a hálózat nagyobb valószínűséggel gondolja, hogy a képen zebra van. Minél nagyobb ez az arány, annál biztosabb a hálózat a döntésében.
Miután a hálózat feldolgozta a bemenetet és adott egy kimenetet, ezt az előrejelzést összehasonlítjuk a valós, helyes kimenettel (ezt nevezzük "címkének" vagy "igazságnak"). A különbséget egy veszteségfüggvény számszerűsíti. Minél nagyobb a különbség, annál nagyobb a veszteség, vagyis annál rosszabbul teljesített a háló.
A hiba a kimeneten jelentkezik, és onnan visszafelé terjedve korrigáljuk a súlyokat, forgatjuk az akadályokat, hogy a rendszer legközelebb helyesebben működjön. Ez a visszaterjesztés ( backpropagation) alapelve.
Egy optimalizáló (optimizer) algoritmus használja a visszaterjesztett hibainformációt, és kiszámolja, hogyan kell módosítani az egyes súlyokat, hogy a következő alkalommal a hálózat kimenete közelebb legyen a helyes eredményhez.
Ezt a folyamatot (bemenet feldolgozása, kimenet generálása, veszteség számolása, súlyok frissítése) nagyon sokszor ismételjük (ezt nevezzük "epókoknak" vagy "iterációknak"). A háló fokozatosan "tanul", és a súlyok finomhangolásával egyre pontosabban tudja majd előre jelezni a kimenetet a bemenő adatokból.
Képzeljünk el egy olyan neurális rendszert, amely 10 x 10 pixeles kétszínű, fekete fehér képekről megmondja, hogy "A" betű van rajta, vagy sem.
Első gondolatom az, hogy valamilyen döntési fát hozok létre, mert azt könnyebb megérteni, főleg lekövetni. A döntési fa talán tényleg lehetett egy állomás a mesterséges intelligencia irányában, de nem jó út. A döntési fánál a rétegekben egy út alakul ki, illetve egy gráf. Ez a rendszer nem kreatív, csak a pontosan "A" betűt tanulná meg. A hálóban minden réteg neuronjának információját megkapja az alsó réteg minden neuronja. Egy rugalmasabb mintafelismerést kapunk, ha az A betű 90 fokkal el van fordítva, azt is fel fogja ismerni a háló.
Ezért gondolkodjunk hálóban.
A bejövő kép azon pixelei, amelyeknek értéke egyes (vagyis fekete pixel), és nem nulla (fehér), a helyiértékének tízszeresével megszorozzuk. Aztán minden számból kivonunk öt szorozva a helyértékkel, és ez legyen a finombeállítás alapbeállítása. Ez lenne a nulladik neuronréteg, amely igazából még csak az inputok fogadása, és átalakítása. Szerintem ezt kezelheti egyetlen egy "If" függvény is. A neurális hálózatnál a súlyok alapbeállítása véletlenszerűen van meghatározva, de mi a súlyokat a pixelek helyértékének megfelelően osztjuk ki. Vagyis az első pixel, ha fekete, kapja a legkisebb súlyt, és az utolsó fekete pixel a számsorban a legnagyobbat. Ez szerintem azonban szintén megfelel a véletlenszerűség követelményének, mert ez a sorrend kialakulhat véletlenszerűen is. A visszafejtés/tanulás során lesz módosítva. Most jön az, hogy a nulladik réteg 100 adatát el kell juttatni az első rejtett réteg minden egyes neuronjához. Csináljuk mondjuk úgy, hogy az első, nulladik rétegben minden neuron megkapja a 100 számból álló számsorozatot, majd ezeket a számokat felsúlyozza a saját súlybeállításával, amely alap beállítása ugyanúgy működik, mint a nulladik rétegben, és a tanulás során módosítjuk majd. Ezután ezt a száz számot összeadjuk. Az egymástól különálló elemeket (aggregáció) úgy kell összekapcsolni, hogy ne legyen nagy az információvesztés. Ezért helyett jobb pl. az átlagolás helyett, ha összeadunk. Aztán megnézzük, hogy a maximális számértékhez képest ez a szám hány százalék. Ha nem éri el a maximális számérték 50%-át, akkor lenullázzuk a számot, ha a felett van, akkor további átalakítás nélkül lejjebb küldjük az alsóbb rétegbe, annak mind a három neuronjának. Az utolsó rétegben már csak egy neuront használunk, és ha a végső szám a maximális számérték 50%-a alatt van, akkor nem "A" betű van a képen, ha felette, akkor az van.
Ez az elképzelés az egyik AI-nak jobban tetszett, mint a másiknak, de egyik se tudta úgy elmagyarázni a kritikáját, hogy mélyebben megértsem, így egyenlőre ezt a modellt, elfogadom egy egyszerűsített olyan példának, ami hasonlít a neurális háló működéséhez.
Visszafejtés:
Ha visszafejtésre gondolunk, akkor első körben nekem egy brute-force jellegű megközelítés jutott eszembe. Ez próbálgatáson alapszik, de ez rendkívül lassú és ineffektív egy bonyolultabb hálózat esetén, ahol paraméterek milliói lehetnek.
A gyakorlatban viszont úgy működik, hogy a hálózat kimenetét összehasonlítják a helyes (valós) kimenettel az "igen/nem" tanítási válaszommal. Ezt a különbséget egy költségfüggvény (loss function, pl. kereszt-entrópia bináris osztályozásra) számszerűsíti. Minél nagyobb a hiba, annál rosszabbul teljesít a hálózat. A gyakorlatban a "próbálgatás" helyett a differenciálszámításra épülő (matematikai lejtő) gradiens alapján számolják ki a súlyok beállítását, nem próbálgatással, így sokkal hatékonyabb és skálázhatóbb a komplex, több millió paraméterrel rendelkező hálózatok esetében. Én a beállított neuronokat már védetté tenném, és a további tanulás alkalmával azok már nem lennének állíthatók. A gyakorlatban viszont nincsenek ilyen védett neuronok.