熵编码
详细梳理熵编码
\(\quad\)熵编码即编码过程中按熵原理不丢失任何信息的无损编码方式,同时在有损编码中的出现,作为编码器的最后一个流程。
\(\quad\)信息熵为信源的平均信息量(不确定性的度量)。常见的熵编码有:香农(Shannon)编码、哈夫曼(Huffman)编码,指数哥伦布编码(Exp-Golomb)和算术编码(arithmetic coding)。
\(\quad\)熵编码利用信息论中的熵概念来设计编码方案,以实现更高效的数据表示。虽然深度学习在许多领域都取得了显著的成功,但在熵编码方面,目前并没有广泛采用深度学习的趋势。
原因在于:熵编码方法通常采用较简单的数学模型,例如霍夫曼编码、算术编码等。这些方法在理论上能够接近信息论的极限。
假设有一个随机变量x,它一共有八个可能取值,记为\({a,b,c,d,e,f,g,h}\) 。当需要将x的取值传输给其它人时,首先需要对x的取值进行二进制编码。例如,可以将这八个状态如下编码:
a:000 b:001 c:010 d:011
e:100 f:101 g:110 h:111
我们用3bits编码了x 的所有取值。这意味着当把x的任意取值发送给其它人时,每次需要3bits来储存信息。
如果x各值均匀分布,则x的熵为:
\(H(x)=8*(-\frac{1}{8}*log_2{-\frac{1}{8}})=3\)
似乎很合理
但如果其概率分布不均匀呢?比如随机变量y的分布为:
\(\frac{1}{2},\frac{1}{4},\frac{1}{8},\frac{1}{16},\frac{1}{64},\frac{1}{64},\frac{1}{64},\frac{1}{64}\)
那么发送一千次y,按照原始方法,还需要1000*3bits嘛?能否对数据进行压缩呢?
可以计算y的熵,H(y)=2
通过使用哈夫曼编码:
\(a:0,b:10,c:110,d:1110,e:111100,f:111101,g:111110,h:111111\)
这样平均长度为:
\(avelen=1*\frac{1}{2}+...+6*\frac{1}{64}=2\)
通过哈夫曼编码 发送一千次y只需要2000bits。
此时哈夫曼编码的性能已交达到了理论极限。
我们所优化的\(Loss=R+\lambda D\)中R一般也直接用熵来近似比特率。
\(R(\hat y)=-E(log (p_{\hat y}(\hat y))\)
当变换、量化操作结束时,得到的符号及其概率分布已经确定,其熵也确定了,那么它bits rate也确定了,影响损失函数的就只有重构效果(或者说取决于我们所提取的特征以及我们估计的概率分布)。
也就是说取决于 熵模型