Grūtības ar mākslīgā intelekta vai pilnas paketes izstrādi? Mūsu eksperti ir gatavi jums palīdzēt: individuāli pielāgoti padomi, tehniskā integrācija un daudz kas cits. Sazinieties ar [email protected].

NER ar dažiem kadriem: Entitāšu ieguve bez anotācijas un apmācības, pamatojoties uz GPT

Iepriekš apmācīti esību ieguves modeļi, kas balstīti uz spaCy vai NLTK, sniedz lieliskus rezultātus, taču, lai atklātu tādas nenoteiktas būtnes kā amata nosaukumi, PVN numuri, zāles u. c., ir nepieciešams garlaicīgs anotācijas un apmācības process. Pateicoties lieliem valodas modeļiem, piemēram, GPT-3, GPT-J un GPT-NeoX, tagad ir iespējams iegūt jebkura veida entītijas, izmantojot mācīšanos ar dažiem kadriem, bez anotācijas un apmācības. Šajā rakstā mēs parādīsim, kā to izdarīt.

NER (būtību ieguve) būtībā ir strukturētas informācijas ieguve no nestrukturēta teksta. Ja esat iesācējs NER jomā, vispirms varat izlasīt mūsu īso ievadu: ievads par NER.

NER ar spaCy un NLTK: tradicionālais veids

SpaCy pēdējos gados ir kļuvusi par de facto NER standartu. (skatīt spaCy tīmekļa vietni). SpaCy ir ļoti pievilcīgs ietvars, jo tas ir viegli lietojams, un tā ātrums to padara labi piemērotu lietošanai ražošanā.

SpaCy ir Python dabiskās valodas apstrādes ietvars, kas piedāvā daudzus iepriekš apmācītus modeļus vairākās valodās, tāpēc ir viegli iegūt vairākus entītijas tipus (uzņēmumus, pilsētas, adreses, datumus u. c.) savā valodā bez nepieciešamības apmācīt savu modeli.

NLTK arī ir interesanta izvēle būtņu ieguvei ar Python, taču pēc noklusējuma tā piedāvā mazāk būtņu, un kopumā NLTK nav ieteicama izmantošanai ražošanā (tā ir vairāk izglītojoša un pētniecības sistēma).

Tomēr, izmantojot šos ietvarus, ātri vien sastapsieties ar ierobežojumiem: dabiski atbalstīto vienību skaits ir ierobežots. Lielākā daļa uzņēmumu vēlas izmantot NER, lai iegūtu specifisku uzņēmējdarbības informāciju, piemēram, informāciju par personām, finanšu datus, ārstniecības metodēm utt. Protams, šīs vienības pēc noklusējuma netiek atbalstītas spaCy iepriekš apmācītajos modeļos, tāpēc, lai to panāktu, jums ir jāizveido sava datu kopa un no tās jāapmāca savs modelis.

Paša spaCy modeļa apmācība ir ilgs un garlaicīgs anotēšanas process: vienam vai vairākiem cilvēkiem ir jāsadarbojas, lai izveidotu milzīgu labu piemēru kopu un anotētu tos. Lai modelis varētu pareizi mācīties, ir nepieciešams ļoti liels piemēru apjoms. Pastāv labi anotēšanas rīki (piemēram, Prodigy, spaCy), bet tas joprojām ir sāpīgs uzdevums, kura dēļ daudzi NLP projekti tiek pārtraukti.

Anotācijas ilustrācija

Labās ziņas: līdz ar tādu lielu valodas modeļu kā GPT-3, GPT-J un GPT-NeoX attīstību tagad ir iespējams iegūt jebkuras vienības bez anotācijas un jauna modeļa apmācības!

Teksta ģenerēšana ar GPT-3, GPT-J un GPT-NeoX

Lieli valodas modeļi teksta ģenerēšanai nesen sāka parādīties ar GPT-3. (skatīt vairāk par GPT-3 OpenAI vietnē.). Kad OpenAI izlaida savu GPT-3 modeli, kas sastāv no 175 miljardiem parametru, tas bija apvērsums, jo pavēra ceļu daudzām progresīvām mākslīgā intelekta lietojumprogrammām, kuru pamatā ir dabiskās valodas apstrāde, neprasot papildu apmācību.

Sākotnējais GPT modeļu, piemēram, GPT-3, mērķis ir ģenerēt tekstu: vienkārši ievadiet modelim ievaddatus un ļaujiet tam ģenerēt pārējo. Balstoties uz teksta ģenerēšanu, var panākt gandrīz jebkuru dabiskās valodas apstrādes lietojumu: klasifikāciju, kopsavilkumu, sarunvalodas mākslīgo intelektu, pārfrāzēšanu... un, protams, būtību ieguvi!

