算術コーディングへのハフマンコーディングの一般化はありますか?


11

ハフマン符号化、算術符号化、および範囲符号化の関係を理解し​​ようとするとき、ハフマン符号化の欠点が分数ビットパッキングの問題に関連していると考え始めました。

つまり、シンボルに240の可能な値があり、これをビットにエンコードする必要がある場合、8は256の可能な値を表すことができるため、「フル」8は必要ないとしても、シンボルごとに8ビットでスタックすることになります。シンボルごと。この問題の解決策は、「フラクショナルビットパッキング」と呼ばれるもので、乗算を使用して2のべき乗ではない「ビットシフト」が可能です。2のべき乗の乗算がシフトするのx * 2 == x << 1と同じようにx * 4 == x << 2、2のべき乗すべてに対して同様に続きます。そのため、代わりに乗算することにより、2のべき乗でない値で「シフト」し、小数ビットサイズのシンボルにパックできます。 。

この問題はハフマンコーディングと同様です。結局、長さが小数ビットサイズでなければならないコードが作成されるため、このパッキング効率は低くなります。ただし、フラシトンビットパッキングのソリューションは、固定サイズのシンボルを想定しているため、単に使用することはできません。

問題は、算術コーディングに似たものを達成するために、フラクショナルビットパッキングと同様のアイデアでハフマンコーディングを改善するための論文や解決策はありますか?(または反対の結果)。


1
算術コーディングはすでに最適です。改善する必要はありません。
Yuval Filmus、2015年

@YuvalFilmusはい、私はハフマンコーディングを改善して算術コーディングと同等にする方法を説明しました。
Realz Slaw 2015

1
提案として、算術コーディングよりも非対称数値システム(ANS)コーディングの方が理解しやすいかもしれません。特に、その特定の定式化を「フラクショナルビットパッキング」と見るのは少し簡単です。
仮名2015年

@Pseudonym rANSとHuffman Codingの間でこの関係を作っているように見えるこのページを見つけました。まだ理解できているとは言えませんが、それで十分だと思います。あなたがコメントを答えにするならば、私は受け入れます。
Realz Slaw 2015

@YuvalFilmus算術符号化には改善が必要だったと私が主張したことを願っています。ANSは改善です。
仮名2015年

回答:


12

ハフマン符号化について少し異なる考え方を見てみましょう。

確率が0.5、0.25、および0.25の3つの記号A、B、Cのアルファベットがあるとします。確率はすべて2の逆乗であるため、これには最適なハフマンコードがあります(つまり、算術コーディングと同じです)。この例では、正規コード0、10、11を使用します。

状態が長整数であると仮定します。これをと呼びます。エンコーディングは、現在の状態とエンコードするシンボルを受け取り、新しい状態を返す関数と考えることができます。s

encode(s,A)=2sencode(s,B)=4s+2encode(s,C)=4s+3

それでは、状態11(バイナリでは1011)から始めて、シンボルBをエンコードします。新しい状態は46で、バイナリでは101110です。ご覧のとおり、これはシーケンス10が最後に追加された「古い」状態です。基本的にビットシーケンスを「出力」します10。

ここまでは順調ですね。

