Cum se configurează smartphone-uri și PC-uri. Portal informativ
  • Acasă
  • Windows 8
  • Rețele neuronale, sfaturi „răi”. Yandex lansează tehnologia de învățare automată CatBoost

Rețele neuronale, sfaturi „răi”. Yandex lansează tehnologia de învățare automată CatBoost

Yandex a introdus un nou algoritm de căutare bazat pe rețele neuronale. Potrivit experților, acest lucru ar trebui să ajute compania să-și crească avantajul pe piața rusă față de principalul său concurent - Google

Holding-ul rus de internet Yandex a introdus un nou algoritm de căutare bazat pe rețele neuronale. Acest lucru a fost anunțat de șeful serviciului de relevanță al serviciului Alexander Safronov. Noul algoritm, numit „Korolev”, caută nu numai cuvinte cheie, ci și semnificație, iar la întrebările complexe se oferă răspunsuri mai precise, a explicat un reprezentant Yandex.

În 2016, Yandex a introdus algoritmul Palekh, care corespunde semnificației unei interogări rare și unice și titlului unei pagini web în timp real, chiar dacă nu au cuvinte cheie comune. De exemplu, dacă căutați „un tablou în care cerul se învârte”, motorul de căutare va putea afișa Noaptea înstelată a lui Van Gogh. Spre deosebire de Palekh, Korolev este capabil să analizeze întreaga pagină, precum și semnificația solicitărilor la care alți utilizatori merg la ea.

Andrey Styskin, șeful de căutare Yandex, a dat un alt exemplu de întrebare complexă: „un film despre spațiu în care un tată comunică cu fiica lui prin mâinile a doua”. În acest caz, interogarea nu conține cuvinte cheie, dar algoritmul de căutare este capabil să înțeleagă că vorbim despre filmul „Interstellar”, spune Styskin.

Potrivit reprezentanților serviciului, rețeaua neuronală este capabilă de auto-învățare, astfel încât cu cât mai mulți utilizatori caută în motorul de căutare, cu atât rezultatele vor fi mai precise. Platforma deschisă de crowdsourcing Yandex.Toloka, lansată în 2014, va fi folosită pentru testare. De fapt, acesta este un serviciu în care oricine poate participa la testarea produselor Yandex, le poate evalua și poate lăsa comentarii. Acest lucru permite companiilor să-și îmbunătățească serviciile, iar utilizatorii primesc recompense bănești pentru aceasta. În prezent, peste 1 milion de utilizatori sunt înregistrați în Yandex.Toloka.

„Problema cu rețelele neuronale a fost că acestea sunt foarte lente și nu pot fi folosite pentru a lucra cu cantități uriașe de text în timp real”, spune Igor Ashmanov, fondator și managing partner Ashmanov & Partners. „Dacă Yandex a reușit cu adevărat să implice rețelele neuronale în indexarea întregului volum al Runetului, este interesant, aceasta este o descoperire destul de serioasă din punct de vedere tehnologic.” Cât de mult va îmbunătăți noul algoritm calitatea căutării și dacă o va îmbunătăți în principiu, rămâne de analizat, a menționat Ashmanov.

Principalul concurent al Yandex, Google, conform șefului Ashmanov și Partners, nu a anunțat încă oficial introducerea rețelelor neuronale în algoritmii săi de căutare. „Google își poate permite să configureze diferit factorii de clasare și să experimenteze mai mult timp în acest domeniu fără a introduce noi tehnologii în căutare, pur și simplu pentru că compania are mai mulți programatori și resurse”, a menționat expertul.


Prinde din urmă și depășește

Potrivit lui Vladimir Bespalov, analist la VTB Capital, noua versiune a motorului de căutare rusesc este un pas către menținerea cotei de piață a Yandex. „Aplicația mobilă Poisk actualizată, un nou algoritm de motor de căutare — toate acestea ar trebui să ajute Yandex să se stabilească și să-și crească cota pe piața de căutare”, spune expertul. — Efectul nu va fi resimțit imediat, dar o scădere a interogărilor de căutare pe termen lung poate avea un impact mai puțin favorabil asupra performanței viitoare. Căutarea este produsul principal al Yandex, principalul venit al companiei este publicitatea care este legată de căutare.”

Decizia Serviciului Federal Antimonopol poate ajuta Yandex să-și mențină poziția în căutarea mobilă, își amintește Bespalov. În luna aprilie a acestui an, departamentul a încheiat un acord de reglementare cu principalul concurent al companiei ruse pe piața de căutare - Google. Potrivit acestuia, gigantul american al internetului va revizui acordurile cu producătorii de smartphone-uri Android din Rusia și va permite utilizatorilor să aleagă servicii alternative de căutare Google ca principale pe dispozitivele lor.

Conform rezultatelor celui de-al doilea trimestru al acestui an, cota Yandex pe piața de căutare din Rusia s-a ridicat la 54,3%, după cum a raportat Yandex N.V. (compania-mamă a Yandex) în raportul său financiar cu un link către propriul serviciu de analiză Yandex.Radar. La 31 iulie, conform Yandex.Radar, Google ocupa 40,36% din motoarele de căutare din Rusia. Potrivit LiveInternet, în medie în ultimele trei luni, Yandex a fost lider în rândul motoarelor de căutare cu o cotă de 51,1%, în timp ce Google a avut 43,9%. Yandex N.V. nu dezvăluie venituri din căutare, dar direcția „căutare și portal” a adus companiei 20,135 miliarde de ruble, cu 22% mai mult decât în ​​aceeași perioadă din 2016.

„Versiunea anterioară revoluționară a căutării Matrixnet a permis lui Yandex să se desprindă de Google și să-și mărească cota cu aproape 10 p.p. Timp de o jumătate de an. Acesta este un exemplu clar al modului în care utilizarea tehnologiilor inovatoare duce la rezultate evidente de afaceri chiar și pe o piață atât de complexă precum cea de căutare”, spune Alexander Laryanovskiy, partener director al școlii online Skyeng și fost director de dezvoltare internațională la Yandex.

Potrivit directorului adjunct pentru cercetare și dezvoltare al grupului de companii ABBYY, Tatyana Danielyan, introducerea de noi algoritmi de căutare poate schimba, de asemenea, clasamentul (ordinea în care site-urile sunt afișate în rezultatele căutării). Cu toate acestea, acest lucru va juca un plus pentru site-urile în sine, susține ea: „Utilizatorii vor merge mai des la pagini care corespund cu adevărat solicitărilor lor, iar conversiile site-ului pot crește semnificativ.”

