Kuidas neuraalse tuumemudeli välja õpetada - Neuralcoref 2

Lingid: Veebidemo Githubi repo: https://github.com/huggingface/neuralcoref ja meie eelmine Keskmine postitus.

Viimased kuud on olnud HuggingFace'is intense hullu kasutamise kasvuga ja kõigil on raske vaeva näha, et sellega sammu pidada , kuid lõpuks õnnestus meil vaba aega ja uuendada avatud lähtekoodiga raamatukogu Neuralcoref, avaldades samal ajal koolituse koodi samal ajal.

Pärast v1 eelmisel suvel turule toomist on Hugging Face'is lahendatud enam kui kümme miljonit tuumikut. Samuti on meile teada, et meie raamatukogu kasutavad tootmises nüüd veel mõned ettevõtted ja mõned tõeliselt nutikad teadlased ning meie tööd kajastati Stanfordi NLP kursuse viimases sessioonis!

Treeningkoodi on värskendatud nii PyTorchi (v0.3) kui ka spaCy v2.0 uusimate väljalasetega töötamiseks, samal ajal kui eelkoolitatud mudel sõltub ainult Numpy ja spaCy v2.0-st.

Selle väljaande peamine verstapost: nüüd saate treenida ral Neuralcorefi enda andmestikus - nt muus keeles kui inglise keeles! - tingimusel, et teil on märkustega andmestik.

Oleme readmesse lisanud spetsiaalse jaotise teise keele koolituse kohta ning üksikasjalikud juhised mudeli hankimiseks, töötlemiseks ja koolitamiseks inglise keeles OntoNotes 5.0.

Nagu varemgi, on Nuralcoref loodud hea tasakaalu leidmiseks täpsuse ja kiiruse / lihtsuse vahel, kasutades reeglipõhist mainimise tuvastusmoodulit, piiratud arvu funktsioone ja lihtsat edasisuunamisnärvivõrku, mida saab rakenduses Numpy hõlpsalt rakendada.

Ülejäänud selle ajaveebi postituses kirjeldan, kuidas südamiku eraldusvõime süsteem töötab ja kuidas seda koolitada. Coreference lahutamine on üsna keeruline NLP ülesanne nii minuga paljalt te ei kahetse!

Vaatame kiiresti (avalikku) andmekogumit

Hea kvaliteediga avalik andmestik, mida saate kasutada mudeli koolitamiseks inglise keeles, on CoNLL 2012 andmestik. See on üks suurimaid vabalt saadaolevaid andmekogumeid koos südamikumärkustega, millel on umbes 1,5 miljonit + märki, mis hõlmavad paljusid valdkondi, näiteks uudistejuhet, saate- ja telefonivestlusi ning veebiandmeid (ajaveebid, uudistegrupid ...).

Repos selgitame, kuidas seda andmestikku alla laadida ja ette valmistada, kui soovite seda kasutada. Kui olete sellega hakkama saanud, näeb tüüpiline CoNLL-fail välja selline:

Väljavõte CoNLL 2012 andmestiku failist „cctv_0005.v4_gold_conll”

See väljavõte sisaldab 2 lauset: “Jah, ma märkasin, et paljud mu sõbrad said seda minu ümber” ja “Tundub, et peaaegu kõik said selle SMS-i”

Laused on märgistatud ja märgistatud koos 4. veerus olevate märkidega ja suure hulga märkustega: POS-sildid (5. veerg), parsimispuu (6. veerg), tegusõnad lemma (7. veerg), kõneleja (10. veerg) ja mis me oleme eriti huvitavad viidete viited viimases veerus (sildid 12, 119 ridadel 5, 12, 14, 23 ja 24). Selles väljavõttes märgitakse “I” koos viidetega “minule” (neil on sama olemimärgis 12) ja “see” kui kaasviidetav “sellele SMS-ile” (silt 119).

Samuti võite märgata, et andmekogumis on sildistatud ainult need mainid, millel on vähemalt üks kaasviide (st vähemalt üks ja sama olemile viitav mainimispaar). Üksuse üksikuid mainimisi, ilma et ükski sama üksus viitaks muule, ei märgita.

See on mõnevõrra tüütu, kuna see tähendab, et me ei saa täielikult hinnata (ja hõlpsalt treenida) oma tuumtsüsteemi mainimistuvastuse moodulit (täpsuse, tagasikutsumise ja F1 mõõdikutega). Saame siiski vaadata ka kaasviitamiste tagasikutsumist, nagu mainime githubi repos.

