Next-token prediction: embedding a co znamená perplexity
Znakový model na 32 033 jménech, gradient descent znovu objeví tabulku počtů na 4 desetinná místa — a proč perplexity málokdy sedí.
Na této stránce
Tady je deset jmen vytvořených programem, který nikdy neviděl slovo:
cexze momakurailezitynn konimittain llayn ka
da moliellavo emia sade ftlspAni jedno z nich není jméno. Téměř všechna se o něj ale pokoušejí. Dají se vyslovit, končí tam, kde jména končí, a jedno z nich — emia — je od skutečného jména vzdálené o jediné písmeno. Program, který je vytvořil, drží 729 čísel, nemá žádnou představu o slově, slabice ani člověku a byl natrénován jediným průchodem počítání sousedních dvojic písmen.
Na konci této kapitoly sníží neuronová síť skóre tohoto programu podle stejné metriky o třetinu. Důvod, proč stojí za to vydržet, je to, co síť udělá jako první: bez vyzvání reprodukuje tabulku počtů na tři desetinná místa v každém dobře obsazeném řádku, protože oba objekty jsou odpovědí na stejnou otázku. Všechno potom je to, co by počítání nikdy nedokázalo.
Cíl je identita, ne návrhová volba
Odkaz na sekci: Cíl je identita, ne návrhová volbaKapitola 7 vás nechala se sekvencí celých čísel a bez důvodu, proč by jedno mělo následovat po druhém. Tady je ten důvod, a je to jeden řádek z kapitoly 2.
Jazykový model je funkce, která vezme dosavadní token a vrátí rozdělení nad tím, který token přijde dál: jedno číslo pro každou položku slovníku, nezáporné, se součtem jedna. Nic víc. Chcete-li se od toho dostat k pravděpodobnosti celého dokumentu, použijte řetězové pravidlo pravděpodobnosti:
To je identita, platná pro libovolnou sekvenci čehokoli, bez dalších předpokladů. Model, který zvládá malou úlohu — další token daný těmi předchozími — tím už zvládl velkou úlohu přiřadit pravděpodobnost každému možnému dokumentu, přesně a zdarma. Populární rámování jako laciný trik („jen předpovídá další slovo“) má logiku obráceně: předpovídat další token je modelovat sdružené rozdělení. Nikdy tu nebyla druhá věc, kterou by bylo potřeba udělat.
Loss z toho plyne stejně mechanicky. V každé pozici model vytváří rozdělení a pravda je jeden známý token, takže cross-entropy z kapitoly 4 platí beze změny:
To je průměrná záporná log-likelihood — recept z kapitoly 2 s kategorickým rozdělením v místě, kde předtím sedělo Gaussovo. A protože skutečné rozdělení je one-hot, jeho entropie je nula, takže podle identity z kapitoly 4 se cross-entropy rovná KL divergenci: snižovat toto číslo a přitahovat přesvědčení modelu k datům je tentýž akt.
Jeden důsledek si zaslouží vlastní větu, protože je to ekonomický fakt pod celým oborem. Labels jsou data posunutá o jednu pozici. Nikdo nic neanotuje. Trilion token textu je trilion předem označených příkladů, proto je trénovací korpus moderního modelu „internet“, a ne „dataset, který někdo postavil“.
Poctivý baseline: počítání
Odkaz na sekci: Poctivý baseline: počítáníPřed jakoukoli sítí baseline: 32 033 jmen, jedno na řádek, a úloha vytvářet další po jednom písmenu.1
Slovník tvoří 26 písmen plus hraniční symbol . označující začátek i konec jména, takže model se musí naučit, kde jména začínají a kde končí. To je 27 symbolů a nejmenší možný model je tabulka toho, jak často každý symbol následoval po každém jiném symbolu.
N = torch.zeros((27, 27), dtype=torch.int32)
for w in words:
cs = ["."] + list(w) + ["."]
for a, b in zip(cs, cs[1:]):
N[stoi[a], stoi[b]] += 1
P = N.float()
P = P / P.sum(1, keepdim=True) # one distribution per row Dva řádky aritmetiky a model je fitnutý — a není to heuristika: dělení počtů součty řádků je maximum-likelihood odhad kategorického rozdělení, tedy recept z kapitoly 2 s již provedeným kalkulem.
names: 32033 train/val/test: 25626 / 3203 / 3204
training bigrams: 182583
the six most likely letters after 'a':
a -> '.' 0.1944 a -> 'n' 0.1600 a -> 'r' 0.0967
a -> 'l' 0.0749 a -> 'h' 0.0690 a -> 'y' 0.0606Vzorkujte z něj — vyberte písmeno z řádku aktuálního písmene, přesuňte se na tento řádek, opakujte, dokud se neobjeví hraniční symbol — a dostanete jména ze začátku této kapitoly. Selhávají specifickým a poučným způsobem: lokálně uvěřitelně, globálně nesmyslně. Každá sousední dvojice písmen v momakurailezitynn je dvojice, která se v reálných jménech vyskytuje; jen jich je sedmnáct za sebou. Model má paměť jednoho písmene, takže nemůže vědět, že už pokračuje příliš dlouho.
Perplexity a jak ji číst
Odkaz na sekci: Perplexity a jak ji čístLoss na odložených jménech je 2,4546 nats. Samo o sobě toto číslo nic neznamená, proto existuje perplexity:
Rozepsáno bez knihovny, která by práci udělala za nás:
@torch.no_grad()
def perplexity(logits, Y):
logp = F.log_softmax(logits, dim=1) # log q for every symbol
chosen = logp[torch.arange(len(Y)), Y] # log q of the one that came next
return torch.exp(-chosen.mean()) Exponentování zruší logaritmus a vrátí číslo do jednotek počítání věcí. Nejčistší způsob, jak vidět, co počítá, je změřit model, který neví vůbec nic — takový, který každému symbolu bez ohledu na kontext přiřadí pravděpodobnost :
uniform over 27 symbols loss 3.2958 nats ppl 27.000
bigram counts, add-one smoothed loss 2.4546 nats ppl 11.642Přesně 27,000, protože . Perplexity je efektivní počet stejně pravděpodobných možností, mezi nimiž model vybírá. Perplexity 27 znamená „netuším, může to být cokoli“. Hodnota 11,642 u count modelu znamená, že jeden znak kontextu ho nechává stejně nejistého jako někoho, kdo naslepo vybírá z přibližně dvanácti možností místo dvaceti sedmi — proto se cituje perplexity, ne surový loss.
Pokazí se na ní dvě věci a ta druhá se kazí i v publikovaných článcích.
Nulové pravděpodobnosti jsou fatální. Z 729 buněk tabulky se 113 v tréninku nikdy nevyskytne — 15,5 % je prázdných. To nevadí, dokud validační sada do jedné z nich nespadne, a sedm bigramů ve validaci to udělá, mezi nimi d→q, z→j a dvakrát q→o. Pravděpodobnost nula znamená log , což znamená nekonečný loss a nekonečnou perplexity: jedno jméno ze tří tisíc zničí metriku. Obvyklá záplata je přidat 1 ke každému počtu před normalizací, což tady nestojí skoro nic (2,4546 místo 2,4524). Ale záplata je přiznání. Count model neumí vůbec generalizovat. Nemá jak tušit, že q→o je uvěřitelné, protože q→u je běžné a o se jinde chová jako u, protože nemá žádnou představu, že dva symboly se mohou podobat. Každá buňka se učí sama a oprava toho je smyslem zbytku této kapitoly.
Perplexity je cena za token a token je volný parametr. To je chyba, která se neustále objevuje při porovnávání modelů, a jakmile se podíváte, je snadno vidět. Vezměte stejný korpus anglické prózy z kapitoly 7, stejný interpolovaný bigram model, a změňte pouze to, jak se text rozřeže:
| jednotka | slovník | token v testu | cross-entropy | perplexity | bity na znak |
|---|---|---|---|---|---|
| znaky | 76 | 14 469 | 2,5217 | 12,45 | 3,6378 |
| BPE, 512 merges | 329 | 6 871 | 3,8547 | 47,21 | 2,6407 |
| BPE, 2 048 merges | 1 820 | 4 233 | 5,7468 | 313,20 | 2,4254 |
| slova | 2 991 | 6 284 | 3,5627 | 35,26 | 2,2322 |
Perplexity se napříč řádky liší faktorem 25. Na modelu se nezměnilo nic; pouze velikost věci, kterou předpovídá. Předpovědět celé slovo je těžší než předpovědět písmeno, takže stojí víc za jednu předpověď — a těch předpovědí je méně.
Teď čtěte poslední sloupec, který místo toho dělí celkové náklady počtem znaků a převádí je na bity. Přerovná tabulku. Podle perplexity je pořadí znaky, slova, BPE-512, BPE-2048; podle bitů na znak je to slova, BPE-2048, BPE-512, znaky. Znakový model se z prvního místa propadne na poslední. Model s 2 048 merges, který podle perplexity vypadá 6,6krát hůř než ten s 512 merges, je ve skutečnosti lepší: 2,4254 bitu proti 2,6407.
Perplexity je tedy porovnatelná jen mezi dvěma modely, které sdílejí tokenizer, a modely s různými tokenizers lze porovnávat jen v bitech na znak — v veličině, kterou Shannon měřil v roce 1951 tak, že nechal lidi hádat další písmeno anglického textu, a ohraničil ji zhruba jedním bitem na znak.2 Náš nejlepší bigram je na 2,23 bitu, což je férové shrnutí toho, jak daleko tato kapitola ještě musí dojít.
Totéž, naučené
Odkaz na sekci: Totéž, naučenéTeď postavme stejný model jako síť. Bude potřebovat o řády víc aritmetiky, aby dorazil na stejné místo — a právě dorazit na stejné místo je pointa.
Nahraďte tabulku jednou vahovou maticí tvaru . Přeměňte aktuální písmeno na one-hot vektor, vynásobte a výsledku říkejte logits — nenormalizovaná skóre z kapitoly 4. Potom softmax, potom cross-entropy, potom gradient descent.
W = torch.randn((27, 27), requires_grad=True)
for step in range(3000):
logits = W[xs]
loss = F.cross_entropy(logits, ys)
W.grad = None
loss.backward()
W.data -= 50.0 * W.gradZvýrazněný řádek obsahuje definici, kterou se vyplatí mít. Násobení one-hot vektoru maticí vybere jeden její řádek, takže násobení je lookup — a každá implementace aritmetiku přeskočí a udělá lookup přímo, což je to, co je W[xs].
To je embedding table. Matice s jedním řádkem na položku slovníku, indexovaná podle token id. Žádná geometrie, žádná sémantika, žádný zvláštní algoritmus: lookup table, jejíž obsah se náhodou učí pomocí gradient descent spolu se vším ostatním. Každé mystické tvrzení o „embedding space“ končí tady.
Natrénujte ji a sledujte, kam jde:
step 1 train 3.7550 val 3.3882 max gap to the count table 0.757269
step 100 train 2.4732 val 2.4726 max gap to the count table 0.388354
step 1000 train 2.4557 val 2.4549 max gap to the count table 0.041862
step 3000 train 2.4547 val 2.4544 max gap to the count table 0.004048Poslední sloupec je největší absolutní rozdíl mezi libovolnou buňkou softmax(W) a odpovídající buňkou count table a jde k nule. Po 3 000 krocích je největší neshoda kdekoli v 729 buňkách 0,004048 a průměr je 0,000224. Nejhorší buňka je q→i, viděná dvanáctkrát v celé trénovací sadě; mezi 22 řádky s více než tisícem výskytů je nejhorší neshoda 0,000562.
count table network
a -> '.' 0.1945 0.1945
a -> 'n' 0.1601 0.1601
a -> 'r' 0.0967 0.0967Gradient descent, začínající z náhodných čísel a bez jiné instrukce než „zvětši log-pravděpodobnost dalšího písmene“, znovu objevil tabulku počtů. A musel: počty jsou maximum-likelihood odhad, cross-entropy je záporná log-likelihood, takže oba postupy optimalizují stejný cíl a tento cíl má jedno optimum. Síť se nenaučila něco jako počítání. Pomalu zkonvergovala k počítání.
Což vyvolává férovou otázku, proč by se tím někdo obtěžoval. Protože count table odtud nemá kam jít, zatímco síť ano.
Bottleneck je kontext, ne kapacita
Odkaz na sekci: Bottleneck je kontext, ne kapacitaRozšiřte model tak, aby se díval na víc než jeden předchozí znak. To je Bengioova architektura z roku 2003, přímý předek každého modelu ve zbytku tohoto kurzu:4 vezměte poslední tři znaky, každý namapujte přes embedding table na 10rozměrný řádek, spojte řádky do 30 čísel, pošlete je přes skrytou vrstvu z kapitoly 5 a zakončete výstupní vrstvou vytvářející jeden logit na položku slovníku.
C = torch.randn((27, 10)) # the embedding table
W1 = torch.randn((3 * 10, 200)) # the hidden layer from Chapter 5
W2 = torch.randn((200, 27)) # one output per vocabulary entry
emb = C[X].view(-1, 30) # three lookups, concatenated
h = torch.tanh(emb @ W1 + b1)
logits = h @ W2 + b2
loss = F.cross_entropy(logits, Y)Všimněte si, co je nové a co není. Skrytá vrstva je ta z kapitoly 5, beze změny; loss je z kapitoly 4, beze změny. Novinky jsou embedding table na začátku a výstupní vrstva široká jako slovník z kapitoly 7 — a právě ta druhá je drahá část každého jazykového modelu, který kdy byl postaven, protože skutečný slovník má 100 000 položek a toto násobení matice běží v každé pozici.
Stejný kód, trénovaný stejně, pouze se změněnou velikostí context window:
| kontext | parametry | validační loss | validační perplexity |
|---|---|---|---|
| počítání, 1 znak | 729 | 2,4546 | 11,642 |
| neuronový, 1 znak | 7 897 | 2,4577 | 11,678 |
| neuronový, 3 znaky | 11 897 | 2,1145 | 8,285 |
| neuronový, 8 znaků | 21 897 | 2,0506 | 7,773 |
Zajímavý je druhý řádek. Síť s 200jednotkovou skrytou vrstvou a jedenáctkrát více parametry než count table funguje přesně stejně dobře jako count table a ani o kousek lépe. Kapacita nikdy nebyla omezením. Kontext jednoho znaku dovoluje určitý loss a nic, co k tomu přišroubujete, se pod něj nedostane, protože informace tam není.
Dejte jí tři znaky a perplexity spadne z 11,68 na 8,29 — pokles o 29 %, koupený 4 000 dalšími parametry. Počítání tady poráží přesně z důvodu diagnostikovaného dříve: count model nad tříznakovými kontexty potřebuje řádků, většinou prázdných nebo s jediným pozorováním, a každý z nich se učí sám. Síť sdílí. Pokud a, e a i skončí s podobnými embedding řádky, to, co se naučí po bra, se přenese na bre, aniž by kdy viděla bre. Tento přenos je celá hodnota embedding table a je to mezera mezi druhým a třetím řádkem.
Vzorky se podle toho zlepší:
deliah nellara joce kael quintis
salayson reety khyrmin mahnen madiaryxiaPořád to není seznam skutečných jmen. Ale deliah, nellara a kael by na takovém seznamu nepůsobily nepatřičně a rozběhnuté obludy jsou pryč: nejdelší z dvaceti vzorků z count modelu má devatenáct písmen, nejdelší z dvaceti z tohoto modelu třináct.
Co je skutečně uvnitř embedding table
Odkaz na sekci: Co je skutečně uvnitř embedding tableTabulka je : jeden řádek deseti čísel na znak, všechny inicializované náhodně a posouvané pouze gradientem loss dalšího znaku. Nikdo tam nic nevložil. Co v ní tedy skončilo?
Nástroj pro otázku je cosine similarity, tedy dot product z kapitoly 1 s vydělenými délkami:
Měří úhel mezi dvěma vektory a ignoruje jejich délky, což chcete, když délka řádku odráží, jak často se jeho token objevil, a ne co znamená. Nejprve normalizujte každý vektor na délku 1 — jak to skutečné systémy dělají jednou při indexování — a cosine similarity je prostě dot product.
Tady jsou nejbližší sousedé několika znaků v natrénované tabulce:
'c' -> 'k':+0.598 'j' -> 'z':+0.650 'i' -> 'y':+0.541
'u' -> 'e':+0.482 'a' -> 'h':+0.367 '.' -> 'q':+0.077Něco z toho odpovídá tomu, co slibuje folklor. c a k jsou ve jménech zaměnitelné, stejně jako i a y; j a z jsou obě vzácné, převážně počáteční souhlásky, které se chovají podobně. Hraniční symbol . není blízko téměř ničemu — 0,077 k nejbližšímu písmenu — protože je to jediný symbol, který označuje pozici, ne zvuk.
A něco z toho neodpovídá. Nejbližší soused a je h, ne jiná samohláska. V průměru přes všechny dvojice:
mean cosine, vowel to vowel : +0.1889
mean cosine, consonant to consonant : +0.0765
mean cosine, vowel to consonant : -0.0042Samohlásky jsou si podobnější navzájem než souhláskám a efekt je skutečný, ale malý. Testováno proti 2 000 náhodně zvoleným skupinám pěti písmen se 58 z těchto skupin oddělí alespoň tak čistě — rozdíl významný asi na . Skutečné tedy ano, ale ani zdaleka ne ostrý geometrický ostrov, který populární výklady embeddings naznačují.
To je poctivý popis embedding table a pro zbytek kurzu stojí za to si ho držet. Není to mapa významu. Je to změna souřadnic, naučená místo navržené, jejímž jediným úkolem je usnadnit práci další vrstvě — stejná věta, kterou kapitola 5 použila pro skrytou vrstvu, jež přehnula rovinu, aby vyřešila XOR. Jakákoli struktura, kterou v ní najdete, tam je proto, že snížila loss, a struktura, která loss nesnižuje, tam prostě není.
word2vec, GloVe a aritmetika, kterou všichni citují
Odkaz na sekci: word2vec, GloVe a aritmetika, kterou všichni citujíPokud je užitečnou částí tabulka, můžete jít přímo po ní. To je word2vec: ponechat embedding lookup, zahodit jazykový model.5
Cíl skip-gram with negative sampling je jeden řádek. Pro skutečnou dvojici (střed, kontext) vytaženou z korpusu tlačte jejich dot product nahoru; pro falešných dvojic vytažených ze šumového rozdělení ho tlačte dolů:6
To je binární klasifikace — „vyskytla se tato dvě slova opravdu spolu?“ — a je levná právě proto, že se nikdy nedotkne celého slovníku, což v roce 2013 umožnilo praktický trénink na miliardách slov. GloVe přichází k podobným vektorům z opačné strany: faktorizuje matici globálních počtů spoluvýskytů místo streamování přes příklady.7 Obojí se fituje přesně na statistiku, z níž byla postavena count table. Je to počítání, komprimované.
Natrénované na text8 — 17 005 207 slov anglické Wikipedie, 71 290 z nich s výskytem alespoň pětkrát, 100 dimenzí, tři průchody — vektory vyjdou s vlastností, která je proslavila:
king -> charles 0.700, son 0.693, queen 0.686, henry 0.669, throne 0.667
physics -> chemistry 0.672, electromagnetism 0.661, quantum 0.654, theoretical 0.624
guitar -> bass 0.733, vocals 0.732, acoustic 0.728, guitars 0.703, drums 0.685
three -> seven 0.892, two 0.877, one 0.875, five 0.871, four 0.870Nikdo nedodal kategorii pro nástroje ani pro číslovky. Teď slavná část: vezměte king, odečtěte man, přičtěte woman a najděte nejbližší vektor k výsledku.
king - man + woman
nothing excluded : king 0.693, elizabeth 0.657, wife 0.629, woman 0.607
a, b, c excluded : elizabeth 0.657, wife 0.629, mary 0.607 (queen is 4th, 0.604)Nejbližší vektor k king - man + woman je king. To není zvláštnost jednoho příkladu. Mikolovova evaluační sada klade otázky tvaru a : b :: c : ? — 8 869 sémantických (paris : france :: rome : italy) a 10 675 syntaktických (walking : walked :: swimming : swam) — a napříč 4 103 sémantickými otázkami, na které tento slovník umí odpovědět, je vítězem jedno ze tří vstupních slov v 99,8 % případů. Publikované ukázky to nezmiňují, protože standardní skórovací pravidlo před hledáním smaže a, b a c. Je to legitimní pravidlo a odvádí víc práce než aritmetika:
| jak se vybírá odpověď | sémantické | syntaktické |
|---|---|---|
| offset, se vstupy vyloučenými (standard) | 17,0 % | 11,9 % |
| offset, bez vyloučení čehokoli | 0,1 % | 0,4 % |
nejbližší soused samotného c, vstupy vyloučeny | 13,1 % | 9,3 % |
nejbližší soused samotného b, vstupy vyloučeny | 2,3 % | 0,4 % |
Třetí řádek je ten, u kterého stojí za to se zastavit. Zahoďte a a b, nedělejte vůbec žádnou aritmetiku, vraťte cokoli, co je nejblíž c — a ponecháte si 77 % sémantického skóre. Většina toho, co vypadá jako analogické uvažování, je blízkost plus pravidlo, které zakazuje zjevné odpovědi, přesně jak to Linzen změřil na řádně natrénovaných vektorech a jak to replikují baseline výše.8 Tyto konkrétní vektory jsou malé — 17 milionů slov proti miliardám za publikovanými modely — takže procenta čtěte jako tvar, ne jako state of the art. Tvar je to, co přežívá v každém měřítku: aritmetika je skutečná a mnohem slabší než jedna ukázka, kterou všichni citují.
Statické a kontextové: jeden vektor na slovo, nebo jeden na výskyt
Odkaz na sekci: Statické a kontextové: jeden vektor na slovo, nebo jeden na výskytVšechno dosud má tvrdý limit zabudovaný v datové struktuře. Tabulka má jeden řádek na token. Slovo bank dostane jeden vektor, stejný ve větě o řece i ve větě o hypotéce — nutně, protože lookup podle id nemůže záviset na ničem dalším.
Oprava je přestat vektor číst z tabulky a začít ho počítat z věty. To je contextual embedding, zavedený ELMo v roce 2018 a ve stejném roce standardizovaný BERTem.910 Měřeno na skutečném modelu jsou čísla ostřejší než vysvětlení:
sentence A: "He sat on the bank of the river and watched the water go by."
sentence B: "She deposited the cheque at the bank on the corner of the street."
static vector for 'bank' (a row of the input embedding table)
cosine A vs B ........................ 1.000000
contextual vector for 'bank', layer by layer
layer | A vs B | A vs another river sentence | B vs another money sentence
0 | 0.9512 | 0.9512 | 0.9359
4 | 0.5647 | 0.8987 | 0.7716
9 | 0.4284 | 0.8699 | 0.7568
12 | 0.5278 | 0.8702 | 0.7335První řádek je přesný, ne přibližný: statický vektor pro bank je stejných 768 čísel v obou větách, takže cosine je konstrukčně 1. O devět vrstev později leží oba výskyty na 0,43, zatímco bank ve dvou různých říčních větách zůstává na 0,87. Nikdo nikde v tomto procesu neoznačoval význam; významy se oddělily, protože jejich oddělení usnadňuje splnění trénovacího cíle — uhodnout skrytý token z jeho sousedů.
Pozornost si zaslouží dva detaily. Vrstva 0 už je 0,9512 místo 1,0, protože byly přidány position embeddings a slovo v každé větě sedí jinde. A podobnost ve vrstvách 11 a 12 znovu roste: finální vrstvy pretrained modelu jsou specializované na jeho trénovací cíl a často nejsou tím nejlepším místem, odkud brát reprezentaci.
Zobrazit podrobnosti
Volitelné: weight tying.
V bert-base-uncased je embedding table — 23 440 896 čísel, 21,4 % ze 109 482 240 parametrů modelu. V malém jazykovém modelu je tento podíl ještě větší, proto je jeden trik téměř univerzální: vstupní tabulka a výstupní vrstva, která vytváří logits, jsou stejná matice, jednou použitá přes lookup řádků a jednou transponovaná.11 Výstupní vrstva už každé položce slovníku přiřazuje vektor — bere dot product proti každé z nich — a tying říká, že vektor použitý ke čtení token a vektor použitý k jeho zápisu mají být stejný objekt. Najednou sníží počet parametrů a zlepší perplexity, což je dost vzácné na to, abychom si toho všimli.
Embedding model není jazykový model
Odkaz na sekci: Embedding model není jazykový modelChcete-li prohledávat korpus podle významu, potřebujete jeden vektor na větu. Jakmile je máte, hledání je triviální — tohle je celé semantic retrieval a kapitola 19 je o všem okolo:
E = normalise(embed(sentences)) # (200, d), every row of length 1
q = normalise(embed([query])) # (1, d)
scores = q @ E.T # one matrix multiply
top5 = scores[0].argsort()[::-1][:5]Jediná skutečná otázka tedy je, odkud pochází embed. Zjevný tah je vzít pretrained jazykový model, pustit každou větu skrz něj a zprůměrovat token vektory. Tady je tato metoda proti čtyřem alternativám, skórovaná dvěma způsoby: rank correlation mezi cosine a lidskými soudy podobnosti nad 1 379 dvojicemi benchmarku STS a top-1 retrieval na indexu postaveném z 200 nejsilněji parafrázovaných těchto dvojic — jedna strana každé dvojice indexovaná, druhá použitá jako query.
| jak je věta embedded | rank correlation | top-1 na indexu 200 vět |
|---|---|---|
| binární překryv slov (vůbec žádný model) | 0,5500 | 89,0 % |
| průměr statických vektorů natrénovaných výše | 0,5263 | 85,5 % |
BERT, token [CLS] | 0,2030 | 67,0 % |
| BERT, průměr token vektorů | 0,4729 | 84,0 % |
| MiniLM, trénovaný kontrastivně | 0,8203 | 92,0 % |
Čtěte prostřední tři řádky proti prvním dvěma. Pretrained transformer se 109 miliony parametrů, použitý zjevným způsobem, je horší v posuzování podobnosti vět než počítání toho, kolik slov dvě věty sdílejí — a horší než průměrování 100rozměrných vektorů text8 natrénovaných před chvílí. Token [CLS], který tutoriály stále doporučují, protože BERT byl pretrained s větným cílem navázaným právě na něj, je horší než polovina toho.
To není chyba BERTu. Je to cíl. Jazykový model je trénovaný tak, aby jeho hidden states předpovídaly token; nic v tom nežádá, aby dvě parafráze skončily blízko sebe, a nic neodměňuje geometrii, v níž cosine znamená „stejný význam“. Poslední řádek je model pětinové velikosti (22 713 216 parametrů) trénovaný na úplně jiný loss: contrastive learning, kde příklady jsou dvojice — otázka a její odpověď, věta a její parafráze — a cíl táhne skutečné dvojice k sobě a odtlačuje vzorkované negativy od sebe. To je přínos Sentence-BERTu a původ celého odvětví embedding modelů.12 Dense Passage Retrieval používá stejný recept přímo pro vyhledávání, s jedním encoderem pro dotazy a jedním pro pasáže.13
Praktické pravidlo tedy zní:
Embedding model není jazykový model s odstraněnou poslední vrstvou. Je to jiný model s jiným cílem, obvykle mnohem menší, jehož cosine znamená to, co chcete, protože byl trénován na dvojicích, kde to bylo cílem. Tabulka výše je cena za nahrazení jednoho druhým.
A celá rodina selhává na pořadí slov. „The dog bit the man“ a „the man bit the dog“ mají identické bags of words, takže překryv slov i průměr statických vektorů jim dají cosine přesně 1,000000, a mean-pooled BERT, který pozici vidí, stejně skončí skoro tamtéž — a kontrastivně trénovaný MiniLM je pořád položí na 0,979. Pokud vaše retrieval úloha závisí na tom, kdo co komu udělal, žádný cosine threshold vás nezachrání.
Kapitola 19 na těchto základech staví produkční retrieval systém a dochází ke konkrétnímu cosine cut-off. Poslední měření v této kapitole je to, co z takového čísla dělá obhajitelné rozhodnutí, ne magii.
Prokletí dimenzionality v jedné tabulce
Odkaz na sekci: Prokletí dimenzionality v jedné tabulceSkutečné embeddings mají stovky nebo tisíce složek a vzdálenosti se tam nahoře chovají zvláštně. Vezměte 1 000 náhodných bodů v jednotkové krychli o dimenzích a podívejte se na poměr největší a nejmenší vzdálenosti mezi libovolnými dvěma z nich:
| dimenze | nejbližší dvojice | nejvzdálenější dvojice | poměr |
|---|---|---|---|
| 2 | 0,0007 | 1,3612 | 1921,66 |
| 10 | 0,2361 | 2,3397 | 9,91 |
| 100 | 3,0047 | 5,1752 | 1,72 |
| 1 000 | 11,7809 | 14,0306 | 1,19 |
| 10 000 | 39,6152 | 42,0125 | 1,06 |
V deseti tisících dimenzích je nejvzdálenější dvojice bodů jen o 6 % dál než nejbližší dvojice. Všechno je zhruba stejně vzdálené od všeho ostatního, „nearest neighbour“ přestává nést moc informací a to je prokletí dimenzionality — a také jeden důvod, proč velké vektorové databáze nedělají přesné nearest-neighbour search. Druhá strana téže mince je to, co činí cosine thresholds použitelnými: měřeno přes tisíc dvojic náhodných jednotkových vektorů sedí průměrný cosine na ve 100 dimenzích a v 768, se směrodatnými odchylkami 0,0968 a 0,0357 — a v 768 dimenzích jen 0,2 % náhodných dvojic překročí 0,1 v absolutní hodnotě. Naměřená podobnost 0,4 proto není „40 % podobné“; je daleko mimo cokoli, co vytváří náhoda, a proto thresholds mezi 0,3 a 0,7 oddělují signál od šumu místo toho, aby seděly uprostřed něj.
Kam dál
Odkaz na sekci: Kam dálModel v této kapitole čte pevný počet předchozích znaků, každý vyhledá a výsledky slepí dohromady v pořadí. Tento návrh má dva problémy a oba jsou tentýž problém.
Podívejte se znovu na tabulku kontextu: přechod ze tří znaků na osm téměř zdvojnásobil parametry a koupil 0,06 nats. Cena roste lineárně s kontextem — každá další pozice potřebuje vlastní blok první vahové matice — a přínos ne. Posuňte to na tisíc tokens a samotná první vrstva převáží zbytek modelu, přičemž většina je utracená za pozice, které pro danou předpověď nejsou důležité.
Což je druhý problém: model nemá jak rozhodnout, které z předchozích tokens jsou důležité. Pozice dvě má vlastní váhy a pozice sedm má vlastní, natrvalo, ať je v nich cokoli. Když model hláskuje nell, rozhodující znak je ten bezprostředně předtím. Když věta obsahuje zájmeno, slovo, které určí jeho referent, může být čtyřicet tokens zpět — a žádný pevný slot nelze přiřadit k „čtyřicet zpět“, protože příště to bude šest.
Chceme model, který pro každou předpověď spočítá, jak moc má každý dřívější token počítat — váhy nad kontextem vytvářené obsahem, ne fixované rozvržením. Napište to pečlivě a začne to jako něco úplně všedního: průměr přes předchozí tokens. Pak nechte váhy tohoto průměru učit se a nechte je záviset na tom, který token se ptá.
To je attention a je to kapitola 9.
Zdroje a metoda
Odkaz na sekci: Zdroje a metodaVedle toho stojí za přečtení: kapitola 3 z Speech and Language Processing od Jurafskyho a Martina, která zpracovává n-gram modely, smoothing a perplexity mnohem pečlivěji, než je zde prostor, včetně toho, proč interpolation a back-off překonávají přičtení jedničky; poznámky Stanford CS229 §17.1–17.2 pro jazykové modelování z pravděpodobnostní strany; a Linzenův článek výše, který je krátký a stojí za přečtení celý.
Reference
Odkaz na sekci: Reference-
Příklad generování jmen, dataset a postup od count table k síti ve stylu Bengia sledují sérii Andreje Karpathyho building makemore, jejíž první dvě části jsou nejlepším doprovodem k této kapitole. ↩
-
Shannon, C. E. Prediction and Entropy of Printed English. Bell System Technical Journal 30(1), s. 50–64 (1951). Lidé hádající další písmeno angličtiny a původní měření bitů na znak. ↩
-
Shannon, C. E. A Mathematical Theory of Communication. Bell System Technical Journal 27 (1948). Věta o zdrojovém kódování a ztotožnění predikce s kompresí. ↩
-
Bengio, Y., Ducharme, R., Vincent, P. and Jauvin, C. A Neural Probabilistic Language Model. Journal of Machine Learning Research 3, s. 1137–1155 (2003). Architektura použitá výše: embedding na slovo, konkatenovaný přes pevné okno, přes skrytou vrstvu, do softmax nad slovníkem. ↩
-
Mikolov, T., Chen, K., Corrado, G. and Dean, J. Efficient Estimation of Word Representations in Vector Space. arXiv:1301.3781 (2013). CBOW a skip-gram a analogická sada použitá výše. ↩
-
Mikolov, T., Sutskever, I., Chen, K., Corrado, G. and Dean, J. Distributed Representations of Words and Phrases and their Compositionality. arXiv:1310.4546 (2013). Negative sampling, subsampling častých slov a šumové rozdělení umocněné na 3/4 použité výše. ↩
-
Pennington, J., Socher, R. and Manning, C. GloVe: Global Vectors for Word Representation. EMNLP 2014. Slovní vektory z faktorizace globální matice spoluvýskytů místo streamovaných lokálních oken. ↩
-
Linzen, T. Issues in evaluating semantic spaces using word analogies. RepEval 2016, arXiv:1606.07736. Zdroj offset-free baselines replikovaných výše. ↩
-
Peters, M. et al. Deep contextualized word representations. arXiv:1802.05365 (2018). ELMo: jeden vektor na výskyt, počítaný obousměrným jazykovým modelem. ↩
-
Devlin, J., Chang, M.-W., Lee, K. and Toutanova, K. BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding. arXiv:1810.04805 (2018). Model měřený v experimentu s bank. ↩
-
Press, O. and Wolf, L. Using the Output Embedding to Improve Language Models. arXiv:1608.05859 (2016), and Inan, H., Khosravi, K. and Socher, R. Tying Word Vectors and Word Classifiers. arXiv:1611.01462 (2016). Dva nezávislé argumenty pro stejný trik. ↩
-
Reimers, N. and Gurevych, I. Sentence-BERT: Sentence Embeddings using Siamese BERT-Networks. arXiv:1908.10084 (2019). Jeho úvodní měření — mean-pooled BERT zaostávající za průměrovanými statickými vektory v podobnosti vět — je to, co tabulka výše reprodukuje. ↩
-
Karpukhin, V. et al. Dense Passage Retrieval for Open-Domain Question Answering. arXiv:2004.04906 (2020). Kontrastivní trénink dvouenkodérového retrieveru; přímý předek retrieval stacku z kapitoly 19. ↩