Kuinka neuraalisen ydinmallin kouluttaminen— Neuralcoref 2

Linkit: Githubin online-esittely: https://github.com/huggingface/neuralcoref ja edellinen Medium-viestimme.

Viimeiset kuukaudet ovat olleet melko intensiivisiä HuggingFacessa crazy hullu käytön kasvulla ja kaikilla on vaikeita töitä pysyäkseen mukana , mutta onnistimme vihdoin vapauttamaan jonkin aikaa ja päivittämään avoimen lähdekoodin kirjastomme Neuralcoref julkaisemalla harjoituskoodin samaan aikaan.

Sen jälkeen kun julkaisimme v1 viime kesänä, yli kymmenen miljoonaa ydinkeskustelua on ratkaistu Hugging Face -palvelussa. Lisäksi meille on selvää, että muutama yritys ja jotkut todella älykkäät tutkijat käyttävät nyt kirjastomme tuotannossa, ja työmme esiteltiin Stanfordin NLP-kurssin viimeisimmässä istunnossa!

Harjoituskoodi on päivitetty toimimaan sekä PyTorch (v0.3): n että spaCy v2.0: n uusimpien versioiden kanssa, kun taas esiopetettu malli riippuu vain Numpy- ja spaCy v2.0 -versioista.

Tämän julkaisun tärkeä virstanpylväs: Voit nyt kouluttaa ral Neuralcoref-tiedoston omassa tietojohdossasi - esimerkiksi jollakin muulla kielellä kuin englannilla! - edellyttäen, että sinulla on merkitty tietojoukko.

Olemme lisänneet lukuluetteloon erityisen osan toisen kielen koulutuksesta, samoin kuin yksityiskohtaiset ohjeet mallin hankkimisesta, käsittelemisestä ja kouluttamisesta englanniksi OntoNotes 5.0 -aineistossa.

Kuten aiemmin, Neuralcoref on suunniteltu saavuttamaan hyvä tasapaino tarkkuuden ja nopeuden / yksinkertaisuuden välillä käyttämällä sääntöpohjaista mainintunnistusmoduulia, rajoitettua määrää ominaisuuksia ja yksinkertaista eteenpäin suuntautuvaa hermoverkkoa, joka voidaan helposti toteuttaa Numpyssa.

Jäljempänä tässä blogiviestissä kuvaan, kuinka ytimen erottelukykyinen järjestelmä toimii ja kuinka sitä voidaan kouluttaa. Coreference-resoluutio on melko monimutkainen NLP-tehtävä niin paljain kanssani, et tule katumaan!

Katsotaanpa nopeasti (julkinen) tietojoukko

Hyvälaatuinen julkinen tietoaineisto, jonka avulla voit kouluttaa mallia englanniksi, on CoNLL 2012 -aineisto. Se on yksi suurimmista vapaasti saatavilla olevista tietojoukoista, joissa on ydinmerkinnät, ja sillä on noin 1,5 M + -merkkiä, jotka kattavat monia aloja, kuten uutisjohdot, lähetys- ja puhelinkeskusteluet sekä verkkotiedot (blogit, uutisryhmät jne.).

Repossa selitämme, kuinka ladata ja valmistella tämä tietojoukko, jos haluat käyttää sitä. Kun olet valmis, tyypillinen CoNLL-tiedosto näyttää tältä:

Ote CoNLL 2012 -tietotiedostosta “cctv_0005.v4_gold_conll”

Tämä ote sisältää 2 virkettä: “Kyllä, huomasin, että monet ystäväni ympärilläni saivat sen” ja “Näyttää siltä, ​​että melkein kaikki saivat tämän tekstiviestin”

Lauseet merkitään tokenoiksi ja merkitään sarakkeessa 4 olevilla merkinnöillä ja suurella määrällä merkintöjä: POS-tunnisteet (sarake 5), jäsentävä puu (sarake 6), verbit lemma (sarake 7), puhuja (sarakkeessa 10) ja mitä me olemme erityisen kiinnostuneita viimeisen sarakkeen rinnakkaisviitteistä (tarrat 12, 119 riveillä 5, 12, 14, 23 ja 24). Tässä otteessa merkinnällä ”I” viitataan rinnakkain ”minen” (heillä on sama kokonaisuuden etiketti 12) ja “se” viittauksella samanaikaisesti “tämän tekstiviestin” kanssa (merkki 119).

Voit myös huomata, että vain maininnat, joissa on ainakin yksi rinnakkaisviittaus, on merkitty tietojoukkoon (ts. Ainakin pari mainintaa, jotka viittaavat samaan kokonaisuuteen). Yksikön maininnat yksiköstä, ilman että muissa maininnoissa viitataan samaan kokonaisuuteen, ei ole merkitty.

