非対称数値システム(ANS)[1] [2]は、ヤギェウォ大学のJarosław(Jarek)Duda [3]によって導入されたエントロピー符号化方式のファミリーであり、以前の方法と比較してパフォーマンスが向上したため、 2014年[4]からデータ圧縮に使用されています。 [5] ANSは、算術符号化(ほぼ正確な確率分布を使用)の圧縮率と、ハフマン符号化と同様の処理コストを組み合わせています。テーブル化されたANS(tANS)バリアントでは、乗算を使用せずに大きなアルファベットを操作する 有限状態マシンを構築することでこれを実現します。
ANSは、Facebook Zstandardコンプレッサー[6] [7](Linuxカーネル[8] 、 Google Chromeブラウザ[9] 、 Android [10]オペレーティングシステムなどでも使用され、MIME [11]およびHTTP [12]についてはRFC 8478として公開されました)、Apple LZFSEコンプレッサー[13] 、 Google Draco 3D コンプレッサー[14] ( Pixar Universal Scene Description形式[15]などで使用)、PIKイメージコンプレッサー[16] 、 SAMtoolsユーティリティのCRAM DNA コンプレッサー[17]、NVIDIA nvCOMP高速圧縮ライブラリ[ 18] 、 Dropbox DivANS コンプレッサー[20] 、 Microsoft DirectStorage BCPackテクスチャコンプレッサー[21]、JPEG XL [22]画像コンプレッサーなどで使用されています。
基本的な考え方は、情報を単一の自然数 にエンコードすることです。標準的な 2 進数システムでは、の末尾にを追加することでに情報ビットを追加でき、 が得られます。エントロピー コーダの場合、これは の場合に最適です。ANS は、確率分布 を伴う任意のシンボル セットに対してこのプロセスを一般化します。ANS では、 からの情報が に追加されて になった場合、 になります。同様に、であり、 は数 に格納されている情報のビット数、 はシンボル に含まれるビット数です。
エンコード規則では、自然数の集合は、異なるシンボルに対応する互いに素なサブセットに分割されます。たとえば、偶数と奇数に分割されますが、密度はエンコードするシンボルの確率分布に対応します。次に、シンボル からの情報を現在の数値 にすでに格納されている情報に追加するには、数値 を、数値サブセットの 番目に出現する位置に移動します。
実際にそれを適用するには、別の方法があります。エンコードとデコードの手順を直接数式で表す方法 (uABS と rANS のバリアント) や、動作全体をテーブルにまとめる方法 (tANS のバリアント) です。再正規化は、蓄積されたビットをビットストリームとの間で転送して無限大にならないようにするために使用されます。
エントロピー符号化
1,000 個の 0 と 1 のシーケンスをエンコードするとします。これを直接保存するには 1,000 ビットが必要です。ただし、ゼロが 1 個と 1 が 999 個だけ含まれていることが何らかの方法でわかっている場合は、ゼロの位置をエンコードするだけで十分であり、元の 1,000 ビットではなく、ここでは ビットのみが必要です。
一般に、ある確率で0と1を含む長さのシーケンスは組み合わせと呼ばれます。スターリングの近似を使用すると、それらの漸近数は次のように得られます。
シャノンエントロピーと呼ばれる。
したがって、このようなシーケンスを 1 つ選択するには、約 ビットが必要です。の場合でも ビットですが、これよりずっと小さくなることもあります。たとえば、 の場合、ビットのみ必要です。
エントロピーコーダを使用すると、シンボルごとにほぼシャノン エントロピー ビットを使用して、シンボルのシーケンスをエンコードできます。たとえば、ANS は組み合わせを列挙するために直接使用できます。つまり、ほぼ最適な方法で、固定された比率を持つシンボルのシーケンスごとに異なる自然数を割り当てます。
エンコードの組み合わせとは対照的に、この確率分布はデータ コンプレッサーによって通常は異なります。この目的のために、シャノン エントロピーは加重平均として考えることができます。確率のシンボルには情報ビットが含まれます。ANS は情報を 1 つの自然数 にエンコードし、情報ビットを含むと解釈されます。確率のシンボルからの情報を追加すると、この情報コンテンツは に増加します。したがって、両方の情報を含む新しい数は になります。
動機付けの例
3 つの文字 A、B、C が 1/2、1/4、1/4 の確率で含まれるソースを考えます。バイナリで最適なプレフィックス コードを構築するのは簡単です。A = 0、B = 10、C = 11。すると、メッセージは ABC -> 01011 としてエンコードされます。
エンコードを実行する同等の方法は次のとおりです。
- 数字 1 から始めて、入力文字ごとに数字に対して演算を実行します。
- A = 2 を掛ける、B = 4 を掛けて 2 を足す、C = 4 を掛けて 3 を足す。
- 数値を 2 進数で表し、最初の数字 1 を削除します。
より一般的な k 文字のソースを有理確率で考えてみましょう。ソースに対して 算術符号化を実行するには、整数を使用した正確な算術演算のみが必要です。
一般に、ANS は、実確率を分母が小さい有理数で近似する算術符号化の近似です。
ANSの基本概念