Tā kā GPT-3 nav atvērtā koda modelis, atvērtā koda kopiena ir izstrādājusi alternatīvas GPT-3, un tagad mums ir 2 lieliski atvērtā koda ekvivalenti: GPT-J un GPT-NeoX. Tie joprojām nav tik lieli kā GPT-3, taču nav šaubu, ka ir tikai laika jautājums, kad atvērtā koda kopiena panākt OpenAI.

Lai šos modeļus pareizi izmantotu, ir nepieciešama jauna metode, ko sauc par "mācīšanos ar dažiem šāvieniem".

Mācīšanās ar dažiem šāvieniem

Šie lielie GPT modeļi ir tik lieli, ka tie var ļoti ātri mācīties no jums.

Pieņemsim, ka vēlaties, lai GPT-3 jums ģenerē īsu produkta aprakstu. Šeit ir piemērs bez dažu kadru mācīšanās:

Generate a product description containing these specific keywords: t-shirt, men, $50

Saņemtā atbilde būs bezjēdzīga. Tā varētu būt, piemēram, šāda:

Generate a product description containing these specific keywords: t-shirt, men, $50 and short.

The product description needs to be a few words long. Don’t use plurals, use the keywords in the order they are

Labas ziņas: jūs varat sasniegt daudz labākus rezultātus, vienkārši sniedzot modelim dažus piemērus!

Generate a product description containing specific keywords.

Keywords: shoes, women, $59
Result: Beautiful shoes for women at the price of $59.
###
Keywords: trousers, men, $69
Result: Modern trousers for men, for $69 only.
###
Keywords: gloves, winter, $19
Result: Amazingly hot gloves for cold winters, at $19.
###
Keywords: gpu, gaming, $1499
Result:

Rezultāts būs apmēram šāds:

Generate a product description containing specific keywords.

Keywords: shoes, women, $59
Result: Beautiful shoes for women at the price of $59.
###
Keywords: trousers, men, $69
Result: Modern trousers for men, for $69 only.
###
Keywords: gloves, winter, $19
Result: Amazingly hot gloves for cold winters, at $19.
###
Keywords: gpu, gaming, $1,499
Result: The best gaming GPU on the market, at the price of $1,499 only.

Kā redzat, modeļa reakcija tagad ir pilnīgi precīza, pateicoties 3 piemēriem, ko mēs tam pirmo reizi sniedzām. Tomēr šis modelis nekad nav ticis apmācīts šāda veida produktu aprakstu ģenerēšanas uzdevumam. Tas ir tas, kas ir "dažu šāvienu mācīšanās" tehnika: jūs veicat "pārneses mācīšanos" uzreiz, izmantojot tikai dažus piemērus. Lai sasniegtu šāda veida rezultātu, parasti sagaidāms, ka dabiskās valodas apstrādes modelis tiks apmācīts ar tonnām piemēru, bet ne šeit.

Entitāšu iegūšana ar dažu kadru mācīšanos

Tagad mēs veiksim būtņu ieguvi, izmantojot dažu kadru mācīšanos.

Pieņemsim, ka vēlaties iegūt amatu nosaukumus no vietnēm. Vienkārši sniedziet pāris darba nosaukumu ieguves piemērus, pirms iesniedzat savu faktisko pieprasījumu:

Extract job titles from the following sentences.

Sentence: John Doe has been working for Microsoft for 20 years as a Linux Engineer.
Job title: Linux Engineer
###
Sentence: John Doe has been working for Microsoft for 20 years and he loved it.
Job title: none
###
Sentence: Marc Simoncini | Director | Meetic
Job title: Director
###
Sentence: Franck Riboud was born on 7 November 1955 in Lyon. He is the son of Antoine Riboud, who transformed the former European glassmaker BSN Group into a leading player in the food industry. He is the CEO at Danone.
Job title: CEO
###
Sentence: Damien is the CTO of Platform.sh, he was previously the CTO of Commerce Guys, a leading ecommerce provider.
Job title:

Rezultāts būs šāds:

Extract job titles from the following sentences.

Sentence: John Doe has been working for Microsoft for 20 years as a Linux Engineer.
Job title: Linux Engineer
###
Sentence: John Doe has been working for Microsoft for 20 years and he loved it.
Job title: none
###
Sentence: Marc Simoncini | Director | Meetic
Job title: Director
###
Sentence: Franck Riboud was born on 7 November 1955 in Lyon. He is the son of Antoine Riboud, who transformed the former European glassmaker BSN Group into a leading player in the food industry. He is the CEO at Danone.
Job title: CEO
###
Sentence: Damien is the CTO of Platform.sh, he was previously the CTO of Commerce Guys, a leading ecommerce provider.
Job title: CTO