De data aceasta am decis să studiez rețelele neuronale. Am reușit să obțin abilități de bază în această chestiune în vara și toamna lui 2015. Prin abilități de bază, vreau să spun că pot crea o rețea neuronală simplă de la zero. Puteți găsi exemple în depozitele mele GitHub. În acest articol, voi oferi câteva clarificări și voi împărtăși resurse pe care le puteți găsi utile pentru studiu.

Pasul 1: Neuronii și propagarea feedforward

Deci, ce este o „rețea neuronală”? Să așteptăm cu asta și să ne ocupăm mai întâi de un neuron.

Un neuron este ca o funcție: acceptă mai multe intrări și returnează una.

Cercul de mai jos reprezintă un neuron artificial. Primește 5 și returnează 1. Intrarea este suma celor trei sinapse conectate la neuron (trei săgeți în stânga).

În partea stângă a imaginii vedem 2 valori de intrare (în verde) și un offset (evidențiat cu maro).

Datele de intrare pot fi reprezentări numerice a două proprietăți diferite. De exemplu, atunci când creați un filtru de spam, acestea ar putea însemna să aveți mai mult de un cuvânt scris cu MAJUSCULE și să aveți cuvântul „Viagra”.

Valorile de intrare sunt înmulțite cu așa-numitele „greutăți”, 7 și 3 (evidențiate cu albastru).

Acum adăugăm valorile rezultate cu offset și obținem un număr, în cazul nostru 5 (evidențiat cu roșu). Aceasta este intrarea neuronului nostru artificial.

Apoi neuronul efectuează un fel de calcul și produce o valoare de ieșire. Avem 1 pentru că valoarea rotunjită a sigmoidului la punctul 5 este 1 (mai multe despre această funcție mai târziu).

Dacă acesta ar fi un filtru de spam, faptul că rezultatul este 1 ar însemna că textul a fost marcat ca spam de către neuron.

Ilustrație rețelei neuronale de pe Wikipedia.

Dacă combinați acești neuroni, obțineți o rețea neuronală care se propagă înainte - procesul trece de la intrare la ieșire, prin neuroni conectați prin sinapse, ca în imaginea din stânga.

Pasul 2. Sigmoid

După ce ați urmărit tutorialele Welch Labs, este o idee bună să consultați a patra săptămână a cursului de învățare automată Coursera despre rețelele neuronale, pentru a vă ajuta să înțelegeți cum funcționează acestea. Cursul intră adânc în matematică și se bazează pe Octave, în timp ce preferința mea este Python. Din acest motiv, am sărit peste exerciții și am obținut toate cunoștințele necesare din videoclip.

Sigmoid pur și simplu mapează valoarea ta (pe axa orizontală) la un segment de la 0 la 1.

Prima prioritate pentru mine a fost să studiez sigmoidul, așa cum figura în multe aspecte ale rețelelor neuronale. Știam deja ceva despre ea din a treia săptămână a cursului de mai sus, așa că am revăzut videoclipul de acolo.

Dar videoclipurile singure nu te vor duce departe. Pentru o înțelegere completă, am decis să-l codez eu. Așa că am început să scriu o implementare a algoritmului de regresie logistică (care folosește sigmoid).

A durat o zi întreagă, iar rezultatul este puțin probabil să fie satisfăcător. Dar nu contează, pentru că mi-am dat seama cum funcționează totul. Codul poate fi văzut.

Nu trebuie să o faceți singur, deoarece necesită cunoștințe speciale - principalul lucru este că înțelegeți cum funcționează sigmoidul.

Pasul 3 Metoda de propagare înapoi

Înțelegerea modului în care funcționează o rețea neuronală de la intrare la ieșire nu este atât de dificilă. Este mult mai dificil de înțeles cum este antrenată o rețea neuronală pe seturi de date. Principiul pe care l-am folosit se numește

18.07.2017, mar, ora 15:53, ora Moscovei, Text: Vladimir Bakhur

Biblioteca de învățare automată CatBoost cu sursă deschisă diferă de metodele tradiționale cu un algoritm de creștere a gradientului pentru învățarea flexibilă pe date eterogene, inclusiv pe cele nenumerice.

Utilizarea flexibilă a datelor numerice și nenumerice

Yandex a introdus o nouă metodă de învățare automată numită CatBoost și a făcut biblioteca CatBoost disponibilă pentru toată lumea de pe GitHub sub licența Apache 2.0. Tehnica vă permite să antrenați în mod eficient modele pe date eterogene, cum ar fi locația utilizatorului, istoricul tranzacțiilor și tipul de dispozitiv.

Potrivit Yandex însuși, bibliotecile CatBoost sunt o alternativă la rețelele neuronale, care sunt departe de a fi potrivite pentru toate tipurile de sarcini reale de producție. În astfel de condiții, algoritmul CatBoost oferă performanțe mai mari și un rezultat mai stabil în procesul de recalificare și predictibilitate ridicată în ceea ce privește calitatea rezultatului final.

„Yandex este implicată în învățarea automată de mulți ani, iar CatBoost a fost creat de cei mai buni specialiști în acest domeniu. Făcând biblioteca CatBoost disponibilă publicului, dorim să contribuim la dezvoltarea învățării automate, - a spus Mihail Bilenko, șeful departamentului de inteligență și cercetare a mașinilor la Yandex. - Trebuie să spun că CatBoost este prima metodă rusă de învățare automată care a devenit disponibilă în Open Source. Sperăm că comunitatea de specialiști îl va aprecia și va ajuta să-l îmbunătățească și mai mult.”

După cum a explicat Yandex pentru CNews, metoda CatBoost este moștenitorul metodei de învățare automată Matrixnet, care este utilizată în aproape toate serviciile Yandex. Prin analogie cu Matrixnet, CatBoost folosește un mecanism de creștere a gradientului, care este foarte potrivit pentru lucrul cu date eterogene.

Tehnica CatBoost este interesantă datorită timpului de reantrenare redus datorită utilizării unui algoritm de construire a modelului proprietar, care, la rândul său, diferă de schema standard de creștere a gradientului.

Logo-ul proiectului CatBoost

Spre deosebire de Matrixnet, care antrenează modele pe date numerice, CatBoost ia în considerare și date nenumerice, cum ar fi tipurile de nori sau tipurile de clădiri. Anterior, astfel de date trebuiau traduse în limbajul numerelor, ceea ce le putea schimba esența și afecta acuratețea modelului.

