Ištirkite pagrindines natūralios kalbos apdorojimo sąvokas naudodami mūsų išsamų vadovą, kaip įgyvendinti N-gramų kalbos modelius nuo nulio. Sužinokite teoriją, kodą ir praktines programas.
NLP pagrindų kūrimas: Gilus nardymas į N-gramų kalbos modelio įgyvendinimą
Eroje, kurioje dominuoja dirbtinis intelektas, nuo išmaniųjų asistentų mūsų kišenėse iki sudėtingų algoritmų, kurie valdo paieškos sistemas, kalbos modeliai yra nematomi varikliai, skatinantys daugelį šių naujovių. Būtent dėl jų jūsų telefonas gali numatyti kitą žodį, kurį norite įvesti, ir kaip vertimo paslaugos gali sklandžiai konvertuoti vieną kalbą į kitą. Bet kaip šie modeliai iš tikrųjų veikia? Prieš atsirandant sudėtingiems neuroniniams tinklams, tokiems kaip GPT, kompiuterinės lingvistikos pagrindas buvo pastatytas ant gražiai paprasto, bet galingo statistinio požiūrio: N-gramų modelio.
Šis išsamus vadovas skirtas pasaulinei pradedančiųjų duomenų mokslininkų, programinės įrangos inžinierių ir smalsių technologijų entuziastų auditorijai. Mes grįšime prie pagrindų, išaiškindami N-gramų kalbos modelių teoriją ir pateikdami praktinį, žingsnis po žingsnio, kaip sukurti vieną nuo pat pradžių. N-gramų supratimas nėra tik istorijos pamoka; tai labai svarbus žingsnis kuriant tvirtą pagrindą natūralios kalbos apdorojimo (NLP) srityje.
Kas yra kalbos modelis?
Iš esmės kalbos modelis (LM) yra tikimybių pasiskirstymas per žodžių seką. Paprasčiau tariant, pagrindinė jo užduotis yra atsakyti į pagrindinį klausimą: Atsižvelgiant į žodžių seką, koks yra labiausiai tikėtinas kitas žodis?
Apsvarstykite sakinį: "Studentai atvertė savo ___."
Gerai apmokytas kalbos modelis priskirtų didelę tikimybę tokiems žodžiams kaip "knygos", "nešiojamieji kompiuteriai" arba "protai", ir labai mažą, beveik nulinę, tikimybę tokiems žodžiams kaip "fotosintezė", "drambliai" arba "greitkelis". Kiekybiškai įvertindami žodžių sekų tikimybę, kalbos modeliai leidžia mašinoms suprasti, generuoti ir apdoroti žmonių kalbą nuosekliai.
Jų pritaikymo sritys yra plačios ir integruotos į mūsų kasdienį skaitmeninį gyvenimą, įskaitant:
- Automatinis vertimas: Užtikrinama, kad išvesties sakinys būtų sklandus ir gramatiškai taisyklingas tikslinėje kalboje.
- Kalbos atpažinimas: Atskirti fonetiškai panašias frazes (pvz., "atpažinti kalbą" ir "sugadinti gražų paplūdimį").
- Predikcinis tekstas ir automatinis užbaigimas: Siūlomas kitas žodis ar frazė, kai įvedate tekstą.
- Rašybos ir gramatikos taisymas: Žodžių sekų, kurios yra statistiškai mažai tikėtinos, nustatymas ir pažymėjimas.
N-gramų pristatymas: Pagrindinė sąvoka
N-grama yra tiesiog gretima 'n' elementų seka iš duoto teksto ar kalbos pavyzdžio. 'Elementai' paprastai yra žodžiai, tačiau jie taip pat gali būti simboliai, skiemenys ar net fonemos. 'n' N-gramoje reiškia skaičių, todėl atsiranda konkretūs pavadinimai:
- Unigrama (n=1): Vienas žodis. (pvz., "The", "quick", "brown", "fox")
- Bigrama (n=2): Dviejų žodžių seka. (pvz., "The quick", "quick brown", "brown fox")
- Trigrama (n=3): Trijų žodžių seka. (pvz., "The quick brown", "quick brown fox")
Pagrindinė N-gramų kalbos modelio idėja yra ta, kad galime numatyti kitą žodį sekoje, žiūrėdami į 'n-1' žodžius, kurie buvo prieš jį. Užuot bandę suprasti visą gramatinį ir semantinį sakinio sudėtingumą, darome supaprastinančią prielaidą, kuri smarkiai sumažina problemos sudėtingumą.
Matematika už N-gramų: Tikimybė ir supaprastinimas
Norėdami formaliai apskaičiuoti sakinio (žodžių sekos W = w₁, w₂, ..., wₖ) tikimybę, galime naudoti grandinės tikimybės taisyklę:
P(W) = P(w₁) * P(w₂|w₁) * P(w₃|w₁, w₂) * ... * P(wₖ|w₁, ..., wₖ₋₁)
Ši formulė teigia, kad visos sekos tikimybė yra kiekvieno žodžio sąlyginių tikimybių sandauga, atsižvelgiant į visus žodžius, kurie buvo prieš jį. Nors matematiškai pagrįstas, šis požiūris yra nepraktiškas. Norint apskaičiuoti žodžio tikimybę, atsižvelgiant į ilgą prieš tai buvusių žodžių istoriją (pvz., P(žodis | "Greitas rudas lapinas šoka per tingų šunį ir tada...")), reikėtų neįmanomai didelio kiekio tekstinių duomenų, kad būtų galima rasti pakankamai pavyzdžių patikimam įvertinimui atlikti.
Markovo prielaida: Praktinis supaprastinimas
Čia N-gramų modeliai pristato savo svarbiausią sąvoką: Markovo prielaidą. Ši prielaida teigia, kad žodžio tikimybė priklauso tik nuo fiksuoto skaičiaus ankstesnių žodžių. Darome prielaidą, kad pakanka tiesioginio konteksto ir galime atmesti tolimesnę istoriją.
- Bigramų modeliui (n=2), darome prielaidą, kad žodžio tikimybė priklauso tik nuo vieno ankstesnio žodžio:
P(wᵢ | w₁, ..., wᵢ₋₁) ≈ P(wᵢ | wᵢ₋₁) - Trigramų modeliui (n=3), darome prielaidą, kad jis priklauso nuo dviejų ankstesnių žodžių:
P(wᵢ | w₁, ..., wᵢ₋₁) ≈ P(wᵢ | wᵢ₋₁, wᵢ₋₂)
Ši prielaida leidžia problemą išspręsti kompiuteriu. Mums nebereikia matyti tikslios visos žodžio istorijos, kad apskaičiuotume jo tikimybę, tik paskutinius n-1 žodžius.
N-gramų tikimybių apskaičiavimas
Turėdami Markovo prielaidą, kaip apskaičiuojame šias supaprastintas tikimybes? Naudojame metodą, vadinamą maksimalaus patikimumo įvertinimu (MLE), kuris yra įmantrus būdas pasakyti, kad gauname tikimybes tiesiogiai iš skaičių mūsų mokymo tekste (korpuse).
Bigramų modeliui žodžio wᵢ tikimybė po žodžio wᵢ₋₁ apskaičiuojama taip:
P(wᵢ | wᵢ₋₁) = Skaičius(wᵢ₋₁, wᵢ) / Skaičius(wᵢ₋₁)
Žodžiais: Žodžio B tikimybė po žodžio A yra skaičius, kiek kartų matėme porą "A B", padalytas iš skaičiaus, kiek kartų iš viso matėme žodį "A".
Naudokime mažytį korpusą kaip pavyzdį: "Katė sėdėjo. Šuo sėdėjo."
- Skaičius("Katė") = 2
- Skaičius("katė") = 1
- Skaičius("šuo") = 1
- Skaičius("sėdėjo") = 2
- Skaičius("Katė katė") = 1
- Skaičius("Katė šuo") = 1
- Skaičius("katė sėdėjo") = 1
- Skaičius("šuo sėdėjo") = 1
Kokia yra "katės" tikimybė po "Katė"?
P("katė" | "Katė") = Skaičius("Katė katė") / Skaičius("Katė") = 1 / 2 = 0,5
Kokia yra "sėdėjo" tikimybė po "katė"?
P("sėdėjo" | "katė") = Skaičius("katė sėdėjo") / Skaičius("katė") = 1 / 1 = 1,0
Žingsnis po žingsnio įgyvendinimas nuo nulio
Dabar paverskime šią teoriją praktiniu įgyvendinimu. Apibūdinsime veiksmus kalbai neutraliu būdu, nors logika tiesiogiai atitinka tokias kalbas kaip Python.
1 žingsnis: Duomenų išankstinis apdorojimas ir tokenizavimas
Prieš ką nors suskaičiuodami, turime paruošti savo tekstinį korpusą. Tai labai svarbus žingsnis, kuris formuoja mūsų modelio kokybę.
- Tokenizavimas: Teksto kūno skaidymo į mažesnius vienetus, vadinamus žetonais (mūsų atveju žodžiais), procesas. Pavyzdžiui, "Katė sėdėjo." tampa ["Katė", "katė", "sėdėjo", "."].
- Mažinimas: Standartinė praktika yra konvertuoti visą tekstą į mažąsias raides. Tai neleidžia modeliui traktuoti "Katė" ir "katė" kaip dviejų skirtingų žodžių, o tai padeda sutvirtinti mūsų skaičiavimus ir padaryti modelį tvirtesnį.
- Pridėti pradžios ir pabaigos žetonus: Tai labai svarbi technika. Kiekvieno sakinio pradžioje ir pabaigoje pridedame specialius žetonus, tokius kaip <s> (pradžia) ir </s> (pabaiga). Kodėl? Tai leidžia modeliui apskaičiuoti žodžio tikimybę pačioje sakinio pradžioje (pvz., P("Katė" | <s>)) ir padeda apibrėžti viso sakinio tikimybę. Mūsų sakinio pavyzdys "katė sėdėjo." taptų ["<s>", "katė", "katė", "sėdėjo", ".", "</s>"].
2 žingsnis: N-gramų skaičiavimas
Kai turime švarų kiekvieno sakinio žetonų sąrašą, pakartotinai einame per mūsų korpusą, kad gautume skaičiavimus. Geriausia duomenų struktūra tam yra žodynas arba maišos žemėlapis, kur raktai yra N-gramos (pavaizduoti kaip rinkiniai), o reikšmės yra jų dažniai.
Bigramų modeliui mums reikėtų dviejų žodynų:
unigram_counts: Saugo kiekvieno atskiro žodžio dažnumą.bigram_counts: Saugo kiekvienos dviejų žodžių sekos dažnumą.
Jūs kartotumėte savo tokenizuotus sakinius. Sakiniui, pvz., ["<s>", "katė", "katė", "sėdėjo", "</s>"], jūs:
- Padidinkite unigramų skaičių: "<s>", "katė", "katė", "sėdėjo", "</s>".
- Padidinkite bigramų skaičių: ("<s>", "katė"), ("katė", "katė"), ("katė", "sėdėjo"), ("sėdėjo", "</s>").
3 žingsnis: Tikimybių apskaičiavimas
Kai mūsų skaičiavimo žodynai užpildyti, dabar galime sukurti tikimybių modelį. Šias tikimybes galime saugoti kitame žodyne arba apskaičiuoti jas realiuoju laiku.
Norėdami apskaičiuoti P(žodis₂ | žodis₁), paimtumėte bigram_counts[(žodis₁, žodis₂)] ir unigram_counts[žodis₁] ir atliktumėte padalijimą. Gera praktika yra iš anksto apskaičiuoti visas įmanomas tikimybes ir jas saugoti greitai paieškai.
4 žingsnis: Teksto generavimas (linksma programa)
Puikus būdas išbandyti savo modelį yra leisti jam generuoti naują tekstą. Procesas veikia taip:
- Pradėkite nuo pradinio konteksto, pavyzdžiui, pradžios žetono <s>.
- Ieškokite visų bigramų, kurie prasideda <s>, ir jų susijusių tikimybių.
- Atsitiktinai pasirinkite kitą žodį, atsižvelgdami į šį tikimybių pasiskirstymą (žodžiai su didesnėmis tikimybėmis dažniau pasirenkami).
- Atnaujinkite savo kontekstą. Naujai pasirinktas žodis tampa pirmąja kitos bigramos dalimi.
- Kartokite šį procesą, kol sugeneruosite pabaigos žetoną </s> arba pasieksite norimą ilgį.
Tekstas, sugeneruotas paprasto N-gramų modelio, gali būti ne visiškai nuoseklus, tačiau dažnai sudarys gramatiškai įtikinamus trumpus sakinius, parodydamas, kad jis išmoko pagrindinius santykius tarp žodžių.
Retumo iššūkis ir sprendimas: Išlyginimas
Kas atsitiks, jei mūsų modelis testavimo metu susidurs su bigrama, kurios jis niekada nematė mokymosi metu? Pavyzdžiui, jei mūsų mokymo korpuse niekada nebuvo frazės "violetinis šuo", tada:
Skaičius("violetinis", "šuo") = 0
Tai reiškia, kad P("šuo" | "violetinis") būtų 0. Jei ši bigrama yra ilgesnio sakinio, kurį bandome įvertinti, dalis, viso sakinio tikimybė taps nulinė, nes dauginame visas tikimybes kartu. Tai yra nulinės tikimybės problema, duomenų retumo pasireiškimas. Nerealistiška manyti, kad mūsų mokymo korpuse yra kiekviena įmanoma galiojanti žodžių kombinacija.
Šio sprendimas yra išlyginimas. Pagrindinė išlyginimo idėja yra paimti nedidelį tikimybės masės kiekį iš N-gramų, kuriuos matėme, ir paskirstyti jį N-gramoms, kurių niekada nematėme. Tai užtikrina, kad nė viena žodžių seka neturėtų lygiai nulinės tikimybės.
Laplaso (pridėti vieną) išlyginimas
Paprastiausia išlyginimo technika yra Laplaso išlyginimas, taip pat žinomas kaip pridėti vieną išlyginimas. Idėja yra neįtikėtinai intuityvi: apsimeskite, kad matėme kiekvieną įmanomą N-gramą vienu kartu daugiau, nei iš tikrųjų matėme.
Formulė tikimybei šiek tiek keičiasi. Pridedame 1 prie skaitiklio skaičiaus. Norėdami užtikrinti, kad tikimybės vis dar sudarytų 1, prie vardiklio pridedame viso žodyno (V) dydį.
P_laplace(wᵢ | wᵢ₋₁) = (Skaičius(wᵢ₋₁, wᵢ) + 1) / (Skaičius(wᵢ₋₁) + V)
- Privalumai: Labai paprasta įgyvendinti ir garantuoja, kad nebus nulinės tikimybės.
- Trūkumai: Jis dažnai suteikia per daug tikimybės nematytiems įvykiams, ypač su dideliais žodynais. Dėl šios priežasties jis dažnai veikia prastai, palyginti su pažangesniais metodais.
Pridėti-k išlyginimas
Nedidelis patobulinimas yra Pridėti-k išlyginimas, kur vietoj to, kad pridėtume 1, pridedame mažą trupmeninę reikšmę 'k' (pvz., 0,01). Tai sušvelnina per didelio tikimybės masės perskirstymo poveikį.
P_add_k(wᵢ | wᵢ₋₁) = (Skaičius(wᵢ₋₁, wᵢ) + k) / (Skaičius(wᵢ₋₁) + k*V)
Nors ir geriau nei pridėti vieną, optimalaus 'k' radimas gali būti iššūkis. Egzistuoja pažangesnės technikos, tokios kaip Geras-Tiuringo išlyginimas ir Kneserio-Nei išlyginimas, kurios yra standartinės daugelyje NLP įrankių rinkinių, siūlančios daug sudėtingesnius būdus įvertinti nematytų įvykių tikimybę.
Kalbos modelio įvertinimas: Painumas
Kaip žinome, ar mūsų N-gramų modelis yra geras? Arba ar trigramų modelis yra geresnis už bigramų modelį mūsų konkrečiai užduočiai? Mums reikia kiekybinio įvertinimo rodiklio. Dažniausias kalbos modelių rodiklis yra painumas.
Painumas yra priemonė, kaip gerai tikimybių modelis prognozuoja pavyzdį. Intuityviai, tai galima laikyti svertiniu vidutiniu modelio šakojimosi koeficientu. Jei modelio painumas yra 50, tai reiškia, kad kiekvienu žodžiu modelis yra toks pat sutrikęs, tarsi jis turėtų rinktis vienodai ir nepriklausomai iš 50 skirtingų žodžių.
Mažesnis painumo rezultatas yra geresnis, nes tai rodo, kad modelis mažiau "nustebęs" dėl bandomųjų duomenų ir priskiria didesnes tikimybes sekoms, kurias jis iš tikrųjų mato.
Painumas apskaičiuojamas kaip atvirkštinė bandomojo rinkinio tikimybė, normalizuota pagal žodžių skaičių. Jis dažnai pateikiamas logaritminėje formoje, kad būtų lengviau apskaičiuoti. Modelis su gera numatoma galia priskirs dideles tikimybes bandomiesiems sakiniams, todėl painumas bus mažas.
N-gramų modelių apribojimai
Nepaisant jų pagrindinės svarbos, N-gramų modeliai turi reikšmingų apribojimų, kurie paskatino NLP sritį link sudėtingesnių architektūrų:
- Duomenų retumas: Net ir išlyginant, didesniems N (trigramoms, 4-gramoms ir tt), įmanomų žodžių kombinacijų skaičius sprogsta. Pasidaro neįmanoma turėti pakankamai duomenų, kad būtų galima patikimai įvertinti daugumos iš jų tikimybes.
- Saugykla: Modelis susideda iš visų N-gramų skaičių. Kai žodynas ir N auga, atmintis, reikalinga šiems skaičiams saugoti, gali tapti didžiulė.
- Nesugebėjimas užfiksuoti ilgalaikių priklausomybių: Tai yra didžiausias jų trūkumas. N-gramų modelis turi labai ribotą atmintį. Pavyzdžiui, trigramų modelis negali sujungti žodžio su kitu žodžiu, kuris pasirodė daugiau nei dviem pozicijomis anksčiau. Apsvarstykite šį sakinį: "Autorius, kuris parašė kelis bestselerius ir dešimtmečius gyveno mažame miestelyje atokioje šalyje, kalba laisvai ___." Trigramų modelis, bandantis numatyti paskutinį žodį, mato tik kontekstą "kalba laisvai". Jis neturi žinių apie žodį "autorius" arba vietą, kurie yra labai svarbūs užuominos. Jis negali užfiksuoti semantinio ryšio tarp tolimų žodžių.
Už N-gramų ribų: Neuroninių kalbos modelių aušra
Šie apribojimai, ypač nesugebėjimas tvarkyti ilgalaikių priklausomybių, atvėrė kelią neuroninių kalbos modelių kūrimui. Tokios architektūros kaip pasikartojantys neuroniniai tinklai (RNN), ilgalaikės trumpos atminties tinklai (LSTM) ir ypač dabar dominuojantys transformatoriai (kurie valdo tokius modelius kaip BERT ir GPT) buvo sukurti siekiant įveikti šias konkrečias problemas.
Užuot rėmęsi retais skaičiais, neuroniniai modeliai išmoksta tankias žodžių vektorines reprezentacijas (įterpimus), kurios užfiksuoja semantinius ryšius. Jie naudoja vidinius atminties mechanizmus, kad sektų kontekstą per daug ilgesnes sekas, leisdami suprasti sudėtingas ir ilgalaikes priklausomybes, būdingas žmogaus kalbai.
Išvada: Pagrindinis NLP ramstis
Nors šiuolaikiniame NLP dominuoja didelio masto neuroniniai tinklai, N-gramų modelis išlieka nepakeičiamas švietimo įrankis ir stebėtinai veiksminga atskaitos taškas daugeliui užduočių. Tai suteikia aiškų, interpretuojamą ir kompiuteriškai efektyvų įvadą į pagrindinį kalbos modeliavimo iššūkį: naudojant statistinius praeities modelius numatyti ateitį.
Sukurdamas N-gramų modelį nuo nulio, įgyjate gilų, pirmųjų principų supratimą apie tikimybę, duomenų retumą, išlyginimą ir įvertinimą NLP kontekste. Šios žinios nėra tik istorinės; tai konceptualus pagrindas, ant kurio pastatyti aukšti šiuolaikinio AI dangoraižiai. Jis moko jus galvoti apie kalbą kaip apie tikimybių seką - perspektyvą, kuri yra būtina norint įsisavinti bet kurį kalbos modelį, nesvarbu, koks jis būtų sudėtingas.