Asymetryczne systemy liczbowe - Asymmetric numeral systems

Asymetryczne systemy liczbowe ( ANS ) to rodzina metod kodowania entropijnego wprowadzona przez Jarosława (Jarka) Dudę z Uniwersytetu Jagiellońskiego , stosowana w kompresji danych od 2014 roku ze względu na lepszą wydajność w porównaniu do dotychczas stosowanych metod, będącą do 30 razy szybszą. ANS łączy współczynnik kompresji kodowania arytmetycznego (który wykorzystuje prawie dokładny rozkład prawdopodobieństwa) z kosztem przetwarzania podobnym do kodowania Huffmana . W wariancie z tabelą ANS (tANS) osiąga się to poprzez skonstruowanie maszyny skończonej do działania na dużym alfabecie bez użycia mnożenia.

ANS jest używany m.in. w kompresorze Facebook Zstandard (wykorzystywany także np. w jądrze Linux , systemie operacyjnym Android , został opublikowany jako RFC 8478 dla MIME i HTTP ), w kompresorze Apple LZFSE, kompresorze Google Draco 3D (wykorzystywanym np. w Pixar Universal Scene Description format) i kompresor obrazu PIK, w kompresorze CRAM DNA z narzędzi SAMtools i innych formatach plików genetycznych, kompresor Dropbox DivANS oraz w standardzie kompresji obrazu JPEG XL nowej generacji.

Podstawową ideą jest zakodowanie informacji w jedną liczbę naturalną . W standardowym systemie liczba binarna, możemy dodać trochę informacji, które przez dodanie na końcu , co daje nam . Dla kodera entropijnego jest to optymalne, jeśli . ANS uogólnia ten proces dla dowolnych zestawów symboli z towarzyszącym rozkładem prawdopodobieństwa . W ANS, jeżeli jest wynikiem dołączenia informacji od do , to . Równoważnie, , gdzie jest liczbą bitów informacji przechowywanych w liczbie i jest liczbą bitów zawartych w symbolu .

W przypadku zasady kodowania zbiór liczb naturalnych jest dzielony na rozłączne podzbiory odpowiadające różnym symbolom – podobnie jak liczby parzyste i nieparzyste, ale z gęstościami odpowiadającymi rozkładowi prawdopodobieństwa zakodowanych symboli. Następnie, aby dodać informację z symbolu do informacji już zapisanej w bieżącym numerze , przechodzimy do numeru będącego pozycją -tego wyglądu z -tego podzbioru.

Istnieją alternatywne sposoby zastosowania go w praktyce – bezpośrednie formuły matematyczne dla kroków kodowania i dekodowania (warianty uABS i rANS) lub całe zachowanie można umieścić w tabeli (wariant tANS). Ponowna normalizacja służy do zapobiegania przechodzeniu w nieskończoność – przeniesieniu zgromadzonych bitów do lub ze strumienia bitów.

Kodowanie entropijne

Załóżmy, że zakodowana zostanie sekwencja 1000 zer i jedynek, których bezpośrednie zapisanie zajmie 1000 bitów. Jeśli jednak jakoś wiadomo, że zawiera tylko 1 zero i 999 jedynek, wystarczyłoby zakodować położenie zera, co wymaga tutaj tylko bitów zamiast oryginalnych 1000 bitów.

Generalnie takie ciągi długości zawierające zera i jedynek, z pewnym prawdopodobieństwem , nazywamy kombinacjami . Używając przybliżenia Stirlinga otrzymujemy ich asymptotyczną liczbę będącą

zwany entropią Shannona .

Stąd, aby wybrać jedną taką sekwencję potrzebujemy około bitów. To wciąż bity , ale może być też znacznie mniejsze. Na przykład potrzebujemy tylko bitów dla .

Kodera entropijnego umożliwia kodowanie sekwencji symboli z wykorzystaniem w przybliżeniu bitów Shannon entropii na symbol. Na przykład ANS może być bezpośrednio użyty do wyliczenia kombinacji: przypisz inną liczbę naturalną do każdej sekwencji symboli o stałych proporcjach w prawie optymalny sposób.

W przeciwieństwie do kombinacji kodowania, ten rozkład prawdopodobieństwa zwykle różni się w kompresorach danych. W tym celu entropię Shannona można postrzegać jako średnią ważoną: symbol prawdopodobieństwa zawiera bity informacji. ANS koduje informacje w jedną liczbę naturalną , interpretowaną jako zawierająca bity informacji. Dodanie informacji z symbolu prawdopodobieństwa zwiększa tę zawartość informacyjną do . Dlatego nowy numer zawierający obie informacje powinien mieć postać .

