Procesarea limbajului natural a evoluat foarte mult în ultimii cinci ani. În articolul anterior am văzut cum putem folosi modele mari pre-antrenate, cum ar fi BERT, pentru a reduce cantitatea de date adnotate care este necesară pentru a antrena un model sau, și mai bine, pentru a obține repede un proof-of-concept fără a adnota un singur document, folosind Zero Shot Learning.
Dar datele adnotate sunt în continuare necesare când dorim să obținem cele mai bune rezultate posibile pentru modelele noastre NLP. Acesta era un proces foarte laborios, care necesita mult timp și efort. Aveați nevoie de zeci de mii sau chiar mai multe documente adnotate. Cea mai bună practică este ca mai mulți adnotatori să analizeze întregul set de date pentru a asigura coerența adnotărilor, deoarece, dacă adnotările umane nu sunt bune, modelul ML nu va putea învăța. Pot apărea probleme în modul în care obțineți datele, care duc la tot felul de biasuri problematice.
Există multe programare care oferă o interfață simplă și un UX bun pentru procesul de adnotare, cum ar fi Doccano, dar există un val de start-upuri care au făcut cercetări ample și au găsit modalități de a face acest lucru mult mai bine.
Prodigy este un instrument de adnotare creat de către Explosion AI. Aceeași companie produce Spacy, una dintre cele mai utilizate bibl ioteci NLP. Cele două sunt foarte bine integrate și dețin opțiunea de a accelera procesul de adnotare prin utilizarea de șabloane.
Modelele pot fi simple căutări după cuvinte. Atunci când se dorește extragerea unor entități (orașe, persoane) din text, un șablon poate fi că, dacă în text se află «Paris», acesta trebuie să fie adnotat ca «oraș». În cazul în care se dorește clasificarea anunțurilor de locuri de muncă în funcție de industrie, un șablon ar putea fi că, dacă în text apare «Python" sau "Java", acesta va fi clasificat ca fiind un loc de muncă în domeniul IT.
De asemenea, puteți defini șabloane mai complexe folosind Spacy, cum ar fi cele bazate pe rădăcinile cuvintelor, etichete ale părții de vorbire (substantiv, adverb etc.), morfologie (verbe la gerunziu, mod indicativ, timp trecut). De exemplu, regula [{[{'LEMMA': 'a fi'}, {'POS': 'ADJ'}]
ar corespunde oricărei forme a verbului "a fi", urmată de un adjectiv. [{[{'TAG': 'VBG'}, {'LEMMA':'skill'}]
ar corespunde oricărui verb la gerunziu urmat de skill sau skills.
Spacy are multe atribute pe baza cărora se pot potrivi șabloanele, nu doar cele lingvistice. Se poate potrivi cu tokenuri care seamănă cu numere, URL-uri, e-mailuri. Se poate căuta forma cuvintelor: dacă au majuscule sau semne de punctuație în ele.
Șabloanele reprezintă o modalitate excelentă de a iniția procesul de adnotare, dar nu sunt o metodă infailibilă. Dacă am putea crea un clasificator doar cu ajutorul unor astfel de șabloane, nu am mai avea nevoie de machine learning. Dacă avem puține șabloane, probabil că acestea vor rata multe dintre entitățile pe care dorim să le extragem sau nu vor sugera nicio categorie pentru documente. Pe măsură ce vom continua să adăugăm tot mai multe șabloane, acestea vor începe să se contrazică între ele sau să facă greșeli. Ce se întâmplă dacă cineva caută un dresor de Python (șarpe) pentru o grădină zoologică? Regula naivă de clasificare a anunțurilor de angajare care conțin "Python" ca fiind locuri de muncă în domeniul IT ar face o clasificare greșită. Numele "Paris Hilton" ar fi marcat ca fiind un oraș cu regula de mai sus.
Dar aceste șabloane și reguli pot fi combinate în moduri mai inteligente. Un algoritm de weakly supervised learning (WSL) poate fi utilizat pentru a elimina greșelile și conflictele dintre diferitele reguli, și astfel se obține un set de date adnotate de o calitate mult mai bună.
În WSL, aceste șabloane se numesc labeling functions. Fiecare labeling function fie atribuie unui document o categorie, fie se abține. Labeling functions nu trebuie să fie perfecte, trebuie doar să fie mai bune decât a face clasificări aleatorii.
Fluxul de lucru atunci când se utilizează Rubrix, un program construit pentru a facilita acest tip de adnotare, este de a eticheta mai întâi un mic set de date manual, de obicei aproximativ 100 de documente. Apoi, începeți să vă uitați la documente și să vorbiți cu experți în domeniu pentru a vedea ce reguli și euristici folosesc ei. După ce le implementați, Rubrix le va evalua pe cele 100 de documente etichetate. Va calcula parametri precum coverage (cât de des este aplicată regula), precizia (cât de des o regulă este corectă) și recall (câte documente din clasa dorită sunt găsite de regulă). Se repetă acest lucru până când se obține un coverage suficient de mare a setului de date. Apoi, Rubrix va combina voturile fiecărei labeling function, rezolvând conflictele dintre ele și va produce un set de date de antrenare care poate fi utilizat pentru instruirea unui model normal de machine learning.
WSL este o modalitate excelentă de a extrage cunoștințe de la experții în domeniu, care efectuează de mulți ani sarcinile pe care dorim să le automatizăm cu ajutorul machine learning. De cele mai multe ori, aceștia operează deja folosind diverse euristici și știu ce fel de șabloane apar în date, așa că tot ce trebuie să facem este să codificăm aceste reguli.
Un alt avantaj al acestei abordări este că face ca deciziile modelului de machine learning să fie mai ușor de înțeles. Atunci când se adnotează manual datele, modificarea etichetei unui singur document nu va face o mare diferență în model, dar atunci când se rafinează o regulă, deoarece aceasta afectează un număr mare de documente, va avea un impact imediat asupra modelului, iar utilizatorii vor putea percepe îmbunătățirile. Acest lucru sporește încrederea în modelul de machine learning, care altfel ar fi considerat o cutie neagră. Atunci când apar schimbări în categoriile noastre, din cauza schimbărilor care au loc în lumea reală, regulile pot fi schimbate mai ușor, fără a fi nevoie să se re-adnoteze manual mai multe mii de documente.
Desigur, nu este întotdeauna posibil să se aplice WSL. De exemplu, atunci când se face o analiză a sentimentelor, sentimentul exprimat de un text este foarte nuanțat și este greu să se găsească reguli care să acopere mai mult de câteva exemple.
O altă modalitate de a îmbunătăți adnotarea datelor este de a face alegeri mai bune cu privire la documentele care trebuie să fie adnotate. În mod normal, seturile de date sunt construite prin preluarea documentelor pe măsură ce acestea sosesc sau, dacă există prea multe documente, prin prelevarea unui eșantion aleatoriu din ele.
Dar, uneori, aceasta nu este cea mai bună strategie. În cazul anunțurilor de angajare, se poate întâmpla ca o companie să publice anunțuri pentru același rol, dar în orașe diferite. Aceste anunțuri sunt identice, cu excepția locației. Dacă vom adnota toate anunțurile cu aceeași etichetă, algoritmul de machine learning nu va învăța mai mult decât dacă ar fi văzut doar unul dintre aceste anunțuri. Atunci când încercăm să triem bug reports, atunci când se lansează un feature nou și există unele buguri, multe dintre rapoarte vor fi foarte asemănătoare, astfel încât modelul nu va învăța mai mult dacă va vedea mai multe dintre ele.
Active learning ne ajută să adnotam documentele mai eficient, încercând să alegem documentele într-un mod mai bun. Modelele de machine learning sunt probabiliste, astfel încât, pe lângă clasa sau entitatea pe care o recunosc, acestea emit și o probabilitate: Sunt 90% sigur că este vorba despre sport, sunt 30% sigur că este un nume de persoană. Putem valorifica aceste probabilități și le putem cere adnotatorilor să revizuiască documentele în legătură cu care modelul este cel mai nesigur. În acest fel, modelul va primi mai multe date care îl vor ajuta să învețe cel mai mult.
Fluxul de lucru tipic care utilizează active learning constă în colectarea unui set mare de date neetichetate de documente din domeniul pe care încercați să îl rezolvați. Se adnotează manual un set mic (100-200) de documente. Apoi se antrenează un model de bază de machine learning pe acest set mic de date. Acest model este apoi utilizat pentru a face predicții pentru restul documentelor care sunt încă neetichetate. Utilizând strategii de active learning, cum ar fi eșantionarea bazată pe incertitudinea cea mai mare, se selectează un alt lot de 100-200 de documente care să fie analizate de către adnotatorii umani. Apoi, modelul este re-antrenat și continuăm să repetăm acest lucru până când ajungem la un model suficient de bun.
Prodigy are un suport excelent pentru active learning. Atunci când rulează cu un model, Prodigy îi va solicita adnotatorului doar să accepte sau să respingă o anumită predicție, în loc să fie nevoit să facă predicția de la zero. Acest lucru face ca procesul de adnotare să fie și mai rapid, oferind în același timp o mulțime de informații pentru ca modelul să învețe.
În această postare am văzut câteva dintre noile tehnici și strategii care pot fi utilizate pentru a aduna mai rapid date pentru a rezolva diverse sarcini de procesare a limbajului natural. Combinate cu progresele modelelor ML pe care le-am prezentat în postarea anterioară, proiectele de clasificare a textului sau de recunoaștere a entităților numite pot fi implementate cu o precizie ridicată în câteva zile sau săptămâni, nu luni ca până acum.
În ultimul articol din această serie, vom analiza încotro se îndreaptă domeniul NLP, care sunt modelele de ultimă generație folosite de marile companii precum Google și OpenAI și cum ne putem aștepta să rezolvăm problemele complet diferit în 2-3 ani.
de Ovidiu Mățan
de Ovidiu Mățan
de Vlad Petrean
de Ovidiu Mățan