ここで、算術コーディングがどのように機能するかについて少し考えてみましょう。確率を共通の分母に置くと、記号Aは実際に範囲、記号Bは範囲[2[04,24)および記号Cは範囲[3[24,34)[34,44)

基本的にここで私たちがしていることは、すべてに共通の分母を掛けることです。状態が実際にはベース4にあると想像してください。シンボルBをエンコードすると、実際にはそのベースに数字2が出力され、シンボルCをエンコードすると、そのベースに数字3が出力されます。

ただし、シンボルAは、基数4の数字ではないため、少し異なります。

代わりに、アルファベットを等しい確率でシンボルA_0、A_1、B、Cのセットと考えることができます。これにも、最適なハフマンコード00、01、10、11があります。または、これもベース4で考えることができます。シンボルをエンコードするには、次のようにします。

encode(s,A0)=4s+0encode(s,A1)=4s+1encode(s,B)=4s+2encode(s,C)=4s+3

A0A1

s

s=s2
i=smod2

そして。encode(s,Ai)

前の例を使用すると、およびであることがわかり、次にます。新しい状態はバイナリで10101です。s = 5 i = 1 エンコード5 A 1= 4 × 5 + 1 = 21s=11s=5i=1encode(5,A1)=4×5+1=21

これはハフマンコーディングとまったく同じビット出力を生成しませんが、同じ長さの出力を生成します。そして、私があなたが見ることができることを望んでいるのは、これもユニークにデコード可能であることです。シンボルをデコードするには、4で割った余りを取ります。値が2または3の場合、シンボルはそれぞれBまたはCです。0または1の場合、シンボルはAであり、状態に2を掛けて0または1を追加することにより、情報のビットを戻すことができます。

このアプローチの良い点は、確率の分子または分母が2のべき乗でない場合に、自然に分数ビットエンコーディングに拡張されることです。AとBの2つのシンボルがあり、Aの確率がで、Bの確率がます。次に、シンボルを次のようにエンコードできます。 23525

encode(s,A0)=5s+0encode(s,A1)=5s+1encode(s,A2)=5s+2encode(s,B0)=5s+3encode(s,B1)=5s+4

シンボルAをエンコードするには、と、そしてます。I=SMOD3エンコードS'AIs=s3i=smod3encode(s,Ai)

これは算術コーディングに相当します。これは、実際にはAsymmetric Numeral Systemsと呼ばれる手法のファミリーであり、過去数年間にJarek Dudaによって開発されました。名前の意味は明白である必要があります。シンボルを確率でエンコードするには、概念的にbase-pの数字を状態から盗み、base-qの数字を追加します。非対称性は、状態を2つの異なる基数の数値として解釈することから生じます。pq

それがコーディング方法のファミリーである理由は、ここで見たものがそれだけでは非実用的だからです。状態変数を効率的に操作するための無限精度の整数はおそらくないという事実に対処するためにいくつかの変更が必要であり、これを実現するにはさまざまな方法があります。もちろん、算術コーディングには、その状態の精度に関する同様の問題があります。

実用的なバリエーションには、rANS(「r」は「比率」を意味します)とtANS(「テーブル駆動型」)があります。

ANSには、算術符号化に比べて実用的かつ理論的ないくつかの興味深い利点があります。

  • 算術符号化とは異なり、「状態」は2つの単語ではなく1つの単語です。
  • それだけでなく、ANSエンコーダーとそれに対応するデコーダーは同一の状態を持ち、その動作は完全に対称です。これにより、エンコードされたシンボルの異なるストリームをインターリーブでき、すべてが完全に同期するなど、いくつかの興味深い可能性が生じます
  • もちろん、実用的な実装では、情報を「出力」して、最後に書き込むために大きな整数に収集するだけでなく、実行する必要があります。ただし、「出力」のサイズは、(通常はわずかな)圧縮損失と引き換えに構成できます。したがって、算術コーダーが一度にビットを出力する必要がある場合、ANSはバイトまたはニブルを一度に出力できます。これにより、速度と圧縮の直接的なトレードオフが得られます。
  • 現在の世代のハードウェアでは、バイナリ算術符号化とほぼ同じ速度で、ハフマン符号化と競合できるようです。これにより、大きなアルファベットの算術コーディングとそのバリアント(たとえば、範囲コーディング)よりもはるかに高速になります。
  • 特許がないようです。

私は算術符号化を再び行うつもりはないと思います。


3
これが、ANSエンコーディングについて私が今まで見た中で最も明確な説明です。
Michael Deardeuff、2016年

2

簡単な例として、1/3の確率で3つのシンボルがある場合、最適なハフマンエンコーディングは、平均5 / 3rdビットの3つのシンボル0、10、11を使用します。

元のシンボルの5つを連結して作成された243のシンボルがあり、それぞれの確率は1/243です。これは1/256にかなり近いです。最適なハフマンエンコーディングは、これらのグループのうち13ビットを7ビットで、230グループを8ビットでエンコードします。グループあたり平均7.9465ビットまたは元のシンボルあたり1.5893ビットで、元のハフマンコーディングの1.6667ビットから、算術コーディングでは1.5850になります。ビット。

したがって、理論的には、それぞれ2つのシンボルを1つの大きなシンボルに、または3つのシンボルをそれぞれ1つの大きなシンボルに結合し、その組み合わせにハフマンコーディングを使用できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.