自然数 に、たとえばその 2 進展開のビット シーケンスとして何らかの情報が格納されているとします。2 進変数 から情報を追加するには、コーディング関数 を使用できます。この関数は、すべてのビットを 1 つ上にシフトし、新しいビットを最下位の位置に配置します。デコード関数 を使用すると、前のビットとこの追加ビットを取得できます。初期状態から始めて、有限ビット シーケンスの連続ビットに 関数を使用して、このシーケンス全体を格納する最終的な数値を取得します。その後、になるまで 関数 を複数回使用すると、ビット シーケンスを逆の順序で取得できます。
上記の手順は、シンボル の均一 (対称) 確率分布に最適です。ANS はこれを一般化して、任意の (非対称) シンボルの確率分布に最適になるようにします。上記の例では偶数と奇数を選択していましたが、ANS では、この自然数の偶数/奇数の分割は、想定される確率分布に対応する密度を持つサブセットへの分割に置き換えられます。位置 まで、シンボル の出現回数はおよそ 回です。
コーディング関数は、シンボル に対応するサブセットから 番目の出現を返します。密度の仮定は条件 と同等です。自然数に情報ビットが含まれていると仮定すると、です。したがって、確率のシンボルは、エントロピー コーダから要求されるように、情報ビットを含むものとしてエンコードされます。
バリエーション
ユニフォームバイナリバリアント (uABS)
2進アルファベットと確率分布 から始めましょう。位置 まで、奇数( の場合)の近似値を求めます。この出現回数を として選択すると、 が得られます。この変形はuABSと呼ばれ、次のデコードおよびエンコード関数につながります。[23]
デコード:
s = ceil (( x + 1 ) * p ) - ceil ( x * p ) // fract(x*p) < 1-p の場合は 0、それ以外の場合は 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) = (new_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 が反転したもの) に相当し、異なる の場合、これはこの特定の確率分布に最適になります。たとえば、 の場合、これらの式は の小さな値に対する表になります。
記号は、密度 の自然数のサブセットに対応しており、この場合は位置 です。 として、これらの位置は 3 または 4 ずつ増加します。ここでは、記号のパターンが 10 位置ごとに繰り返されるからです。
コーディングは、与えられた記号 に対応する行を取得し、この行で与えられた を選択することで見つけることができます。すると、一番上の行は を提供します。たとえば、中央の行から一番上の行までです。
から始まるシーケンス '0100' をエンコードするとします。まず に移動し、次にに移動し、次にに移動し、最後に に移動します。この最後の に対してデコード関数を使用すると、シンボル シーケンスを取得できます。この目的のためにテーブルを使用すると、最初の行で列が決定され、次に空でない行と書き込まれた値によって対応すると が決定されます。
範囲変異(rANS)とストリーミング
範囲バリアントも算術式を使用しますが、大きなアルファベットでの演算が可能です。直感的に言えば、自然数の集合をサイズの範囲に分割し、それぞれを同じ方法で、想定される確率分布によって与えられた割合のサブ範囲に分割します。
まず、確率分布を分母に量子化します。ここで、nはいくつかの自然数 (サブ範囲のサイズ) に対して選択されます (通常 8 ~ 12 ビット) 。
と累積分布関数 を表します。
ここで、
関数は、現在のシンボルの確率が式の値に含まれていないという点で、真のCDFではないことに注意してください。代わりに、 はすべての前のシンボルの合計確率を表します。例: の通常の定義の代わりに、前のシンボルがないため、
として評価されます。CDF[s]CDF[s]CDF[0] = f[0]CDF[0] = 0
機能を表す(通常は表形式)
シンボル( y ) = sであり、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 &マスク) - CDF [ s ], s )
この方法では、シンボルのシーケンスを大きな自然数xにエンコードできます。大きな数の演算を使用しないようにするために、実際にはストリームバリアントが使用されます。これは、再正規化によって、 xの最下位ビットをビットストリームに送信したり、ビットストリームから送信したりします (通常、Lとb は2 の累乗です)。
rANS バリアントでは、x はたとえば 32 ビットです。16 ビットの再正規化の場合、デコーダーは必要に応じてビットストリームから最下位ビットを補充します。
( x < ( 1 << 16 ))の場合、 x = ( x << 16 ) + read16bits ()
テーブル変異(tANS)

