Hogyan képeztünk ki egy nagyszabású kulcsszó-szöveg modellt ingatlanokiratok holland nyelvű összeállításához

Az alapötlet

A mesterséges neurális hálózatokkal történő szöveggenerálás vagy a neurális szöveggenerálás nagyon népszerűvé vált az elmúlt néhány évben. A nagyszabású transzformátornyelvi modellek, mint például az OpenAI’s GPT-2/3 lehetővé tették nagyon meggyőző szöveg létrehozását, amely úgy néz ki, mintha ember írta volna. (Ha még nem próbáltad ki magad, erősen ajánlom, hogy nézd meg a Write With Transformer oldalt.)

Noha ez sok aggodalomra ad okot a technológiával való esetleges visszaélésekkel kapcsolatban, sok lehetőséget is rejt magában. Számos kreatív alkalmazást építettek már a GPT-2 segítségével, mint például az AI Dungeon 2 szöveges kalandjáték. Az ilyen alkalmazások mögött meghúzódó kulcsötlet a nyelvi modell finomhangolása a saját adatkészletén, amely megtanítja a modellt a saját tartományának megfelelő szöveg létrehozására. Mindenképpen nézze meg ezt a blogbejegyzést arról, hogy az ML6-nál dolgozó kollégáim hogyan használták ezt a megközelítést dalszöveg generálására.

Azonban gyakran nehéz azonos minőségű szöveget generálni az angoltól eltérő nyelveken, mivel más nyelveken nem állnak rendelkezésre nagy, előre betanított modellek. Ezeknek a nagy modelleknek a semmiből történő betanítása a legtöbb ember számára túlzott mértékű a szükséges számítási teljesítmény rendkívüli mennyisége miatt (valamint az elég nagy adatkészlet szükségessége miatt).

Ezt az ötletet alkalmazva

Az ML6-nál nagyszabású holland szöveggenerálással akartunk kísérletezni egy egyedi adathalmazon. A Fednot-tal (a Belga Közjegyzők Királyi Szövetsége) való együttműködésünkből egy nagy adatkészletet hoztunk létre, amely 1 millió névtelen belga ingatlanokiratból állt, és a Fednot szíves beleegyezett abba, hogy dolgozzunk ebben a kísérletben.

Az ötlet: képezzen ki egy automatikus kiegészítési modellt, amely végül íróeszközként használható a közjegyzők számára az ingatlanokiratok megírásában. Annak érdekében, hogy az eszközt még hasznosabbá tegyük a közjegyzők számára, úgy döntöttünk, hogy egy kicsit feldobjuk a modellt kulcsszavak hozzáadásával, mint kiegészítő mellékbevitel. Ez lehetővé teszi a generálandó szöveg kontextusának irányítását, mint a modellünk által generált következő példában:

Ebben a blogbejegyzésben megvitatjuk, hogyan képeztük ki modellünket. Kitérünk a modellarchitektúra kiválasztására és az adatok előfeldolgozására is, beleértve azt is, hogyan nyertük ki a kulcsszavakat a képzési adatainkhoz. A végén bemutatunk néhány eredményt, és megvitatjuk a lehetséges fejlesztéseket és a jövőbeli irányokat.

A modell architektúrája

A szöveggenerálás nyelvi modellezési feladatként fogalmazható meg: a következő szó előrejelzése az előző szavak ismeretében. Az ismétlődő neurális hálózatok (RNN-ek) voltak a választott architektúra erre a feladatra szekvenciális jellege és a gyakorlatban való sikeressége miatt.

RNN-ek

Az RNN nyelvi modellben a tokenek (például szavak vagy karakterek) bemeneti sorozata balról jobbra haladva, tokenről tokenre kerül feldolgozásra, és a modell minden egyes lépésben megpróbálja megjósolni a következő tokent úgy, hogy egy valószínűségi eloszlást ad ki az egészre. szójegyzék. A legnagyobb valószínűséggel rendelkező token az előre jelzett következő token. (Az RNN-ek működésének mélyreható magyarázatához tekintse meg Andrej Karpathy legendás blogbejegyzését, „A visszatérő neurális hálózatok indokolatlan hatékonysága”.)

Szintezés: transzformátorok