Acum, astfel de date pot fi folosite în forma sa originală, datorită căreia CatBoost arată o calitate superioară a instruirii decât metodele similare de lucru cu date eterogene. Poate fi folosit într-o varietate de domenii - de la bancar la industrie.

CatBoost poate fi rulat direct din linia de comandă sau puteți utiliza API-ul ușor de utilizat pentru Python sau R cu instrumente de analiză a formulelor și de vizualizare a învățării.

După cum a explicat serviciul de presă al Yandex pentru CNews, CatBoost este rezultatul muncii îndelungate a celor mai buni specialiști ai companiei, care a absorbit mulți ani de experiență a companiei în dezvoltarea de soluții de top de învățare automată, cum ar fi Matrixnet. Punând tehnologia la dispoziția publicului, Yandex intenționează să aducă o contribuție serioasă la dezvoltarea învățării automate și se așteaptă ca comunitatea de specialiști să aprecieze algoritmul și să îl ajute să-l îmbunătățească.

Yandex intenționează să ofere sprijin continuu pentru proiect. După cum sa explicat în companie, sprijinul va fi exprimat în îmbunătățirea constantă a algoritmului, precum și în lucrul cu feedback de la utilizatorii tehnologiei.

Comparație a algoritmilor de învățare automată (GitHub)

Dezvoltatorii plănuiesc să dezvolte tehnologia în cadrul companiei: acum o echipă separată lucrează la ea, care o îmbunătățește și o implementează în mai multe servicii. Biblioteca de aplicații CatBoost va crește în timp. Deoarece tehnologia este open source, toate progresele vor fi imediat disponibile pentru toți utilizatorii. Având în vedere cantitatea și calitatea serviciilor Yandex și sarcinile non-triviale pe care le rezolvă, compania este încrezătoare că tehnologia va rămâne lider în clasa sa pentru o lungă perioadă de timp de acum încolo.

Astăzi în lume există diferite moduri de a lucra cu factori categoric. Ele constau în preprocesarea inițială și transformarea lor în numere, explicate în Yandex.

Cea mai practică metodă este numărarea „contoarelor”, este folosită activ de concurenții de pe Kaggle, iar această metodă este folosită în deciziile câștigătoare. Soluțiile deschise existente nu folosesc această metodă, dar folosesc metode mai simple, cum ar fi one-hot-encoding, de obicei funcționează mai rău. De exemplu, o astfel de preprocesare poate fi utilizată în algoritmul lightgbm.

CatBoost folosește o muncă mai inteligentă cu factori categoric, unde statisticile despre aceștia sunt calculate nu în avans, ci în timpul antrenamentului, iar cele mai utile statistici sunt selectate pentru date și combinațiile lor. Codificarea one-hot în CatBoost este, desigur, acceptată; pentru caracteristicile care au puține valori, uneori această metodă oferă un plus în calitate, a explicat Yandex.

Particularitatea bibliotecilor CatBoost este că și acum, în epoca introducerii pe scară largă a tehnologiilor Deep Learning, rețelele neuronale sunt departe de a fi potrivite pentru toate tipurile de sarcini pentru producția reală, iar în astfel de condiții, creșterea gradientului CatBoost oferă performanțe mai mari. , stabilitate și predictibilitate în ceea ce privește calitatea rezultatului final.

Aplicații practice

CatBoost a fost deja testat pe serviciile Yandex. Ca parte a experimentului, a fost folosit pentru a îmbunătăți rezultatele căutării, pentru a clasifica feedul de recomandări Yandex.Zen și pentru a calcula prognoza meteo în tehnologia Meteum. În toate cazurile, tehnologia sa dovedit a fi mai bună decât Matrixnet.

În viitor, CatBoost va lucra și la alte servicii, notează Yandex. De asemenea, este folosit de echipa Yandex Data Factory în soluțiile lor pentru industrie, în special, pentru a optimiza consumul de materii prime și pentru a prezice defectele.

CatBoost are deja experiență internațională: această metodă de învățare automată a fost introdusă de Centrul European de Cercetare Nucleară (CERN) pentru a combina date din diferite părți ale detectorului LHCb.

Datele colectate în timpul experimentului sunt procesate pentru coliziuni individuale folosind CatBoost la o rată de 40 de milioane pe secundă.

Disponibilitate

Pentru a lucra cu CatBoost, trebuie doar să-l instalați pe computer. Biblioteca acceptă sistemele de operare Linux, Windows și macOS și este disponibilă în limbaje de programare Python și R.

Yandex a dezvoltat, de asemenea, programul de vizualizare CatBoost Viewer, care vă permite să urmăriți procesul de învățare pe diagrame. Puteți descărca CatBoost și CatBoost Viewer pe GitHub.

Kruchinin Dmitri, Dolotov Evgeny, Kustikova Valentina, Druzhkov Pavel, Kornyakov Kirill

Introducere

În prezent, învățarea automată este un domeniu în curs de dezvoltare a cercetării științifice. Aceasta este legată atât de capacitatea de a colecta și prelucra datele mai rapid, mai ridicat, mai puternic, mai ușor și mai ieftin, cât și de dezvoltarea unor metode de identificare a legilor din aceste date, conform cărora se desfășoară procesele fizice, biologice, economice și de altă natură. În unele sarcini, când este destul de dificil să se determine o astfel de lege, se folosește învățarea profundă.

Invatare profunda ia în considerare metode de modelare a abstracțiilor la nivel înalt în date folosind un set de transformări neliniare secvențiale, care, de regulă, sunt reprezentate ca rețele neuronale artificiale. Până în prezent, rețelele neuronale au fost utilizate cu succes pentru a rezolva probleme precum prognoza, recunoașterea modelelor, compresia datelor și o serie de altele.

Relevanța subiectului învățării automate și, în special, a învățării profunde este confirmată de apariția regulată a articolelor pe această temă pe Habré: Acest articol este dedicat unei analize comparative a unor instrumente software de învățare profundă, dintre care foarte multe au a aparut recent. Astfel de instrumente includ biblioteci de software, extensii ale limbajelor de programare, precum și limbaje independente care permit utilizarea unor algoritmi gata pregătiți pentru crearea și antrenamentul modelelor de rețele neuronale. Instrumentele de deep learning existente au funcționalități diferite și necesită niveluri diferite de cunoștințe și abilități din partea utilizatorului. Alegerea corectă a instrumentului este o sarcină importantă care vă permite să obțineți rezultatul dorit în cel mai scurt timp și cu mai puțin efort.

