Embedding fjalë

Ky postim në blog është i përkushtuar për të shpjeguar futjen e fjalëve, një pjesë thelbësore përpara se të aplikoni ndonjë rrjet nervor për të zgjidhur problemet e klasifikimit të tekstit. Në pjesën 1, shpjegova "Naive Bayes", një klasifikues linear. Disa klasifikues të tjerë linearë që janë gjithashtu të dobishëm në klasifikimin e tekstit janë Lregresioni ogistikdhe Makinat e vektorit mbështetës (SVM). Teoria pas SVM u diskutua në "postimin tim të mëparshëm në blog". Ndërsa regresioni logjistik është shumë i popullarizuar në shumë detyra të mësimit të makinerive, vendosa të mos shpenzoj një postim të tërë në blog për ta mbuluar atë. Tashmë ishte mbuluar shumë mirë në shumë postime në blog. Në këtë, unë dua të theksoj rëndësinë e futjes së fjalëve dhe sa i zbatueshëm është ai në zgjidhjen e shumë problemeve të botës reale. Një keqkuptim i zakonshëm që kam dëgjuar nga shumë shkencëtarë të të dhënave është se ata mendojnë se algoritmet NLP mund të përdoren vetëm për problemet NLP. Kjo nuk është e vërtetë, dhe unë do t'ju jap disa ide më poshtë.

Vektorë fjalësh

Kur përpunoni tekstin ose të dhënat e vargut, kodimi i vetëm është një metodë e zakonshme për të kthyer tekstin në numra. Është vektori i fjalës së parë dhe më i thjeshti. Çdo fjalë përfaqësohet si një identitet plotësisht i pavarur.

Me njohuritë bazë të matematikës, mund të shihni se këta vektorë nuk kanë ngjashmëri. Nëse merrni produkte pikash të 2 vektorëve fjalësh, rezultati është 0. Megjithatë, kjo nuk është e vërtetë për gjuhën tonë. Për shembull, molla dhe portokalli duhet të jenë më të lidhura se molla dhe zebra.

Përfshirja e fjalës

Kjo çon në idenë e ngulitjes së fjalëve. Le të imagjinojmë se mund të keni një hapësirë ​​me dimensione të larta ku fjalët që janë të ngjashme në një kuptim do të jenë afër njëra-tjetrës në atë një dimension specifik. Ju mund ta konsideroni çdo fjalë si një vëzhgim dhe mund të përfaqësohet nga karakteristika të shumta. Çdo veçori mund të jetë një kuptim i fjalës në një kontekst specifik. Për shembull, molla mund të jetë marka Apple ose një frut. Problemi i ndërtimit të një matrice me shumë variabla kategorike si kjo është se matrica mund të jetë e madhe dhe shumë e lirë. Pra, pyetja është: si mund t'i nxjerrim faktorët latente? Një qasje e zakonshme është dekompozimi i matricës (PCA, SVD, etj.). Në këtë kontekst, ne do të fokusohemi në SVD.

Ekzistojnë 2 mënyra të përdorura shpesh për të formuar një matricë fjalësh në mënyrë që të nxirret futja duke përdorur SVD, duke përfshirë matricën e dokumentit fjalë dhe matricën e bashkë-ndodhjes së bazuar në dritare. Për matricën fjalë-dokument, supozojmë se fjalët që lidhen shpesh do të shfaqen në të njëjtat dokumente. Kështu, ne përdorim numërimin e secilës fjalë në çdo dokument këtu. Fatkeqësisht, kjo metodë është shumë joefikase pasi llogaritja do të shkallëzohet me numrin e dokumenteve. Alternativa është një matricë bashkë-ngjarjeje e bazuar në dritare. Në këtë qasje, ne numërojmë numrin e herëve që një fjalë është rreth fjalës me interes në madhësinë e dritares së paracaktuar. Le të supozojmë se kemi 3 fjali në korpusin tonë dhe madhësia e dritares është 1.

  1. Më pëlqen të fluturoj.
  2. Më pëlqen NLP.
  3. Më pëlqen të mësuarit e thellë.

Tani mund të krijojmë matricën si më poshtë.

Ne mund të aplikojmë SVD në matricën X të mësipërm dhe të zgjedhim vetëm vektorët e parë k njëjës për të zvogëluar dimensionin e matricës X.

Megjithatë, vini re se llogaritja e SVD-së është shumë e shtrenjtë, veçanërisht kur matrica është e madhe, O(mn²) për një matricë mx n. Përveç kësaj, matrica X është gjithashtu shumë e lirë sepse shumica e fjalëve nuk ndodhin bashkë, duke çuar në probleme me ruajtjen. Është gjithashtu mjaft e vështirë të përfshihen fjalë të reja dhe/ose dokumente të reja me këtë metodë. Si rezultat, metodat e bazuara në përsëritje u preferuan.

Algoritmi Word2Vec

Word2Vec u zhvillua fillimisht në Google. Është një algoritëm klasik, por është ende i popullarizuar në praktikë, pavarësisht nga shfaqja e ngulitjeve të bazuara në transformatorë. Ideja e përfaqësimit të fjalëve sipas kontekstit të tyre vjen nga "Ju do të dini një fjalë nga kompania që mban" (J. R. Firth 1957: 11). Supozoni se keni një fjalë 'qendër' c dhe një madhësi dritareje prej 2. Ato fjalë që shtrihen në këtë dritare kontekstuale quhen 'fjalë të jashtme'. Për shembull, në figurën më poshtë, fjala qendrore është "në" dhe fjalët e jashtme janë "probleme", "kthim", "bankë" dhe "kriza".

