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