Südamikmooduli töövoog

Meie protsessi esimene samm on võimalike mainimiste väljavõtmine. Neuralcoref kasutab selle toimingu jaoks reeglitel põhinevat mainimise-ekstraheerimise funktsiooni ja saadakse meie kahe lause näites:

Sõltuvalt reeglipõhise mainimismeetodi ja meie lause jaoks parsepuu valimisest võib see hõlmata ka mõnda suuremat mainimist, näiteks „paljud sõbrad said mu ümber” või „peaaegu kõik said selle SMSi”. Pidagem siin lihtsuse huvides ainult lühikesi mainimisi.

Iga mainimine võib viidata mitmele varasemale mainimisele. Saame koguda kõik mainimised mainimispaaride tabelisse, et esile tuua kaasviidavad paarid (tabelis ∅ tähendab, et mainimine ei hõlma ühtegi varasemat mainimist).

Tabel peamiste mainimispaaride kohta meie kahe lause näites (punased positiivsed sildid)

Pange tähele, et nende mainitud nimetuste jaoks võib olla mitu kui ühte kaasviidavat eelkäijat (st mitu punast kasti ühel real meie laual), moodustades kaasviidavate mainimiste klastrid (koosviitamise resolutsioon on klastrimisülesanne).

Näeme juba mõnda probleemi, mis selliste andmetega mudeli väljaõppimisel üles kerkib, nimelt et (i) igal mainimisel on erinev arv potentsiaalseid eelnevaid isikuid, mis raskendab pakkimist (meie mainimispaaride vektori suurus hõlmab kõiki vahemikus 0 kuni N dokumendis mainitavate üldarvude arv) ja (ii) mainimispaaride tabel skaleeritakse tavaliselt cN-ga, kus c on andmekogu iga dokumendi keskmine mainimiste arv ja see võib muutuda üsna suur.

Praktikas tuvastab meie reeglipõhine mainimisseade CoNLL 2012 koolituskomplektis umbes 1 miljon potentsiaalset mainimist, mille tulemuseks on umbes 130 miljonit mainimispaari, et meie mudelit koolitada.

Kui oleme tuvastanud nende jaoks potentsiaalsed mainimised ja sildid (meie tabeli punane kast), saame iga mainimise ja iga mainitava paari jaoks eraldada funktsioonide komplekti. Vaatame funktsioone, mida me ekstraheerime:

Väljavõtete funktsioonid mainimiseks ja mainimispaaride jaoks. Span vektorid on sõnavektorite eelnevalt arvutatud keskmine.

Võib tunduda, et vajame palju funktsioone, kuid Neuralcorefi üks eelis on tegelikult selle vähendatud funktsioonide arv - mõned tuuma eraldusvõime süsteemid kasutavad kuni +120 funktsiooni! Teine eelis on see, et enamik neist funktsioonidest ei sõltu parserist ega täiendavatest andmebaasidest (nt sõna sugu / arv) ja neid on lihtne / kiire arvutada.

Praktiliselt on funktsioonideks hulk reaalväärtusega vektoreid (nt span vektorid, mis on sõnavektoritest keskmiselt kõrgemad ja mida ei koolitata), täisarvude (nt sõna indeksid sõnastikus, kategoorilised indeksid) ja tõeväärtuste (nt „pesastatud”) jaoks ? ”Näitab, kas paar mainitakse teises).

Reaalsete väärtuste, täisarvude ja loogiliste tunnuste segu võib põhjustada suuri tuhmi massiive, kui me lihtsalt koondame need ühte massiivi (täisarv ja loogiline väärtus teisendatakse ujukiteks). Seega salvestame need eraldi massiividesse ja ehitame funktsioonimassiivid õigel ajal, kui toidame närvivõrku (vt DataLoaderi koodi andmest.py).

Oleme teinud eeltöötlusetapid. Neid samme rakendatakse koodides Neuralcoref conllparser.py ja document.py.

Kasutagem neid funktsioone meie mudeli koolitamiseks!

Neuraalvõrgu mudeli kiire ülevaade