Articolul oferă o scurtă prezentare generală a instrumentelor pentru proiectarea și antrenamentul modelelor de rețele neuronale. Accentul este pus pe patru biblioteci: Caffe , Pylearn2 , Torch și Theano . Sunt luate în considerare capacitățile de bază ale acestor biblioteci, sunt date exemple de utilizare a acestora. Calitatea și viteza bibliotecilor sunt comparate atunci când se construiesc aceleași topologii de rețele neuronale pentru rezolvarea problemei de clasificare a cifrelor scrise de mână (setul de date MNIST este folosit ca set de antrenament și de testare). Se încearcă, de asemenea, să se evalueze comoditatea utilizării în practică a bibliotecilor luate în considerare.

Setul de date MNIST

În plus, baza de date cu imagini scrise de mână MNIST () va fi utilizată ca set de date studiat. Imaginile din această bază de date au o rezoluție de 28x28 și sunt stocate în format de tonuri de gri. Numerele sunt centrate pe imagine. Întreaga bază de date este împărțită în două părți: una de antrenament, formată din 50.000 de imagini, și una de test, formată din 10.000 de imagini.

Instrumente software pentru rezolvarea problemelor de învățare profundă

Există multe instrumente software pentru rezolvarea problemelor de învățare profundă. În puteți găsi o comparație generală a funcționalității celor mai faimoși, aici vă oferim informații generale despre unele dintre ele (). Primele șase biblioteci software implementează cea mai largă gamă de metode de învățare profundă. Dezvoltatorii oferă oportunități pentru crearea de rețele neuronale complet conectate (rețea neuronală complet conectată, FC NN), rețele neuronale convoluționale (rețea neuronală convoluțională, CNN), autoencodere (autoencoder, AE) și mașini Boltzmann limitate (mașină Boltzmann restricționată, RBM). Este necesar să acordați atenție bibliotecilor rămase. Deși au mai puține funcționalități, în unele cazuri simplitatea lor ajută la obținerea unor performanțe mai bune.

Tabelul 1. Capabilitățile instrumentelor software de deep learning

# Nume Limba OC FC NN CNN AE RBM
1 DeepLearnToolbox matlab Windows, Linux + + + +
2 Theano Piton Windows, Linux, Mac + + + +
3 pylearn2 Piton Linux, Vagrant + + + +
4 deepnet Piton linux + + + +
5 Deepmat matlab ? + + + +
6 Torță Lua, C Linux, Mac OS X, iOS, Android + + + +
7 Darch R Windows, Linux + - + +
8 Caff e C++, Python, Matlab Linux, OS X + + - -
9 nnForge C++ linux + + - -
10 CXXNET C++ linux + + - -
11 cuda-convnet C++ Linux, Windows + + - -
12 Cuda CNN matlab Linux, Windows + + - -

Pe baza informațiilor furnizate și a recomandărilor experților, au fost selectate patru biblioteci pentru o analiză ulterioară: , - una dintre cele mai mature și mai complete biblioteci funcțional și - utilizată pe scară largă de către comunitate. Fiecare bibliotecă este luată în considerare conform următorului plan:
  1. Scurte informații de fundal.
  2. Caracteristici tehnice (OS, limbaj de programare, dependențe).
  3. Funcționalitate.
  4. Un exemplu de formare a unei rețele de tip regresie logistică.
  5. Pregătirea și utilizarea modelului construit pentru clasificare.
După luarea în considerare a bibliotecilor listate, acestea sunt comparate pe o serie de configurații de rețea de testare.

Biblioteca Caffe



Caffe este în curs de dezvoltare din septembrie 2013. Yangqing Jia a început dezvoltarea în timpul studiilor sale la Universitatea din California din Berkeley. De atunci, Caffe a fost susținut activ de Centrul de Viziune și Învățare Berkeley (BVLC) și de comunitatea de dezvoltatori de pe GitHub. Biblioteca este distribuită sub licența BSD 2-Clause.

Caffe este implementat folosind limbajul de programare C++, există wrapper-uri în Python și MATLAB. Sistemele de operare acceptate oficial sunt Linux și OS X și există, de asemenea, un port neoficial pentru Windows. Caffe folosește biblioteca BLAS (ATLAS, Intel MKL, OpenBLAS) pentru calcule vectoriale și matrice. Alături de aceasta, dependențele externe includ glog, gflags, OpenCV, protoBuf, boost, leveldb, nappy, hdf5, lmdb. Pentru a accelera calculul, Caffe poate fi rulat pe un GPU folosind capacitățile de bază ale tehnologiei CUDA sau biblioteca primitivă cuDNN deep learning.

Dezvoltatorii Caffe susțin capacitatea de a crea, antrena și testa rețele neuronale complet conectate și convoluționale. Datele de intrare și transformările sunt descrise de concept strat. În funcție de formatul de stocare, pot fi utilizate următoarele tipuri de straturi de date sursă:

  • DATE - definește un strat de date în format leveldb și lmdb.
  • HDF5_DATA - strat de date în format hdf5.
  • IMAGE_DATA este un format simplu care presupune că fișierul conține o listă de imagini cu o etichetă de clasă.
  • alte.
Transformările pot fi definite folosind straturi:
  • INNER_PRODUCT - strat complet conectat.
  • CONVOLUȚIE - strat convoluțional.
  • POOLING - strat de pooling spațial.
  • Local Response Normalization (LRN) - nivelul de normalizare local.
Alături de aceasta, în formarea transformărilor pot fi utilizate diverse funcții de activare.
  • Parte pozitivă (Unitate liniară rectificată, ReLU).
  • Funcția sigmoidă (SIGMOID).
  • Tangenta hiperbolica (TANH).
  • Valoarea absolută (ABSVAL).
  • Exponentiație (PUTERE).
  • Funcția de probabilitate a logului normal binomial (BNLL).
Ultimul strat al modelului rețelei neuronale ar trebui să conțină funcția de eroare. Biblioteca are următoarele funcții:
  • Eroare pătrată medie (MSE).
  • Eroare de margine (pierderea balamalei).
  • Funcția de eroare logistică (Pierdere logistică).
  • Funcția de câștig de informații (Pierdere de câștig de informații).
  • Pierderea entropiei în cruce sigmoidală.
  • Funcția Softmax. Generalizează entropia încrucișată sigmoidă la mai mult de două clase.
