În lumea de astăzi ne-am obișnuit deja cu termenul mai demult exotic de machine learning. Sistemele de ultimă generație AI (inteligența artificială) pot acum să se apropie foarte mult sau chiar să rivalizeze cu performanța umană în diverse sarcini, cum ar fi clasificarea imaginilor, înțelegerea scenei sau procesarea semnalelor variate (ex. audio). Și totuși, cum face acest lucru un algoritm de machine learning? De ce are nevoie? După cum sugerează denumirea sa, el "învață" din date. Având la dispoziție un set de exemple etichetate (o pereche input - output), algoritmul estimează o funcție de corelație între cele două.
Luăm un exemplu din manuale, banal și ușor de înțeles: clasificarea unei imagini în "pisică" sau "câine" (vom presupune aici că imaginea conține fie o pisică, fie un câine). În acest caz, imaginea este inputul țintă, iar clasa (pisică/ câine) este outputul țintă, cu cea din urmă fiind etichetată manual de către un om, pentru a asigura corectitudinea. Pare simplu până aici, dar există o capcană: noi, oamenii, ne așteptăm ca sistemele AI să aibă o performanță excelentă, în cazul de față însemnând o clasificare corectă a unei majorități de pisici/ câini. Prin urmare, cum ne putem asigura că un algoritm de machine learning poate face asta? Răspunsul este să ne asigurăm că datele de învățare (cunoscute în general drept date de training) care sunt furnizate algoritmilor sunt cât mai variate posibil. Gândiți-vă la un sistem AI/ ML ca la un copil mic. El nu a mai văzut niciodată ce este o pisică sau un câine, ci trebuie să îi arăți ce sunt. Cu cât sunt mai variate exemplele pe care le vede, cu atât mai bine se poate descurca cu cele noi. În exemplul nostru, aceasta ar însemna selectarea unor imagini cu pisici de diferite rase și câini de diferite rase, căci ambele pot diferi foarte mult. Să luăm de exemplu un mops și un ciobănesc german.
Sursă imagini: www.unsplash.com
Ambii sunt câini, dar destul de diferiți ca înfățișare, nu-i așa? Un deficit major pe care îl au aproape toți algoritmii ML versus învățarea umană este puterea de generalizare din puține exemple. Aceasta înseamnă două lucruri. În primul rând, înseamnă că este suficient să îi arăți unui om (chiar unui copil) doar 1-2 imagini ale unui anumit câine (să zicem ciobănesc german) pentru ca acesta să înțeleagă ce este și pentru ca să recunoască un ciobănesc german în aproape orice altă imagine. Pentru ca un algoritm ML să facă asta, este nevoie de mult mai multe exemple, zeci, sute sau chiar mii în anumite cazuri, în funcție de problemă. Aceasta se datorează de asemenea și faptului că cei mai mulți algoritmi ML sunt acum specializați să facă un singur lucru, (de exemplu: clasificarea pisici/ câini), în timp ce oamenii sunt adaptați prin evoluție să facă față mai multor sarcini de învățare deodată (să recunoască alte tipuri de obiecte, precum mașini, semne, copaci etc.) În al doilea rând, înseamnă că oamenii, versus algoritmi ML, pot, având la dispoziție un set redus de imagini ale unui ciobănesc german, să recunoască că un mops este de asemenea un câine. Această putere de generalizare este ceva ce AI-urile nu deprind atât de ușor. Mai clar, în cazul nostru, pentru a recunoaște un mops ar trebui să îi furnizăm câteva imagini cu mopși, căci, altfel, s-ar putea să îl confunde cu o pisică. Ceea ce ne aduce înapoi la ideea de la care am pornit: pentru a aduce AI / ML la o performanță umană, avem nevoie de cantități mari de date, și nu doar orice fel de date, ci date pe cât posibil de variate, acoperind toate cazurile/ scenariile. Pentru a înțelege mai bine ce înseamnă "variat" și cât de provocator poate fi, ar fi necesare pentru simpla noastră clasificare pisici/ câini următoarele exemple de date de training: diferite rase de pisici/ câini (și există zeci de rase), de vârste diferite (pui, matur, bătrân), de culori diferite (căci pot fi maro, negre sau albe etc.), văzute din unghiuri diferite (stânga, de sus, lateral etc.) și de la distanțe diferite (de aproape, de departe) și în condiții de lumină diferită (pe zi, la apus, la răsărit, pe timp de noapte). În concluzie, un coșmar de combinatorică.
Așadar, totul se reduce la cum selectăm datele potrivite pentru training. Prima soluție, cea care ne vine mai întâi în minte, este una de forță brută, în care un "profesor" uman care deja cunoaște și înțelege problema de rezolvat (clasificarea pisică/ câine), selectează datele de training cu varietatea specificată mai sus. Norocosul/ norocoasa, nu? Această metodă este, de obicei, utilizată atunci când se face o primă selecție de date pentru un training inițial al unui algoritm ML, deoarece aceasta are, în mod evident, neajunsurile sale (anumite cazuri pot fi uitate sau chiar să nu se regăsească deloc). Este, totuși, suficient de bună pentru a ne asigura că obținem cel puțin o performanță decentă (putere de clasificare). Ceea ce ne conduce la cea de-a 2-a modalitate, mai avansată, automată, de selectare a datelor potrivite pentru training. Să spunem că am făcut mai întâi antrenamentul pe 10.000 de imagini cu pisici/ câini (ex. 5.000 pentru fiecare), care au fost minuțios selectate și etichetate de către oameni, cu condiții cât se poate de variate, și mai avem încă 1.000.000 (un milion) de imagini care conțin de asemenea pisici/ câini, dar care nu au fost etichetate (deci, nu știm ce tip de câine/ pisică conțin), nici nu știm din ce unghi, de la ce distanță sau în ce condiții de lumină au fost făcute. Ideal, ne dorim acum să selectăm imagini cu exemple de pisici/ câini pe care nu le-am folosit până acum (poate rase diferite, culori diferite, pe timp de noapte etc.). Să faci asta manual ar fi, bineînțeles, foarte provocator, dar cum poate fi făcută în mod automat? Răspunsul este elegant de simplu: lăsăm algoritmul ML deja antrenat să aleagă exemplele potrivite, dar pe care nu le-a mai văzut înainte. Dar cum? Ținem cont de faptul că, ori de câte ori algoritmii ML întâlnesc exemple noi (pe care nu le-au văzut în training), aceștia sunt de obicei nehotărâți sau au un grad redus de încredere, când prezic o anumită clasă (în cazul nostru, pisică/ câine). Noi putem valorifica această stare de fapt. Luăm toate cele 1.000.000 de imagini pe care le avem (fără etichete), și rulăm algoritmul ML pentru toate acestea, adică îi cerem să prezică dacă acea clasă este câine/ pisică. Bineînțeles, nu știm care predicție este corectă și care este greșită (atâta timp cât nu avem setul de etichete făcute de către om), dar putem observa când algoritmul nu este sigur, adică nu s-a putut decide între pisică sau câine. De obicei, primim două posibilități: probabilitate pisică și probabilitate câine. În exemplele clare pe care algoritmul ML le cunoaște deja, o probabilitate va fi foarte ridicată și alta foarte scăzută. De exemplu, pentru un ciobănesc german care este deja cunoscut, probabilitatea câine va fi de 99%, pe când probabilitatea pisică va fi doar de 1%. Cu toate acestea, dacă încercăm cu un Chihuahua (pentru care nu s-a făcut training, adică nu a fost văzut anterior, în cele 10.000 de imagini originale), probabilitatea ar putea fi 55% câine și 45% pisică.
Sursă imagini: www.unsplash.com
Acest rezultat este foarte asemănător cu ceea ce li se întâmplă și oamenilor uneori (când văd un câine care arată ciudat, mic și păros, se poate crea o confuzie sau o nesiguranță: este un câine sau o pisică?). Acesta este un semnal că ceva este greșit, reprezentând un exemplu care ar fi util de etichetat manual de către "profesorul" uman și utilizat apoi pentru un training ulterior. Nu este nevoie de muncă manuală pentru selecție, ci lăsăm AI-ul să decidă unde nu este sigur și, de asemenea, limităm numărul imaginilor care trebuie să fie minuțios etichetate la doar câteva selectate. După următorul training, algoritmul va recunoaște apoi cazurile selectate, în mod similar cazului în care unui copil mic i se spune că un Chihuahua nu este o pisică.
Această procedură de training, selectare de date și apoi de reluare a trainingului se numește învățare activă și alcătuiește acea buclă de date "data-loop", extrem de mediatizată în prezent. Există multe variante pentru a face același lucru. Un alt exemplu implică ceea ce se numește o selecție bazată pe ansamblu. Aceasta implică rularea nu doar a unuia, ci a mai multor modele ML (sau a aceluiași model antrenat pe imagini diferite) pe aceleași imagini neetichetate și verificarea cazurilor unde predicțiile lor diferă. În cazul nostru, am selecta imaginile la care, să spunem, două dintre modele au prezis că acolo este o pisică, în timp ce alte două au prezis că este un câine. Din nou, este asemănător cu cazul în care întrebăm patru oameni ce văd într-o anumită imagine: dacă unii dintre ei văd o pisică, în timp ce alții, un câine, poți să îți dai seama imediat că este un caz limită. Dacă toate văd același lucru, este foarte probabil să fie corect și atunci nu mai este nevoie să îl utilizezi mai departe pentru training (antrenare).
Poate să fie și mai bine? Desigur. Pentru a stimula și mai mult învățarea, acest proces de selectare de date și re-training poate fi făcut din mers (în timp ce programul rulează). Adică, pentru fiecare imagine nouă care apare (de exemplu, surprinsă de o cameră live undeva), un algoritm AI rulează în fundal și verifică dacă este sigur de ceea ce vede. Dacă nu este sigur, acea imagine este selectată automat și trimisă spre etichetare, apoi spre re-antrenare (re-training). Aceasta se numește, de obicei, selecție online iar, dacă trainingul are loc din mers, învățare online. Din nou, la fel ca și un om când întâlnește un câine care arată ciudat și întreabă pe altcineva (presupunând că este un expert), "Hei, ce este acela?" și primește un răspuns, după care își actualizează cunoștințele. În cazul AI, expertul este omul care face etichetarea, în timp ce actualizarea cunoștințelor se face prin re-training. Pentru exemplele cunoscute, nu este necesară selectarea și re-instruirea, economisind astfel timp și bani.
În rândurile următoare, abordăm problematica modului cum sunt reprezentate în industrie aceste concepte. În contextul conducerii autonome, proiectăm sisteme astfel încât senzori multipli comunică unii cu alții. Acești senzori nu doar comunică între ei, dar și produc date valoroase pe care le putem utiliza în continuare pentru a dezvolta următoarele generații de sisteme la nivel de management și dezvoltare. Acum, să ne uităm mai de aproape la unul dintre acești senzori și să vedem despre ce cantitate de date vorbim. În departamentul de Computer Vision de la Centrul de Inginerie Bosch din Cluj concentrarea principală este pe dezvoltarea camerelor frontale Front Video și, de asemenea, de proximitate Near Range. Aceste camere produc date, multe date. Pentru 1 minut de înregistrare sunt utilizați zeci de gigabytes. Dacă încerci să transferi în același timp cantitatea de date produsă de mii de mașini, Internetul nu este suficient. Să ne uităm la cele patru dimensiuni ale Big Data: Volum, Velocitate, Varietate și Veridicitate.
Când avem Volum, Velocitate și chiar Varietate, 5G intră în joc. Cu 5G vom fi capabili să transferăm date pe Internet chiar mai rapid față de standardele anterioare. Am putea spune că acesta este pasul evolutiv următor. Dar această definiție nu merge suficient de departe. 5G reprezintă ceva complet nou. Pentru prima dată, un standard de comunicații mobile a fost dezvoltat pentru a se concentra nu pe conectarea oamenilor, ci pe comunicarea dintre senzori, dispozitive, aparate și mai mult pe internetul lucrurilor (IoT). IoT are o importanță cheie pentru Bosch. Astfel, cu 5G, Big Data este și mai mare ca volum, mai rapidă ca velocitate și chiar îmbunătățită ca varietate. Cum putem decide în ceea ce privește Veridicitatea sau semnificația, fidelitatea și credibilitatea datelor? Aici intervine AI, oferind abilități și tehnologii de a lua decizii bazate pe date și pe analizarea și colectarea tuturor datelor cu intenția de a identifica oportunități de afaceri. Pentru a atinge aceste scopuri, avem și următoarele provocări: Nu există informații centralizate pentru user, iar sursele nu sunt combinate între ele. Perspectivele legale în legătură cu utilizarea datelor trebuie și ele clarificate, iar cazurile de utilizare a datelor relevante nu sunt adesea definite. Când proiectăm sisteme pentru procesarea unor cantități enorme de date, primul lucru care ne vine în minte este cum să scalăm, deoarece nu ne dorim să așteptăm ani întregi până când avem disponibil un rezultat. Atunci când un set mare de date trebuie procesat, primul pas care poate fi făcut este să împarți munca în unități care pot fi operate separat; bineînțeles, dacă este posibil, pentru că s-ar putea ca aceasta să nu fie o opțiune pentru anumite seturi de date. O unitate ar trebui să conțină date care ar trebui procesate împreună. Dar, dacă acestea nu sunt procesate deloc, nu trebuie să influențeze alte unități. Odată ce împărțirea datelor a fost efectuată, paralelizarea procesului de calcul poate începe. Cea mai bună abordare este cea asincronă, care înseamnă că o sarcină de lucru se ocupă de o unitate de date când are resursele disponibile pentru ea. Pentru a obține asincronicitatea, un vehicul cu mesaje (message bus) este cea mai bună soluție pentru a distribui munca. Vorbind despre resurse, acestea sunt, de cele mai multe ori, disponibile pe noduri și fiecare sarcină de lucru poate sau nu poate fi executată pe un anumit nod, în funcție de resursele cerute. De exemplu, resursele ar putea fi memoria și numărul de GPU disponibile. Cea mai bună strategie este să împarți munca în unități foarte mici, astfel încât sarcinile de lucru să poată fi executate cât mai des posibil (de exemplu, în loc de o sarcină care necesită patru GPU, faceți patru sarcini de lucru, fiecare necesitând un GPU). Considerând flexibilitatea metodei, s-ar putea să fie nedrept față de ceilalți utilizatori ai clusterelor, deoarece aceasta va folosi, de fapt, toate resursele neutilizate. Mai mult, de îndată ce se ivește ceva disponibil, va fi condusă la acel fond comun, ceea ce va rezulta foarte curând în utilizarea tuturor resurselor de pe clustere. O modalitate de a contracara acest fenomen este deținerea unui mecanism de descreștere a priorității. (Cu cât sunt rulate mai multe sarcini de lucru, cu atât scade prioritatea, asigurându-se faptul că și alte sarcini programate și că durata sarcinii ar trebui să fie suficient de scurtă pentru a elibera resursele din fondul comun, dar îndeajuns de lungă pentru a utiliza eficient resursele). Aceste sarcini de lucru pot extrage date, pot deduce inferențe ale învățării automate, pot indexa date.
Dar toate operațiile expuse mai sus sunt suficiente pentru a face AI sigur și robust? Putem reduce totul la date atunci când vine vorba de a insufla simțul practic în AI? Poate face AI să învețe din experiență? Gândiți-vă la voi: puteți îndeplini sarcini cu foarte puține date de training. De exemplu, un copil poate interpreta situații într-un mod complet adecvat și poate trage concluzii potrivite și poate acționa într-un mod foarte rezonabil, fără prea multă instruire, deoarece un copil are abilitatea raționamentului abstract. Rețelele neurale de forță brută și spațiile cu parametri în continuă expansiune cu cantități enorme de date de training nu vor fi suficiente. Să aruncăm o privire la un exemplu: ce facem noi, oamenii, când ne aflăm într-o situație care este nouă pentru noi, pe care nu am mai întâlnit-o până atunci? Unul dintre lucrurile pe care le facem în asemenea situații este să ne referim la experiențele anterioare, pentru a găsi legături cu ceea ce știm deja din trecut.
Gândiți-vă la un drum nou care nu are benzile marcate pe el. Ca șoferi, suntem totuși capabili să ne menținem mașina pe banda corectă, chiar dacă nu există marcaje pe drum. Asta înseamnă că noi putem, în mod intuitiv, să potrivim un spațiu multi-dimensional cu un spațiu cunoscut bine-definit și putem reduce complexitatea la câțiva parametri cu care ne putem descurca. Pentru a face față acestor tipuri de probleme în lumea reală, dimensionalitatea trebuie redusă într-un mod dovedit matematic și statistic.
Chiar dacă înțelegerea și cunoașterea profundă au răspuns multor întrebări, după cum vedeți, mai avem încă multe provocări de înfruntat. Aștept cu nerăbdare această minunată călătorie printre noile provocări.
de Ovidiu Mățan
de Ovidiu Mățan
de Ovidiu Mățan
de Ovidiu Mățan