Podstawowe pojęcia ANS

Porównanie koncepcji kodowania arytmetycznego (po lewej) i ANS (po prawej). Oba mogą być postrzegane jako uogólnienia standardowych systemów liczbowych, optymalnych dla jednolitego rozkładu prawdopodobieństwa cyfr, na zoptymalizowane dla pewnego wybranego rozkładu prawdopodobieństwa. Kodowanie arytmetyczne lub zakresowe odpowiada dodawaniu nowych informacji na najbardziej znaczącej pozycji, podczas gdy ANS uogólnia dodawanie informacji na najmniej znaczącej pozycji. Jego zasadą kodowania jest " x przechodzi do x-tego wyglądu podzbioru liczb naturalnych odpowiadającego aktualnie zakodowanemu symbolowi". W przedstawionym przykładzie sekwencja (01111) jest zakodowana na liczbę naturalną 18, mniejszą niż 47 uzyskaną przy użyciu standardowego systemu binarnego, dzięki lepszej zgodności z częstościami zakodowanego ciągu. Zaletą ANS jest przechowywanie informacji w jednej liczbie naturalnej, w przeciwieństwie do dwóch określających zakres.

Wyobraź sobie, że w liczbie naturalnej jest przechowywana jakaś informacja , na przykład jako sekwencja bitowa jej rozwinięcia binarnego. Aby dodać informacje ze zmiennej binarnej , możemy użyć funkcji kodowania , która przesuwa wszystkie bity o jedną pozycję w górę, a nowy bit umieszcza w najmniej znaczącej pozycji. Teraz funkcja dekodowania pozwala odzyskać poprzedni i ten dodany bit: . Możemy zacząć od stanu początkowego, a następnie użyć funkcji na kolejnych bitach skończonej sekwencji bitów, aby uzyskać końcową liczbę przechowującą całą sekwencję. Następnie użyj funkcji wiele razy, aż do uzyskania sekwencji bitów w odwrotnej kolejności.

Powyższa procedura jest optymalna dla równomiernego (symetrycznego) rozkładu prawdopodobieństwa symboli . ANS uogólniają go tak, aby był optymalny dla dowolnego wybranego (asymetrycznego) rozkładu prawdopodobieństwa symboli: . Podczas gdy w powyższym przykładzie wybierano pomiędzy parzystymi i nieparzystymi , w ANS ten parzysty/nieparzysty podział liczb naturalnych został zastąpiony podziałem na podzbiory o gęstości odpowiadającej założonemu rozkładowi prawdopodobieństwa : do pozycji występuje w przybliżeniu symbol .

Funkcja kodująca zwraca -ty wygląd z takiego podzbioru odpowiadający symbolowi . Założenie gęstości jest równoznaczne z warunkiem . Zakładając, że liczba naturalna zawiera informację bitową, . Stąd symbol prawdopodobieństwa jest zakodowany jako zawierający bity informacji, tak jak jest to wymagane od koderów entropijnych .

Jednolity wariant binarny (uABS)

Zacznijmy od alfabetu binarnego i rozkładu prawdopodobieństwa , . Do pozycji potrzebujemy w przybliżeniu analogów liczb nieparzystych (dla ). Tę liczbę wystąpień możemy wybrać jako , coraz . Ten wariant nazywa się uABS i prowadzi do następujących funkcji dekodowania i kodowania:

Rozszyfrowanie:

s = ceil((x+1)*p) - ceil(x*p)  // 0 if fract(x*p) < 1-p, else 1
if s = 0 then new_x = x - ceil(x*p)   // D(x) = (new_x, 0), this is the same as new_x = floor(x*(1-p))
if s = 1 then new_x = ceil(x*p)  // D(x) = (new_x, 1)

Kodowanie:

if s = 0 then new_x = ceil((x+1)/(1-p)) - 1 // C(x,0) = new_x
if s = 1 then new_x = floor(x/p)  // C(x,1) = new_x

Ponieważ jest to standardowy system binarny (z odwróconymi 0 i 1), dla innego staje się optymalny dla danego rozkładu prawdopodobieństwa. Na przykład, dla tych formuł prowadzą do tabeli dla małych wartości :

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
0 1 2 3 4 5 6 7 8 9 10 11 12 13
0 1 2 3 4 5 6

Symbol odpowiada podzbiorowi liczb naturalnych o gęstości , które w tym przypadku są pozycjami . Ponieważ pozycje te wzrastają o 3 lub 4. Ponieważ tutaj wzór symboli powtarza się co 10 pozycji.