Nagu ikka, on neuraalvõrgu mudelil pyTorchis kirjutamine rõõm, nii et kopeerin selle täies mahus siia (eemaldasin just kaalude lähtestamise / laadimise funktsioonid).

Mudel sisaldab ühist manustamiskihti, self.embed, mis muudab sõnavektorites sõnaindeksid ja toidab kahte paralleelset edasisuunamisvõrku:

  • self.single sisendina kasutatakse mainimise sõnavektoreid, pikkusi ja lisafunktsioone (vt ülal) ja arvutatakse skoor, et sellel pole ühtegi muud kaasviidavat mainimist (skoor score sildina),
  • self.pairs võtab sisendina sõnavektorid, mainimise ja eelneva tunnusjooned ja tunnused koos paariliste omadustega ning arvutab skoori, millele mainitud paar viitab.

Niisiis, kuidas me seda ilu koolitame?

Treeningu südamiku närvivõrk

Esiteks, sõna minisegust. Rääkisime probleemist, et iga mainimise jaoks on erinev arv paare. Üks võimalus minisegmentide kasutamiseks sellistes tingimustes on minipartiide pakkimine järgmiselt:

  • Sorteerige treeningus mainitud kogumid nende potentsiaalsete eelkäijate arvu järgi (meie paaritabeli iga rea ​​pikkus),
  • Määratlege minipartii jaoks maksimaalne paaride arv P ja
  • Tükeldage sorteeritud treeningkomplekt miniP-minipartiidena, polstrides mainimispaarid igas minipartitsioonis maksimaalse paaride arvuga minipartiis (pikim rida, st viimane sort meie sorteeritud andmestikus).

Rakenduses Nuralcoref teeb seda moodul dataset.py, mis laadib ja konstrueerib selliste polsterdatud minikomplektidega andmekogu ja katalüsaatori.

Näide Neuralcorefi hindamismõõdikust koolituse ajal

Kui meie minipartiid on valmis, saame hakata treenima.

Treening läbib kolm järjestikust treeningfaasi: kõik paarid, parimad paarid ja paremusjärjestus.

Seadsime treeningu kiireks pidamiseks kokku väga lihtsa ajakava: iga kord, kui meie mõõteseadme püstitatud mõõtmine lakkab tõusmast, liigume järgmisele etapile.

Esimeses kahes faasis kasutatakse tõenäosuskaod (rist-entroopia), samas kui viimases faasis kasutatakse mõõduka suurusega paremusjärjestust. Täpsemalt, meie kaotused igas treeningfaasis näevad välja järgmised:

𝓣 (m) on m-i mainitud tõeliste eelkäijate kogum, 𝓕 (m) vale-eelsete ja 𝓐 (m) kõigi eelnevate (sealhulgas ∅).

Kõikide paaride kaotus on standardne rist-entroopia kaotus kogu mainitud paaride komplekti korral. Parimate paaride kaotus on samuti rist-entroopia, kuid piirdub (praegu) mainimise tõeliste ja valede eelnevate (praegu) edetabelite tipptasemel. Lõpuks on edetabeli kaotus maksimaalse marginaali kaotus madala tariifiga madalama hinnaga Δ.

Lisateabe saamiseks peaksite tutvuma Kevin Clarki ja Christopher Manningi 2016. aastal ilmunud väga toreda tööga (vt Kevin Clarki ja Christopher D. Manningu süvatugevdamise õppimist mainimisjärjekorraga Coreference mudelite jaoks, EMNLP 2016, Coreference Resolution parandamine). Kevin Clarki ja Christopher D. Manningi õppimisüksuse tasemel hajutatud esindused, ACL 2016 ja nendes sisalduvad viited), millele meie mudel on kohandatud.

Üksikasjalikud üksikasjad ja palju muud on nendes väljaannetes, mida peaksite kindlasti lugema, kui olete sellest mudelist huvitatud.

See koolitus on rakendatud saidil learning.py koodis Neuralcoref.

Nii et ma loodan, et see annab teile mõned head intuitsioonid selle üsna haruldase metsalise toimimise kohta.

Mis kõige tähtsam, seadistame tõeliselt toreda ja kiire demo, nii et ärge kartke proovida ka südamikussüsteemi ise!

Ja ärge kõhelge sellest, et koodi on vaja kasutada ja seda oma projektides kasutada. Loodetavasti meeldis see ja andke meile teada, kuidas te seda kasutate