tANS バリアントは、 の全体的な動作 (再正規化を含む) をテーブルに格納し、乗算の必要性を回避する有限状態マシンを生成します。
最後に、デコード ループのステップは次のように記述できます。
t = decodingTable ( x ); x = t . newX + readBits ( t . nbBits ); //状態遷移writeSymbol ( t . symbol ); //デコードされたシンボル
エンコード ループのステップ:
s = ReadSymbol (); nbBits = ( x + ns [ s ]) >> r ; // 再正規化のビット数writeBits ( x , nbBits ); // 最下位ビットをビットストリームに送信x = encodingTable [ start [ s ] + ( x >> nbBits )];
特定の tANS コーディングは、各位置にシンボルを割り当てることによって決定されます。シンボルの出現回数は、想定される確率に比例する必要があります。たとえば、Pr(a)=3/8、Pr(b)=1/8、Pr(c)=2/8、Pr(d)=2/8 の確率分布に対して、「abdacdac」割り当てを選択できます。シンボルが 2 の累乗の長さの範囲で割り当てられると、ハフマン コーディングが得られます。たとえば、tANS に対して「aaaabcdd」シンボル割り当てで、a->0、b->100、c->101、d->11 プレフィックス コードが得られます。

備考
ハフマン符号化に関しては、tANS の確率分布を変更するのに比較的コストがかかるため、主に静的な状況で使用され、通常はLempel-Ziv方式 (ZSTD、LZFSE など) が使用されます。この場合、ファイルはブロックに分割され、各ブロックのシンボル頻度が個別にカウントされ、近似 (量子化) 後にブロック ヘッダーに書き込まれ、tANS の静的確率分布として使用されます。
対照的に、rANSは通常、範囲コーディング(例:CRAM、LZNA、Draco、[14] )のより高速な代替として使用されます。乗算が必要ですが、メモリ効率が高く、確率分布を動的に適応させるのに適しています。
ANS のエンコードとデコードは反対方向に実行されるため、シンボルのスタックになります。この不便さは通常、逆方向にエンコードすることで解決され、その後デコードは順方向に実行できます。マルコフ モデルのようなコンテキスト依存性の場合、エンコーダーは後のデコードの観点からコンテキストを使用する必要があります。適応性の場合、エンコーダーは最初にデコーダーによって使用される (予測される) 確率を見つけてバッファーに格納し、バッファーに格納された確率を使用して逆方向にエンコードする必要があります。
デコードを開始するにはエンコードの最終状態が必要なので、圧縮ファイルに保存する必要があります。このコストは、エンコーダの初期状態に何らかの情報を保存することで補うことができます。たとえば、「10000」状態から開始する代わりに、「1****」状態から開始します。ここで、「*」はデコードの最後に取得できる追加の保存ビットです。または、固定状態でエンコードを開始し、デコードの最終状態が期待どおりであるかどうかをテストすることで、この状態をチェックサムとして使用できます。
特許論争
斬新なANSアルゴリズムとその変種であるtANSとrANSの作者は、利他的な理由から、自分の研究成果をパブリックドメインで自由に利用できるようにすることを特に意図していました。彼はそれらから利益を得ようとはせず、それらが「法的な地雷原」になったり、他者によって制限されたり、利益を得たりしないようにするための措置を講じました。2015年に、Googleは「混合ブールトークンANS係数コーディング」の米国特許、その後世界中で特許を公開しました。[24]当時、ドゥダ教授はGoogleからビデオ圧縮の支援を依頼されていたため、この分野に精通しており、元の作者の支援を受けていました。
ドゥダ氏は、グーグルの特許意図を(偶然に)知ったことに不満だった。なぜなら、彼は特許をパブリックドメインにしたいと明確に考えており、特にその点に関してグーグルを支援していたからだ。その後、ドゥダ氏は米国特許庁に第三者申請[25]を提出し、拒絶を求めた。USPTOは2018年にその申請を拒絶し、グーグルはその後特許を放棄した[26] 。
2019年6月、マイクロソフトは「範囲非対称数体系の符号化および復号化の機能」という特許出願を提出した。[27] USPTOは2020年10月27日にこの出願の最終拒絶を発表した。しかし、2021年3月2日、マイクロソフトは「出願人は拒絶に敬意を表して異議を唱えます」と記載したUSPTOへの説明文書を提出し、[28]「最終検討後パイロット2.0」プログラムの下で最終拒絶を覆そうとした。[29]再検討後、USPTOは2022年1月25日にこの出願を認可した。[30]
参照
参考文献
- ^ J. Duda、K. Tahboub、NJ Gadil、EJ Delp、「ハフマン符号化の正確な代替としての非対称数値システムの使用」、Picture Coding Symposium、2015 年。
- ^ J. Duda、非対称数値システム:ハフマン符号化の速度と算術符号化の圧縮率を組み合わせたエントロピー符号化、arXiv:1311.2540、2013年。
- ^ “ヤロスワフ・ドゥダ博士 (ヤレク・ドゥダ)”.理論物理学研究所。クラクフのヤゲウォ大学。2021年8月2日閲覧。
- ^ Duda, Jarek (2019年10月6日). 「ANS、実装、その他の資料を使用するコンプレッサーのリスト」 。 2019年10月6日閲覧。
- ^ 「Google、パブリックドメイン技術の特許取得を試みていると非難される」Bleeping Computer 2017年9月11日。
- ^ Zstandard によるより小さく高速なデータ圧縮、Facebook、2016 年 8 月。
- ^ Facebook が Zstandard を使用して大規模な圧縮を改善した 5 つの方法、Facebook、2018 年 12 月。
- ^ Linux 4.14 向けに Btrfs および Squashfs 用の Zstd 圧縮が設定され、Facebook 内ですでに使用されている、Phoronix、2017 年 9 月。
- ^ Chrome 123(Content-Encoding)の新機能、Google、2024年3月。
- ^ 「Android P リリースの Zstd」。2020 年 8 月 26 日時点のオリジナルよりアーカイブ。2019 年 5 月 29 日閲覧。
- ^ Zstandard 圧縮と application/zstd メディア タイプ (電子メール標準)。
- ^ ハイパーテキスト転送プロトコル (HTTP) パラメータ、IANA。
- ^ Apple、新しい圧縮アルゴリズム LZFSE をオープンソース化、InfoQ、2016 年 7 月。
- ^ ab Google Draco 3D 圧縮ライブラリ。
- ^ Google と Pixar が Universal Scene Description (USD) 形式に Draco 圧縮を追加。
- ^ Google PIK: インターネット用の新しい非可逆画像形式。
- ^ CRAM フォーマット仕様 (バージョン 3.0)。
- ^ Chen W、Elliott LT (2021)。「有限状態エントロピーによる集団遺伝データの圧縮」。J Bioinform Comput Biol . 19 (5): 2150026. doi : 10.1142/S0219720021500268 . PMID 34590992。
- ^ NVIDIA GPU を使用した高速データ圧縮。
- ^ DivANS と協力してより優れた圧縮を構築します。
- ^ Microsoft DirectStorage の概要。
- ^ ラトゥシュニャク、アレクサンダー;ワッセンベルク、ジャン。スニーズ、ジョン。アラクイジャラ、ジルキ。ヴァンデベンヌ、ロード。ヴェルサリ、ルカ。ロバート・オブリク。ザバトカ、ゾルタン。クリッチニコフ、エフゲニー。コムサ、ユリア・マリア。ポテンパ、クシシュトフ。ブルース、マーティン。ファーシング、モーリッツ。カサノバ、レナタ。ルート・ファン・アッセルドンク。サミ州ブーコート。ゴメス、セバスチャン。フィッシュバッハー、トーマス (2019)。 「JPEG XL画像符号化方式委員会草案」。arXiv : 1908.03565 [eess.IV]。
- ^ データ圧縮の説明、マット・マホニー
- ^ 「混合ブールトークンANS係数コーディング」 。 2021年6月14日閲覧。
- ^ 「Google への抗議」(PDF)。理論物理学研究所。ポーランド、クラクフのヤギェウォ大学。ヤロスワフ・ドゥダ教授。
- ^ 「特許庁の拒絶後、Google はパブリック ドメイン アルゴリズムの使用を特許化する試みを断念すべき時が来た」EFF。2018 年 8 月 30 日。
- ^ 「範囲非対称数体系の符号化と復号化の特徴」 。 2021年6月14日閲覧。
- ^ 「3度目の正直は危ない?マイクロソフト、2度拒否された圧縮特許を懐疑的な審査官に認めさせようと試みる」 The Register 。 2021年6月14日閲覧。
- ^ 「After Final Consideration Pilot 2.0」。米国特許商標庁。 2021年6月14日閲覧。
- ^ 「範囲非対称数体系の符号化と復号化の特徴」 。 2022年2月16日閲覧。
外部リンク
- 非対称数値システムエントロピー符号化のための高スループットハードウェアアーキテクチャ SM Najmabadi、Z. Wang、Y. Baroud、S. Simon、ISPA 2015
- 新世代エントロピー コーダ Yann Collet による tANS の有限状態エントロピー (FSE) 実装
- rygorous/ryg_rans Fabian Giesen による rANS の実装
- jkbonfield/rans_static James K. Bonfield による rANS と算術コーディングの高速実装
- facebook/zstd Facebook Zstandardコンプレッサー (Yann Collet 著、 LZ4の作者)
- LZFSE Apple Inc.のLZFSEコンプレッサー (LZ+FSE)
- CRAM 3.0 DNA コンプレッサー (1 rANS オーダー) ( SAMtoolsの一部) 、European Bioinformatics Institute製
- [1] Google VP10の実装
- [2] Google WebPの実装
- [3] Google Draco 3D圧縮ライブラリ
- aom_dsp - aom - Google の Git によるAlliance for Open Mediaの実装
- 非対称数値システムを使用したデータ圧縮 - Wolfram デモンストレーション プロジェクト Wolfram デモンストレーション プロジェクト
- GST: GPU デコード可能な超圧縮テクスチャ GST: GPU デコード可能な超圧縮テクスチャ
- A. Haecky、C. McAnlis 著『圧縮を理解する』