Tämä on hiukan ärsyttävää, koska se tarkoittaa, että emme voi täysin arvioida (ja helposti kouluttaa) ydinjärjestelmän mainitsemisen tunnistusmoduulia (tarkkuuden, palautuksen ja F1-metrien avulla). Voimme kuitenkin silti tarkastella rinnakkaisviittausten palauttamista, kuten mainitsemme github-repo-julkaisussa.

Ytimen moduulin työnkulku

Prosessimme ensimmäinen askel on potentiaalisten mainintojen poimiminen. Neuralcoref käyttää sääntöpohjaista maininta-poiminto -toimintoa tähän operaatioon ja saada kahden lauseen esimerkissä:

Riippuen sääntöpohjaisen maininnan poimijan ja lauseen jäsennyspuun selektiivisyydestä, se voi myös kaapata muutaman isomman maininnan, kuten ”monet ystävät, minua ympäröivät vastaan” tai “melkein kaikki saivat tämän tekstiviestin”. Pidetään tässä vain lyhyet maininnat yksinkertaisuuden vuoksi.

Jokainen maininta voi viitata useiden aiempien mainintojen kanssa. Voimme koota kaikki maininnat mainintaparipöytään korostaakseen viittausparit (taulukossa ∅ tarkoittaa, että maininta ei ole yhtään yhtään aikaisemman maininnan kanssa).

Taulukko ylimääräisiä mainintapareja kahden lauseen esimerkillemme (positiiviset etiketit punaisella)

Huomaa, että he voivat olla useampia kuin yksi rinnakkaisviite edeltäjä tietylle maininnalle (ts. Useita punaisia ​​ruutuja yhdellä rivillä pöydällämme), muodostaen ryhmiä rinnakkaisviittausten maininnoista (rinnakkaisviittauksen resoluutio on klusterointitehtävä).

Voimme jo nähdä joitain ongelmista, joita syntyy mallia koulutettaessa tällaisista tiedoista, nimittäin siitä, että (i) jokaisella maininnalla on erilainen lukumäärä potentiaalisia edeltäjiä, mikä vaikeuttaa eräajoa (mainintaparevektorimme koko kattaa kaikki välillä 0 - N asiakirjassa mainittujen mainintojen kokonaismäärä), ja (ii) mainintapareiden taulukko on tyypillisesti asteikolla cN, missä c on keskimääräinen mainintojen lukumäärä jokaisessa tietojoukon asiakirjassa, ja siitä voi tulla melko suuri.

Käytännössä sääntöpohjainen mainintapurkajamme identifioi noin miljoonan potentiaalisen maininnan CoNLL 2012 -koulutusjoukosta. Tuloksena on noin 130 miljoonaa mainintaparia mallin kouluttamiseksi.

Kun olemme löytäneet mahdolliset maininnat ja etiketit heille (punainen ruutu taulukossamme), voimme purkaa joukon ominaisuuksia jokaiselle maininnalle ja jokaiselle mainintaparille. Katsotaanpa ominaisuuksia, joita me poimimme:

Otetuista ominaisuuksista maininnat ja mainintaparit. Spanvektorit ovat ennalta laskettuja sanamarkkinoiden keskiarvoja.

Vaikuttaa siltä, ​​että tarvitsemme paljon ominaisuuksia, mutta yksi Neuralcorefin eduista on oikeastaan ​​sen vähentynyt ominaisuuksien lukumäärä - jotkut ytimen erottelukykyjärjestelmät käyttävät jopa +120 ominaisuutta! Toinen etu on, että suurin osa näistä ominaisuuksista ei ole riippuvaisia ​​jäsentäjästä tai ylimääräisistä tietokannoista (kuten sanan sukupuoli / numero) ja niiden laskeminen on helppoa / nopeaa.

Käytännössä ominaisuudet ovat joukko reaaliarvoisia vektoreita (esim. Spanvektorit, jotka ovat keskimäärin sanavektoreita eivätkä ole koulutetut), kokonaislukuja (esim. Sanakirjojen sanan indeksit, luokitteluindeksit) ja loogisia (esim. ”Sisäkkäisiä”) ? ”Tarkoittaa, sisältyykö pari maininta toiseen).

Oikeiden arvojen, kokonaisluku- ja boolean-ominaisuuksien sekoitus voi aiheuttaa suuria numpy-taulukkoja, jos keräämme ne vain yhteen taulukkoon (kokonaisluku ja boolean muunnetaan kelluviksi). Joten tallennamme ne erillisiin ryhmiin ja rakennamme ominaisuusryhmiä oikeaan aikaan syöttämällä hermoverkkoa (katso DataLoader-koodi dataset.py).

Olemme suorittaneet esikäsittelyvaiheet. Nämä vaiheet toteutetaan conllparser.py ja document.py -koodissa Neuralcoref.

