Jump to content

Асимметричные системы счисления

Асимметричные системы счисления ( АНС ) [1] [2] это семейство методов энтропийного кодирования, введенное Ярославом (Яреком) Дудой. [3] из Ягеллонского университета , используется для сжатия данных с 2014 года. [4] из-за улучшенной производительности по сравнению с предыдущими методами. [5] ANS сочетает в себе степень сжатия арифметического кодирования (которое использует почти точное распределение вероятностей ) с затратами на обработку, аналогичными затратам на обработку при кодировании Хаффмана . В табличном варианте ANS (tANS) это достигается путем построения конечного автомата для работы с большим алфавитом без использования умножения.

Помимо прочего, ANS используется в Facebook Zstandard . компрессоре [6] [7] (также используется, например, в ядре Linux , [8] Гугл Хром , браузер [9] Андроид [10] операционная система была опубликована как RFC 8478 для MIME. [11] и HTTP [12] ), Apple LZFSE , компрессор [13] Google Draco 3D compressor [14] (используется, например, в Pixar. универсального описания сцены формате [15] ) и компрессор изображений PIK, [16] CRAM Компрессор ДНК [17] из SAMtools , утилит [18] NVIDIA nvCOMP, Библиотека высокоскоростного сжатия [19] Dropbox DivANS, Компрессор [20] Компрессор текстур Microsoft DirectStorage BCPack, [21] и JPEG XL [22] компрессор изображений.

Основная идея состоит в том, чтобы закодировать информацию в одно натуральное число. . В стандартную двоичную систему счисления можно добавить немного информации для добавив в конце , что дает нам . Для энтропийного кодера это оптимально, если . ANS обобщает этот процесс для произвольных наборов символов. с сопутствующим распределением вероятностей . В ANS, если информация из добавляется к привести к , затем . Эквивалентно, , где количество бит информации, хранящейся в числе , и количество бит, содержащихся в символе .

В правиле кодирования набор натуральных чисел разбивается на непересекающиеся подмножества, соответствующие разным символам — например, на четные и нечетные числа, но с плотностью, соответствующей распределению вероятностей кодируемых символов. Затем, чтобы добавить информацию из символа в информацию, уже хранящуюся в текущем номере , идем на номер является позиция -ое появление из -е подмножество.

Есть альтернативные способы применить его на практике – прямые математические формулы для шагов кодирования и декодирования (варианты uABS и raNS), либо можно поместить все поведение в таблицу (вариант tANS). Перенормировка используется для предотвращения уход в бесконечность – передача накопленных битов в битовый поток или из него.

Энтропийное кодирование [ править ]

Предположим, что будет закодирована последовательность из 1000 нулей и единиц, для непосредственного хранения которой потребуется 1000 бит. Однако, если каким-то образом известно, что он содержит только 1 ноль и 999 единиц, было бы достаточно закодировать положение нуля, для чего требуется всего лишь бит здесь вместо исходных 1000 бит.

Обычно такая длина последовательности, содержащие нули и единицы, с некоторой вероятностью , называются комбинациями . Используя приближение Стирлинга, мы получаем их асимптотическое число:

называется энтропией Шеннона .

Следовательно, для выбора одной такой последовательности нам нужно примерно биты. Это все еще биты, если , однако оно также может быть намного меньше. Например, нам нужно всего лишь биты для .

Энтропийный кодер позволяет кодировать последовательность символов, используя примерно биты энтропии Шеннона на символ. Например, ANS можно напрямую использовать для подсчета комбинаций: присваивать разные натуральные числа каждой последовательности символов, имеющих фиксированные пропорции, почти оптимальным способом.

В отличие от комбинаций кодирования, это распределение вероятностей обычно варьируется в компрессорах данных. Для этой цели энтропию Шеннона можно рассматривать как средневзвешенное значение: символ вероятности. содержит биты информации. АНС кодирует информацию в одно натуральное число. , интерпретируемый как содержащий биты информации. Добавление информации из символа вероятности увеличивает это информационное содержание до . Следовательно, новый номер, содержащий обе информации, должен быть .

Мотивирующие примеры [ править ]