A közelmúltban az „Attention Is All You Need” (Vaswani et al) című újság transzformátor-architektúrája számítási hatékonyságának köszönhetően átvette az NLP-környezetet. A transzformátormodellben nincs szekvenciális számítás, hanem egy önfigyelő mechanizmusra támaszkodik, amely teljesen párhuzamosítható, ezáltal teljes mértékben kihasználja a modern gyorsítók, például a GPU-k előnyeit. A transzformátor építészetének nagyszerű magyarázatát találja Jay Alammar „The Illustrated Transformer” című művében.

A transzformátorok különösen sikeresek a nagyméretű beállításokban, ahol több gigabájt edzési adat áll rendelkezésre. Példa erre a GPT-2, amelyet 40 GB nyers szövegre tanítottak az internetről, óránként 256 USD becsült képzési költséggel! Az RNN-ek (vagy változata, az LSTM) azonban versenyképesek maradnak a nyelvi modellezésben, és még mindig alkalmasabbak lehetnek kisebb adatkészletekhez.

A mi modellünk

Visszatérve a használati esetünkhöz, valójában elegendő adatunk van (körülbelül 17 GB) egy GPT-2-szerű modell betanításához, de úgy döntöttünk, hogy az LSTM-alapú architektúrát választjuk, mivel az adatok ismétlődőek, mivel sok kifejezést többször is felhasználnak, így arra jutottunk. hogy valószínűleg nem kell teljes értékű transzformátor-architektúrát keresni a jó eredmények eléréséhez (nézze meg az egyszerűbb és fenntarthatóbb NLP irányába tett közelmúltbeli elmozdulásokat is, pl. a SustaiNLP2020 workshopot az EMNLP-nél).

Végül egy 4 rétegű LSTM modellt választottunk 400-as beágyazási mérettel és 1150-es rejtett mérettel, összhangban a „Merity et al” architektúrájával. A bemeneti beágyazási réteg súlyait a kimeneti softmax réteghez kötjük, amiről kimutatták, hogy javítja a nyelvi modellezés eredményeit. Sőt, az LSTM nem visszatérő kapcsolataihoz adjuk a lemorzsolódást. (A kimaradás hozzáadása az ismétlődő kapcsolatokhoz nem kompatibilis az LSTM architektúra CuDNN-re optimalizált verziójával, amely szükséges a GPU-n történő hatékony képzéshez.)

Alszavak tokenizálását használjuk, mivel ez jó kompromisszumot biztosít a karakterszintű és a szószintű bevitel között (további magyarázatért lásd ezt a blogbejegyzést). Pontosabban, saját BPE tokenizátorunkat képezzük ki 32 KB-os szóhasználattal a Hugging Face tokenizers könyvtár segítségével.

Kulcsszavak bemutatása

Alapvető nyelvi modell architektúránk már a helyén van, de a következő kérdés az, hogy hogyan építsünk be kulcsszavakat mellékbevitelként. Ehhez a gépi fordítási szakirodalomból merítünk ihletet, ahol jellemzően figyelemfelkeltő kódoló-dekódoló modellt használnak (eredetileg a Bahadanu et al-ban vezették be). Adott egy mondat a forrásnyelven, a kódoló először minden tokent kódol vektoros reprezentációba, majd a dekódoló megtanulja a lefordított mondat tokenenkénti kiadását úgy, hogy „figyelni kell” a kódoló reprezentációira. Ily módon a dekódoló megtanulja, hogy a bemeneti mondat mely részei a legfontosabbak a kimenet szempontjából az egyes időlépésekben. (Ismét Jay Alammarnak van egy szép vizuális blogbejegyzése erről.)

Esetünkben egy egyszerű beágyazó keresőréteggel fogjuk „kódolni” a beviteli kulcsszavainkat. A mi „dekóderünk” a fent említett LSTM modell, egy extra figyelemfelkeltő réteggel a végső softmax réteg elé. Ez a figyelemréteg lehetővé teszi a nyelvi modell számára, hogy „figyeljen” a kulcsszavakra, mielőtt megjósolja a következő tokent.

Végső modellarchitektúránk a következőképpen néz ki:

Az adat

