1.概要
本文简述在频域中基于神经网络进行帧内预测,通过将预测prediction转换到频域,从而大大减少了密集矩阵-向量乘法需要的运算量。将l1范数和s型函数应用于预测残差在DCT域中,我们的损失函数反映了残差量化和编码阶段存在于典型的混合视频编码架构中。最近也是初看HEVC,可能会有理解错误之处。
2. Introduction
与之前的工作相比,该论文所描述的预测方法提高了压缩效率,大大减少了计算负担。主要在于结构层数的减少及根据统计特性对某些特定频域置零,从而减少矩阵运算量。
2.1 Predictor Architecture
作为预测器的输入,该论文取当前block的左方和上方的两条重建样本线的重构样本块作为输入,如图所示。因此对于M × N大小的块,预测器的输入维数,即r的维数为2(M + N + 2)输出维数为MN。将预测器定义为一个完全连接的两层具有位移整流线性单元(SReLU)激活函数的神经网络。 第一层使用矩阵A1和偏置向量b1来计算向量t1:
t
1
=
f
(
A
1
r
+
b
1
)
t_1=f(A_1r+b_1)
t1?=f(A1?r+b1?)
p
k
(
r
)
=
A
2
,
k
t
1
+
b
2
,
k
p_k(r)=A_{2,k}t_1+b_{2,k}
pk?(r)=A2,k?t1?+b2,k? SReLU function f:
f
(
x
)
i
=
m
a
x
(
?
1
,
x
i
)
f(x)_i=max(-1,x_i)
f(x)i?=max(?1,xi?)
由于模式索引k被信号到解码器,我们需要一种方法预测它在解码器执行熵编码。为了这个目的,我们用分离的两层函数,将r映射到模态上的概率分布通过softmax-function
σ
\sigma
σ:
q
(
r
)
=
σ
(
A
4
f
(
A
3
r
+
b
3
)
)
q(r)=\sigma(A_4f(A_3r+b_3))
q(r)=σ(A4?f(A3?r+b3?))
σ
(
x
)
i
\sigma (x)_i
σ(x)i?:
σ
(
x
)
i
=
e
x
i
/
∑
j
e
x
j
\sigma (x)_i=e^{x_i}/\sum_j e^{x_j}
σ(x)i?=exi?/j∑?exj?
2.2 Training
loss函数的设计包括两个方面:第一个是关于预测残差的转换编码,其中零系数起着重要作用。第二个方面是分区将图片分成块并选取其中一套简单的预测模型进行计算。 假设pk预测了一块原始样本s,ck=T
×
\times
×(s-pk)是由T进行的预测残差变换,即二维DCT-II。我们使用系数c上的损失函数l:
l
(
c
)
=
∣
c
∣
+
σ
g
(
β
∣
c
∣
?
γ
)
l(c)=|c|+\sigma g(\beta |c|-\gamma)
l(c)=∣c∣+σg(β∣c∣?γ) 其中g为logistic函数:
g
(
x
)
=
1
/
(
1
+
e
?
x
)
g(x)=1/(1+e^{-x})
g(x)=1/(1+e?x) 对于完整的块,则损失是所有DCT-II系数(ck)i损失的总和:
L
b
l
o
c
k
(
s
,
k
)
=
∑
i
l
(
(
c
k
)
i
)
L_{block}(s,k)=\sum_il((c_k)_i)
Lblock?(s,k)=i∑?l((ck?)i?) 在下图中,我们可以看到,当系数很小时,函数
l
l
l迅速减小,当系数大时,斜率较小。 还有一个额外的好处系数设为零的好处,因为zero可以减少矩阵相乘次数,为后面的变换到频域提供了可能。 使用函数Lblock,我们构建了一个考虑到成本需要信号的模式
k
k
k,以及将块分割成各种各样的可能性形状,我们将损失函数定义为:
L
t
r
e
e
(
s
)
=
m
i
n
(
?
j
{
∑
s
i
?
C
j
(
s
)
L
t
r
e
e
(
s
i
)
}
)
∪
L
n
o
d
e
(
s
)
}
)
L_{tree}(s)=min(\bigcup_j \lbrace \sum_{s_i\epsilon C_j(s)}L_{tree}(s_i) \rbrace) \cup L_{node}(s) \rbrace)
Ltree?(s)=min(j??{si??Cj?(s)∑?Ltree?(si?)})∪Lnode?(s)})
L
n
o
d
e
(
s
)
=
L
b
l
o
c
k
(
s
,
k
ˇ
)
+
b
t
r
u
e
(
q
(
r
)
,
k
ˇ
)
+
H
(
μ
k
ˇ
,
q
(
r
)
)
L_{node}(s)=L_{block}(s,\check{k})+b_{true}(q(r),\check{k})+H(\mu_{\check{k}},q(r))
Lnode?(s)=Lblock?(s,kˇ)+btrue?(q(r),kˇ)+H(μkˇ?,q(r))
k
ˇ
=
a
r
g
m
i
n
k
L
b
l
o
c
k
(
s
,
k
)
\check{k}=argmin_k L_{block}(s,k)
kˇ=argmink?Lblock?(s,k) 对于分区树中的每个节点,在上述公式中出现的损失项Lnode由的Lblock,它对上述量化系数编码的代价进行了建模,btrue,它为预测编码的速率开销,以及一个交叉熵项。 i.e
H
(
u
k
ˇ
,
q
(
r
)
)
=
?
l
o
g
2
(
q
(
r
)
k
ˇ
)
H(u_{\check{k}},q(r))=-log_2(q(r)_{\check{k}})
H(ukˇ?,q(r))=?log2?(q(r)kˇ?) 通过梯度下降法来进行更新权重。
3.Predictor Simplification
当计算资源有限时,系统的全连接体系结构由于需要进行大量的乘法运算,对于大的block size将更为严重。然而,如果人们能够利用出现的权重结构,那将降低最终实现的复杂性。在这里,我们现在降低复杂性的两种可能性:第一个是基于统计特性将矩阵某些行设置为零,即剪枝在训练之后的一个步骤中从块预测器中获得权重。另一个是从实验观察,我们可以近似的块预测一个仿射线性函数。
3.1 Pruning
在解码器处,通过反变换得到重构信号量化剩余系数并加入预测器,即
r
e
c
=
T
i
n
v
c
+
p
rec=T_{inv}c+p
rec=Tinv?c+p 我们可以将式子重写为
r
e
c
=
T
i
n
v
(
c
+
T
i
n
v
?
1
p
)
rec=T_{inv}(c+T_{inv}^{-1}p)
rec=Tinv?(c+Tinv?1?p)。但现在我们不计算预测在空间域,我们在编解码器使用的频域计算它。在这个领域工作使我们能够设置它的许多行到零,这样造成的损失很小。这样可以直接节省大量的计算时间,因为我们不需要计算相应的标量乘积输出层的矩阵行。 那么该如何选取矩阵那些参数为零呢,通过在大量的训练例子中积累这些差异,具体为: 假设
c
=
T
s
c=Ts
c=Ts,c是样本block变换到频域的参数;我们可以比较预测器
p
^
\hat{p}
p^?和零预测器的损失函数
l
l
l:
l
^
i
=
l
(
c
i
?
p
^
i
)
?
l
(
c
i
?
0
)
\hat{l}_i=l(c_i-\hat{p}_i)-l(c_i-0)
l^i?=l(ci??p^?i?)?l(ci??0)。我们通过在大量的样本上对应维度分别计算上述
l
l
l函数,通过
d
w
,
h
,
k
,
i
d_{w,h,k,i}
dw,h,k,i?来表示累计和;最后我们将输出
d
w
,
h
,
k
,
i
/
n
w
,
h
,
k
,
i
d_{w,h,k,i}/n_{w,h,k,i}
dw,h,k,i?/nw,h,k,i?和阈值
τ
\tau
τ相比较,如果小于,则将对应矩阵的对应行参数设置为零,不用参与矩阵计算,节省计算开销。结果如下图,可见经过Pruning对于大block size带来较大提升。
3.2Affine Linear Predictors
当在大量的例子中评估块预测器时,该论文注意到小于?1的SReLU函数的参数非常少,即激活函数在大多数情况下被用作线性函数,所以通过删除SReLU,可以表示块预测器由单一的矩阵乘法和偏置加法,同时又不会带来较大的error。
Reference:Intra Picture Prediction for Video Coding with Neural Networks
|