În procesul de formare a modelelor se folosesc diverse metode de optimizare. Dezvoltatorii Caffe oferă implementarea unui număr de metode:

În biblioteca Caffe, topologia rețelelor neuronale, datele inițiale și metoda de antrenament sunt specificate folosind fișiere de configurare în format prototxt. Fișierul conține o descriere a datelor de intrare (antrenament și test) și a straturilor rețelei neuronale. Să luăm în considerare etapele construirii unor astfel de fișiere pe exemplul rețelei „regresie logistică” (). În cele ce urmează, vom presupune că fișierul se numește linear_regression.prototxt și se află în directorul examples/mnist.
Orez. 2. Structura rețelei neuronale

Biblioteca Pylearn2


Pylearn2 este o bibliotecă dezvoltată în laboratorul LISA de la Universitatea din Montreal din februarie 2011. Are aproximativ 100 de dezvoltatori pe GitHub. Biblioteca este distribuită sub licența BSD 3-Clause.

Pylearn2 este implementat în Python, sistemul de operare Linux este suportat în prezent, este și posibil să rulați pe orice sistem de operare folosind o mașină virtuală, deoarece dezvoltatorii furnizează un pachet configurat de mediu virtual bazat pe Vagrant. Pylearn2 este construit pe partea superioară a bibliotecii Theano. În plus, sunt necesare PyYAML, PIL. Pentru a accelera calculele, Pylearn2 și Theano folosesc Cuda-convnet , care este implementat în C++ / CUDA, ceea ce oferă o creștere semnificativă a vitezei.

Pylearn2 acceptă crearea de rețele neuronale complet conectate și convoluționale, diferite tipuri de auto-encodere (Auto-encodere contractive, auto-encodere de denoisare) și mașini Boltzmann limitate (Gaussian RBM, spike-and-slab RBM). Sunt furnizate mai multe funcții de eroare: cross-entropie (cross-entropie), log-probabilitate (log-probabilitate). Sunt disponibile următoarele metode de predare:

  • Batch Gradient Descent (BGD).
  • Coborâre Stochastic Gradient (SGD).
  • Coborâre a gradientului conjugat neliniar (NCG).
În biblioteca Pylearn2, rețelele neuronale sunt definite folosind descrierea lor din fișierul de configurare în format YAML. Fișierele YAML sunt o modalitate convenabilă și rapidă de a serializa obiecte, deoarece sunt proiectate folosind tehnici de programare orientate pe obiecte.

Biblioteca Tortei


Torch este o bibliotecă de calcul științific cu suport larg pentru algoritmii de învățare automată. Dezvoltat de Institutul de Cercetare Idiap, Universitatea din New York și NEC Laboratories America din 2000, distribuit sub licență BSD.

Biblioteca este implementată în Lua folosind C și CUDA. Limbajul rapid de scripting Lua în combinație cu tehnologiile SSE, OpenMP, CUDA îi permit lui Torch să arate o viteză bună în comparație cu alte biblioteci. Sistemele de operare suportate în prezent sunt Linux, FreeBSD, Mac OS X. Modulele principale funcționează și pe Windows. Dependențele Torch includ imagemagick, gnuplot, nodejs, npm și altele.

Biblioteca constă dintr-un set de module, fiecare dintre acestea fiind responsabil pentru diferite etape de lucru cu rețelele neuronale. Deci, de exemplu, modulul nn oferă configurarea rețelei neuronale (definirea straturilor și a parametrilor acestora), modul optim conține implementări ale diferitelor metode de optimizare utilizate pentru antrenament și gnuplot oferă capacitatea de a vizualiza date (trasarea graficelor, afișarea imaginilor etc.). Instalarea modulelor suplimentare vă permite să extindeți funcționalitatea bibliotecii.

Torch vă permite să creați rețele neuronale complexe folosind un mecanism container. Container este o clasă care combină componentele declarate ale unei rețele neuronale într-o singură configurație comună, care poate fi trecută ulterior procedurii de antrenament. O componentă de rețea neuronală poate fi nu numai straturi complet conectate sau convoluționale, ci și funcții de activare sau eroare, precum și containere gata făcute. Torch vă permite să creați următoarele straturi:

  • Strat complet conectat (liniar).
  • Funcții de activare: tangentă hiperbolică (Tanh), alegere minim (Min) sau maxim (Max), funcție softmax (SoftMax) și altele.
  • Straturi convoluționale: convoluție (Convolution), subțiere (SubSampling), unire spațială (MaxPooling, AveragePooling, LPPooling), normalizare diferențe (SubtractiveNormalization).
Funcții de eroare: eroare pătrată medie (MSE), entropie încrucișată (CrossEntropy), etc.

Următoarele metode de optimizare pot fi utilizate în antrenament:

Luați în considerare procesul de configurare a unei rețele neuronale în Torch. Mai întâi trebuie să declarați un container, apoi să adăugați straturi la acesta. Ordinea în care sunt adăugate straturile este importantă deoarece ieșirea stratului (n-1) va fi intrarea celui de-al n-lea.
regresie = nn.Sequential() regresie:add(nn.Linear(784,10)) regresie:add(nn.SoftMax()) pierdere = nn.ClassNLLCriterion()
Utilizarea și antrenarea unei rețele neuronale:

  1. Încărcarea datelor de intrare X. Funcția torch.load(path_to_ready_dset) vă permite să încărcați un set de date pre-preparat în format text sau binar. De regulă, acesta este un tabel Lua format din trei câmpuri: dimensiune, date și etichete. Dacă nu există un set de date gata făcut, puteți utiliza funcțiile standard ale limbajului Lua (de exemplu, io.open(filename [, mode])) sau funcțiile din pachetele bibliotecii Torch (de exemplu, image.loadJPG(filename) )).
  2. Determinarea răspunsului rețelei pentru intrarea X:
    Y = regresie:forward(X)
  3. Calculul funcției de eroare E = pierdere(Y, T), în cazul nostru este funcția de probabilitate.
    E = pierdere:forward(Y,T)
  4. Calculul gradienților conform algoritmului de backpropagation.
    dE_dY = pierdere:înapoi(Y,T) regresie:înapoi(X,dE_dY)
