Асимметричные системы счисления
Эта статья включает список общих ссылок , но в ней отсутствуют достаточные соответствующие встроенные цитаты . ( Май 2017 г. ) |
Часть серии о |
Системы счисления |
---|
Список систем счисления |
Асимметричные системы счисления ( АНС ) [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 букв с рациональными вероятностями. . Тогда для выполнения арифметического кодирования источника требуется только точная арифметика с целыми числами.
В общем, АНС — это аппроксимация арифметического кодирования, аппроксимирующая реальные вероятности. рациональными числами с маленьким знаменателем .
Основные понятия АНС [ править ]
Представьте, что есть некоторая информация, хранящаяся в натуральном числе. , например, как битовая последовательность его двоичного расширения. Чтобы добавить информацию из двоичной переменной , мы можем использовать функцию кодирования , который сдвигает все биты на одну позицию вверх и помещает новый бит в наименее значащую позицию. Теперь функция декодирования позволяет восстановить предыдущий и этот добавленный бит: . Мы можем начать с исходное состояние, затем используйте функцию над последовательными битами конечной битовой последовательности для получения окончательного число, хранящее всю эту последовательность. Затем используя функционировать несколько раз, пока позволяет получить последовательность битов в обратном порядке.
Описанная процедура оптимальна для равномерного (симметричного) распределения вероятностей символов. . 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) [ править ]
Вариант 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 является относительно дорогостоящим, поэтому оно в основном используется в статических ситуациях, обычно с некоторой схемой Лемпеля-Зива (например, 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]
См. также [ править ]
- Энтропийное кодирование
- Кодирование Хаффмана
- Арифметическое кодирование
- Кодирование диапазона
- Zstandard Facebook компрессор
- LZFSE Компрессор Apple
Ссылки [ править ]
- ^ Дж. Дуда, К. Тахбуб, Н. Дж. Гадил, Э. Дж. Дельп, Использование асимметричных систем счисления в качестве точной замены кодирования Хаффмана , Симпозиум по кодированию изображений, 2015.
- ^ Дж. Дуда, Асимметричные системы счисления: энтропийное кодирование, сочетающее скорость кодирования Хаффмана со степенью сжатия арифметического кодирования , arXiv:1311.2540, 2013.
- ^ «Доктор Ярослав Дуда (Ярек Дуда)» . Институт теоретической физики . Ягеллонский университет в Кракове . Проверено 2 августа 2021 г.
- ^ Дуда, Ярек (6 октября 2019 г.). «Список компрессоров, использующих ANS, реализации и другие материалы» . Проверено 6 октября 2019 г.
- ^ «Google обвиняют в попытке запатентовать технологию, являющуюся общественным достоянием» . Пипящий компьютер . 11 сентября 2017 г.
- ^ Меньшее и более быстрое сжатие данных с помощью Zstandard , Facebook, август 2016 г.
- ^ 5 способов, с помощью которых Facebook улучшил масштабируемое сжатие с помощью Zstandard , Facebook, декабрь 2018 г.
- ^ Сжатие Zstd для Btrfs и Squashfs, установленное для Linux 4.14, уже используется в Facebook , Phoronix, сентябрь 2017 г.
- ^ Новое в Chrome 123 (кодирование контента) , Google, март 2024 г.
- ^ «Zstd в версии Android P» . Архивировано из оригинала 26 августа 2020 г. Проверено 29 мая 2019 г.
- ^ Сжатие Zstandard и тип носителя application/zstd (стандарт электронной почты) .
- ^ Параметры протокола передачи гипертекста (HTTP) , IANA .
- ^ Apple открывает исходный код своего нового алгоритма сжатия LZFSE , InfoQ, июль 2016 г.
- ^ Jump up to: Перейти обратно: а б Библиотека сжатия 3D Google Draco .
- ^ Google и Pixar добавляют сжатие Draco в формат универсального описания сцены (USD) .
- ^ Google PIK: новый формат изображений с потерями для Интернета .
- ^ Спецификация формата CRAM (версия 3.0) .
- ^ Чен В., Эллиотт LT (2021). «Сжатие популяционных генетических данных посредством энтропии конечного состояния» . Журнал Биоинформ Компьютерная Биол . 19 (5): 2150026. doi : 10.1142/S0219720021500268 . ПМИД 34590992 .
- ^ Высокоскоростное сжатие данных с использованием графических процессоров NVIDIA .
- ^ Улучшение сжатия вместе с DivANS .
- ^ Обзор Microsoft DirectStorage .
- ^ Ратушняк, Александр; Вассенберг, Ян; Снейерс, Джон; Алакуйала, Юрки; Вандевенн, Лоде; Версари, Лука; Обрик, Роберт; Шабадка, Золтан; Ключников Евгений; Комса, Юлия-Мария; Потемпа, Кристофер; Брюс, Мартин; Фиршинг, Мориц; Хасанова Рената; Красный Ассельдонка; Букортт, Сами; Гомес, Себастьян; Фишбахер, Томас (2019). «Проект комитета системы кодирования изображений JPEG XL». arXiv : 1908.03565 [ eess.IV ].
- ^ Объяснение сжатия данных , Мэтт Махони
- ^ «Смешанное кодирование логических символов и коэффициентов» . Проверено 14 июня 2021 г.
- ^ «Протест Google» (PDF) . Институт теоретической физики. Ягеллонский университет в Кракове, Польша . Профессор Ярослав Дуда.
- ^ «После отказа патентного ведомства Google пришло время отказаться от попыток запатентовать использование алгоритма общественного достояния» . ЭФФ. 30 августа 2018 г.
- ^ «Особенности кодирования и декодирования диапазонной асимметричной системы счисления» . Проверено 14 июня 2021 г.
- ^ «Третий раз — это вред? Microsoft пытается добиться, чтобы скептически настроенные эксперты получили дважды отклоненный патент на сжатие» . Регистр . Проверено 14 июня 2021 г.
- ^ «После окончательного рассмотрения пилотной версии 2.0» . Ведомство США по патентам и товарным знакам . Проверено 14 июня 2021 г.
- ^ «Особенности кодирования и декодирования диапазонной асимметричной системы счисления» . Проверено 16 февраля 2022 г.
Внешние ссылки [ править ]
- Аппаратные архитектуры с высокой пропускной способностью для энтропийного кодирования асимметричных систем счисления С. М. Наджмабади, З. Ван, Ю. Баруд, С. Саймон, ISPA 2015
- Энтропийные кодеры нового поколения Реализация tANS с энтропией конечного состояния (FSE) от Янна Колле
- rygorous/ryg_rans Реализация RANS Фабианом Гизеном
- jkbonfield/rans_static Быстрая реализация raNS и арифметического кодирования Джеймса К. Бонфилда
- facebook/zstd Компрессор Facebook Zstandard от Янна Колле (автора LZ4 )
- LZFSE LZFSE Компрессор (LZ+FSE) компании Apple Inc.
- Компрессор ДНК CRAM 3.0 (ранс порядка 1) (часть SAMtools ) от Европейского института биоинформатики
- [1] реализация для Google VP10
- [2] реализация для Google WebP
- [3] Google Draco. Библиотека сжатия 3D
- aom_dsp — aom — Git и Google реализуют Alliance for Open Media
- Сжатие данных с использованием асимметричных систем счисления - Демонстрационный проект Wolfram
- GST: сверхсжатые текстуры, декодируемые графическим процессором. , декодируемые графическим процессором. GST: сверхсжатые текстуры
- Книга «Понимание сжатия» А. Хаеки, К. Маканлиса