Back to archive
#ai#llm#glossary#aigen

Decode

Pierwszy fragment odpowiedzi już się pojawił. Następny musi uwzględniać to, co właśnie napisano: po „Dziś piję herbatę” model ma inny kontekst niż po „Dziś piję wodę”. Trzeba kolejno rozwijać ten zmieniający się tekst.

Decode to etap generowania kontynuacji po przetworzeniu początkowego wejścia. W zwykłej pętli model przetwarza ostatnio wybrany token — kawałek tekstu — wylicza szanse następnego, a reguła wyboru dopisuje jeden z kandydatów.

Wybrany fragment staje się wejściem kolejnego kroku. KV Cache zachowuje potrzebne wyniki wcześniejszych obliczeń, dzięki czemu nie trzeba od nowa przetwarzać całej historii.

Powstaje zależność między kolejnymi wyborami, choć kilka różnych odpowiedzi można obsługiwać razem. Decode oznacza tu rozwijanie tekstu przez model, a nie tylko zamianę numerów tokenów na znaki. Prefill przygotowuje początkowy kontekst.

Źródło mechanizmu: Shazeer, Fast Transformer Decoding, §2.4.

Mechanizm i szczegóły

Rząd gotowych oczek dzianiny kończy się jednym nowym oczkiem tworzonym na drucie.

Pierwszy token odpowiedzi można wybrać z wyniku Prefill. Jeśli generowanie trwa dalej, ten token staje się wejściem kolejnego przejścia przez model. Jego nowe K i V dołączają do KV Cache, a query korzysta z bieżącej i wcześniejszych pozycji. Sam wybór identyfikatora tokena nie dopisuje jeszcze jego reprezentacji do cache. Widać to w pętli generowania Hugging Face, „Cache storage implementation”.

Token wybrany, ale jeszcze nieprzetworzony

Własny miniaturowy model ma trzy tokeny: A, B, C. Ich wektory to odpowiednio (1,0)(1,0), (0,1)(0,1) i (−1,−1)(-1,-1). Przyjmujemy Q=K=VQ=K=V równe tym wektorom; attention używa skali 1/21/\sqrt{2}. Z wyniku h=(h0,h1)h=(h_0,h_1) tworzymy logity [h1,h0,−h0−h1][h_1,h_0,-h_0-h_1], a Greedy Decoding wybiera największy.

Prompt A B daje w przybliżeniu h=(0,330;0,670)h=(0{,}330;0{,}670), więc pierwszą odpowiedzią jest A. Cache zawiera na razie tylko dwie pozycje promptu. Dopiero następne przejście przetworzy wybrane A.

To kompletnie określony model demonstracyjny, bez uczenia, pozycji, wielu warstw ani tokena końca. Jego powtarzalna odpowiedź nie ma znaczenia językowego. Porównanie z ponownym obliczaniem całego prefiksu sprawdza zgodność wyników, a licznik obejmuje wyłącznie pozycje, dla których liczono K/V.

Cache usuwa powtarzane obliczenia wcześniejszych K/V, ale attention nadal odczytuje kontekst. Przy małych batchach ograniczeniem często staje się transfer wag lub cache; zależy to od modelu, sprzętu i długości sekwencji. W architekturze Disaggregated Serving Decode działa na osobnych zasobach po otrzymaniu cache. Decode w tym znaczeniu nie jest zamianą identyfikatorów tokenów z powrotem na tekst przez tokenizer.

Wykorzystuję treści generowane przez AI jako część mojego codziennego procesu nauki.