Acum să punem totul împreună. Pentru a antrena o rețea neuronală în biblioteca Torch, trebuie să vă scrieți propria buclă de antrenament. În ea, declarați o funcție specială (închidere) care va calcula răspunsul rețelei, va determina valoarea erorii și va recalcula gradienții și trece această închidere la funcția de coborâre a gradientului pentru a actualiza greutățile rețelei.
-- Creați variabile speciale: greutățile rețelei neuronale și gradienții lor w, dE_dw = regresie:getParameters() local eval_E = function(w) dE_dw:zero() -- Actualizați gradienți local Y = regresie:forward(X) local E = pierdere : forward(Y,T) local dE_dY = loss:backward(Y,T) regresie:backward(X,dE_dY) return E, dE_dw end -- Apoi apelați optim.sgd(eval_E, w, optimState) în bucla de învățare
unde optimState sunt parametrii de coborâre a gradientului (learningRate, impuls, weightDecay etc.). Puteți vedea întregul ciclu de antrenament.

Este ușor de observat că procedura de declarare, ca și procedura de instruire, necesită mai puțin de 10 linii de cod, ceea ce indică ușurința de utilizare a bibliotecii. În același timp, biblioteca vă permite să lucrați cu rețele neuronale la un nivel destul de scăzut.

Salvarea și încărcarea rețelei instruite se realizează folosind funcții speciale:
torch.save(cale, regresie) net = torch.load(cale)
Odată încărcată, rețeaua poate fi folosită pentru clasificare sau formare suplimentară. Dacă trebuie să știți din ce clasă aparține elementul eșantion, atunci este suficient să treceți prin rețea și să calculați rezultatul:
rezultat = net:forward(eșantion)
Exemple mai avansate pot fi găsite în tutorialele pentru bibliotecă.

Biblioteca Theano


Theano este o extensie de limbaj Python care vă permite să evaluați eficient expresiile matematice care conțin tablouri multidimensionale. Biblioteca și-a primit numele în onoarea soției filosofului și matematicianului grec antic Pitagora - Theano (sau Theano). Theano a fost dezvoltat în laboratorul LISA pentru a sprijini dezvoltarea rapidă a algoritmilor de învățare automată.

Biblioteca este implementată în Python și este acceptată pe sistemele de operare Windows, Linux și Mac OS. Theano include un compilator care traduce expresiile matematice scrise în Python în cod eficient C sau CUDA.

Theano oferă un set de bază de instrumente pentru configurarea și formarea rețelelor neuronale. Este posibil să se implementeze rețele multistrat complet conectate (Multi-Layer Perceptron), rețele neuronale convoluționale (CNN), rețele neuronale recurente (Recurrent Neural Networks, RNN), autoencodere și mașini Boltzmann limitate. Sunt furnizate, de asemenea, diverse funcții de activare, în special, sigmoidală, softmax-funcție, cross-entropie. Antrenamentul folosește coborârea gradientului în lot (Batch SGD).

Luați în considerare configurația rețelei neuronale în Theano. Pentru comoditate, implementăm clasa LogisticRegression (), care va conține variabile - parametri antrenabili W, b și funcții pentru lucrul cu aceștia - numărarea răspunsului rețelei (y = softmax(Wx + b)) și o funcție de eroare. Apoi, pentru a antrena rețeaua neuronală, creăm funcția train_model. Pentru aceasta, este necesar să se descrie metodele care determină funcția de eroare, regula de calcul a gradienților, metoda de modificare a greutăților rețelei neuronale, dimensiunea și locația eșantionului mini-lot (imaginile în sine și răspunsurile). pentru ei). După ce toți parametrii sunt definiți, funcția este compilată și transmisă buclei de antrenament.


Orez. 3. Diagrama de clasă pentru implementarea unei rețele neuronale în Theano

Implementarea programatică a clasei

clasa LogisticRegression(obiect): def __init__(self, input, n_in, n_out): # y = W * x + b # declara variabile, definește tipul, numărul de intrări și ieșiri self.W = theano.shared (# inițializa ponderile inițiale la zero value=numpy.zeros((n_in, n_out), dtype=theano.config.floatX), name="W", borrow=True) self.b = theano.shared(value=numpy.zeros((n_out, ), dtype=theano.config.floatX), name="b", borrow=True) # adăugați funcția de activare softmax, ieșirea rețelei este variabilă y_pred self.p_y_given_x = T.nnet.softmax(T.dot(input, self. W) + self.b) self.y_pred = T.argmax(self.p_y_given_x, axis=1) self.params = # definește funcția de eroare def negative_log_likelihood(self, y): return -T.mean(T.log( self.p_y_given_x )) # x - este alimentat la intrarea în rețea # un set de imagini (minibatch) este aranjat în rânduri în matrice x # y - răspunsul rețelei la fiecare probă x = T.matrix("x") y = T.ivector("y") # creați un model de regresie logistică fiecare imagine MNIST are o dimensiune de 28*28 clasificator = LogisticR egression(input=x, n_in=28 * 28, n_out=10) # valoarea funcției de eroare pe care încercăm să o minimizăm în timpul antrenamentului cost = classifier.negative_log_likelihood(y) # pentru a calcula gradienții, trebuie să apelați Funcția Theano - grad g_W = T .grad(cost=cost, wrt=clasifier.W) g_b = T.grad(cost=cost, wrt=classifier.b) # definiți regulile pentru actualizarea ponderilor rețelei neuronale actualizări = [(clasificator .W, classifier.W - learning_rate * g_W ), (classifier.b, classifier.b - learning_rate * g_b)] # compilați funcția de antrenament, mai târziu va fi apelată în bucla de antrenament model_tren = theano.function(inputs=, ieșiri=cost, actualizări=actualizări, date=( x : train_set_x, y: train_set_y ))


Pentru a salva și încărca rapid parametrii rețelei neuronale, puteți utiliza funcțiile din pachetul cPickle:
import cPickle save_file = open("cale", "wb") cPickle.dump(classifier.W.get_value(borrow=True), save_file, -1) cPickle.dump(classifier.b.get_value(borrow=True), save_file , -1) save_file.close() file = open("cale") classifier.W.set_value(cPickle.load(save_file), borrow=True) classifier.b.set_value(cPickle.load(save_file), borrow=True )
Este ușor de observat că procesul de creare a unui model și de determinare a parametrilor acestuia necesită scrierea unui cod mare și zgomotos. Biblioteca este la nivel scăzut. De remarcat flexibilitatea acesteia, precum și posibilitatea implementării și utilizării propriilor componente. Site-ul oficial al bibliotecii are un număr mare de materiale educaționale pe diverse teme.