Modellünk betanításához szükségünk van egy adatkészletre, amely a megfelelő kulcsszavakkal párosított szövegrészekből áll. A Fednot-tól származó nyers adatkészletünk valójában beolvasott PDF-fájlokból származik, így az első lépés az, hogy ezeket a PDF-fájlokat szöveggé (darabokká) alakítsuk át. Teljes adatfolyamunk a következőképpen néz ki:

  1. Záradékészlelés: Az okirat záradékokból épül fel. Például lehet egy záradék, amely leírja az ingatlant, egy másik záradék az árról stb. Kezdjük egy záradékészlelési modell betanításával, amely a teljes okirat PDF-fájlját számítógépes látásmód segítségével építőelemekre bontja.
  2. OCR: Minden záradékot szöveggé alakítunk a beépített optikai karakterfelismerés segítségével. Ez némileg zajos szöveget eredményez, amelyet egy kicsit megtisztítunk a legrosszabb OCR hibákat tartalmazó záradékok kiszűrésével.
  3. Álnevesítés: A záradékok álnevesítése úgy történik, hogy az összes bizalmas nevű entitást (például neveket, címeket és számlaszámokat) véletlenszerű entitásokra cserélik. Ennek a megközelítésnek az az előnye, hogy még ha a modellünkből valaha is hiányozna egy entitás, az ellenfél soha nem lesz képes felismerni, hogy mely entitások valódiak és melyek véletlenszerűek. Saját egyedi elnevezésű entitásfelismerési modellünket betanítottuk a s paCy segítségével.
  4. Bekezdésekre bontás: A teljes záradékok nagyon hosszúak és változatosak lehetnek, ezért minden záradékot olyan bekezdésekre bontunk, amelyek kulcsszavakkal könnyebben rögzíthetők. Ezenkívül kiszűrjük a nagyon rövid vagy nagyon hosszú bekezdéseket, mert azokból a bekezdésekből nehezebb tanulni. Csak azokat a bekezdéseket őrizzük meg, amelyek 8 és 256 token közöttiek.
  5. Kulcsszó kinyerése: Minden bekezdésben kivonjuk az összes főnevet, igét és melléknevet a spaCy használatával. Ezek a kulcsszójelöltek. Egyes esetekben a bekezdés rövid címmel kezdődik, amit heurisztikusan észlelhetünk. Ezekben az esetekben a címet kulcsszóként szerepeltetjük, mivel nagyon tömör információkat tartalmaz arról, hogy miről szól a bekezdés. Most már van egy (meglehetősen nagy és változatos) kulcsszavak listája bekezdésenként. A képzés során ezekből a kulcsszavakból mintát veszünk a TF-IDF súlya alapján, így a ritka szavak gyakrabban kerülnek mintavételre. A minta kulcsszavak száma is dinamikusan változik a képzés során: bekezdésenként 0 és 6 kulcsszó között lehet. Ez a modell nagyon sokrétű használatát teszi lehetővé, mivel a modell megtanulja kezelni mind a kulcsszavak nélküli bemeneteket, mind a legfeljebb 6 kulcsszót tartalmazó bemeneteket.

Edzésidő

A modellt 10 korszakon keresztül betanították az Adam optimalizálóval gradiens kivágással és 3e-4 tanulási sebességgel. Nem végeztünk túl sok hiperparaméter hangolást, így ezeken az edzési beállításokon valószínűleg tovább lehetne javítani. A veszteséggörbénk ésszerűnek tűnik:

Következtetési idő

Végre itt az ideje, hogy egy pörgetésre elővegyük az újonnan betanított modellünket, de mielőtt ezt megtennénk, vessünk egy rövid megbeszélést arról, hogyan lehet ténylegesen szöveget generálni egy nyelvi modellből.

Emlékezzünk vissza, hogy egy nyelvi modell egy valószínűségi eloszlást ad ki a teljes szókincsre vonatkozóan, rögzítve, hogy az egyes token milyen valószínűséggel lesz a következő token.

Mohó dekódolás

A legegyszerűbb módja annak, hogy szöveget generáljon, ha minden egyes időlépésnél a legvalószínűbb tokent veszi fel, más néven mohó dekódolás. A mohó dekódolás (vagy kevésbé mohó változata, a sugárkeresés) azonban köztudottan meglehetősen unalmas és ismétlődő szöveget hoz létre, amely gyakran elakad egy hurokban, még olyan kifinomult modelleknél is, mint például a GPT-2.

Tiszta mintavétel

Egy másik lehetőség, hogy minden időlépésben mintát vesz a következő tokenből a kimeneti valószínűségi eloszlásból, ami lehetővé teszi a modell számára, hogy meglepőbb és érdekesebb szöveget generáljon. A tiszta mintavétel azonban túlságosan meglepő és inkoherens szöveget hoz létre, és bár minden bizonnyal érdekesebb, mint a mohó dekódolásból származó szöveg, gyakran nincs sok értelme.