Kodowanie można znaleźć wybierając wiersz odpowiadający danemu symbolowi i wybierając dany w tym wierszu. Następnie w górnym wierszu znajduje się . Na przykład od środka do górnego rzędu.

Wyobraź sobie, że chcielibyśmy zakodować sekwencję '0100' zaczynając od . Najpierw zabiera nas do , potem do , potem do , potem do . Korzystając z funkcji dekodowania w tym finale , możemy pobrać sekwencję symboli. Wykorzystując w tym celu tabelę, w pierwszym wierszu określa się kolumnę, następnie niepusty wiersz i zapisaną wartość określają odpowiednie i .

Warianty zasięgu (rANS) i streaming

Wariant zakresowy również wykorzystuje wzory arytmetyczne, ale umożliwia operowanie na dużym alfabecie. Intuicyjnie dzieli zbiór liczb naturalnych na przedziały wielkościowe , a każdy z nich w identyczny sposób dzieli na podzakresy o proporcjach określonych przez założony rozkład prawdopodobieństwa.

Zaczynamy od kwantyzacji rozkładu prawdopodobieństwa do mianownika, gdzie wybiera się n (zwykle 8-12 bitów): dla niektórych liczb naturalnych (wielkości podzakresów).

Oznaczmy , dystrybuantę skumulowaną:

Dla oznaczenia funkcji (zwykle w formie tabeli)

symbol(y) = s  such that  CDF[s] <= y < CDF[s+1]

Teraz funkcja kodowania to:

C(x,s) = (floor(x / f[s]) << n) + (x % f[s]) + CDF[s]

Rozszyfrowanie: s = symbol(x & mask)

D(x) = (f[s] * (x >> n) + (x & mask ) - CDF[s], s)

W ten sposób możemy zakodować sekwencję symboli w dużą liczbę naturalną x . Aby uniknąć stosowania arytmetyki dużych liczb, w praktyce stosuje się warianty strumieni: które wymuszają przez renormalizację: wysyłanie najmniej znaczących bitów x do lub ze strumienia bitów (zwykle L i b są potęgami 2).

W wariancie rANS x jest na przykład 32-bitowy. W przypadku 16-bitowej renormalizacji dekoder w razie potrzeby uzupełnia najmniej znaczące bity ze strumienia bitów:

if(x < (1 << 16)) x = (x << 16) + read16bits()

Wariant stołowy (tANS)

Prosty przykład 4-stanowego automatu ANS dla Pr( a ) = 3/4, Pr( b ) = 1/4 rozkład prawdopodobieństwa. Symbol b zawiera −lg(1/4) = 2 bity informacji, a więc zawsze daje dwa bity. Natomiast symbol a zawiera −lg(3/4) ~ 0,415 bitów informacji, stąd czasami daje jeden bit (ze stanu 6 i 7), czasami 0 bitów (ze stanu 4 i 5), tylko zwiększając stan, co pełni rolę bufora zawierającego ułamkową liczbę bitów: lg( x ). Liczba stanów w praktyce wynosi np. 2048, dla alfabetu o rozmiarze 256 (do bezpośredniego kodowania bajtów).

Wariant tANS umieszcza całe zachowanie (w tym renormalizację) for w tabeli, która daje maszynę skończoną, unikając potrzeby mnożenia.

Na koniec etap pętli dekodowania można zapisać jako:

t = decodingTable(x);  
x = t.newX + readBits(t.nbBits); //state transition
writeSymbol(t.symbol); //decoded symbol

Krok pętli kodowania:

s = ReadSymbol();
nbBits = (x + ns[s]) >> r;  // # of bits for renormalization
writeBits(x, nbBits);  // send the least significant bits to bitstream
x = encodingTable[start[s] + (x >> nbBits)];

Konkretne kodowanie tANS określa się przez przypisanie symbolu do każdej pozycji, ich liczba wystąpień powinna być proporcjonalna do założonych prawdopodobieństw. Na przykład można wybrać przypisanie "abdacdac" dla rozkładu prawdopodobieństwa Pr(a)=3/8, Pr(b)=1/8, Pr(c)=2/8, Pr(d)=2/8. Jeśli symbole są przypisane w zakresach długości będących potęgami 2, otrzymalibyśmy kodowanie Huffmana . Na przykład kod prefiksu a->0, b->100, c->101, d->11 byłby otrzymany dla tANS z przypisaniem symbolu „aaaabcdd”.