Comparația bibliotecilor pe exemplul sarcinii de clasificare a cifrelor scrise de mână

Infrastructura de testare

În cursul experimentelor de evaluare a performanței bibliotecilor, a fost utilizată următoarea infrastructură de testare:
  1. Ubuntu 12.04, Intel Core i5-3210M la 2,5 GHz (experimente cu CPU).
  2. Ubuntu 14.04, Intel Core i5-2430M @ 2.4GHz + NVIDIA GeForce GT 540M (experimente GPU).
  3. GCC 4.8, NVCC 6.5.

Topologii de rețea și parametri de antrenament

Experimentele de calcul au fost efectuate pe rețele neuronale complet conectate și convoluționale cu următoarea structură:

Toate greutățile au fost inițializate aleatoriu conform legii de distribuție uniformă în intervalul (−6/(n_in + n_out), 6/(n_in + n_out)), unde n_in, n_out sunt numărul de neuroni la intrarea și la ieșire a stratului , respectiv. Parametrii de coborâre a gradientului stocastic (SGD) sunt aleși egali cu următoarele valori: rata de învățare - 0,01, impuls - 0,9, scăderea greutății - 5e-4, dimensiunea lotului - 128, numărul maxim de iterații - 150.

Rezultate experimentale

Timpul de antrenament al rețelelor neuronale descrise mai devreme ( , ) folosind cele patru biblioteci considerate este prezentat mai jos (

Din punct de vedere istoric, rețelele neuronale artificiale, în cele peste jumătate de secol de istorie, au cunoscut atât perioade de decolare rapidă și o atenție sporită a publicului, cât și perioade de scepticism și indiferență care le-au înlocuit. În vremuri bune, oamenilor de știință și inginerilor li se pare că a fost găsită în sfârșit o tehnologie universală care poate înlocui oamenii în orice sarcini cognitive. Asemenea ciupercilor după ploaie apar diverse modele noi de rețele neuronale, între autorii lor, matematicieni profesioniști, există dispute intense cu privire la gradul mai mare sau mai mic de biologicitate al modelelor pe care le-au propus. Biologii profesioniști observă aceste discuții din exterior, întrerupând periodic și exclamând „Da, acest lucru nu se întâmplă în natura reală!” – și cu puțin efect, deoarece matematicienii rețelelor neuronale îi ascultă pe biologi, de regulă, doar atunci când faptele biologilor sunt în concordanță cu propriile lor teorii. Cu toate acestea, în timp, se acumulează treptat un grup de sarcini, pe care rețelele neuronale funcționează sincer prost și entuziasmul oamenilor se răcește.

Astăzi, rețelele neuronale revin la apogeu datorită inventării metodei de pre-antrenament „nesupravegheat” bazată pe Restricted Boltzmann Machines (RBM), care permite antrenamentul rețelelor neuronale profunde (adică cu extra-mari, de ordinul a zeci de mii, număr de neuroni) și succesul rețelelor neuronale profunde în sarcini practice de recunoaștere a vorbirii și imaginilor orale. De exemplu, recunoașterea vorbirii în Android se bazează pe rețele neuronale profunde. Nu se știe cât de mult va dura acest lucru și cât de profunde rețelele neuronale vor justifica așteptările asupra lor.
Între timp, în paralel cu toate disputele, curentele și tendințele științifice, există o comunitate distinctă de utilizatori ai rețelelor neuronale - ingineri software și practicieni care sunt interesați de aspectul aplicat al rețelelor neuronale, capacitatea lor de a învăța din datele colectate și de a rezolva recunoașterea. Probleme. Modele bine dezvoltate, relativ mici de perceptroni multistrat (Multilayer Perceptron, MLP) și rețele de funcții de bază radială (Radial Basis Function network, RBF) fac o treabă excelentă cu multe probleme practice de clasificare și predicție. Aceste rețele neuronale au fost descrise de multe ori, aș recomanda următoarele cărți, în ordinea simpatiei mele personale pentru ele: Osovsky, Bishop, Khaykin; există și cursuri bune despre Coursera și resurse similare.

Cu toate acestea, în ceea ce privește abordarea generală a utilizării rețelelor neuronale în practică, este fundamental diferită de abordarea obișnuită de dezvoltare deterministă „programat, funcționează, funcționează întotdeauna”. Rețelele neuronale sunt modele probabilistice prin natura lor, iar abordarea lor ar trebui să fie complet diferită. Din păcate, mulți programatori începători ai tehnologiilor de învățare automată în general și a rețelelor neuronale în special fac erori sistemice atunci când lucrează cu ei, sunt frustrați și abandonează această afacere. Ideea de a scrie acest tratat despre Habr a apărut după ce am discutat cu utilizatori atât de dezamăgiți ai rețelelor neuronale - programatori excelenți, experimentați și încrezători în sine.

Iată lista mea de reguli și greșeli comune în utilizarea rețelelor neuronale.

1. Dacă este posibil să nu folosiți rețelele neuronale, nu le folosiți.
Rețelele neuronale vă permit să rezolvați problema dacă este imposibil să propuneți un algoritm prin vizualizarea în mod repetat (sau foarte repetat) a datelor cu ochii. De exemplu, dacă există o mulțime de date, acestea sunt neliniare, zgomotoase și/sau de dimensiuni mari.

2. Complexitatea rețelelor neuronale ar trebui să fie adecvată complexității sarcinii.
Calculatoarele personale moderne (de exemplu, Core i5, 8 GB RAM) fac posibilă antrenarea rețelelor neuronale într-un timp confortabil pe mostre de zeci de mii de exemple, cu dimensiuni ale datelor de intrare de până la o sută. Eșantioanele mari reprezintă o provocare pentru rețelele neuronale profunde menționate mai sus, care sunt antrenate pe GPU-uri multiprocesor. Aceste modele sunt foarte interesante, dar nu sunt în centrul atenției acestui articol Habr.

3. Datele pentru formare ar trebui să fie reprezentative.
Eșantionul de formare ar trebui să reprezinte complet și cuprinzător fenomenul descris, să includă diverse situații posibile. Este bine când există multe date, dar nici asta în sine nu ajută întotdeauna. În cercuri înguste, o glumă este larg răspândită atunci când un geolog vine la un detector, așează o bucată de mineral în fața lui și îi cere să dezvolte un sistem de recunoaștere a unei astfel de substanțe pe baza acestuia. „Pot avea mai multe exemple de date?” întreabă recunoaștetorul. "Cu siguranță!" - răspunde geologul, scoate un târnăcop și își desparte bucata de mineral în mai multe bucăți. După cum înțelegeți, nu va fi niciun beneficiu de pe urma unei astfel de operațiuni - un astfel de eșantion crescut nu conține informații noi.

4. Amestecați proba.
După ce vectorii de date de intrare și de ieșire sunt colectați, dacă măsurătorile sunt independente unele de altele, schimbați ordinea vectorilor într-un mod arbitrar. Acest lucru este esențial pentru împărțirea corectă a eșantionului în Train/Test/Validare și pentru toate metodele de antrenament eșantion cu eșantion.

5. Normalizați și centrați datele.
Pentru perceptronii multistrat și pentru multe alte modele, valorile datelor de intrare trebuie să se situeze în [-1;1]. Înainte de a le furniza rețelei neuronale, scădeți media din date și împărțiți toate valorile la valoarea maximă.

6. Împărțiți proba în Train, Test și Validare.
Principala greșeală a începătorilor este aceea de a asigura eroarea minimă a rețelei neuronale pe setul de antrenament, reantrenând-o diabolic pe parcurs și dorindu-și apoi aceeași bună calitate asupra noilor date reale. Acest lucru este deosebit de ușor de făcut dacă există puține date (sau dacă toate sunt dintr-o singură bucată). Rezultatul poate fi foarte frustrant: rețeaua neuronală se va adapta pe cât posibil la eșantion și își va pierde performanța pe date reale. Pentru a controla abilitățile de generalizare ale modelului dvs., împărțiți toate datele în trei mostre într-un raport de 70: 20: 10. Train on Train, verificând periodic calitatea modelului pe Test. Pentru evaluarea finală imparțială - Validare.
Tehnica de validare încrucișată, când Train și Test sunt generate aleatoriu de mai multe ori pe rând din aceleași date, poate fi dificilă și poate oferi o impresie falsă a calității bune a sistemului - de exemplu, dacă datele sunt preluate din surse diferite și acest lucru este critic. Utilizați validarea corectă!

7. Aplicați regularizarea.
Regularizarea este o tehnică care vă permite să evitați supraadaptarea unei rețele neuronale în timpul antrenamentului, chiar dacă există puține date. Dacă găsiți o casetă de selectare cu un astfel de cuvânt, asigurați-vă că o bifați. Un semn al unei rețele neuronale reeducate sunt valorile mari ale greutăților, de ordinul sutelor și miilor, o astfel de rețea neuronală nu va funcționa normal pe date noi care nu au fost văzute înainte

8. Nu este nevoie să antrenezi rețeaua neuronală online.
Ideea de a reinstrui permanent rețeaua neuronală pe date noi primite este corectă în sine, în sistemele biologice reale, exact așa se întâmplă. Învățăm în fiecare zi și rareori înnebunim. Cu toate acestea, pentru rețelele neuronale artificiale convenționale în stadiul actual de dezvoltare tehnică, această practică este riscantă: rețeaua se poate reinstrui sau se poate adapta la cele mai recente date primite și își pierde abilitățile de generalizare. Pentru ca sistemul să fie utilizat în practică, rețeaua neuronală trebuie să: 1) să antreneze, 2) să testeze calitatea pe probe de testare și validare, 3) să aleagă o versiune bună a rețelei, să-i stabilească greutățile și 4) să utilizeze rețeaua neuronală antrenată în practică, greutățile din proces nu schimbă utilizarea.