Kā jau pamanījāt, mums ir gudri jāizvēlas, kā veidojam savus dažu kadru piemērus. Var gadīties, ka vispār netiek atrasts neviens amata nosaukums, tāpēc mēs izveidojām piemēru, kas atgriež "none" (tas novērš viltus pozitīvos rezultātus). Varbūt vēlaties iegūt vairākus amatu nosaukumus vienlaicīgi? Tādā gadījumā ir svarīgi izveidot piemērus, kas atgriež arī vairākus amatu nosaukumus (piemēram, ar komatu atdalītus amatu nosaukumus).

Vēl labākus rezultātus iegūsiet, pievienojot vēl vairāk piemēru. Turklāt ir svarīgi, lai jūsu piemēri pēc iespējas vairāk atbilstu jūsu faktiskajam galīgajam pieprasījumam. Piemēram, ja zināt, ka analizēsiet veselas rindkopas, nevis tikai teikumus, vislabāk ir izveidot piemērus arī ar rindkopām.

Ja jums nav piekļuves GPT modelim, varat vienkārši izmantot NLP Cloud API. Ir pieejami vairāki klienti (Python, Go, Node.js, Ruby, PHP...). Šeit parādīsim piemēru, kurā izmantots GPT-J ar Python klientu:

import nlpcloud

client = nlpcloud.Client("gpt-j", "your API token", gpu=True)
client.generation("""Extract job titles from the following sentences.

    Sentence: John Doe has been working for Microsoft for 20 years as a Linux Engineer.
    Job title: Linux Engineer
    ###
    Sentence: John Doe has been working for Microsoft for 20 years and he loved it.
    Job title: none
    ###
    Sentence: Marc Simoncini | Director | Meetic
    Job title: Director
    ###
    Sentence: Franck Riboud was born on 7 November 1955 in Lyon. He is the son of Antoine Riboud, who transformed the former European glassmaker BSN Group into a leading player in the food industry. He is the CEO at Danone.
    Job title: CEO
    ###
    Sentence: Damien is the CTO of Platform.sh, he was previously the CTO of Commerce Guys, a leading ecommerce provider.
    Job title:""",
top_p=0.1,
length_no_input=True,
remove_input=True,
end_sequence="###",
remove_end_sequence=True
)

Rezultāts būs šāds: CTO

Ļaujiet man sniegt jums īsu skaidrojumu par tikko izmantotajiem teksta ģenerēšanas parametriem.

Mēs iestatījām ļoti zemu maksimālo p vērtību, jo nevēlamies, lai GPT-J radītu pārāk oriģinālus rezultātus: mēs vēlamies, lai tas pieturētos pie tā, ko tas redzēja jūsu pieprasījumā.

"length_no_input" nozīmē, ka maksimālā garuma vērtībā nedrīkst ņemt vērā ievades tekstu.

"remove_input" nozīmē, ka ievades teksts ir jādzēš no rezultāta.

"end_sequence" nozīmē, ka tad, kad modelis saskaras ar šo rakstzīmi, tam jāpārtrauc teksta ģenerēšana. Tā kā mūsu dažos piemēros mēs katras atbildes beigās pievienojām "####", modelis pēc atbildes ģenerēšanas automātiski ģenerēs "####" un apstāsies.

"remove_end_sequence" nozīmē, ka mēs vēlamies no atbildes dzēst "####".

Sīkāku informāciju varat skatīt NLP Cloud dokumentācijā: skatīt šeit.

Darbības apsvērumi

Entitāšu ieguve ar GPT modeli sniedz lielu brīvību, jo jebkuru jaunu vienību var iegūt "uzreiz", pat ja modelis nav tam apmācīts!

Tomēr par to ir jāmaksā: šie lielie valodu modeļi ir milzīgi un salīdzinoši lēni.

Piemēram, ja vēlaties izmantot GPT-J vai GPT-NeoX, būs nepieciešams liels GPU ar lielu VRAM, piemēram, NVIDIA RTX A6000 vai A40. Turklāt būs zināma aizkavēšanās (vienības izvilkšana aizņem aptuveni 500 ms). Turpretī spaCy vai NLTK būs daudz ātrāks un lētāks no infrastruktūras viedokļa.

Secinājums

2022. gadā ir iespējams ļoti vienkārši veikt progresīvu NER bez anotācijas un apmācības! Tas ievērojami palīdzēs uzņēmumiem ātrāk īstenot savus esību ieguves projektus, kā arī ļaus izstrādāt progresīvākus lietojumus, kas balstīti uz dabiskās valodas apstrādi.

Tomēr tādi lieli valodu modeļi kā GPT-3, GPT-J un GPT-NeoX ir dārgi, tāpēc nevajadzētu pārāk zemu novērtēt ar tiem saistītās infrastruktūras izmaksas.

Es ceru, ka šis raksts palīdzēs jums ietaupīt laiku un naudu!

Julien Salinas
NLP Cloud tehniskais direktors