Рассмотрим источник с 3 буквами А, Б, С с вероятностью 1/2, 1/4, 1/4. Оптимальный префиксный код построить в двоичном виде просто: A = 0, B = 10, C = 11. Тогда сообщение кодируется как ABC -> 01011.

Мы видим, что эквивалентный метод выполнения кодирования выглядит следующим образом:

  • Начните с цифры 1 и выполните операцию с числом для каждой введенной буквы.
  • А = умножить на 2; B = умножить на 4, прибавить 2; C = умножить на 4, прибавить 3.
  • Выразите число в двоичном виде, затем удалите первую цифру 1.

Рассмотрим более общий источник из k букв с рациональными вероятностями. . Тогда для выполнения арифметического кодирования источника требуется только точная арифметика с целыми числами.

В общем, АНС — это аппроксимация арифметического кодирования, аппроксимирующая реальные вероятности. рациональными числами с маленьким знаменателем .

Основные понятия АНС [ править ]

Сравнение понятия арифметического кодирования (слева) и АНС (справа). Обе можно рассматривать как обобщения стандартных систем счисления, оптимальных для равномерного распределения вероятностей цифр, в оптимизированные для некоторого выбранного распределения вероятностей. Арифметическое или диапазонное кодирование соответствует добавлению новой информации в наиболее значимой позиции, тогда как АНС обобщает добавление информации в наименее значимой позиции. Его правило кодирования таково: « x переходит к x -му появлению подмножества натуральных чисел, соответствующего текущему кодированному символу». В представленном примере последовательность (01111) кодируется натуральным числом 18, которое меньше 47, полученного с использованием стандартной двоичной системы, из-за лучшего согласования с частотами кодируемой последовательности. Преимущество ANS заключается в хранении информации в одном натуральном числе, в отличие от двух, определяющих диапазон.

Представьте, что есть некоторая информация, хранящаяся в натуральном числе. , например, как битовая последовательность его двоичного расширения. Чтобы добавить информацию из двоичной переменной , мы можем использовать функцию кодирования , который сдвигает все биты на одну позицию вверх и помещает новый бит в наименее значащую позицию. Теперь функция декодирования позволяет восстановить предыдущий и этот добавленный бит: . Мы можем начать с исходное состояние, затем используйте функцию над последовательными битами конечной битовой последовательности для получения окончательного число, хранящее всю эту последовательность. Затем используя функционировать несколько раз, пока позволяет получить последовательность битов в обратном порядке.

Описанная процедура оптимальна для равномерного (симметричного) распределения вероятностей символов. . ANS обобщает его, чтобы сделать его оптимальным для любого выбранного (асимметричного) распределения вероятностей символов: . Пока в приведенном выше примере выбирал между четным и нечетным , в АНС это четное/нечетное деление натуральных чисел заменяется делением на подмножества, имеющие плотности, соответствующие предполагаемому распределению вероятностей : до позиции , есть примерно появления символа .

Функция кодирования возвращает -е появление из такого подмножества, соответствующего символу . Предположение о плотности эквивалентно условию . Предполагая, что натуральное число содержит кусочки информации, . Отсюда и символ вероятности кодируется как содержащий бит информации, как это требуется от энтропийных кодировщиков .

Варианты [ править ]

Унифицированный бинарный вариант (uABS) [ править ]

Начнем с двоичного алфавита и распределения вероятностей , . До позиции мы хотим примерно аналоги нечетных чисел (для ). Мы можем выбрать это количество появлений как , получающий . Этот вариант называется uABS и приводит к следующим функциям декодирования и кодирования: [23]

Расшифровка:

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)

Кодировка:

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

Для это соответствует стандартной двоичной системе (с перевернутыми 0 и 1), для другого оно становится оптимальным для данного данного распределения вероятностей. Например, для эти формулы приводят к таблице для малых значений :

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

Символ соответствует подмножеству натуральных чисел с плотностью , которые в данном случае являются позициями . Как , эти позиции увеличиваются на 3 или 4. Поскольку здесь набор символов повторяется каждые 10 позиций.

Кодирование можно найти, взяв строку, соответствующую данному символу , и выбрав данное в этом ряду. Тогда верхняя строка обеспечивает . Например, от среднего к верхнему ряду.