9. Folosiți algoritmi noi de învățare: Levenberg-Marquardt, BFGS, Gradienți conjugați etc.
Sunt profund convins că este datoria sacră a tuturor celor care lucrează cu rețele neuronale să implementeze învățarea cu propagare inversă. Această metodă este cea mai simplă, relativ ușor de programat și vă permite să studiați bine procesul de învățare al rețelelor neuronale. Între timp, backpropagarea a fost inventată la începutul anilor 70 și a devenit populară la mijlocul anilor 80 ai secolului trecut, de atunci au apărut metode mai avansate care pot îmbunătăți semnificativ calitatea antrenamentului. Mai bine le folosești.

10. Antrenează rețele neuronale în MATLAB și în medii prietenoase similare.
Dacă nu sunteți un om de știință care dezvoltă noi metode pentru antrenarea rețelelor neuronale, ci un programator practic, nu v-aș recomanda să codificați singur procedura de antrenare a rețelelor neuronale. Există un număr mare de pachete software, în principal în MATLAB și Python, care vă permit să antrenați rețele neuronale, controlând în același timp procesul de instruire și testare folosind instrumente convenabile de vizualizare și depanare. Bucurați-vă de moștenirea omenirii! Personal îmi place abordarea „antrenament în MATLAB cu o bibliotecă bună - implementarea manuală a modelului antrenat”, este destul de puternică și flexibilă. Excepție este pachetul STATISTICA, care conține metode avansate de antrenament a rețelelor neuronale și vă permite să le generați sub forma unui cod de program în C care este convenabil pentru implementare.

În următorul articol îmi propun să descriu în detaliu ciclul industrial complet pentru pregătirea unei rețele neuronale, implementat pe baza principiilor descrise mai sus, utilizate pentru sarcini de recunoaștere într-un produs software comercial.

Noroc!

Literatură

Hinton G., Deng L., Yu D., Dahl G., Mohamed A., Jaitly N., Senior A., ​​​​Vanhoucke V., Nguyen P., Sainath T. și Kingsbury B. Deep Neural Networks for Acoustic Modelarea în recunoașterea vorbirii, IEEE Signal Processing Magazine, vol. 29, nr. 6, 2012, pp. 82-97.
Ciresan D., Meier U., Masci J și Schmidhuber J. Multi-column Deep Neural Network for Traffic Sign Classification. Rețele neuronale, voi. 34, august 2012, pp. 333 - 338
S. Osovski. Rețele neuronale de prelucrare a informațiilor - banda. din poloneză. M.: Finanțe și statistică, 2002. - 344 p.
Episcopul C.M. Recunoașterea modelelor și învățarea automată. Springer, 2006 - 738 p.
S. Khaikin. Rețele neuronale: curs complet. Williams, 2006.

Top articole similare