Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

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

Среди прочего, ANS используется в компрессоре Facebook Zstandard [5] [6] (также используется, например, в ядре Linux, [7 ] операционной системе Android [8] , был опубликован как RFC 8478 для MIME [9] и HTTP [10]) ), в компрессоре Apple LZFSE , [11] компрессоре Google Draco 3D [12] (используется, например, в формате универсального описания сцены Pixar [13] ) и компрессоре изображений PIK, [14] в компрессоре CRAM DNA[15] изутилит SAMtools ,компрессора Dropbox DivANS, [16] и встандарте сжатия изображений следующего поколения JPEG XL [17] .

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

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

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

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

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

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

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

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

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

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

Основные концепции ANS [ править ]

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

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

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

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

Единый двоичный вариант (uABS) [ править ]

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

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

s  =  ceil (( x + 1 ) * p )  -  ceil ( x * p )  // 0, если фракт (x * p) <1-p, иначе 1, если  s  =  0,  то  new_x  =  x  -  ceil ( x * p )  // D (x) = (new_x, 0), это то же самое, что new_x = floor (x * (1-p)), если  s  =  1,  то  new_x  =  ceil ( x * p )  // D (x) = (новый_x; 1)

Кодировка:

если  s  =  0,  то  new_x  =  ceil (( x + 1 ) / ( 1 - p ))  -  1  // C (x, 0) = new_x, если  s  =  1,  то  new_x  =  floor ( x / p )  // C ( x, 1) = new_x

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

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

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

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

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

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

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

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

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

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)

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

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

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

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

Простой пример 4-х состояний ANS-автомата для распределения вероятностей 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  =  таблица декодирования ( x );  х  =  т . newX  +  readBits ( т . nbBits );  // переход состояния writeSymbol ( т . символ );  // декодированный символ

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

s  =  ReadSymbol (); nbBits  =  ( x  +  ns [ s ])  >>  r ;  // # бит для перенормировки writeBits ( x ,  nbBits );  // отправляем младшие биты в битовый поток x  =  encodingTable [ start [ s ]  +  ( x  >>  nbBits )];

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


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

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

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

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

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

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

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

  • Энтропийное кодирование
  • Кодирование Хаффмана
  • Арифметическое кодирование
  • Кодирование диапазона
  • Компрессор Zstandard Facebook
  • Компрессор LZFSE Apple

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

  1. ^ Дж. Дуда, К. Тахбуб, Н. Дж. Гадил, Э. Дж. Делп, Использование асимметричных систем счисления как точная замена кодированию Хаффмана , Симпозиум по кодированию изображений, 2015.
  2. ^ http://th.if.uj.edu.pl/~dudaj/
  3. Дуда, Ярек (6 октября 2019 г.). «Список компрессоров, использующих ANS, реализации и другие материалы» . Проверено 6 октября 2019 года .
  4. ^ «Google обвиняется в попытке запатентовать технологию общественного достояния» . Пищевой компьютер . 11 сентября 2017 года.
  5. ^ Меньшее и быстрое сжатие данных с Zstandard , Facebook, август 2016 г.
  6. ^ 5 способов, которыми Facebook улучшил сжатие в масштабе с помощью Zstandard , Facebook, декабрь 2018 г.
  7. ^ Zstd Compression For Btrfs & Squashfs Set For Linux 4.14, уже используется в Facebook , Phoronix, сентябрь 2017 г.
  8. ^ «Zstd в выпуске Android P» .
  9. ^ Стандартное сжатие Z и тип носителя приложения / zstd (стандарт электронной почты)
  10. ^ Параметры протокола передачи гипертекста (HTTP) , IANA
  11. ^ Apple открывает исходный код своего нового алгоритма сжатия LZFSE , InfoQ , июль 2016 г.
  12. ^ Библиотека сжатия Google Draco 3D
  13. ^ Google и Pixar добавляют сжатие Draco в универсальный формат описания сцены (USD).
  14. ^ Google PIK: новый формат изображений с потерями для Интернета
  15. ^ Спецификация формата CRAM (версия 3.0)
  16. ^ Создание лучшего сжатия вместе с DivANS
  17. ^ Rhatushnyak, Александр; Вассенберг, Ян; Снейерс, Джон; Алакуйяла, Юрки; Вандевенн, Лоде; Версари, Лука; Обрик, Роберт; Забадка, Золтан; Ключников, Евгений; Комса, Юлия-Мария; Потемпа, Кшиштоф; Брюс, Мартин; Фиршинг, Мориц; Хасанова, Рената; Рууд ван Асселдонк; Букортт, Сами; Гомес, Себастьян; Фишбахер, Томас (2019). «Проект комитета системы кодирования изображений JPEG XL». arXiv : 1908.03565 [ eess.IV ].
  18. ^ Объяснение сжатия данных , Мэтт Махони

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

  • Аппаратные архитектуры с высокой пропускной способностью для энтропийного кодирования асимметричных систем счисления С. М. Наджмабади, З. Ван, Ю. Баруд, С. Саймон, ISPA 2015
  • https://github.com/Cyan4973/FiniteStateEntropy Реализация tANS с конечной энтропией (FSE) Янном Колле
  • https://github.com/rygorous/ryg_rans Реализация rANS от Фабиана Гизена
  • https://github.com/jkbonfield/rans_static Быстрая реализация rANS и аритметического кодирования Джеймсом К. Бонфилдом
  • https://github.com/facebook/zstd/ Компрессор Zstandard для Facebook, автор Ян Колле (автор LZ4 )
  • https://github.com/lzfse/lzfse Компрессор LZFSE (LZ + FSE) Apple Inc.
  • Компрессор ДНК CRAM 3.0 (заказ 1 rANS) (часть SAMtools ) от Европейского института биоинформатики
  • https://chromium-review.googlesource.com/#/c/318743 реализация для Google VP10
  • https://chromium-review.googlesource.com/#/c/338781/ реализация для Google WebP
  • https://github.com/google/draco/tree/master/core Библиотека сжатия Google Draco 3D
  • https://aomedia.googlesource.com/aom/+/master/aom_dsp реализация Alliance for Open Media
  • http://demonstrations.wolfram.com/DataCompressionUsingAsymmetricNumeralSystems/ Демонстрационный проект Wolfram
  • http://gamma.cs.unc.edu/GST/ GST: сверхсжатые текстуры с возможностью декодирования с помощью графического процессора
  • Книга A. Haecky, C. McAnlis " Понимание сжатия"