Представьте, что мы хотели бы закодировать последовательность «0100», начиная с . Первый отвезет нас в , затем к , затем к , затем к . С помощью функции декодирования в этом финале , мы можем получить последовательность символов. Используя для этого таблицу, в первой строке определяет столбец, затем непустая строка и записанное значение определяют соответствующее и .

Варианты диапазона (rANS) потоковая передача и

Вариант диапазона также использует арифметические формулы, но позволяет работать с большим алфавитом. Интуитивно он делит множество натуральных чисел на размеры диапазоны и разбить каждый из них одинаковым образом на поддиапазоны с пропорциями, заданными предполагаемым распределением вероятностей.

Начнем с квантования распределения вероятностей до знаменатель, где n (обычно 8-12 бит): выбирается для некоторого естественного числа (размеры поддиапазонов).

Обозначим и кумулятивную функцию распределения:

Обратите внимание, что здесь CDF[s] функция не является истинным CDF , поскольку вероятность текущего символа не включена в значение выражения. Вместо этого CDF[s] представляет собой общую вероятность всех предыдущих символов. Пример: Вместо обычного определения CDF[0] = f[0], оно оценивается как CDF[0] = 0, поскольку предыдущих символов нет.

Для обозначают функцию (обычно представленную в таблице)

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

Теперь функция кодирования:

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

Расшифровка: s = symbol(x & mask)

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

Таким образом, мы можем закодировать последовательность символов в большое натуральное число x . Чтобы избежать использования арифметики больших чисел, на практике используются потоковые варианты: которые обеспечивают путем перенормировки: отправка младших битов x в битовый поток или из него (обычно L и b представляют собой степени 2).

В варианте rans x , например, 32-битный. Для 16-битной перенормировки , декодер при необходимости дополняет младшие биты из битового потока:

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

Табличный вариант (tANS) [ править ]

Простой пример автомата АНС с 4 состояниями для распределения вероятностей Pr( a ) = 3/4, Pr( b ) = 1/4. Символ b содержит −lg(1/4) = 2 бита информации и поэтому всегда дает два бита. Напротив, символ a содержит -lg(3/4) ~ 0,415 бит информации, поэтому иногда он выдает один бит (из состояния 6 и 7), иногда 0 бит (из состояния 4 и 5), только увеличивая состояние, что действует как буфер, содержащий дробное число битов: lg( x ). На практике количество состояний составляет, например, 2048 для алфавита размером 256 (для прямого кодирования байтов).

Вариант tANS помещает все поведение (включая перенормировку) для в таблицу, которая дает конечный автомат, избегающий необходимости умножения.

Наконец, шаг цикла декодирования можно записать так:

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

Шаг цикла кодирования:

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)];

Конкретное кодирование tANS определяется путем присвоения символа каждому позиции, их количество появлений должно быть пропорционально предполагаемым вероятностям. Например, можно выбрать назначение «abdacdac» для распределения вероятностей Pr(a)=3/8, Pr(b)=1/8, Pr(c)=2/8, Pr(d)=2/8. Если символы назначаются в диапазонах длин, являющихся степенями 2, мы получим кодирование Хаффмана . Например, префиксный код a->0, b->100, c->101, d->11 будет получен для tANS с присвоением символа «aaaabcdd».

Пример генерации таблиц tANS для алфавита размера m = 3 и состояний L = 16 с последующим применением их для декодирования потока. Сначала мы аппроксимируем вероятности, используя дробь, знаменателем которой является количество состояний. Затем мы распространяем эти символы практически единообразно, при необходимости детали могут зависеть от криптографического ключа для одновременного шифрования. Затем мы перечисляем появления, начиная со значения — их количества для данного символа. Затем мы повторно заполняем младшие биты потока, чтобы вернуться к предполагаемому диапазону x (перенормировка).

Замечания [ править ]

