TSM - Deep learning

Roland Szabo - Junior Python Developer


În ultimii doi -trei ani a apărut un nou buzzword: deep learning. În 2012 Microsoft a prezentat un demo destul de impresionant care recunoaștea vorbitul în limba engleză, traducea în chineză, apoi reda, cu vocea originală, în chineză, traducerea. Tot atunci, Google a realizat un sistem care, din 10 milioane de imagini alese din clipuri de pe YouTube, a învățat singur să recunoască fețe de pisici și alte 22.000 de categorii de obiecte.

În decembrie 2013, Facebook a deschis un laborator de cercetare în domeniul inteligenței artificiale, condus de Yann LeCunn de la Universitatea din New York, unul dintre principalii cercetători în domeniul "deep learning".

Deep learning-ul reprezintă o categorie de algoritmi de învățare automată care se remarcă prin faptul că într-o primă etapă învață cum să se prelucreze datele de intrare și ulterior funcția dorită. Până acum, pentru recunoașterea de obiecte în imagini, cercetătorii trebuiau să găsească tot felul de trăsături specifice obiectelor, să le extragă din imagini și apoi să aplice un algoritm de clasificare cum ar fi SVM sau Random Forest pentru a determina ce conține fiecare imagine. Pentru unele obiecte s-au găsit trăsături bune (recunoașterea fețelor funcționează destul de bine), pentru altele nu chiar (un tocător de hârtie este greu de descris și recunoscut chiar și de către oameni). În contrast, algoritmii de deep learning nu necesită extragerea de trăsături despre categorii în prealabil, deoarece ele învață să facă aceasta în mod automat.

Partea de "deep" din nume provine din faptul că în loc de a avea un singur nivel care primește datele de intrare și ne dă rezultatul dorit, avem o serie de nivele care procesează datele primite de la nivele anterioare, extrăgând trăsături de nivel tot mai înalt. Ultimul nivel este cel care se ocupă de obținerea rezultatului, după ce datele au fost deja transformate și comprimate.

Filtre învățate de un Restricted Boltzmann Machine pe MNIST

Începuturile "deep learning"-ului

Marea partea a algoritmilor de deep learning este reprezentată de diferite forme de rețele neuronale. Prima variantă a acestora a fost perceptronul, propus în 1958 de către Frank Rosenblatt, bazându-se pe cercetările lui Warren McCulloch și Walter Pitts. Aceștia au propus în 1943 un model matematic pentru funcționarea neuronilor din creierul animal.

Perceptronul este un model foarte simplu: intrarea este înmulțită cu o pondere și apoi toate rezultatele sunt adunate. Dacă rezultatul este mai mare decât o valoare predefinită, atunci rezultatul este 1, altfel este 0. Ponderile acestea trebuie adaptate pentru fiecare set de date în parte. Există un algoritm prin care se pot calcula.

Însă acestui model simplu i s-a descoperit o problemă majoră: nu funcționa decât pentru date linear separabile. De exemplu: în plan, dacă toate punctele care au clasa pozitivă se pot separa cu o dreaptă de punctele cu clasa negativă. Aceasta este o limitare mare, ceea ce a dus la abandonarea pentru o vreme a rețelelor neuronale .

În 1975, Paul Werbos a descoperit algoritmul "backpropagation", care permitea folosirea mai multor straturi în rețelele neuronale. Dacă în perceptron intrările erau folosite pentru a calcula imediat rezultatul, acum se puteau folosi mai multe straturi, care efectau o prelucrare a datelor din stratul anterior, și se puteau folosi alte funcții de activare (rezultatul nu mai trece brusc de la negativ la pozitiv, ci are o trecere continuă). Hornik a demonstrat teoretic că o rețea neuronală cu un strat ascuns, cu un număr suficient de mare de neuroni, putea să aproximeze orice funcție computabilă, cu o precizie arbitrară. Algoritmul funcționează în felul următor: inițializezi aleatoriu toate ponderile dintre neuroni și începi să vezi ce valori s-ar obține pentru datele tale de intrare. Calculezi diferența față de valoarea care trebuie să fie obținută și aceasta o "propagi înapoi" pe penultimul strat, împărțind eroarea în mod proporțional la fiecare neuron, în funcție de ce pondere avea. Această propagare înapoi se repetă până se ajunge la primul strat și apoi se calculează noile valori obținute. Acest ciclu de corectare se repetă până când eroarea obținută pe datele noastre este suficient de mică (sau până ne-am plictisit să mai așteptăm).