Mindkét világ legjobbja

Szerencsére léteznek alternatív mintavételi módszerek is, amelyek jó kompromisszumot biztosítanak a mohó dekódolás és a tiszta mintavétel között. Az általánosan használt módszerek közé tartozik a hőmérsékleti mintavétel és a felső k mintavételezés.

Úgy döntöttünk, hogy az újabban bevezetett mintavételi technikát, az úgynevezett nucleus samplinget vagy top-p mintavételt választjuk, mivel kimutatták, hogy ez a legtermészetesebb és leginkább emberszerű szöveget produkálja. Ezt a tavalyi „The Curious Case of Neural Text Degeneration” (Holtzman et al) című tanulmányban mutatták be, amely nagyon szép és érdekes olvasmány, amely magában foglalja a különböző mintavételi stratégiák összehasonlítását.

A magmintavételnél a kimeneti valószínűségi eloszlás csonkolva van, így csak a legvalószínűbb tokenekből – az eloszlás „magjából” – veszünk mintát. A magot egy p paraméter határozza meg (általában 0,95 és 0,99 között), amely küszöbként szolgál: csak a legvalószínűbb tokenekből veszünk mintát, amelyek kumulatív valószínűségi tömege éppen meghaladja a p értéket. Ez lehetővé teszi a generált szöveg változatosságát, miközben eltávolítja a disztribúció megbízhatatlan végét.

Nézzünk néhány példát a modellünkből (minden példában p=0,95-tel rendelkező magmintavételt használunk):

Látjuk, hogy a szöveg meglehetősen koherens, és a modell valóban megtanulta figyelembe venni a kulcsszavakat. Ezután próbálkozzunk néhány ritkább kulcsszóval a korpuszunkból, mint például a „brandweer” (csak 51 képzési példában fordul elő) és a „doorgang” (114 képzési példában fordul elő).

A szöveg mára meglehetősen értelmetlen, és tartalmaz néhány kitalált szót (gehuurgen?), de a modellnek így is sikerült többé-kevésbé helyesre állítania a kontextust.

Zárjuk be néhány további példával, amelyek több kulcsszót használnak bevitelként.

Következtetés

Első eredményeink ígéretesnek tűnnek, legalábbis akkor, ha gyakori kulcsszavakat használunk bemenetként. A képzési korpuszunkban nem túl gyakran előforduló kulcsszavak esetében a modell összezavarodik, és rossz minőségű szöveget generál. Általában OCR-hibákat és álnevesítési hibákat is észleltünk a képzési adatainkból, ami korlátozza a generált szöveg minőségét. Még mindig sok lehetőség van az eredményeink javítására, például a képzési adatok további tisztításával, valamint a modell architektúrájának módosításával vagy felnagyításával.

A kísérlet egyik tanulsága az, hogy nincs mindig szükség hatalmas transzformátormodellre a jó minőségű szöveg generálásához, és az LSTM-ek továbbra is életképes alternatívát jelenthetnek. A modell architektúrát az adatoknak megfelelően kell kiválasztani. Ennek ellenére érdekes lenne megközelítésünket tovább bővíteni, több képzési adatot és nagyobb modellt használva ennek a kompromisszumnak az elemzésére.

A szöveggenerálás szórakoztató téma a természetes nyelvi feldolgozásban, de valós használati esetekre való alkalmazása nehéz lehet a kimeneti szöveg ellenőrzésének hiánya miatt. Kulcsszavakkal dúsított automatikus kiegészítési eszközünk lehetőséget biztosít a kimenet szabályozására kulcsszavak használatával. Reméljük, hogy ez hasznos íróeszközt biztosít a közjegyzőknek a holland ingatlanokiratok megírásához.

Az ML6-ról

Mi egy mesterséges intelligencia-szakértőkből álló csapat vagyunk, és Belgium leggyorsabban növekvő mesterségesintelligencia-vállalata. Gentben, Amszterdamban, Berlinben és Londonban található irodákkal öntanuló rendszereket építünk és valósítunk meg különböző ágazatokban, hogy segítsük ügyfeleink hatékonyabb működését. Ezt úgy érjük el, hogy a kutatás, innováció csúcsán maradunk, és szakértelmünket a gyakorlatban alkalmazzuk. További információért látogasson el a www.ml6.eu oldalra.