Что касается кодирования Хаффмана, изменение распределения вероятностей tANS является относительно дорогостоящим, поэтому оно в основном используется в статических ситуациях, обычно с некоторой схемой Лемпеля-Зива (например, ZSTD, LZFSE). В этом случае файл разбивается на блоки – для каждого из них независимо подсчитываются частоты символов, затем после аппроксимации (квантования) записываются в заголовок блока и используются как статическое распределение вероятностей для tANS.

Напротив, rANS обычно используется как более быстрая замена кодирования диапазона (например, CRAM , LZNA, Draco, [14] ). Он требует умножения, но более эффективен в использовании памяти и подходит для динамической адаптации распределений вероятностей.

Кодирование и декодирование ANS выполняются в противоположных направлениях, образуя стек символов. Это неудобство обычно устраняется путем кодирования в обратном направлении, после чего можно выполнить декодирование в прямом направлении. Для зависимости от контекста, как в модели Маркова , кодировщику необходимо использовать контекст с точки зрения последующего декодирования. Для обеспечения адаптивности кодер должен сначала пойти вперед, чтобы найти вероятности, которые будут использоваться (прогнозированы) декодером, и сохранить их в буфере, а затем закодировать в обратном направлении, используя буферизованные вероятности.

Конечное состояние кодирования необходимо для начала декодирования, поэтому его необходимо сохранить в сжатом файле. Эту стоимость можно компенсировать сохранением некоторой информации в исходном состоянии кодера. Например, вместо того, чтобы начинать с состояния «10000», начните с состояния «1****», где «*» — это некоторые дополнительные сохраненные биты, которые можно получить в конце декодирования. В качестве альтернативы это состояние можно использовать в качестве контрольной суммы, начиная кодирование с фиксированного состояния и проверяя, является ли конечное состояние декодирования ожидаемым.

Патентный спор [ править ]

Автор нового алгоритма ANS и его вариантов tANS и ranS специально намеревался сделать свою работу свободно доступной в общественном достоянии по альтруистическим причинам. Он не стремился извлечь из них выгоду и предпринял шаги, чтобы гарантировать, что они не станут «законным минным полем», не будут ограничены другими или получат от них выгоду. В 2015 году Google опубликовала в США, а затем и во всем мире патент на «Смешанное кодирование логических токенов и коэффициентов». [24] В то время Google попросил профессора Дуду помочь ему со сжатием видео, поэтому он был хорошо осведомлен об этой области, и им помогал первоначальный автор.

Дуда не был доволен тем, что (случайно) узнал о патентных намерениях Google, поскольку он ясно дал понять, что хочет сделать это общественным достоянием, и помогал Google именно на этом основании. Впоследствии Дуда подал стороннюю заявку. [25] в Патентное ведомство США с просьбой об отказе. В 2018 году USPTO отклонило заявку, а Google впоследствии отказался от патента. [26]

В июне 2019 года Microsoft подала заявку на патент под названием «Особенности кодирования и декодирования асимметричной системы счисления». [27] 27 октября 2020 г. ВПТЗ США окончательно отклонило заявку. Однако 2 марта 2021 г. Microsoft подала в ВПТЗ США пояснительную заявку, в которой говорилось: «Заявитель со всем уважением не согласен с отклонениями». [28] стремясь отменить окончательный отказ в рамках программы «Пилот после окончательного рассмотрения 2.0». [29] После повторного рассмотрения USPTO удовлетворило заявку 25 января 2022 года. [30]

См. также [ править ]