Ideja e Word2Vec mund të përmblidhet si më poshtë:

  1. Ne kemi një korpus të madh.
  2. Ne mund të përfaqësojmë çdo fjalë në një fjalor fiks si një vektor.
  3. Ne përsërisim çdo pozicion t në tekst që ka një fjalë në qendër c dhe fjalë të jashtme o.
  4. Ne llogarisim probabilitetin e o të dhënë c (ose anasjelltas) duke llogaritur ngjashmërinë e vektorëve të fjalëve për c dhe o.
  5. Më pas vazhdojmë të ndryshojmë vektorët e fjalëve derisa të maksimizohet probabiliteti i një fjale duke pasur parasysh kontekstin e saj.

Këtu ka 2 variante modeli: Skip-gram— parashikoni fjalët 'jashtë' me një fjalë qendrore — dhe Cantinuous Bag of Words (CBOW)— parashikoni një fjalë qendrore nga 'jashtë ' fjalët.

Meqenëse mendoj se skip-gram është më e vështirë për t'u kuptuar, unë do të kaloj në matematikën e këtij algoritmi këtu.

xₒ është skalar dhe mund të konsiderohet si ngjashmëri e vektorit uₒ dhe v_c. Ne duam të llogarisim probabilitetin që fjala o të jetë një fjalë "jashtë" për c.

Këtu, uₒ është vektori "jashtë" që përfaqëson fjalën e jashtme o dhe v_c është vektori "qendër" që përfaqëson fjalën qendrore c. Ata janë vektorë kolonash me 2 matrica U dhe V. Edhe U dhe V përmbajnë një vektor për çdo fjalor w ∈. Për të mësuar ngjashmërinë, duhet të gjenerojmë një funksion objektiv. Ne përdorim një supozim Naive Bayes këtu, duke supozuar se të gjitha fjalët e jashtme janë plotësisht të pavarura duke pasur parasysh fjalën qendrore. Më pas mund të llogarisim humbjen Naive Softmax si më poshtë:

Këtu w është o kur y_w = 1 dhe pjesa tjetër është 0. Mund të shihni se distanca midis fjalës së jashtme o dhe fjala qendrore c nuk ka rëndësi. Skip-gram trajton çdo fjalë kontekstuale në mënyrë të barabartë.

Më pas, duhet të llogarisim gradientët e kësaj humbjeje.

Kur kemi një korpus të madh, përmbledhja e të gjithë fjalorit është e pamundur nga pikëpamja llogaritëse. Kështu, ne duhet të përafrojmë funksionin objektiv duke përdorur Sampion Negativ.

Supozoni se K mostrat negative (fjalët) janë nxjerrë nga fjalori, dhe o ∉ {w₁, …, w_K}. Për një fjalë qendrore c dhe një fjalë të jashtme o, funksioni i humbjes është më poshtë. Ideja është që të maksimizohet probabiliteti i fjalës së jashtme reale duke minimizuar probabilitetin e fjalëve të rastësishme të dhëna në qendër të fjalës.

Ne mund të llogarisim gradientët për këtë humbje si më poshtë:

Për të minimizuar funksionin e humbjes, ne mund të përdorim zbritjen e gradientit ose zbritjen stokastike të gradientit për të përditësuar parametrat e panjohur në çdo përsëritje.

Doreza

GloVe kombinon më të mirën nga të dyja metodat e përshkruara më sipër për të gjetur futjen e fjalëve (bazuar në numërim me faktorizimin e matricës dhe të bazuar në dritare të cekëta si gram skip). Është një model i peshuar i katrorëve më të vegjël që stërvitet në numërimin global të bashkë-ndodhjes fjalë-fjalë. Ai arriti një performancë të shkëlqyer në atë kohë në detyrën e analogjisë së fjalëve dhe disa detyra të ngjashmërisë së fjalëve.

Rreth 4 vjet më parë, përdorimi i GloVe embedding si shtresa e parë në modelin tuaj RNN ishte praktikë e zakonshme. Në atë kohë konsiderohej si më i fundit. Modeli është i shpejtë i trajnimit dhe i shkallëzueshëm në korpora të mëdha. Ai gjithashtu mund të arrijë performancë të mirë edhe me korpus të vogël dhe vektorë të vegjël.

Rreth 3 vjet më parë e deri më tani, ka shumë të ngjarë të dëgjoni më shumë për përdorimin e një modeli gjuhe të trajnuar paraprakisht, si BERT, GPT, XLNet, etj, për të krijuar një shtresë të futjes së fjalëve për të gjitha detyrat NLP në vend që të përdorni GloVe ose Word2Vec. Megjithatë, unë ende mendoj se kjo njohuri është e rëndësishme për t'u kuptuar për aplikime të tjera që do të diskutoj më poshtë.

Aplikime/Sugjerime për të provuar

  1. Krijimi i një shtrese ngulitjeje për grupimin e algoritmeve. Uber Marketplace përdor këtë teknikë për të grumbulluar rajonet e tyre të tregut. Detajet mund të gjenden nën "Të mësosh Word2Vec Embeddings për gjenerimin e Hexcluster".
  2. Krijimi i një ngulitjeje për të dhëna kategorike në vend të përdorimit të kodimit të vetëm. Kjo qasje u prezantua nga "fastai" dhe fitoi "Kaggle garat".
  3. Krijimi i një ngulitjeje listimi për të përmirësuar rekomandimet e ngjashme të listimit dhe personalizimin në kohë reale në renditjen e kërkimit. Airbnb përdori teknikën e kampionimit negativ me idenë e listimit qendror dhe listimeve të kontekstit.

Kjo është ajo për momentin. Çdo koment apo sugjerim do të vlerësohej shumë.

Referenca:CS224n - Përpunimi i gjuhës natyrore me mësim të thellë nga Stanford.