【图像压缩】超先验模型 《VARIATIONAL IMAGE COMPRESSION WITH A SCALE HYPERPRIOR》

updating...

1 动机

基于香农定理,使用估计所得熵模型对隐层表示建模理论上的编码下界为:

R = \mathbb{E}_{\hat{y}\sim m}[-log_2 p_{\hat{y}}(\hat{y}))]

其中m为隐层表示(latent representation)实际分布,p_{\hat{y}}为熵模型估计分布,熵模型是一个发送人与接收人共享的先验概率模型,用来估计真实隐层表示分布。上面的式子说明当熵模型估计p_{\hat{y}}与实际分布m完全相同的时候会有编码长度最小。这告诉我们,一方面,当熵模型使用全分解(fully factorized)概率分布的时候,如果实际分布中存在统计依赖,熵模型估计分布天然不能拟合实际分布;另一方面,因为y=encoder(x)是一个确定性的过程,如果想要在使用全分解概率分布的情况下效果提升,则需要encoder对输入的自然图像尽量多的去除统计依赖。

这篇文章,关键在于引入边信息,捕捉隐层表示的隐藏信息以辅助熵模型的参数生成,从而改善熵模型估计与隐层实际分布不匹配问题。将边信息导入比特流,这使得decoder也可以共享熵模型。解压时decoder先解压边信息,构建熵模型,之后基于正确的熵模型解压隐层信息。

2 变分模型

算法的优化问题可以建模为VAE模型。VAE是一个概率生成模型。熵模型对应VAE隐层表示的先验p_{\tilde{y}}边信息可以看做是熵模型参数的先验,先验的先验这里称之为超先验。

把压缩问题中的分析模型g_a看做VAE中的推理模型,把合成模型g_s看做生成模型。在VAE的推理模型,目的是要估计真实的后验概率p_{\tilde{y}|x}(\tilde{y}|x),这通常不可行。于是VAE中使用一个带参变分密度q(\tilde{y}|x)来拟合真实后验概率p_{\tilde{y}|x}(\tilde{y}|x),通过最小化优化目标——隐变量真实分布与模拟分布的KL散度来达到拟合的效果,这相当于最小化图像压缩中的率失真(rate-distortion)性能:

\mathbb{E}_{x\sim p_x} D_{KL}[q\ ||\ p_{\tilde{y}|x}] = \mathbb{E}_{x\sim p_x}\mathbb{E}_{\tilde{y}\sim q}[\cancelto{0}{logq(\tilde{y}|x)}\underbrace{-logp_{x|\tilde{y}}(x|\tilde{y})}_{weighted \ distortion}\underbrace{-logp_{\tilde{y}}(\tilde{y})}_{rate}]+const

1. 第一项如下所示,U是一个宽度为1的均匀分布(如第三章中描述,在训练的时候使用添加均匀噪声代替量化),q概率为1。log\ q == 0

q(\tilde{y}|x,\phi_g) = \prod_i \boldsymbol{U}(\tilde{y}|y_i - \frac{1}{2},y_i+\frac{1}{2})) , y=g_a(x;\phi_g)

2. 如果假设满足下面的分布:

p_{x|\tilde{y}}(x|\tilde{y},\theta_g) = \boldsymbol{N}(x|\tilde{x},(2\lambda)^{-1}I), \tilde{x} = g_s(\tilde{y};\theta_g)

那么第二项就是x\tilde{x}的平方差,以\lambda为权重。也就是说,如果以\tilde{y}为条件的x的分布满足如上条件的多维高斯分布,那么第二项可以看做图像压缩中的类MSE的失真项distortion,最小化目标函数等同于缩小重构图像的失真

第三项,\mathbb{E}_{\tilde{y}\sim q}[-log\ p_{\tilde{y}}(\tilde{y})],很容易看出与边缘分布m(\tilde{y})=\mathbb{E}_{x\sim p_x}q(\tilde{y}|x)(经过合成变换、量化操作之后的隐层分布)和先验p_{\tilde{y}}(\tilde{y})(熵模型分布)的交叉熵[1]相同,当边缘分布与先验相同时最小,即最小化目标函数等同于使熵模型分布更拟合边缘分布。反映了编码\tilde{y}的代价,可以看做图像压缩中的率rate。这里将先验建模成为一个无参数、可全分解的密度函数如下(A.6.1):

p_{\tilde{y}|\psi}(\tilde{y}|\psi) = \prod_i(p_{y_i|\psi^{(i)}}(\psi^{(i)})*\boldsymbol{U}(-\frac{1}{2},\frac{1}{2}))(\tilde{y}_i)

其中,\psi^{(i)}代表每一个单变量分布p_{y_i|\psi^{(i)}}的所有参数。在图像压缩中,熵模型的分布只由参数决定。*代表卷积,目的是让先验p_{\tilde{y}}(\tilde{y})能够更好地匹配边缘分布m(\tilde{y})。称上面这种式子为可分解先验模型(A.6.2)。

[1]:交叉熵定义:

H(p,q) = \mathbb{E}_p[-log\ q] = H(p)+D_{KL}(p||q)

