Strojno učenje z evolucijskim izračunavanjem modelnega algoritma. To mislimo, oziroma smo prepričani, da je naslednji veliki korak v tehnologiji imenovani AI ali umetna inteligenca po naše.
Če se vam prebrano zdi preveč bahaško, pretirano optimistično, kot marketing, ki je ušel s svoje ketne, ali karkoli v tem slogu, se ne pustite zmesti obrobnostim, važno je samo kaj od tega je nemara res.
V prilogi je log dogajanja med (nenadzorovanim) strojnim učenjem. V začetku je učilna datoteka števil med vključno 3 in 122. Sestavljena števila so označena z 1, praštevila pa z 0. Tretji stolpec je izpolnjen s samimi 1, katere pomenijo samo “podatek se upošteva”. To je cel svet ki ga vidi “tabula rasa” (“prazna tabla” ali “blank slate”) program z delovnim imenom Spector-Profounder (v nadaljevanju SP). Ker smo pač tako izbrali, lahko pa bi določena znanja ob zagonu SP tudi imel, a tokrat jih nima. Vse se začne samo z vgrajenimi, relativno preprostimi matematičnimi operacijami.
SP, kakor da se zbudi iz kome s totalno amnezijo. Vendar ne samo da ne ve kdo je in kje je, ne ve da sploh je, ker sebe ne vidi in zase nič ne ve. Zaznava samo že omenjeno učilno listo in računalniško uro, to je ves njegov svet, vse njegovo vesolje. Nadaljna podobnost s človekom s totalno amnezijo je ta, da vsak v svojem jeziku se vendarle izražata! Kakor junak filma ki ga ribiči potegnejo iz vode. Nima pojma od kod in kdo je, angleško pa zna! Tudi pretepa se izborno! V svoj svet zbujeni SP ne govori angleščine ali slovenščine, pač pa neko (Turing kompletno) funkcijsko latovščino, ki nam ljudem sploh ni tako zelo nerazumljiva.
V logu so kronološko nanizani nekateri algoritmi, s katerimi SP vedno bolje modelira ta svoj edini svet. Z vsako zevoluirano generacijo je model-algoritem boljši. V logu vidni, so kakor ključni fosili v naravoslovnem muzeju, katerih je morda nekaj deset. Milijarde manjkajočih veznih členov pa manjka. V muzejih jih ni zato, ker še niso najdeni. Večina jih tudi nikoli ne bo, ker so že davno uničeni. V logu algoritmov pa bi lahko bili vsi, ampak terabajtna datoteka ni pripravna za človeško branje.
Po dobrih 20 tisoč generacijah (v delčku sekunde), je napisan prvi konsistentni algoritem, ki pa še velikokrat zgreši sestavljenost števila. Njegova napaka je nekaj 100 tisoč kvadratnih dekaprocentov (prečudna enota, mar ne?), zato same cene takega primordialnega in primitivnega fosila, SP niti še ne izračuna. Šele po 24 milijonih generacij, smo prišli do prvega algoritma, ki pravilno ugane (ne)deljivost vsakega števila z liste. Če bi imeli nevronsko mrežo, bi rekli da je nevronska mreža zdaj naučena, tukaj pa je bolj ustrezno reči – zevoluiral je deskriptivni algoritem, ki ločuje praštevila od sestavljenih. Toda ni preveč učinkovit, njegova cena izražena v nekih še posebnejših enotah, temelječih na dolžini algoritma in številu potrebnih korakov, je še vedno relativno visoka. A odslej bo samo še padala proti ničli. ki je nikoli ne bo dosegla. (Razen v primeru, ko je zahtevani rezultat vedno 0. Takrat je algoritem iz samih “Nop” (No operation) funkcij povsem ustrezen.) Naslednje generacije algoritmov ne bodo nikoli več dajale nepravilnih napovedi, vsaj v okviru svoje učilne liste ne.
Po 100 milijonih generacij imamo relativno razumljivo kodo, ki klasificira to kar vidi. Ne da bi mi prej povedali za kaj gre, koncept je bil tako razumljen in eksplicitno izražen v obliki zevoluiranega algoritma. Človek bi rekel, “aha, praštevilom sledi 0, sestavljenim pa 1 v tej tabeli!” Če človek še nikoli ne bi slišal za praštevila, bi težje videl vzorec. Kakšen Evklid ali Gauss bi ga že, pa še kdo. Stroj ga pa tudi!
Rekli smo, da je učilna lista ali tabela ves Spectorjev svet. V njem ni neskončno števil ampak le 120, zato, pričakovano, “zaide na stranpot”. Po pol milijarde generacij se algoritem “overfita” tako, da ne velja več splošno, ampak se optimizira za svoj končni svet, zadano učilno listo. Praštevila 2,3,5,7 in 11 so edina, s katerimi je vredno preizkušati deljivost. In to po tem vrstnem redu. Zato izumi “code embeded” števila 2, 3, 5 in 7 in z njimi testira morebitno sestavljenost. Števila 11 pa sploh ne rabi, ker se testiranje za kvadratnost v zadnji vrstici bolj splača. Izkoristi tudi dejstvo, da se 3, 5 in 7 razlikujejo ravno za 2. Kaj hočemo, SP ima Occamovo britev v svojih genih. Ne operira s hipotezami za onstran meja svojega sveta.
Če vendarle želimo obdržati splošni algoritem, ki ga evolucija ne zdegenerira v lokalne posebnosti in optimume, mu v učilno listo dopišemo nekaj zelo velikih števil in/ali omejimo število dovoljenih vrstic ki jih algoritem sme imeti — in degeneracija se ne splača več, optimizacija pa vsekakor še. To je morda slišati nenavadno, vendar “makes perfect sense”. Po istem principu, vsako vrstico katero lahko, zapolni z “Nop” ali “Noq”, ki pomenita “nič delat”. Lenoba kot največja čednost.
Končni rezultat:
****************** Generation#2,826,188,589 ****************
Algorithm’s error : 0
Algorithm’s cost : 0.0019871199949837033
Input register(s) : A
Output register(s): B
01 Nop
02 ID2 : B=B+1; C=B+1
03 Jmc : If (A%C==0) {24 Else 4}
04 Nop
05 Nop
06 Opc : If (B<A) {C=C+B}
07 Jmc : If (A%C==0) {20 Else 9}
08 Nop
09 Opc : If (B<A) {B=B+B}
10 Opc : If (B<A) {C=C+B}
11 Jmc : If (A%C==0) {20 Else 12}
12 Nop
13 Nop
14 Opc : If (B<A) {C=C+B}
15 Nop
16 Nop
17 Sq? : B=(A Is X^2)
18 Jmc : If (A%C==0) {21 Else 26}
19 Nop
20 Nop
21 Opc : If (B<A) {A=A Xor C}
22 Nop
23 Sgn : B=Sgn(A)
24 Nop
25 Nop
26 Nop
Zaključek
Da se razumemo. AI program z delovnim imenom Spector-Profounder ni tukaj iznašel NIČ novega ali doslej neznanega o praštevilih. Nasprotno. Vse to je zelo elementarno, z matematičnega stališča gledano. Osnovnošolsko, pravzaprav. Vendar ločevanje mačkov in psov je pa celo predšolska naloga za človeka. Pa vseeno ni bilo lahko izdelati programa, ki bi to na nivoju predšolskega otroka znal. Po nekaj desetletjih je takšna automatska klasifikacija vendarle uspela s konvolucijskimi nevronskimi mrežami.
Avtomatska klasifikacija števil na sestavljena in na praštevila, prav tako samo z učenjem, je pa ena od nalog, pretežkih celo za (brez ironije) veličastne konvolucijske nevronske mreže. Ne ker ne vemo, da bi komurkoli to že uspelo, ampak ker vemo da algoritmi ki tako ločevanje počnejo, niso izrazljivi zgolj s povezavami med nevroni in z utežmi med njimi. Ne glede na to, kako bo velika in kako dolgo bomo učili nevronsko mrežo, izven svojih učilnih datotek bo ugibala dokaj random, kaj je praštevilo in kaj ni.
Spector-Profounder pa to zna. Narediti takšno klasifikacijo števil v obliki algoritma, samo z učenjem iz primera, ki vedno deluje. Tako takega ki deluje na omejeni množici števil in takega ki je povsem splošen, kot recimo takoimenovani Eratosten!
Log dogajanja med strojnim učenjem