Ссылки [ править ]

  1. ^ Дж. Дуда, К. Тахбуб, Н. Дж. Гадил, Э. Дж. Дельп, Использование асимметричных систем счисления в качестве точной замены кодирования Хаффмана , Симпозиум по кодированию изображений, 2015.
  2. ^ Дж. Дуда, Асимметричные системы счисления: энтропийное кодирование, сочетающее скорость кодирования Хаффмана со степенью сжатия арифметического кодирования , arXiv:1311.2540, 2013.
  3. ^ «Доктор Ярослав Дуда (Ярек Дуда)» . Институт теоретической физики . Ягеллонский университет в Кракове . Проверено 2 августа 2021 г.
  4. ^ Дуда, Ярек (6 октября 2019 г.). «Список компрессоров, использующих ANS, реализации и другие материалы» . Проверено 6 октября 2019 г.
  5. ^ «Google обвиняют в попытке запатентовать технологию, являющуюся общественным достоянием» . Пипящий компьютер . 11 сентября 2017 г.
  6. ^ Меньшее и более быстрое сжатие данных с помощью Zstandard , Facebook, август 2016 г.
  7. ^ 5 способов, с помощью которых Facebook улучшил масштабируемое сжатие с помощью Zstandard , Facebook, декабрь 2018 г.
  8. ^ Сжатие Zstd для Btrfs и Squashfs, установленное для Linux 4.14, уже используется в Facebook , Phoronix, сентябрь 2017 г.
  9. ^ Новое в Chrome 123 (кодирование контента) , Google, март 2024 г.
  10. ^ «Zstd в версии Android P» . Архивировано из оригинала 26 августа 2020 г. Проверено 29 мая 2019 г.
  11. ^ Сжатие Zstandard и тип носителя application/zstd (стандарт электронной почты) .
  12. ^ Параметры протокола передачи гипертекста (HTTP) , IANA .
  13. ^ Apple открывает исходный код своего нового алгоритма сжатия LZFSE , InfoQ, июль 2016 г.
  14. ^ Jump up to: Перейти обратно: а б Библиотека сжатия 3D Google Draco .
  15. ^ Google и Pixar добавляют сжатие Draco в формат универсального описания сцены (USD) .
  16. ^ Google PIK: новый формат изображений с потерями для Интернета .
  17. ^ Спецификация формата CRAM (версия 3.0) .
  18. ^ Чен В., Эллиотт LT (2021). «Сжатие популяционных генетических данных посредством энтропии конечного состояния» . Журнал Биоинформ Компьютерная Биол . 19 (5): 2150026. doi : 10.1142/S0219720021500268 . ПМИД   34590992 .
  19. ^ Высокоскоростное сжатие данных с использованием графических процессоров NVIDIA .
  20. ^ Улучшение сжатия вместе с DivANS .
  21. ^ Обзор Microsoft DirectStorage .
  22. ^ Ратушняк, Александр; Вассенберг, Ян; Снейерс, Джон; Алакуйала, Юрки; Вандевенн, Лоде; Версари, Лука; Обрик, Роберт; Шабадка, Золтан; Ключников Евгений; Комса, Юлия-Мария; Потемпа, Кристофер; Брюс, Мартин; Фиршинг, Мориц; Хасанова Рената; Красный Ассельдонка; Букортт, Сами; Гомес, Себастьян; Фишбахер, Томас (2019). «Проект комитета системы кодирования изображений JPEG XL». arXiv : 1908.03565 [ eess.IV ].
  23. ^ Объяснение сжатия данных , Мэтт Махони
  24. ^ «Смешанное кодирование логических символов и коэффициентов» . Проверено 14 июня 2021 г.
  25. ^ «Протест Google» (PDF) . Институт теоретической физики. Ягеллонский университет в Кракове, Польша . Профессор Ярослав Дуда.
  26. ^ «После отказа патентного ведомства Google пришло время отказаться от попыток запатентовать использование алгоритма общественного достояния» . ЭФФ. 30 августа 2018 г.
  27. ^ «Особенности кодирования и декодирования диапазонной асимметричной системы счисления» . Проверено 14 июня 2021 г.
  28. ^ «Третий раз — это вред? Microsoft пытается добиться, чтобы скептически настроенные эксперты получили дважды отклоненный патент на сжатие» . Регистр . Проверено 14 июня 2021 г.
  29. ^ «После окончательного рассмотрения пилотной версии 2.0» . Ведомство США по патентам и товарным знакам . Проверено 14 июня 2021 г.
  30. ^ «Особенности кодирования и декодирования диапазонной асимметричной системы счисления» . Проверено 16 февраля 2022 г.

Внешние ссылки [ править ]

Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: cfd03defa8588c601d04b7c91b1e98fa__1711525380
URL1:https://arc.ask3.ru/arc/aa/cf/fa/cfd03defa8588c601d04b7c91b1e98fa.html
Заголовок, (Title) документа по адресу, URL1:
Asymmetric numeral systems - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)