Deci am rezolvat problema, avem algoritmul perfect pentru învățare automată? Nu chiar. S-au descoperit alte două probleme. Prima era că numărul de neuroni necesar pentru a aproxima funcții creștea exponențial cu numărul de intrări. O altă problemă era că s-a demonstrat că antrenarea rețelelor neuronale aparține clasei de probleme NP-Complete, despre care se presupune că nu poate fi rezolvată în timp polinomial.

Din cauza acestor două probleme și a utilizării altor tehnici mai rapide precum arborii de decizie (1986), SVM (1996)sau random forests (1995), rețelele neuronale au fost iarăși neglijate pentru o vreme de marea parte a cercetătorilor. Totuși, unii au obținut rezultate bune cu ele, cum ar fi Yann LeCun cu LeNet (1998). Le Net este un sistem de recunoaștere a cifrelor scrise de mână, folosit la multe bănci, bazat pe rețele neuronale convoluționale.

Schemă a straturilor din LeNet

Marea descoperire

O schimbare majoră de paradigmă a apărut în 2006, când Geoffrey Hinton a publicat două articole care conțineau idei noi și revoluționare: "Reducing the dimensionality of data with neural networks" și "A fast learning algorithm for deep belief nets", bazate pe Restricted Boltzmann Machines. Acești algoritmi noi pornesc căutarea pentru parametrii rețelelor neuronale din locuri care sunt mai aproape de valorile optimale. Rețelele neuronale se antrenau strat cu strat în mod nesupervizat, pentru a găsi structura din spatele datelor, pentru ca la sfârșit să se efectueze corecții fine folosind algoritmul clasic de backpropagation.

Unul dintre testele standard pentru tehnici de învățare automată este MNIST, care este un set de 70.000 de imagini conținând fiecare câte o cifră. Datele sunt împărțite în două, 60.000 de imagini fiind folosite pentru antrenare, iar 10.000 pentru testare. Se evită astfel situația în care algoritmul de învățare automată pur și simplu memorează valorile cu care a fost antrenat, verificându-se dacă este capabil de a generaliza și la valori noi. Pe acest set de date, o rețea antrenată în prealabil cu RBM-uri a obținut o eroare de 1%, care la vremea respectivă era printre cinci cele mai bune rezultate.

Structura unui Deep Belief Network, fomat dintr-o serie de RBM-uri suprapuse.

În 2007 Yoshua Bengio a introdus autoencodere în locul RBM-urilor, care au fost apoi dezvoltate și au apărut tot felul de variații, cum ar fi denoising autoencoder, sparse autoencoder.

S-au făcut multe progrese în acest domeniu de învățare prealabilă, până când în 2010 James Martens a publicat un articol în care prezenta un alt algoritm pentru găsirea parametrilor, folosind derivate de ordinul 2 și fără a folosi învățarea nesupervizată prealabilă, care obținea rezultate mai bune decât rezultatele de până atunci.

Tot în același an, Dan Cireșan a arătat că nici măcar acest algoritm nu este necesar, ci, folosind algoritmul clasic de backpropagare, cu o rețea adâncă și lată, pe GPU, folosind deformări elastice pe imagini, se pot obține rezultate excelente pe MNIST: 0.35% eroare. În 2012, același grup a stabilit recordul curent pe MNIST, de 0.23%, care este o eroare mai mică decât cea făcută de oameni în urma clasificării. De data aceasta au folosit rețele neuronale convoluționale și max-pooling, dar tot fără antrenare prealabilă.

Unde suntem azi

Cercul s-a închis și am revenit de unde am "început": ultimele rezultate nu mai folosesc antrenarea prealabilă nesupervizată, ci doar algoritmul de backpropagation. Îmbunătățirile se aduc în domeniul funcțiilor de activare ( care se referă la cum se trec datele de la un strat la altul), unde acum sunt la modă "Rectified Linear Units", precum și în cel al tehnicilor de regularizare (care ajută la generalizare și previn memorarea intrărilor) precum maxout și dropout și la alternarea straturilor convoluționale și a celor de max-pooling.

În articolele următoare se vor prezenta avantajele și dezavantajele tehnicilor menționate lor, respectiv cum se pot implementa folosind diverse framework-uri de învățare automată.