Asymetryczne systemy liczbowe - Asymmetric numeral systems
Systemy liczbowe |
---|
System liczb hindusko-arabskich |
Azji Wschodniej |
amerykański |
Alfabetyczny |
Dawny |
Systemy pozycyjne według bazy |
Niestandardowe pozycyjne systemy liczbowe |
Lista systemów liczbowych |
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
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)
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”.
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ż
- Kodowanie entropii
- Kodowanie Huffmana
- Kodowanie arytmetyczne
- Kodowanie zakresu
- Zstandardowy kompresor Facebooka
- Kompresor LZFSE Apple
Bibliografia
- ^ J. Duda, K. Tahboub, NJ Gadil, EJ Delp, Zastosowanie asymetrycznych systemów liczbowych jako dokładnego zamiennika kodowania Huffmana , Sympozjum kodowania obrazu, 2015.
- ^ „Dr Jarosław Duda (Jarek Duda)” . Instytut Fizyki Teoretycznej . Uniwersytet Jagielloński w Krakowie . Pobrano 2021-08-02 .
- ^ Jarek Duda (6 października 2019). „Wykaz kompresorów wykorzystujących ANS, implementacje i inne materiały” . Źródło 6 października 2019 .
- ^ „Google oskarżony o próbę opatentowania technologii domeny publicznej” . Syczący komputer . 11 września 2017 r.
- ^ Mniejsza i szybsza kompresja danych dzięki Zstandard , Facebook, sierpień 2016.
- ^ 5 sposobów, w jakie Facebook poprawił kompresję na dużą skalę dzięki Zstandard , Facebook, grudzień 2018 r.
- ^ Zestaw kompresji Zstd dla Btrfs i Squashfs dla Linuksa 4.14, już używany na Facebooku , Phoronix, wrzesień 2017.
- ^ "Zstd w wersji Androida P" .
- ^ Kompresja Zstandard i Application/zstd Media Type (standard e-mail) .
- ^ Parametry protokołu przesyłania hipertekstu (HTTP) , IANA .
- ^ Apple Open-Sources nowy algorytm kompresji LZFSE , InfoQ, lipiec 2016 r.
- ^ a b Biblioteka kompresji Google Draco 3D .
- ^ Google i Pixar dodają kompresję Draco do formatu Universal Scene Description (USD) .
- ^ Google PIK: nowy stratny format obrazu w internecie .
- ^ Specyfikacja formatu CRAM (wersja 3.0) .
- ^ 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 .
- ^ Budowanie lepszej kompresji razem z DivANS .
- ^ 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 ].
- ^ Wyjaśnienie kompresji danych , Matt Mahoney
- ^ „Mieszane kodowanie Boolean-token i współczynnika” . Google . Pobrano 14 czerwca 2021 .
- ^ „Protestuj do Google” (PDF) . Instytut Fizyki Teoretycznej. Uniwersytet Jagielloński w Krakowie Polska . Profesor Jarosław Duda.
- ^ „Po odrzuceniu przez urząd patentowy, nadszedł czas, aby Google zrezygnowało z prób patentowego wykorzystania algorytmu domeny publicznej” . EFR.
- ^ „Funkcje kodowania i dekodowania asymetrycznego systemu liczbowego zakresu” . Pobrano 14 czerwca 2021 .
- ^ "Trzeci raz to szkoda? Microsoft próbuje dwukrotnie odrzucić patent na kompresję przez sceptycznych egzaminatorów" . Rejestr . Pobrano 14 czerwca 2021 .
- ^ „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 .
- ^ „Funkcje kodowania i dekodowania asymetrycznego systemu liczbowego zakresu” . Pobrano 14 czerwca 2021 .
Zewnętrzne linki
- Architektury sprzętowe o wysokiej przepustowości do kodowania entropijnego asymetrycznych systemów liczbowych SM Najmabadi, Z. Wang, Y. Baroud, S. Simon, ISPA 2015
- https://github.com/Cyan4973/FiniteStateEntropy Implementacja tANS według entropii skończonego stanu (FSE) autorstwa Yanna Colleta
- https://github.com/rygorous/ryg_rans Wdrożenie rANS przez Fabiana Giesena
- https://github.com/jkbonfield/rans_static Szybka implementacja rANS i kodowania arytmetycznego przez Jamesa K. Bonfielda
- https://github.com/facebook/zstd/ Facebook kompresor Zstandard autorstwa Yanna Colleta (autora LZ4 )
- https://github.com/lzfse/lzfse Kompresor LZFSE (LZ+FSE) firmy Apple Inc.
- Kompresor CRAM 3.0 DNA (zamówienie 1 rANS) (część SAMtools ) przez Europejski Instytut Bioinformatyki
- https://chromium-review.googlesource.com/#/c/318743 Implementacja dla Google VP10
- https://chromium-review.googlesource.com/#/c/338781/ implementacja dla Google WebP
- https://github.com/google/draco/tree/master/core Biblioteka kompresji 3D Google Draco
- https://aomedia.googlesource.com/aom/+/master/aom_dsp wdrożenie Alliance for Open Media
- http://demonstrations.wolfram.com/DataCompressionUsingAsymmetricNumeralSystems/ Wolfram Demonstrations Project
- http://gamma.cs.unc.edu/GST/ GST: Superkompresowane tekstury dekodowane przez GPU
- Zrozumienie książki o kompresji autorstwa A. Haecky, C. McAnlis