3 超先验

如下所示,左二,由分析模型得出的隐层表示在尺度上存在空间耦合性,如高对比度区域响应集中的高、存在边缘。只靠全分解的熵模型不能够捕获这些耦合情况,超先验用来捕获这些空间耦合性。

超先验的方法,通过引入隐藏变量\tilde{z}来建模空间相关性,扩展模型,将每个隐层变量\tilde{y}_i建模成满足均值为0标准差为\tilde{\sigma}_i的高斯分布,其中\tilde{\sigma}由隐藏变量\tilde{z}经过变换h_a得来(同样卷积上一个标准均匀分布):

p_{\tilde{y}|\tilde{z}}(\tilde{y}|\tilde{z},\theta_h) = \prod_i(\boldsymbol{N}(0, \tilde{\sigma}^2)*\boldsymbol{U}(-\frac{1}{2},\frac{1}{2}))(\tilde{y}_i), \quad \tilde{\sigma} = h_s(\tilde{z};\theta_h)

拓展推理模型,y之上加一个变换h_a,得到一个联合可分解变分后验概率(single joint factorized variational posterior)如下:

q(\tilde{y},\tilde{z}|x,\phi_g,\phi_h) = \prod_i \boldsymbol{U}(\tilde{y}_i|y_i-\frac{1}{2},y_i+\frac{1}{2})\cdot\prod_j \boldsymbol{U}(\tilde{z}_j|z_j-\frac{1}{2},z_j+\frac{1}{2}), \\ with \ y = g_a(x;\phi_g),z = h_a(y;\phi_h)

由于没有\tilde{z}的先验信息,所以使用之前建模\tilde{y}的全分解密度模型建模\tilde{z}(A.6.1):

p_{\tilde{z}|\psi}(\tilde{z}|\psi) = \prod (p_{z_i|\psi^{(i)}}(\psi^{(i)})*\boldsymbol{U}(-\frac{1}{2},\frac{1}{2}))(\tilde{z}_i)

总损失函数如下所示,其中第三项和第四项分别代表编码\tilde{y}\tilde{z}的交叉熵,第四项代表边信息: 

\mathbb{E}_{x\sim p_x} D_{KL}[q\ ||\ p_{\tilde{y},\tilde{z}|x}] = \mathbb{E}_{x\sim p_x} \mathbb{E}_{\tilde{y},\tilde{z}\sim q}[ \cancelto{0}{log\ q(\tilde{y},\tilde{z}|x)} \underbrace{- log\ p_{x|\tilde{y}}(x|\tilde{y})}_{distortion} \underbrace{- log\ p_{\tilde{y}|\tilde{z}}(\tilde{y}|\tilde{z}) - log\ p_{\tilde{z}}(\tilde{z})}_{rate} ] + const

直观来看,\tilde{z}\tilde{y}经过分析变换得到,其规模进一步缩小,然后又通过合成变换扩大规模,得到熵模型的参数,其中可能会有两个位置的参数来源与同一个\tilde{z}_i,这就达到了对两个元素之间耦合性建模的目的。

 

4 网络结构

5 实验

A.6.1 单变量无参密度模型

借助累计分布函数c:\mathbb{R} \rightarrow [0,1]定义密度模型p:\mathbb{R} \rightarrow \mathbb{R}^+。其中累计分布函数满足:

c(-\infty)=0;\ c(\infty)=1;\ p(x)=\frac{\partial{c(x)} }{\partial{x}} \ge 0

累计分布函数应满足单调性,所以需要密度函数非负。假设累计分布函数可以分解为若干个函数:

c = f_K\circ f_{K-1} \cdots f_1,\ with f_k:\mathbb{R}^{d_k} \rightarrow \mathbb{R}^{r_k}