Przykład generowania tablic tANS dla alfabetu o rozmiarze m = 3 i L = 16 stanów, a następnie zastosowanie ich do dekodowania strumienia. Najpierw przybliżamy prawdopodobieństwa za pomocą ułamka, którego mianownikiem jest liczba stanów. Następnie rozkładamy te symbole w prawie jednolity sposób, opcjonalnie szczegóły mogą zależeć od klucza kryptograficznego do jednoczesnego szyfrowania. Następnie wyliczamy wyglądy zaczynając od wartości będącej ich ilością dla danego symbolu. Następnie uzupełniamy najmłodsze bity ze strumienia, aby powrócić do założonego zakresu dla x (renormalizacja).

Uwagi

Jeśli chodzi o kodowanie Huffmana, modyfikacja rozkładu prawdopodobieństwa tANS jest stosunkowo kosztowna, stąd jest stosowana głównie w sytuacjach statycznych, zwykle z pewnym schematem Lempel-Ziv (np. ZSTD, LZFSE). W tym przypadku plik dzielony jest na bloki - dla każdego z nich niezależnie zliczane są częstotliwości symboli, a następnie po aproksymacji (kwantyzacji) zapisywanej w nagłówku bloku i wykorzystywanej jako statyczny rozkład prawdopodobieństwa dla tANS.

W przeciwieństwie do tego rANS jest zwykle używany jako szybszy zamiennik kodowania zakresu (np. CRAM , LZNA, Draco, AV1 ). Wymaga mnożenia, ale jest bardziej wydajny pod względem pamięci i jest odpowiedni do dynamicznego dostosowywania rozkładów prawdopodobieństwa.

Kodowanie i dekodowanie ANS odbywa się w przeciwnych kierunkach, dzięki czemu jest to stos symboli. Ta niedogodność jest zwykle rozwiązywana przez kodowanie w kierunku wstecznym, po czym można wykonać dekodowanie do przodu. W przypadku zależności kontekstowej, takiej jak model Markowa , koder musi używać kontekstu z perspektywy późniejszego dekodowania. W przypadku adaptacyjności koder powinien najpierw przejść do przodu, aby znaleźć prawdopodobieństwa, które będą używane (przewidywane) przez dekoder i przechowywać je w buforze, a następnie kodować w kierunku wstecznym przy użyciu zbuforowanych prawdopodobieństw.

Ostateczny stan kodowania jest wymagany do rozpoczęcia dekodowania, dlatego musi być przechowywany w skompresowanym pliku. Koszt ten można zrekompensować poprzez przechowywanie niektórych informacji w początkowym stanie kodera. Na przykład, zamiast zaczynać od stanu „10000”, zacznij od stanu „1****”, gdzie „*” to dodatkowe zapisane bity, które można odzyskać na końcu dekodowania. Alternatywnie, stan ten może być użyty jako suma kontrolna, rozpoczynając kodowanie od ustalonego stanu i sprawdzając, czy końcowy stan dekodowania jest oczekiwany.

Kontrowersje patentowe

Autor nowatorskiego algorytmu ANS i jego wariantów, tANS i rANS, chciał, aby jego prace były swobodnie dostępne w domenie publicznej z powodów altruistycznych. Nie dążył do czerpania z nich korzyści i podjął kroki, aby zapewnić, że nie staną się „legalnym polem minowym” lub ograniczonym lub czerpanym przez innych. W 2015 r. Google opublikował amerykański, a następnie światowy patent na „Mixed Boolean-token and factor coding”. W tym czasie profesor Duda został poproszony przez Google o pomoc w kompresji wideo, więc był dokładnie świadomy tej domeny, mając do pomocy oryginalnego autora.

Duda nie był zadowolony z (przypadkowego) odkrycia intencji patentowych Google, ponieważ jasno określił, że chce, aby była to domena publiczna i wspierał Google właśnie na tej podstawie. Duda złożył następnie wniosek osoby trzeciej do urzędu patentowego USA o odrzucenie. USPTO odrzuciło jego wniosek w 2018 roku, a Google następnie porzucił patent.

W czerwcu 2019 r. Microsoft złożył wniosek patentowy o nazwie „Funkcje kodowania i dekodowania systemu liczb asymetrycznych zakresu”. USPTO wydała ostateczne odrzucenie wniosku w dniu 27 października 2020 r. Jednak 2 marca 2021 r. Microsoft złożył uzasadnienie USPTO stwierdzające „Wnioskodawca z szacunkiem nie zgadza się z odrzuceniem”, starając się unieważnić ostateczne odrzucenie w ramach „Po Program Rozważania Końcowego 2.0". Wniosek jest obecnie w toku, ponieważ USPTO nie potwierdziło, czy pozwoli na kontynuowanie odwołania od odrzucenia.