Käytämme nyt näitä ominaisuuksia mallimme kouluttamiseen!

Pikakatsaus hermoverkkomalliin

Kuten aina, hermoverkkomalli on ilo kirjoittaa pyTorchiin, joten kopioin sen täällä kokonaan (poistin juuri painotalustus- / lataustoiminnot).

Malli käsittää yhteisen upotuskerroksen, self.embed, joka muuntaa sanan indeksit sanavektoreissa ja syöttää kaksi rinnakkaista feed-forward-verkkoa:

  • self.single käyttää syötteinä sanan vektoreita, välejä ja lisäominaisuuksia (katso yllä) maininnasta ja laskee pistemäärän, jolla sillä ei ole muuta rinnakkaisviittausta (pisteen score merkki),
  • self.pairs ottaa syötteinä sanavektorit, maininnan ja edeltäjän tunnusmerkit ja piirteet yhdessä pariominaisuuksien kanssa ja laskea pistemäärän, jonka mainitsemat parit viittaavat.

Joten kuinka me koulutamme tätä kauneutta?

Harjoitetaan ydinhermoverkko

Ensinnäkin sana mini-panostamisesta. Puhuimme ongelmasta, että jokaisessa maininnassa on eri määrä paria. Yksi tapa käyttää pieneroja tällaisissa olosuhteissa on pakata minierät seuraavasti:

  • Lajittele koulutuksessa olevat maininnat potentiaalisten edeltäjien lukumäärän mukaan (parin taulukon kunkin rivin pituus),
  • Määritä enimmäismäärä paria P minieräksi ja
  • Leikkaa lajiteltu harjoitusjoukko inP-minierässä, täyttämällä mainintaparit jokaisessa minierässä mini-erässä olevien parien enimmäismäärään (pisin rivi, eli lajiteltujen tietojoukkojen viimeinen rivi).

Neuralcoref-sovelluksessa tämä tehdään dataset.py-moduulilla, joka lataa ja rakentaa tietojoukon ja katalysaattorin sellaisilla pehmustetuilla minierillä.

Esimerkki Neuralcoref-arviointitietoista koulutuksen aikana

Kun minierämme ovat valmiit, voimme aloittaa harjoittelun.

Harjoittelu käydään läpi kolme peräkkäistä harjoitteluvaihetta: Kaikki parit, Yläparit ja Ranking.

Perustimme hyvin yksinkertaisen aikataulukaavion pitääksemme harjoituksen nopeana: joka kerta, kun kehysmittarimme lakkaa kasvamasta, siirrymme seuraavaan vaiheeseen.

Kaksi ensimmäistä vaihetta käyttävät todennäköisyyshäviötä (risti-entropia), kun taas viimeisessä vaiheessa käytetään löysästi mitoitettua sijoitushäviötä. Tarkemmin sanottuna tappiomme jokaisella harjoittelujaksolla näyttävät tältä:

𝓣 (m) on joukko oikeita edeltäjiä maininnalle m, 𝓕 (m) väärät edeltäjät ja 𝓐 (m) kaikki edeltäjät (mukaan lukien ∅).

Kaikki parit tappio on tavanomainen risti-entropiahäviö kaikissa mainintapareissa. Yläparien tappio on myös risti-entropia, mutta rajoittuu maininnan (tällä hetkellä) parhaan pistemäärän oikeisiin ja vääriin edeltäjiin. Viimeiseksi, Ranking-tappio on maksimimarginaalitappio, jonka kustannuslaskenta on hidas Δ.

Saadaksesi lisätietoja, sinun kannattaa tarkistaa Kevin Clarkin ja Christopher Manningin vuonna 2016 julkaisema erittäin hieno teos (katso Kevin Clarkin ja Christopher D. Manningin syvävahvistusoppimiskertoimen mallien syventävä oppiminen, EMNLP 2016, Coreference Resolution parantaminen) Kevin Clarkin ja Christopher D. Manningin opiskeluyksikkötason hajautetut edustajat, ACL 2016 ja siihen liittyvät viitteet), joihin mallimme on mukautus.

Yksityiskohtaiset tiedot ja muut on annettu näissä julkaisuissa, jotka sinun tulee ehdottomasti lukea, jos olet kiinnostunut tästä mallista.

Tämä koulutus toteutetaan oppimahdollisuuksissa koodissa Neuralcoref.

Joten toivon, että tämä antaa sinulle hyviä intuitioita siitä, kuinka tämä melko harvinainen peto toimii.

Tärkeintä on, että asennamme todella mukavan ja nopean esittelyn, joten älä epäröi kokeilla ydinjärjestelmää itse!

Älä epäröi haaroittaa koodia ja käyttää sitä projekteissasi. Toivottavasti pidit siitä ja kerro meille kuinka käytät sitä