p = f_K^{'} \cdot f_{K-1}^{'} \cdots f_1^{'}

f_K^{'}是雅克比矩阵,矩阵形状为(r_k, d_k),为了保证p(x)是一个单变量函数,即p的形状为(1,1),需要r_K = d1 = 1(矩阵相乘从左向右)

为满足0\le p(x) \le 1,首先需要雅克比矩阵非负,则选择f_K如下:

f_k(x) = g_k(H^{(k)}x + b^{(k)}), \quad 1 \le k \le K

f_K(x) = sigmoid(H^{(K)}x + b^{(K)})

with\ nonlinearities: \quad g_k(x) = x+a^{(k)} \odot tanh(x)

\odot代表逐元素相乘,H^{(k)}代表权重矩阵,a^{(k)},b^{(k)}代表偏置向量。将上面的式子求导如下:

f_k^{'}(x) = diag g_k^{'}(H^{(k)}x + b^{(k)}) \cdot H^{(k)},\quad 1\le k \le K

g_k^{'}(x) = 1+a^{(k)} \odot tanh^{'}(x)

f_K^{'}(x) = sigmoid^{'}(H^{(K)}x + b^{(K)}) \cdot H^{(K)}

为了限制导数非负,需要限制H^{(k)}所有元素非负,a^{(k)}所有元素以-1为下界,通过重参数化操作实现(其中带hat的是真实参数):

H^{(k)} = softplus(\hat{H}^{(k)}),\quad a^{(k)} = tanh(\hat{a}^{(k)})

下面是使用该密度函数拟合一种高斯混合分布的情况(熵模型最终目的是要拟合真实分布):

该模型pytorch版对应于entropy_model中的bottleneck,可以看出累计分布函数形如一个多层感知机MLP。在实现代码使用多种方法解决精度表示的数值问题。

其中累计分布函数部分代码如下:

    def _logits_cumulative(self, inputs: Tensor, stop_gradient: bool) -> Tensor:
        # TorchScript not yet working (nn.Mmodule indexing not supported)
        logits = inputs
        for i in range(len(self.filters) + 1):
            matrix = getattr(self, f"_matrix{i:d}")
            if stop_gradient:
                matrix = matrix.detach()
            logits = torch.matmul(F.softplus(matrix), logits)

            bias = getattr(self, f"_bias{i:d}")
            if stop_gradient:
                bias = bias.detach()
            logits += bias

            if i < len(self.filters):
                factor = getattr(self, f"_factor{i:d}")
                if stop_gradient:
                    factor = factor.detach()
                logits += torch.tanh(factor) * torch.tanh(logits)
        return logits

另外,实现的时候,设计了一个辅助损失函数,...,略。

 

A.6.2 加上均匀噪声来建模先验

在正文中,用到了与均匀噪声卷积后的密度函数来建模先验(熵模型)p_{\tilde{y}|\tilde{z}}和超先验p_{\tilde{z}},以使先验更加灵活的拟合变分后验q(实际分布)。假设变分后验和先验只有一维,此时,g_a总是为相应维度生成一个常数值:

y=g_a(x)=c,\quad independent\ of\ x

由于量化操作添加了均匀噪声,此时变分后验应该要精确匹配边缘分布:

m(\tilde{y}) = q({\tilde{y}|x}) = \boldsymbol{U}(\tilde{y}|c-\frac{1}{2}, c+\frac{1}{2})

交叉熵为:\mathbb{E}_{\tilde{y}\sim m}[-log_2\ p_{\tilde{y}}],该交叉熵应该为0,为了使交叉熵估计为0,此时先验应该足够灵活地估计后验的形状——单位宽度均匀密度。

均匀分布不仅是高斯密度也是A.6.1中单变量无参密度函数的边界案例。为了解决这个问题,给先验卷上一个均匀分布:

p_{\tilde{y}}(\tilde{y}) = (p*\boldsymbol{U}(-\frac{1}{2}, \frac{1}{2}))(\tilde{y}) \\ = \int_{-\infty}^{\infty} p(y)\boldsymbol{U}(\tilde{y}-y|-\frac{1}{2}, \frac{1}{2})dy \\ =\int_{\tilde{y}-\frac{1}{2}}^{\tilde{y}+\frac{1}{2}}p(y)dy \\ =c(\tilde{y}+\frac{1}{2}) - c(\tilde{y}-\frac{1}{2})

其中c是累计分布函数。于是,先验的概率密度可以使用累计分布函数的差来表示。此时不论p是什么样的,当它的尺度参数[2](简单来说,尺度越大分布越分散,尺度越小分布越集中)趋向于0的时候,p_{\tilde{y}}趋向于一个单位均匀密度。如下所示,卷积上一个均匀分布使得先验概率对均匀分布的陡峭边界更加拟合:

[2]https://en.wikipedia.org/wiki/Scale_parameter

 

 

  • 18
    点赞
  • 77
    收藏
    觉得还不错? 一键收藏
  • 13
    评论
图像压缩是一种旨在减小数字图像文件大小以便更好地存储和传输的技术。目前国内外对于图像压缩的研究主要集中在以下几个方面。 1. 无损压缩 无损压缩是指压缩后的图像可以100%还原为原始图像,不会有任何信息损失。目前最常用的无损压缩算法是GIF和PNG。国内外研究者也在不断探索新的无损压缩算法,如基于深度学习的无损压缩算法和基于无参考图像质量评价的图像压缩算法等。 2. 有损压缩 有损压缩是指压缩后的图像会有信息损失,但是可以通过降低图像质量来减小文件大小。目前最常用的有损压缩算法是JPEG。国内外研究者也在不断探索新的有损压缩算法,如基于深度学习的有损压缩算法和基于人眼视觉特性的有损压缩算法等。 3. 基于神经网络的图像压缩 近年来,基于神经网络的图像压缩算法备受关注。这些算法利用深度学习技术来自动学习压缩图像的特征,并且可以实现无损和有损压缩。目前,基于神经网络的图像压缩算法已经取得了一定的进展,例如Google开发的BPG算法、Facebook开发的PIPP和Toderici等人开发的End-to-End Optimized Image Compression算法。 总之,图像压缩作为一项重要的技术,一直都是学术界和工业界关注的焦点,国内外的研究者在不断探索新的压缩算法和优化方法,以便更好地适应不同的应用场景。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值