Zobacz też

Bibliografia

  1. ^ J. Duda, K. Tahboub, NJ Gadil, EJ Delp, Zastosowanie asymetrycznych systemów liczbowych jako dokładnego zamiennika kodowania Huffmana , Sympozjum kodowania obrazu, 2015.
  2. ^ „Dr Jarosław Duda (Jarek Duda)” . Instytut Fizyki Teoretycznej . Uniwersytet Jagielloński w Krakowie . Pobrano 2021-08-02 .
  3. ^ Jarek Duda (6 października 2019). „Wykaz kompresorów wykorzystujących ANS, implementacje i inne materiały” . Źródło 6 października 2019 .
  4. ^ „Google oskarżony o próbę opatentowania technologii domeny publicznej” . Syczący komputer . 11 września 2017 r.
  5. ^ Mniejsza i szybsza kompresja danych dzięki Zstandard , Facebook, sierpień 2016.
  6. ^ 5 sposobów, w jakie Facebook poprawił kompresję na dużą skalę dzięki Zstandard , Facebook, grudzień 2018 r.
  7. ^ Zestaw kompresji Zstd dla Btrfs i Squashfs dla Linuksa 4.14, już używany na Facebooku , Phoronix, wrzesień 2017.
  8. ^ "Zstd w wersji Androida P" .
  9. ^ Kompresja Zstandard i Application/zstd Media Type (standard e-mail) .
  10. ^ Parametry protokołu przesyłania hipertekstu (HTTP) , IANA .
  11. ^ Apple Open-Sources nowy algorytm kompresji LZFSE , InfoQ, lipiec 2016 r.
  12. ^ a b Biblioteka kompresji Google Draco 3D .
  13. ^ Google i Pixar dodają kompresję Draco do formatu Universal Scene Description (USD) .
  14. ^ Google PIK: nowy stratny format obrazu w internecie .
  15. ^ Specyfikacja formatu CRAM (wersja 3.0) .
  16. ^ Chen W, Elliott LT (2021). „Kompresja danych genetycznych populacji poprzez entropię stanu skończonego” . J Bioinform Comput Biol : 2150026 . doi : 10.1142/S0219720021500268 . PMID  34590992 .
  17. ^ Budowanie lepszej kompresji razem z DivANS .
  18. ^ Ratuszniak Aleksander; Wassenberg, Jan; Sneyers, Jon; Alakuijala, Jyrki; Vandevenne, Lode; Wersari, Luca; Obryk, Robert; Szabadka, Zoltan; Kliuchnikow, Jewgienij; Comsa, Iulia-Maria; Potempa, Krzysztof; Brus, Martin; Firschinga, Moritza; Khasanowa, Renata; Ruud van Asseldonk; Boukortt, Sami; Gomez, Sebastian; Fischbacher, Tomasz (2019). „Projekt komisji systemu kodowania obrazu JPEG XL”. arXiv : 1908.03565 [ eess.IV ].
  19. ^ Wyjaśnienie kompresji danych , Matt Mahoney
  20. ^ „Mieszane kodowanie Boolean-token i współczynnika” . Google . Pobrano 14 czerwca 2021 .
  21. ^ „Protestuj do Google” (PDF) . Instytut Fizyki Teoretycznej. Uniwersytet Jagielloński w Krakowie Polska . Profesor Jarosław Duda.
  22. ^ „Po odrzuceniu przez urząd patentowy, nadszedł czas, aby Google zrezygnowało z prób patentowego wykorzystania algorytmu domeny publicznej” . EFR.
  23. ^ „Funkcje kodowania i dekodowania asymetrycznego systemu liczbowego zakresu” . Pobrano 14 czerwca 2021 .
  24. ^ "Trzeci raz to szkoda? Microsoft próbuje dwukrotnie odrzucić patent na kompresję przez sceptycznych egzaminatorów" . Rejestr . Pobrano 14 czerwca 2021 .
  25. ^ „Po ostatecznym rozpatrzeniu Pilot 2.0” . Biuro Patentów i Znaków Towarowych Stanów Zjednoczonych . Biuro Patentów i Znaków Towarowych Stanów Zjednoczonych . Pobrano 14 czerwca 2021 .
  26. ^ „Funkcje kodowania i dekodowania asymetrycznego systemu liczbowego zakresu” . Pobrano 14 czerwca 2021 .

Zewnętrzne linki