算術符号化( AC ) は、ロスレスデータ圧縮で使用されるエントロピー符号化の一種です。通常、ASCIIコードのように、文字列は文字ごとに固定ビット数を使用して表現されます。文字列を算術符号化に変換すると、頻繁に使用される文字はより少ないビットで格納され、あまり頻繁には出現しない文字はより多くのビットで格納されるため、合計でより少ないビットが使用されます。算術符号化は、ハフマン符号化などの他のエントロピー符号化とは異なり、入力を構成要素のシンボルに分割してそれぞれをコードに置き換えるのではなく、メッセージ全体を単一の数値、任意精度の分数q (0.0 ≤ q < 1.0 )にエンコードします。[ 1 ]

算術符号化は、区間 [0, 1) をシンボル確率に比例した小区間に分割することで圧縮を実現します。シンボル確率が等しくない場合、確率の高いシンボルにはより大きな小区間が割り当てられ、その区間内の点を指定するのに必要なビット数が少なくなります。この圧縮の理論的な限界は、ソースのエントロピーによって与えられ、シャノンのソース符号化定理は、任意のロスレス方式で達成できるシンボルあたりの最小平均ビット数としてエントロピーを確立します。[ 2 ] [ 3 ]算術符号化は、特に長いメッセージの場合に、この限界に非常に近い値になります。[ 1 ] [ 4 ]
すべてのシンボルが等しい確率で出現する場合、各サブインターバルは同じサイズになり、どのシンボルも他のシンボルより少ないビット数で表現することはできません。この場合、エントロピーは最大値に達します。ビット/シンボル (はアルファベットのサイズです)であり、圧縮は不可能です。たとえば、独立した公平なコイン投げのストリームは、シンボルあたりちょうど 1 ビットのエントロピーを持ち、これはストレージの全コストであるため、算術符号化はメリットを提供しません。同様に、等しい確率を持つ独立した 3 進シンボルは、シンボルあたり約 1.585 ビットのエントロピーを持ち、これは 3 シンボルのアルファベットの最大値であり、同様に圧縮不可能です。[ 3 ] [ 2 ]
確率が不均等な場合、部分区間のサイズが不均等になるため、圧縮が可能になります。たとえば、確率が 0.9 と 0.1 のバイナリソースは、シンボルあたり約 0.469 ビットのエントロピーを持ちます。確率 0.9 のシンボルは各区間の 90% を受け取るため、ほとんどのエンコード手順では区間がほとんど縮小されず、最終値を識別するために必要なビット数が少なくなります。これにより、算術符号化で約 2.1:1 の圧縮率を達成できます。[ 3 ] [ 1 ]


最も単純なケースでは、各シンボルが出現する確率は等しい。たとえば、出現確率が等しい3つのシンボルA、B、Cのセットを考えてみよう。シンボルを1つずつエンコードすると、シンボルごとに2ビットが必要となり、無駄になる。ビットのバリエーションの1つは使用されないからである。つまり、シンボルA、B、Cはそれぞれ00、01、10としてエンコードされ、11は使用されない可能性がある。[ 1 ]
より効率的な解決策は、これら 3 つの記号のシーケンスを、各桁が記号を表す 3 進数の有理数として表現することです。たとえば、シーケンス「ABBCAB」は、算術符号化では区間[ 0, 1) の値として 0.011201 3になります。次のステップは、この3 進数を、復元するのに十分な精度を持つ固定小数点 2 進数を使用してエンコードすることです。たとえば、0.0010110001 2は、わずか 10 ビットです。単純なブロック符号化と比較して 2 ビット節約できます。任意の精度の数の基数を変換するための効率的なインプレース アルゴリズムがあるため、これは長いシーケンスでも実行可能です。[ 5 ]
値を解読するには、元の文字列の長さが 6であることがわかっているので、単純に3進数に変換し 、6桁に丸めて文字列を復元すればよい。
一般的に、算術符号化器は、任意のシンボルと確率のセットに対してほぼ最適な出力を生成できます。(最適な値は、確率Pの各シンボルに対して−log 2 Pビットです。ソース符号化定理を参照してください。)[ 2 ]算術符号化を使用する圧縮アルゴリズムは、まずデータのモデルを決定することから始まります。これは基本的に、メッセージのシンボルにどのようなパターンが見られるかを予測することです。この予測の精度が高いほど、出力は最適に近づきます。[ 1 ]
例:特定の監視機器の出力を時間経過とともに記述する単純な静的モデルは次のようになる。
モデルは、この例で選択した単純な 4 文字セット以外のアルファベットも処理できます。より高度なモデルも可能です。高次モデリングでは、先行する記号 (コンテキスト)に基づいて記号の現在の確率の推定値を変更するため、たとえば英語のテキストのモデルでは、「u」が「Q」または「q」の後に続く場合、「u」の確率ははるかに高くなります。モデルは適応型にもなり、ストリームに実際に含まれている内容に基づいてデータの予測を継続的に変更することもできます。デコーダはエンコーダと同じモデルを持つ必要があります。[ 1 ] [ 6 ]
一般的に、エンコード処理の各ステップは、最後のステップを除いて同じです。エンコーダーは基本的に3つのデータのみを考慮する必要があります。[ 1 ]
エンコーダは現在の区間をサブ区間に分割し、各サブ区間は現在のコンテキストにおけるそのシンボルの確率に比例した現在の区間の割合を表します。次にエンコードされる実際のシンボルに対応する区間が次のステップで使用される区間になります。[ 1 ]
例:上記の4つのシンボルモデルの場合:
すべてのシンボルがエンコードされると、結果として得られる区間は、それを生成したシンボルのシーケンスを明確に識別します。同じ最終区間と使用されているモデルを持っている人は誰でも、その最終区間を生成するためにエンコーダに入力されたシンボルシーケンスを再構築できます。[ 1 ]
ただし、最終区間を送信する必要はなく、その区間内に含まれる1つの分数のみを送信すれば十分です。具体的には、その分数の十分な桁数(どの基数でも)を送信すれば、その桁数で始まるすべての分数が最終区間内に収まります。これにより、結果として得られるコードがプレフィックスコードであることが保証されます。[ 7 ]

