32bit intと32bit floatの情報量は同じか?
結論から言うと、一般には違います。さらには、みなさんの予想に反して32bit floatのほうが情報量が大きくなることもあります。どういうことなのでしょうか。
「32bit intと32bit floatの情報量が同じか否か」が巷で話題となっているようです。
ここでは、情報理論における「情報量」の定義に立ち返って、この問について考えてみましょう[1]。
変数がもつ情報量
「情報量」とは、一体どのようなものだったでしょうか。「情報量」という概念は情報理論におけるものであり、これは確率の概念に基づいて定義されています。「ある離散確率変数
ここで
では、「32bit intの情報量」すなわちここでは ある32bit符号付き整数型の変数a
の値を観測したときに得られる情報量 は、どのようにして定義され、計算されるのでしょうか?
素朴には、「32bitのビット列なのだから、得られる情報量は32bitではないのか?」と思われるかもしれません。
いま、確率変数a : int32
の値をprintなどで出力して表示された整数値」[3]として定義しましょう。このとき情報量a : int32
の値を出力したら整数
さらに、表示される値
いま、確率分布
しかしこれは a >= 0
に常に(かつ一様に)なり、一方でa < 0
となる確率が
が考えられます。このとき、この確率変数の平均情報量すなわち プログラム変数a : int32
の情報量a
が実際には31 bitの情報量しか持っていないということを意味しています。
一般に、平均情報量
プログラムの変数は、その使われ方によって妥当な分布の仮定は異なります。
もしそのint型変数が例えばチェックサムやハッシュ値などであれば、一様分布を仮定するのが妥当でしょう。しかしそのような特殊な場合でなければ、一般に一様分布を仮定することはできないはずです。例えば通常のサービスにおけるユーザーの実年齢であればおそらく、負の値を取る確率は0で、その分布は80辺りを境に減衰する形になっているでしょう。このような場合、年齢変数の持つ情報量は明らかに32 bitよりもはるかに小さくなります。
まとめると、
- 32bit int型変数の情報量は、その変数が保持しうる値(データ)の確率分布に依存して変化する
- 32bit int型変数が表現可能な最大の情報量は確かに32bit
- 型の持つ情報量が32bitで最大となるのは、その変数の確率分布が一様分布である場合(そのように仮定できる場合)であり、かつそのときに限る[6]
同様の議論から、32bit floatについても同様のことが言えます[7]。
複数の(符号化方式としての)型どうしの情報量の比較
ここまでの話では、単一の型の情報量に着目してきました。しかし、ここまでの話は型自体の情報量というよりも変数の情報量では、というツッコミが考えられ、若干ミスリーディングな所があります。
そもそも一番最初の話では、int型とfloat型の情報量の大小について言及がされていたのでした。何を隠そう、ここまでの話だけでは、例え仮定する分布を固定したところで、型の間で情報量を比較するということができないのです。そこでここからは、「符号化の方法としての型」ごとの情報量の大小関係についても考えてみましょう。
ある情報があって、これをデータ化したいとしましょう。
例えば音楽という情報であれば、これを.wavに保存する場合、現実世界の音の振幅は連続的であるため、量子化という過程を経ることでビット列へと符号化されるのでした。
(ここでは量子化の詳しい話は省略します。標本化についても省略します。他の記事をあたってください。)
さらに、量子化において振幅を整数で符号化する方法と浮動小数点数により符号化する方法の2種類がよく知られているのでした。
一般に、ある情報を複数の符号化方式(型)で表現するという状況では、複数の型について、それぞれで同じ情報を符号化したときの情報量を比較する、ということが可能になってきます。
音楽を32bit intで量子化する場合と32bit floatで量子化する場合では、これも直前の議論と同様、これは音楽の音の振幅がとる確率分布によって符号化後の情報量が変わってきます。このことを利用して、逆にこれらの型の間の情報量の大小関係を恣意的に満たすような確率分布を作ることもできます。
例えば、(32bit floatの情報量)
ここで量子化前の連続確率分布
ここで
このような音声を32bit intで符号化した場合、振幅が
量子化された振幅の確率変数を
となり、32 bitよりも遥かに小さな情報量となります。一方で、32bit floatの場合は
また、音声処理では大きすぎる音が最大値に潰れてしまうことがないよう正規化を行うことがあります。例えば、振幅が
さらに、先程「変数の確率分布が一様分布である場合は型の持つ情報量が最大となる」と書きました。しかし、ある同じ情報
そもそも符号化元の情報
あとちなみに、(符号化前の情報
まとめ
- 32bit int、32bit floatの情報量は、それらが表現するデータの確率分布をどのように仮定するかによって変化する
- 一般にはこれらの情報量は0bit以上32bit以下となる
- ある情報(情報源)を32bit intと32bit floatの2種類の型(符号化方式)で符号化した場合、符号化されたデータの情報量を比較すると、一般にその大小関係は情報源の分布に依存し、同じ・どちらが大きい・小さいのように言い切ることはできない
- 分布を固定してはじめて大小関係を議論できる
- 分布に合わせた符号化(型)を選ぶことで、情報を効率的に符号化できる(情報量を最大化できる)
- これは「用途に合わせた型を選ぼう」というベストプラクティスの理由付けにもなるはず
余談ですが、例えば想定される状況として、オーディオマニアの方が「intよりfloatのほうが情報量が多くて〜」と言った場合、これは先程のintとfloatの符号化方式としての比較の意味で「情報量」という言葉を使ったのだ、と解釈することができます。この意味では、やはり振幅の分布の仮定に依るので一概には言えませんが、「確かにfloatによる符号のほうが情報量が多くなるような分布がありうる」という意味で間違っていると言い切ることも簡単にはできないでしょう。
もっとも普通の音楽の分布を想定した場合に、本当にfloatのほうが情報量が多くなるかは確かに怪しいです。しかし、例え普通の分布を仮定する限りfloatもintも大差なかったとしても、その人はひょっとしたら振幅分布がかなり普通ではない音楽を嗜んでいるコアなオーディオマニアの可能性があります。
振幅分布異常音楽に次に魅入ることになるのは、紛れもない貴方自身かもしれません……
音割れ 本来は良くない
-
「32bit int/floatの情報量」というフレーズに対して、本記事で提示する2つの解釈以外にも情報理論的な解釈がありうると考える方がいらっしゃいましたら、是非コメントください。 ↩︎
-
ここでの「変数」は、数学ではなくプログラムにおける意味での変数 ↩︎
-
のときP_X(x)=0 の引数が\log_2 となり0 の不定形が出現しますが、この場合は0 \times -\infty とみなして計算します ↩︎0 \times -\infty = 0 -
例えば、サイコロの出る目は各確率が
の一様分布です ↩︎\frac{1}{6} -
あと、確率分布として一様分布を仮定するのは、その変数がどういう使われ方をするのかが一切仮定できない場合の、ある種「無情報事前分布」的な見方をするという意味付けもできるかもしれません。32bitより小さくなるのはその分の情報量だけその変数(ビットパターン)がどういう使われ方をするのかの知識を事前に知っているから、と言うこともできるかもしれない。ただその場合もそういう仮定を置いてるという但し書きがない限り正しくないと思う ↩︎
-
IEEE 754より、取りうる浮動小数点数のパターンの数
はN よりも小さくなるはずで、そこだけ注意が必要です ↩︎2^{32} -
話を簡単にするために、この2種類の音が重なり合う場合はないものとします。 ↩︎
-
量子化元の振幅(実数)を、そこと最も近い符号の点へと移すような符号化を考えています。例えばintへの符号化は四捨五入など。 ↩︎
-
の具体的な値の計算は少し難しそうです。誰か適当な分布作って計算に成功したら教えてください(他力本願) ↩︎H(X_\mathrm{float})
Discussion