与えられた4つのシンボルモデルでエンコードされたメッセージを復号するプロセスを考えてみましょう。メッセージは分数0.538でエンコードされています(分かりやすさのために2進数ではなく10進数を使用しています。また、メッセージを復号するために必要な桁数だけがあると仮定しています)。[ 1 ]
このプロセスはエンコーダーが使用するのと同じ区間[0,1)から始まり、同じモデルを使用して、エンコーダーが持つべき 4 つのサブ区間に分割します。分数 0.538 は NEUTRAL のサブ区間[0, 0.6)に該当します。これは、エンコーダーが読み取った最初のシンボルが NEUTRAL であったことを示しているため、これがメッセージの最初のシンボルとなります。
次に、区間[0, 0.6)を小区間に分割します。
0.538は区間[0.48, 0.54)内にあるため、メッセージの2番目のシンボルはNEGATIVEであったに違いない。
再び現在の区間をいくつかの小区間に分割します。
0.538 は END-OF-DATA シンボルの範囲内にあるため、これが次のシンボルになります。これは内部終了シンボルでもあるため、デコードが完了したことを意味します。ストリームが内部的に終了しない場合は、ストリームがどこで停止するかを示す別の方法が必要です。そうしないと、デコード処理が永遠に続き、実際にエンコードされた数よりも多くのシンボルを誤って読み取ってしまう可能性があります。[ 1 ]
前の例のメッセージ0.538は、0.534、0.535、0.536、0.537、または0.539という同じ長さの小数でエンコードできたはずです。これは、2進数の代わりに10進数を使用することで、何らかの非効率性が生じることを示唆しています。これは正しいです。3桁の10進数の情報量はビット。同じメッセージは、わずか 8 ビットのコストでバイナリ小数 0.10001001 (10 進数で 0.53515625 に相当) にエンコードできたはずです。[ 7 ]
この 8 ビット出力は、メッセージの情報量、つまりエントロピーよりも大きい。
しかし、バイナリ符号化では整数ビット数を使用する必要があるため、このメッセージのエンコーダは少なくとも8ビットを使用し、結果としてメッセージはエントロピーの内容よりも8.4%大きくなります。最大1ビットのこの非効率性により、メッセージサイズが大きくなるにつれてオーバーヘッドは相対的に少なくなります。[ 7 ]
さらに、主張されたシンボル確率は[0.6, 0.2, 0.1, 0.1)でしたが、この例の実際の頻度は[0.33, 0, 0.33, 0.33)です。これらの頻度に合わせて間隔を再調整すると、メッセージのエントロピーは 4.755 ビットになり、同じ NEUTRAL NEGATIVE END-OF-DATA メッセージは、間隔[0, 1/3); [1/9, 2/9); [5/27, 6/27);およびバイナリ間隔[0.00101111011, 0.00111000111)としてエンコードできます。これはまた、算術符号化などの統計的符号化方法が、特に確率モデルが間違っている場合に、入力メッセージよりも大きな出力メッセージを生成する可能性がある例でもあります。[ 1 ]
算術符号化が他の類似のデータ圧縮方式に比べて優れている点の1つは、適応が容易であることです。適応とは、データ処理中に頻度(または確率)テーブルを変更することです。復号時の頻度テーブルが符号化時と同じ方法、同じステップで置き換えられる限り、復号されたデータは元のデータと一致します。同期は通常、符号化および復号処理中に発生するシンボルの組み合わせに基づいています。[ 1 ] [ 6 ]
上記の算術符号化の説明には、いくつかの簡略化が含まれています。特に、エンコーダが最初に区間の端点を表す分数を無限精度で完全に計算し、エンコードの最後に分数を最終形式に変換するという前提で記述されています。無限精度をシミュレートしようとするのではなく、ほとんどの算術コーダーは、デコーダが対応できることがわかっている固定精度の限界で動作し、計算された分数をその精度で最も近い等価物に丸めます。[ 7 ]例として、モデルが区間[0,1)を3分の1に分割し、これを8ビット精度で近似する場合の動作を示します。精度がわかっているので、使用できるバイナリ範囲もわかっていることに注意してください。
正規化と呼ばれるプロセスにより、有限精度がエンコード可能なシンボルの総数の制限にならないようにします。範囲が縮小され、範囲内のすべての値が特定の先頭桁を共有するようになると、それらの桁が出力に送られます。コンピュータが処理できる精度の桁数に関係なく、現在処理しているのはそれよりも少ないため、既存の桁は左にシフトされ、右側には新しい桁が追加されて範囲が可能な限り広くなります。この結果は、前の例の 3 つのケースのうち 2 つで発生することに注意してください。[ 7 ]
記号の出現確率が等しい場合、算術符号化は基数、つまり基数の単純な変更によって実現できることを思い出してください。一般に、算術(および範囲)符号化は、基数の一般化された変更として解釈できます。[ 5 ]例えば、任意の記号列を見てみましょう。
ある基数における数値として、関連する記号が順序付けられた集合を形成し、その集合内の各記号が連続する整数 A = 0、B = 1、C = 2、D = 3 などを表すと仮定します。これにより、次の頻度と累積頻度が得られます。
ある項目の累積頻度とは、その項目より前のすべての頻度の合計です。言い換えれば、累積頻度とは、頻度の累計値です。
位取り記数法では、基数(または基底)は、数値を表すために使用されるさまざまな記号の数に等しくなります。たとえば、10進数では、記号の数は 10 個、つまり 0、1、2、3、4、5、6、7、8、9 です。基数は、任意の有限整数を多項式形式の想定乗数で表すために使用されます。たとえば、457 という数は、実際には 4×10 2 + 5×10 1 + 7×10 0であり、基数は 10 であると想定されていますが、明示的には示されていません。
まず、文字列の長さが6であるため、DABDDBを6進数に変換します。文字列は最初に数字列301331にマッピングされ、次に多項式によって整数にマッピングされます。
結果23671の長さは15ビットであり、理論上の限界(メッセージのエントロピー)である約9ビットにはあまり近くない。 [ 3 ]
情報理論によって課せられる理論上の限界に近い長さのメッセージをエンコードするには、基数を変更する古典的な公式を少し一般化する必要があります。下限と上限のLとUを計算し、その間の数を選択します。Lの計算では、上記の式の各項に、以前に出現したすべてのシンボルの頻度の積を掛けます。[ 5 ]
この多項式と上記の多項式との違いは、各項がそれまでに出現したすべての記号の頻度の積で乗算されている点です。より一般的には、Lは次のように計算できます。
どこ累積頻度とは出現頻度です。インデックスはメッセージ内のシンボルの位置を示します。すべての頻度が1 の場合、これは基数変換式です。[ 5 ]
上限値UはLにすべての周波数の積を加えた値になります。この場合、 U = L + (3 × 1 × 2 × 3 × 3 × 2) = 25002 + 108 = 25110 となります。一般に、Uは次のように与えられます。
これで、区間 [ L , U ) から任意の数値を選択してメッセージを表すことができます。便利な選択肢の 1 つは、可能な限り長いゼロの列を持つ値である 25100 です。これは、結果を 251×10 2と表現することで圧縮を実現できるためです。メッセージの長さを別々に保存する場合は、ゼロを切り捨てて 251 にすることもできます。メッセージが長くなるほど、ゼロの列も長くなる傾向があります。
整数25100を復号するには、以下の表に示すように、多項式の計算を逆に行います。各段階で現在の記号を識別し、対応する項を結果から減算します。
復号中は、対応する 6 のべき乗で割った後に切り捨てます。次に、結果を累積間隔と照合し、ルックアップ テーブルから適切なシンボルを選択します。シンボルが識別されると、結果が修正されます。このプロセスは、メッセージの既知の長さの間、または残りの結果が正である限り継続されます。古典的な基数変換との唯一の違いは、各シンボルに関連付けられた値の範囲がある可能性があることです。この例では、A は常に 0、B は 1 または 2、D は 3、4、5 のいずれかです。これは、周波数によって決定される間隔と完全に一致しています。すべての間隔が 1 に等しい場合、古典的な基数変換の特殊なケースになります。[ 5 ]
下限L はn n を超えることはなく、ここでnはメッセージのサイズであり、したがって次のように表すことができます。ビット。上限Uを計算し、区間 [ L , U )から最も長いゼロの列を持つ数を選択することによってメッセージを削減した後、この長さは次のように削減できると推測できます。 ビット。各周波数は、その周波数の値と全く同じ回数出現するため、アルファベットAのサイズを積の計算に使用できます。
メッセージの推定ビット数にlog 2を適用すると、最終的なメッセージ (メッセージの長さと頻度テーブルの対数オーバーヘッドは除く) は、エントロピーによって与えられるビット数と一致し、長いメッセージの場合は最適値に非常に近くなります。[ 3 ] [ 2 ]
言い換えれば、算術符号化の効率は理論上の限界に近づく。メッセージ長が無限大に近づくにつれて、シンボルあたりのビット数が増加します。
これは直感的に理解できます。ソースがエルゴード的であると仮定すると、漸近等分配特性(AEP)を持ちます。AEPにより、長いストリームの後、記号、間隔ほぼ等しい大きさの区間に分割されている。[ 3 ]
技術的には、どんな小さなものでも十分に大きいすべての存在する弦それぞれの文字列がほぼ等しい確率を持つように、そしてそれらの合計確率は。
このような文字列はすべて、長さのバイナリ文字列によって算術的にエンコードされます。、 どこ最小次のような分数が存在する区間内で区間はサイズがあります1 つの分数が含まれると予想されます。いつ。
算術符号化は一度に1つのデータを圧縮しないため、IID文字列を圧縮する際にエントロピーに任意に近づくことができます。対照的に、ハフマン符号化の拡張(文字列用)を使用しても、アルファベット記号のすべての確率が2のべき乗でない限りエントロピーには達しません。この場合、ハフマン符号化と算術符号化の両方がエントロピーを達成します。[ 3 ] [ 8 ]
バイナリ文字列を単純にハフマン符号化すると、エントロピーが低い場合(例えば、({0, 1}) の確率が {0.95, 0.05} の場合)、圧縮は不可能になります。ハフマン符号化では各値に 1 ビットが割り当てられ、結果として入力と同じ長さのコードが生成されます。対照的に、算術符号化はビットをうまく圧縮し、[ 7 ]の最適な圧縮率に近づきます。
ハフマン符号化の最適性の欠如に対処する簡単な方法の1つは、シンボルを連結(「ブロッキング」)して新しいアルファベットを形成することです。この新しいアルファベットでは、各新しいシンボルは、元のアルファベットからの元のシンボルのシーケンス(この場合はビット)を表します。上記の例では、エンコード前に3つのシンボルのシーケンスをグループ化すると、次の頻度の新しい「スーパーシンボル」が生成されます。[ 6 ]
このグループ化により、ハフマン符号化は、シンボルごとに平均 1.3 ビット、つまりシンボルあたり 0.433 ビットとなり、元の符号化のシンボルあたり 1 ビットと比較されます。圧縮。任意の長さのシーケンスを許容すると、算術符号化と同様にエントロピーに任意に近づくが、そのためには巨大なコードが必要となるため、この目的においては算術符号化ほど実用的ではない。[ 6 ]
別の方法として、ハフマン符号に基づくゴロム・ライス符号を用いてランレングスを符号化する方法がある。このようなアプローチは、算術符号化やハフマン符号化よりも、より単純かつ高速な符号化/復号化を可能にする。後者はテーブル参照を必要とするためである。{0.95, 0.05}の例では、4ビットの剰余を持つゴロム・ライス符号は、圧縮率を達成する。3ビットブロックを使用するよりもはるかに最適に近い。ただし、ゴロム・ライス符号は、この例のようなベルヌーイ入力にのみ適用されるため、すべての場合においてブロッキングの代替となるわけではない。[ 6 ]
算術符号化の基本アルゴリズムは、IBM リサーチのJorma J. Rissanenとスタンフォード大学の博士課程学生 Richard C. Pasco によってそれぞれ独立して開発され、両方とも 1976 年 5 月に発表されました。[ 5 ] [ 9 ] Pasco は Rissanen の論文の出版前の草稿を引用し、彼らの研究の関係についてコメントしています。[ 9 ]
このアルゴリズム群の1つは、Rissanen [1976] によって独自に開発されました。これは、加算とべき乗によって得られたポインタを使用して、コード要素をアキュムレータの最上位にシフトします。次に、3つの選択肢の代替案を比較し、アキュムレータではなくコード要素をシフトし、コード要素をアキュムレータの最下位に加算する方が好ましいことを見ていきます。
発表から1年も経たないうちに、IBMはリッサネンの研究成果について米国特許を出願した。一方、パスコの研究成果は特許化されなかった。
算術符号化のためのさまざまな具体的な技術は、歴史的に米国特許で保護されてきましたが、特許の失効に伴い、多くの周知の手法がパブリックドメインに移行しています。特許で保護されている技術は、一部の正式な国際標準で規定されている算術符号化アルゴリズムを実装するために不可欠な場合があります。このような場合、これらの特許は一般的に、「合理的かつ非差別的」(RAND)ライセンス条件(少なくとも標準化委員会のポリシーとして)に基づいてライセンス供与されます。いくつかの有名な事例(すでに失効したIBMの特許を含む)では、このようなライセンスは無料で提供されていましたが、他の事例ではライセンス料が必要でした。RAND条件でのライセンスの提供は、必ずしもその技術を利用したいすべての人を満足させるものではありません。なぜなら、独自の商用ソフトウェア製品を開発する企業にとって「合理的」に見えるものが、フリーソフトウェアやオープンソースプロジェクトにとってはそれほど合理的ではないように見える場合があるからです。
少なくとも1つの重要な圧縮ソフトウェアプログラムであるbzip2は、当時の特許状況を考慮して、算術符号化の使用を意図的に中止し、ハフマン符号化を採用しました。また、ハフマン符号化と算術符号化の両方のオプションがあるJPEGファイル形式のエンコーダとデコーダは、特許上の懸念から、通常はハフマン符号化オプションのみをサポートしています。その結果、現在使用されているほぼすべてのJPEG画像はハフマン符号化を使用しています[ 10 ]。ただし、JPEGの算術符号化特許[ 11 ]は、JPEG規格の古さ(設計は1990年頃にほぼ完了)のために期限切れとなっています[ 12 ] 。JPEG XL、およびPackJPG、Brunsli、Leptonなどのアーカイバは、ハフマン符号化されたファイルを算術符号化(またはJPEG XLの場合は非対称数値システム)のファイルにロスレスで変換でき、最大25%のサイズ削減を実現しています。
JPEG画像圧縮フォーマットの算術符号化アルゴリズムは、以下の引用特許(既に失効)に基づいています。[ 13 ]
算術符号化に関連するその他の特許(ほとんどが既に失効している)には、以下のものがある。
注: このリストは網羅的なものではありません。その他の米国特許のリストについては、次のリンクを参照してください。[ 14 ] Diracコーデックは算術符号化を使用しており、特許出願中ではありません。[ 15 ]
算術符号化に関する特許は、他の法域にも存在する可能性があります。世界各国におけるソフトウェアの特許性については、ソフトウェア特許の項を参照してください。
算術符号化のプログラムによる実装はそれぞれ圧縮率とパフォーマンスが異なります。圧縮率はわずかにしか変化しませんが(通常 1% 未満)、[ 7 ]コードの実行時間は 10 倍も変化する可能性があります。パフォーマンスと圧縮率はデータの種類、特にアルファベットのサイズ(異なる記号の数)にも依存するため、公開されているエンコーダのリストから適切なエンコーダを選択するのは簡単な作業ではありません。2 つのエンコーダのうち一方は小さなアルファベットに対してより優れたパフォーマンスを発揮し、もう一方は大きなアルファベットに対してより優れたパフォーマンスを発揮する可能性があります。ほとんどのエンコーダはアルファベットのサイズに制限があり、その多くは正確に 2 つの記号 (0 と 1) のアルファベットに特化しています。
{{cite journal}}: CS1 maint: 複数の名前: 著者リスト (リンク)