【论文笔记】ResRep: Lossless CNN Pruning via Decoupling Remembering and Forgetting

Abstract

提出了ResRep,一种无损通道修剪的新方法,它通过减少卷积层的宽度(输出通道数)来缩小CNN的尺寸。
建议将CNN重新参数化为记忆部分遗忘部分,前者学习保持性能,后者学习修剪。通过对前者使用常规 SGD 进行训练,对后者使用带有惩罚梯度的新颖更新规则进行训练,实现了结构化稀疏性,然后等效地将记忆和遗忘部分合并到层数更窄的原始架构中。

github仓库

1 Introduction

压缩和加速卷积神经网络(CNN)的主流技术包括稀疏化、通道剪枝、量化、知识蒸馏等。通道剪枝通过减少卷积层的宽度(即输出通道数)来有效计算次数和内存占用,这与其他模型压缩方法相辅相成,因为它产生了原始架构的较薄模型,没有自定义的结构或操作。

然而,由于CNN的表示能力取决于卷积层的宽度,因此很难在不降低性能的情况下减小宽度。理想情况下,如果剪枝通道的参数足够小,剪枝后的模型可以提供与之前相同的性能(即训练后但剪枝前),称为完美剪枝。

由于训练和剪枝都可能降低性能,因此从两个方面评估基于训练的剪枝方法。

  • 抗损性。训练阶段倾向于降低准确性(称为训练引起的损害),因为它引入了一些期望的属性,如结构化稀疏性,这可能是有害的,因为优化目标发生了改变,参数偏离了最优解。如果模型在训练期间性能保持高水平,则说它具有高抗损性。
  • 可剪性。当训练后将模型剪枝成一个较小的模型时,获得的属性(例如,许多通道接近零)将减少剪枝引起的损害。如果模型承受高剪枝比例且性能下降较小,则说它具有高可剪性。

在本文中,提出了ResRep来解决上述问题,这受到了神经生物学对记忆和遗忘的研究的启发。

  • 记忆需要大脑加强某些突触但减弱其他突触,这类似于CNN的训练,使一些参数变大而另一些变小。
  • 通过萎缩或丢失突触来消除突触是一种经典的遗忘机制,作为生物神经网络中提高能量和空间效率的关键过程,类似于剪枝。
    神经生物学研究表明,记忆和遗忘分别由Rutabaga腺苷酸环化酶介导的记忆形成机制和Rac调节的突触萎缩机制独立控制,这表明通过两个解耦模块学习和剪枝更为合理。

受到这种独立性的启发,本文提出将“记忆”和“遗忘”解耦,传统范式中这两者是耦合在一起的,因为卷积参数同时参与了“记忆”(目标函数)和“遗忘”(惩罚损失)以达到折衷的目的。
传统方法强制每个通道“遗忘”,并删除了“遗忘最多”的通道。相比之下,本文的方法首先将原始模型重新参数化为“记忆部分”和“遗忘部分”,然后在前者上应用“记忆学习”(即使用原始目标的常规SGD)以保持“记忆”(原始性能),在后者上应用“遗忘学习”以“消除突触”(将通道置零)。

ResRep包括两个关键组成部分:

  • 卷积重新参数化(Rep,解耦的方法和相应的等效转换);
  • 梯度重置(Res,用于“遗忘”的更新规则)。

具体而言,在希望剪枝的原始卷积层后插入一个压缩器,它是一个 1 × 1 1\times 1 1×1卷积。在训练过程中,仅对压缩器添加惩罚梯度,选择一些压缩器通道并将它们从目标函数推导出的梯度置零。这样的训练过程使得一些压缩器通道的梯度非常接近于零,并且在没有剪枝引起的损害的情况下被移除。
然后,通过一些线性变换,将压缩器连同前面的卷积等效转换为具有较少通道的单个卷积。这种方法很容易推广到原始卷积后跟批量归一化(BN)的常见情况。在这种情况下,在BN后附加压缩器,并通过首先等效融合卷积-BN为带偏置的卷积(Eq. 4)来在训练后转换卷积-BN-压缩器序列。最终,结果模型具有与原始模型相同的架构(即没有压缩器),但是层次更窄。

Algorithm 1: Pipeline of ResRep channel pruning

输入:训练好的模型 W \mathcal{W} W
使用压缩器构建重参数化的模型 W ^ \hat{\mathcal{W}} W^
用单位矩阵初始化压缩器,其他部分使用 W \mathcal{W} W的原参数。
for i=0 to 最大迭代次数:

W ^ \hat{\mathcal{W}} W^前向传播一个小批量,使用原来的目标函数计算损失,求出梯度。
只对压缩器的梯度应用梯度重置。
使用压缩器重置后的梯度和其它参数的原始梯度更新 W ^ \hat{\mathcal{W}} W^
end for
删除 W ^ \hat{\mathcal{W}} W^中接近于零的压缩器行(如范数小于等于 1 0 − 5 10^{-5} 105)。将 W ^ \hat{\mathcal{W}} W^的参数等效地转换到 W ′ \mathcal{W}' W中。此时 W ′ \mathcal{W}' W W \mathcal{W} W具有相同的结构,但是具有更窄的层。
输出:剪枝后的模型 W ′ \mathcal{W}' W

总结ResRep的特点:

  • 高抗损性。为了维持性能,ResRep不改变原始模型(即卷积-BN部分)的损失函数、更新规则或任何训练超参数。
  • 高可剪性。压缩器受惩罚梯度驱动,使得许多通道的值足够小,实现了完美的剪枝,即使惩罚强度较轻。
  • 针对所需的FLOP全局减少比例,ResRep自动找到每层的最终宽度,无需先验知识,使其成为CNN结构优化的强大工具。
  • 端到端训练和易于实现。

总结本文贡献:

  • 受神经生物学研究启发,提出了将“记忆”和“遗忘”解耦以进行剪枝。
  • 提出了两种技术,Rep和Res,以实现高抗损性和高可剪性。它们可以分开使用,而组合使用效果最佳。
  • 在常见的基准模型上取得了最先进的结果,包括在ImageNet上对ResNet50进行了真正的无损剪枝,剪枝比例为54.5%。

3 ResRep for Lossless Channel Pruning

3.1 Formulation and Background

首先介绍卷积和通道剪枝的公式。

D D D C C C为输出和输入的通道数, K K K为卷积核的大小, K ∈ R D × C × K × K \mathbf{K}\in\mathbb{R}^{D\times C\times K\times K} KRD×C×K×K是卷积核的参数tensor, b ∈ R D \mathbf{b}\in\mathbb{R}^D bRD为可选的偏差, I ∈ R N × C × H × W \mathbf{I}\in\mathbb{R}^{N\times C\times H\times W} IRN×C×H×W O ∈ R N × D × H ′ × W \mathbf{O}\in\mathbb{R}^{N\times D\times H'\times W} ORN×D×H×W是输入和输出, ⊛ \circledast 是卷积操作, B B B是广播函数,将 b \mathbf{b} b广播城 N × D × H ′ × W ′ N\times D\times H'\times W' N×D×H×W的尺寸。有:
O = I ⊛ K + B ( b ) (1) \mathbf{O}=\mathbf{I}\circledast\mathbf{K}+B(\mathbf{b})\tag{1} O=IK+B(b)(1)
对于一个不含偏差项但是后面跟着一个bn层(均值为 μ \mu μ,标准差为 σ \sigma σ,比例因子为 γ \gamma γ,偏差为 β ∈ R D \beta\in \mathbb{R}^D βRD)的卷积层,有:
O : , j , : , : = ( ( I ⊛ K : , j , : , : ) − μ j ) γ j σ j + β j , ∀ 1 ≤ j ≤ D (2) \mathbf{O}_{:,j,:,:}=((\mathbf{I}\circledast\mathbf{K}_{:,j,:,:})-\mu_j)\frac{\gamma_j}{\sigma_j}+\beta_j,\ \forall 1\leq j\leq D\tag{2} O:,j,:,:=((IK:,j,:,:)μj)σjγj+βj, ∀1jD(2)
i i i为卷积层的编号,为了剪枝卷积层 i i i,根据某种规则获得了被剪掉的通道集合 P ( i ) ⊂ { 1 , 2 , ⋯ , D } \mathcal{P}^{(i)}\subset\{1,2,\cdots,D\} P(i){1,2,,D},留下其补集 S ( i ) = { 1 , 2 , ⋯ , D } \ P ( i ) \mathcal{S}^{(i)}=\{1,2,\cdots,D\}\backslash\mathcal{P}^{(i)} S(i)={1,2,,D}\P(i)。剪枝操作留下了第 i i i个卷积层的 S ( i ) \mathcal{S}^{(i)} S(i)的输出通道和后续层(第 i + 1 i+1 i+1个卷积层)的相应输入通道,然后丢弃其他的。偏差或后续BN中的相应输入通道也被丢弃。
获得的新卷积核为:
K ( i ) ′ = K S ( i ) , : , : , : ( i ) , K ( i + 1 ) ′ = K : , S ( i ) , : , : ( i + 1 ) (3) {\mathbf{K}^{(i)}}'=\mathbf{K}_{\mathcal{S^{(i)},:,:,:}}^{(i)},\ {\mathbf{K}^{(i+1)}}'=\mathbf{K}_{:,\mathcal{S}^{(i)},:,:}^{(i+1)}\tag{3} K(i)=KS(i),:,:,:(i), K(i+1)=K:,S(i),:,:(i+1)(3)

3.2 Convolutional Re-parameterization

对于每一个需要修剪的带有BN层(如果有的话)的卷积层(这个卷积层被称为目标层),附加一个 1 × 1 1\times 1 1×1卷积的压缩器,卷积核 Q ∈ R D × D \mathbf{Q}\in\mathbb{R}^{D\times D} QRD×D。给一个训练好的模型 W \mathcal{W} W,构建一个重参数化的模型 W ′ \mathcal{W}' W,方法是通过 W \mathcal{W} W的原始参数初始化卷积层和bn层, Q \mathbf{Q} Q用单位矩阵初始化,以便重新参数化的模型产生与原始模型相同的输出。
如果目标层没有后续的BN,那么BN可以被看做偏差。
梯度重置(3.3)训练后,修剪压缩器产生的接近于0的通道并将模型转换为 W ′ \mathcal{W}' W,其具有与 W \mathcal{W} W相同的结构,但是具有更窄的层。
具体来说,对于具有卷积核 Q \mathbf{Q} Q的特定压缩器,修剪范数小于阈值 ϵ \epsilon ϵ的通道。
形式上,获得要被剪枝的通道集合 P = { j ∣ ∣ ∣ Q j , : ∣ ∣ 2 < ϵ } \mathcal{P}=\{j|\ ||\mathbf{Q}_{j,:}||_2<\epsilon\} P={j ∣∣Qj,:2<ϵ}或者保留通道集合 S = { j ∣ ∣ ∣ Q j , : ∣ ∣ 2 ≥ ϵ } \mathcal{S}=\{j|\ ||\mathbf{Q}_{j,:}||_2\geq\epsilon\} S={j ∣∣Qj,:2ϵ}。与Eq.3相似,通过 Q ′ = Q S , : \mathbf{Q}'=\mathbf{Q}_{\mathcal{S},:} Q=QS,:来剪枝 Q \mathbf{Q} Q。实验中设置 ϵ = 1 0 − 5 \epsilon=10^{-5} ϵ=105,这个阈值足够剪枝获得不错的效果了。剪枝后,压缩器的行数会小于列数,如 Q ′ ∈ R D ′ × D , D ′ = ∣ S ∣ \mathbf{Q}'\in \mathbb{R}^{D'\times D},\ D'=|\mathcal{S}| QRD×D, D=S
为了将 W ^ \hat{\mathcal{W}} W^转变为 W ′ \mathcal{W}' W,将每个卷积层-bn层-压缩器序列转换为具有 K ′ ∈ R D ′ × C × K × K \mathbf{K}'\in\mathbb{R}^{D'\times C\times K\times K} KRD×C×K×K和偏差 b ′ ∈ R D ′ \mathbf{b}'\in\mathbb{R}^{D'} bRD
首先,等效地将卷积层-bn层融合到用于推理的卷积层中,这个卷积层会产生和原始相同的输出。对于一个具有 K , μ , σ , γ , β \mathbf{K},\mu,\sigma,\gamma,\beta K,μ,σ,γ,β的卷积层-bn层,用如下的方法构建一个具有 K ˉ \bar{\mathbf{K}} Kˉ卷积核、 b ˉ \bar{\mathbf{b}} bˉ偏差的卷积核。对于 1 ≤ j ≤ D 1\leq j\leq D 1jD,有:
K ˉ j , : , : , : = γ j σ j K j , : , : , : , b ˉ j = − μ j γ j σ j + β j (4) \bar{\mathbf{K}}_{j,:,:,:}=\frac{\gamma_j}{\sigma_j}\mathbf{K}_{j,:,:,:},\ \bar{\mathbf{b}}_j=-\frac{\mu_j\gamma_j}{\sigma_j}+\beta_j\tag{4} Kˉj,:,:,:=σjγjKj,:,:,:, bˉj=σjμjγj+βj(4)
找出一种方法构建 K ′ \mathbf{K}' K b ′ \mathbf{b}' b,使得:
( I ⊛ K ˉ + B ( b ˉ ) ) ⊛ Q ′ = I ⊛ K ′ + B ( b ′ ) (6) (\mathbf{I}\circledast\bar{\mathbf{K}}+B(\bar{\mathbf{b}}))\circledast\mathbf{Q}'=\mathbf{I}\circledast\mathbf{K}'+B(\mathbf{b}')\tag{6} (IKˉ+B(bˉ))Q=IK+B(b)(6)
通过卷积的可加性,得到:
I ⊛ K ˉ ⊛ Q ′ + B ( b ˉ ) ⊛ Q ′ = I ⊛ K ′ ˉ + B ( b ′ ) \mathbf{I}\circledast\bar{\mathbf{K}}\circledast\mathbf{Q}'+B(\bar{\mathbf{b}})\circledast{\mathbf{Q}}'=I\circledast\bar{\mathbf{K}'}+B(\mathbf{b}') IKˉQ+B(bˉ)Q=IKˉ+B(b)
由于 B ( b ˉ ) B(\bar{\mathbf{b}}) B(bˉ)的每个通道都是常值矩阵,因此 B ( b ˉ ⊛ Q ′ ) B(\bar{\mathbf{b}}\circledast\mathbf{Q}') B(bˉQ)也应当是常值矩阵。由于 I ⊛ K ˉ \mathbf{I}\circledast\bar{\mathbf{K}} IKˉ上使用 Q ′ \mathbf{Q}' Q进行的 1 × 1 1\times 1 1×1卷积只是通道级别的重组,因此可以通过重组 K ˉ \bar{\mathbf{K}} Kˉ的通道的方式将 Q ′ \mathbf{Q}' Q合并到 K ˉ \bar{\mathbf{K}} Kˉ中。设转置函数为 T ( K ˉ ) T(\bar{\mathbf{K}}) T(Kˉ),如 T ( K ˉ ) T(\bar{\mathbf{K}}) T(Kˉ)的尺寸是 C × D × K × K C\times D\times K\times K C×D×K×K,于是构造 K ′ \mathbf{K}' K b ′ \mathbf{b}' b的公式可以写为:
K ′ = T ( T ( K ˉ ⊛ Q ′ ) ) (8) \mathbf{K}'=T(T(\bar{\mathbf{K}}\circledast\mathbf{Q}'))\tag{8} K=T(T(KˉQ))(8)
b j ′ = b ˉ ⋅ Q j , : ′ , ∀ 1 ≤ j ≤ D ′ (9) \mathbf{b}'_j=\bar{\mathbf{b}}\cdot\mathbf{Q}'_{j,:}, \ \forall1\leq j\leq D'\tag{9} bj=bˉQj,:, ∀1jD(9)
在实践中,转换并保存训练好的重新参数化模型的权重,构建一个具有原始架构但层数更窄且没有BN的模型,并使用保存的权重进行测试和部署。

3.3 Gradient Resetting

本节描述了如何在保持准确性的同时在压缩器中产生结构化稀疏性,首先讨论特定内核 K \mathbf{K} K上惩罚的传统用法,以使某些通道的大小更小,即 ∣ ∣ K P , : , : , : ∣ ∣ → 0 ||\mathbf{K}_{\mathcal{P},:,:,:}||\rightarrow0 ∣∣KP,:,:,:∣∣0。令 Θ \Theta Θ为通用参数集, X , Y X,Y X,Y是数据示例和标签, L perf ( X , Y , Θ ) L_\text{perf}(X,Y,\Theta) Lperf(X,Y,Θ)是与性能相关的目标函数(如:用于分类的交叉熵)。传统范式通过预定义的强度因子 λ \lambda λ来添加惩罚项 P ( K ) P(\mathbf{K}) P(K)
L total ( X , Y , Θ ) = L perf ( X , Y , Θ ) + λ P ( K ) (10) L_\text{total}(X,Y,\Theta)=L_\text{perf}(X,Y,\Theta)+\lambda P(\mathbf{K})\tag{10} Ltotal(X,Y,Θ)=Lperf(X,Y,Θ)+λP(K)(10)其中 P P P可以是 L 1 L1 L1 L 2 L2 L2,或group Lasso。尤其是group Lasso可以有效地产生通道方式的结构化稀疏性。下面的讨论中用 F ( j ) = K j , : , : , : \mathbf{F}^{(j)}=\mathbf{K}_{j,:,:,:} F(j)=Kj,:,:,:来表示 K \mathbf{K} K中的特定通道。于是group Lasso损失可以表述为:
P Lasso ( K ) = ∑ j = 1 D ∣ ∣ F ( j ) ∣ ∣ E (11) P_\text{Lasso}(\mathbf{K})=\sum_{j=1}^D ||\mathbf{F}^{(j)}||_E\tag{11} PLasso(K)=j=1D∣∣F(j)E(11)
其中 ∣ ∣ F ( j ) ∣ ∣ E ||\mathbf{F}^{(j)}||_E ∣∣F(j)E是欧几里得范数
∣ ∣ F ∣ ∣ E = ∑ c = 1 C ∑ p = 1 K ∑ q = 1 K F c , p , q 2 (12) ||\mathbf{F}||_E=\sqrt{\sum_{c=1}^C\sum_{p=1}^K\sum_{q=1}^K\mathbf{F}_{c,p,q}^2}\tag{12} ∣∣FE=c=1Cp=1Kq=1KFc,p,q2 (12)
G ( F ) G(\mathbf{F}) G(F)作为梯度,对其进行求导
G ( F ) = ∂ L total ( X , Y , Θ ) ∂ F = ∂ L perf ( X , Y , Θ ) ∂ F + λ F ∣ ∣ F ∣ ∣ E (13) G(\mathbf{F})=\frac{\partial L_\text{total}(X,Y,\Theta)}{\partial\mathbf{F}}=\frac{\partial L_\text{perf}(X,Y,\Theta)}{\partial\mathbf{F}}+\lambda\frac{\mathbf{F}}{||\mathbf{F}||_E}\tag{13} G(F)=FLtotal(X,Y,Θ)=FLperf(X,Y,Θ)+λ∣∣FEF(13)
特定通道 F \mathbf{F} F的训练动态非常直接。从一个训练良好的模型开始, F \mathbf{F} F位于局部最优解附近,因此Eq.13的第一项接近于0,但第二项不接近0,因此 F \mathbf{F} F被推向0。如果 F \mathbf{F} F对性能很重要,目标函数将试图保持其幅度,即第一个梯度项将与第二个梯度项相竞争,因此 F \mathbf{F} F最终会比原来更小,这取决于 λ λ λ。否则,以极端情况为例,如果 F \mathbf{F} F根本不影响 L perf L_\text{perf} Lperf,第一项将为0,因此 F \mathbf{F} F将通过第二项持续向0增长。换句话说,性能相关的损失和惩罚损失相互竞争,使得 F \mathbf{F} F的最终值将反映其重要性,为了方便起见,称之为基于能力的重要性评估。

然而这面临了两个问题:
问题A:惩罚将每个通道的参数偏离了目标函数的最优解。值得注意的是,轻微的偏差可能不会带来负面影响,例如, L 2 L2 L2正则化也可以被视为轻微的偏差。然而,如果惩罚过于强大,尽管一些通道被置零以进行剪枝,但剩余的通道也变得太小,无法保持表征能力,这是一个不希望出现的副作用。
问题B:通过轻微的惩罚实现高抗损性,我们无法实现高可剪性,因为大多数通道仅仅变得比原来更接近于0,但不足以实现完美的剪枝。

提出通过对由目标函数导出的梯度进行重置,以实现对轻微惩罚的高可剪性。
引入二进制掩码 m ∈ { 0 , 1 } m\in\{0,1\} m{0,1},表示是否希望将 F \mathbf{F} F归零。为了便于实现, 没有向目标函数添加任何项(即 L total = L perf L_\text{total}=L_\text{perf} Ltotal=Lperf),只和往常一样求梯度,然后手动应用掩码,添加惩罚梯度并用所得梯度进行SGD更新:
G ( F ) ← ∂ L perf ( X , Y , Θ ) ∂ F m + λ F ∣ ∣ F ∣ ∣ E (14) G(\mathbf{F})\leftarrow\frac{\partial L_\text{perf}(X,Y,\Theta)}{\partial\mathbf{F}}m+\lambda\frac{\mathbf{F}}{||\mathbf{F}||_E}\tag{14} G(F)FLperf(X,Y,Θ)m+λ∣∣FEF(14)
下一节描述如何决定将哪些通道置零(即为多个通道设置掩码值)。通过这种方式,已经解决了上述两个问题。A) 尽管我们对每个通道的目标相关梯度添加了Lasso梯度,这等价于通过向原始损失添加Lasso损失来偏离最优解,但偏差是轻微的(在实验中 λ = 1 0 − 4 λ = 10^{-4} λ=104),因此对性能没有害处。B) 当 m = 0 m=0 m=0时,第一项不再存在与第二项竞争,因此即使λ很小, F \mathbf{F} F也会稳步向0移动。

3.4 The Remembering Parts Remember Always, the Forgetting Parts Forget Progressively

记住的部分永远记住,忘记的部分逐渐忘记。

如果直接应用于卷积核,Res会带来一个问题:一些与目标相关的梯度编码了保持性能所需的监督信息,但被丢弃了。直觉上,参数被强制“遗忘”了一些有用的信息(梯度)。幸运的是,Rep正是解决这个问题的方法,它允许只剪枝压缩器,而不是原始的卷积层。ResRep只强迫压缩器“遗忘”,而所有其他层仍然专注于“记忆”,因此不会失去编码在原始卷积核梯度中的信息。

要将Res与Rep结合起来,需要决定哪些 Q \mathbf{Q} Q的通道将被置零。在训练重新参数化的模型时,只对压缩器添加Lasso梯度。
几个epochs后, ∣ ∣ Q j , : ∣ ∣ ||\mathbf{Q}_{j,:}|| ∣∣Qj,:∣∣会反应通道 j j j的重要性(3.3中的基于能力的重要性评估),因此根据 Q \mathbf{Q} Q的值执行通道选择。
n n n为压缩器的数量, m ( i ) m^{(i)} m(i)(一个 D ( i ) D^{(i)} D(i)维的二进制向量)是第 i i i个压缩器的掩码,定义 t ( i ) ∈ R D ( i ) t^{(i)}\in\mathbb{R}^{D^{(i)}} t(i)RD(i)是度量向量,有
t j ( i ) = ∣ ∣ Q j , : ( i ) ∣ ∣ 2 , ∀ 1 ≤ j ≤ D ( i ) (15) t_j^{(i)}=||\mathbf{Q}^{(i)}_{j,:}||_2,\ \forall1\leq j\leq D^{(i)}\tag{15} tj(i)=∣∣Qj,:(i)2, ∀1jD(i)(15)
每次通道选择,对每个压缩器的每个通道,计算其度量值,并将其组织为映射 M = { ( i , j ) → t j ( i ) ∣ ∀ 1 ≤ i ≤ n , 1 ≤ j ≤ D ( i ) } \mathcal{M}=\{(i,j)\rightarrow t_j^{(i)}|\forall1\leq i\leq n,1\leq j\leq D^{(i)}\} M={(i,j)tj(i)∣∀1in,1jD(i)}。然后对 M \mathcal{M} M的值进行升序排序,依次选择最小的,将其对应 m j ( i ) m_j^{(i)} mj(i)设为0。当减少的FLOPS达到目标,或已经选择了 θ \theta θ(选择上限)个通道时,停止选择。
未选择的通道的掩码值设置为1。动机很简单:根据基于能力的重要性评估的讨论,就像传统的惩罚损失用于与原始损失竞争并选择具有较小范数的通道一样,使用惩罚梯度来与原始梯度竞争。 更好的是,所有指标值在开始时都是1(因为每个压缩器核都初始化为单位矩阵),这使得在不同层之间进行比较更加公平。将 θ \theta θ初始化为一个小数,每隔几次迭代增加 θ \theta θ,并逐渐重新选择通道以逐渐“遗忘”,避免一次性将太多通道置零。那些掩码为0的通道将变得非常接近0,因此压缩器中出现了结构化稀疏性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/812065.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[BT]BUUCTF刷题第16天(4.12)

第16天 Web [MRCTF2020]Ezpop 打开网站就是一段泄露的源代码&#xff1a; <?php //flag is in flag.php //WTF IS THIS? //Learn From https://ctf.ieki.xyz/library/php.html#%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E9%AD%94%E6%9C%AF%E6%96%B9%E6%B3%95 //And Crack…

「49」一拆为九,探索直播内容的商业价值

「49」拆分变现:一拆为九探索直播内容的商业价值 直播已经成为现代社交互动的热门方式,然而,直播内容一经结束,是否可以为我们带来更多的价值? 这篇文章将探究如何发挥创意,将直播内容变现为多种形式,例如电子书、实体书、课程和短视频、文章、音频等,让我们一起来一…

数字化转型(二)-华为发布的数字化转型:从战略到执行

个人认为这是一篇很好&#xff0c;值得看的文章&#xff0c;但是没啥大用&#xff0c;可供参考。 数字化转型是一个复杂而全面的过程&#xff0c;它涉及到从战略规划到具体执行的多个层面。根据提供的信息&#xff0c;我们可以从以下几个方面来理解和探讨数字化转型的从战略到执…

文件名乱码危机:数据恢复全攻略

在数字化时代的浪潮中&#xff0c;电脑文件成为我们日常生活和工作中不可或缺的一部分。然而&#xff0c;有时我们会突然遭遇一个令人头疼的问题&#xff1a;原本清晰易读的文件名突然变成了乱码。这些乱码文件名不仅让我们无法准确识别文件内容&#xff0c;更可能意味着数据丢…

时间序列分析 # 平稳性检验和ARMA模型的识别与定阶 #R语言

掌握单位根检验的原理并能解读结果&#xff1b;掌握利用序列的自相关图和偏自相关图识别模型并进行初步定阶。 原始数据在文末&#xff01;&#xff01;&#xff01; 练习1、根据某1971年9月-1993年6月澳大利亚季度常住人口变动&#xff08;单位&#xff1a;千人&#xff09;的…

一个开源跨平台嵌入式USB设备协议:TinyUSB

概述 TinyUSB 是一个用于嵌入式系统的开源跨平台 USB 主机/设备堆栈&#xff0c;设计为内存安全&#xff0c;无需动态分配&#xff0c;线程安全&#xff0c;所有中断事件都被推迟&#xff0c;然后在非 ISR 任务函数中处理。查看在线文档以获取更多详细信息。 源码链接&#xff…

Redis从入门到精通(十五)Redis分布式缓存(三)Redis分片集群的搭建和原理分析

文章目录 前言5.4 分片集群5.4.1 搭建分片集群5.4.2 散列插槽5.4.3 集群伸缩5.4.3.1 需求分析5.4.3.2 创建新的Redis实例5.4.3.3 添加新节点到Redis集群5.4.3.4 转移插槽 5.4.4 故障转移5.4.4.1 自动故障转移5.4.4.2 手动故障转移 5.4.5 RedisTemplate 5.5 小结 前言 Redis分布…

kali工具----枚举工具

一、枚举工具 枚举是一类程序&#xff0c;它允许用户从一个网络中收集某一类的所有相关信息。本节将介绍DNS枚举和SNMP枚举技术。DNS枚举可以收集本地所有DNS服务和相关条目。DNS枚举可以帮助用户收集目标组织的关键信息&#xff0c;如用户名、计算机名和IP地址等&#xff0c;…

【Qt】界面优化

目录 一、QSS 1.1 基本语法 1.2 QSS设置方法 1.2.1 指定控件样式设置 1.2.2 全局样式设置 1.2.3 从文件加载样式表 1.2.4 使用Qt Designer编辑样式 1.3 选择器 1.3.1 介绍 1.3.2 子控件选择器 1.3.3 伪类选择器 1.4 样式属性(盒模型) 1.5 代码示例(登录界面) 二、…

OSCP靶场--Banzai

OSCP靶场–Banzai 考点(ftp爆破 webshell上传web1访问403web2可以访问webshell反弹mysql udf提权) 1.nmap扫描 ## nmap扫描一定要使用 -p- 否则容易扫不全端口 ┌──(root㉿kali)-[~/Desktop] └─# nmap -sV -sC 192.168.158.56 -Pn -p- --min-rate 2500Starting Nmap 7.…

机器学习前导——PyCharm PyTorch Python3 机器学习

机器学习前导——PyCharm & pytorch & Python3 & 机器学习 文章目录 前言PyCharmPyTorchPython3机器学习联系 前言 这学期选了《机器学习》&#xff0c;第一次接触&#xff0c;对一些专有名词很陌生。 PyCharm PyCharm是一款由JetBrains开发的软件&#xff0c…

STM32 串口接收定长,不定长数据

本文为大家介绍如何使用 串口 接收定长 和 不定长 的数据。 文章目录 前言一、串口接收定长数据1. 函数介绍2.代码实现 二、串口接收不定长数据1.函数介绍2. 代码实现 三&#xff0c;两者回调函数的区别比较四&#xff0c;空闲中断的介绍总结 前言 一、串口接收定长数据 1. 函…

SpringBoot3 + Vue3 + Uniapp + uView + Elenment 实现动态二级分类以及二级分类的管理

SpringBoot3 Vue3 Uniapp uView Elenment 实现动态二级分类以及二级分类的管理 1. 效果展示1.1 前端显示效果1.2 后台管理一级分类1.3 后台管理二级分类 2. 后端代码2.1 GoodsCategoryController.java2.2.1 GoodsCategoryMapper.java2.2.2 GoodsCategorySonMapper.java2.3.…

Zookeeper的集群搭建和ZAB协议详解

Zookeeper的集群搭建 1&#xff09;zk集群中的角色 Zookeeper集群中的节点有三个角色&#xff1a; Leader&#xff1a;处理集群的所有事务请求&#xff0c;集群中只有一个LeaderFollwoer&#xff1a;只能处理读请求&#xff0c;参与Leader选举Observer&#xff1a;只能处理读…

数仓维度建模

维度建模 数仓建模方法1. 范式建模法&#xff08;Third Normal Form&#xff0c;3NF&#xff09;2. 维度建模法&#xff08;Dimensional Modeling&#xff09;3. 实体建模法&#xff08;Entity Modeling&#xff09; 维度建模1. 事实表事实表种类事务事实表周期快照事实表累计快…

强大的数据分析计算软件:Stata 15 for Mac 激活版

Stata 15 for Mac是一款高级统计分析软件&#xff0c;具有强大的数据管理和数据提取工具。以下是其功能和特点的详细介绍&#xff1a; 软件下载&#xff1a;Stata 15 for Mac 激活版版下载 数据管理&#xff1a;Stata 15 for Mac支持多种数据库、数据格式和计算机语言&#xff…

salesforce apex判断用户的登录网址

在Salesforce Apex中判断用户的登录网址可以通过使用User和LoginHistory对象来实现。以下是一种可能的方法&#xff1a; // 导入必要的命名空间 // 注意&#xff1a;需要为该类启用“Use With Sharing”或者使用无法设置为“Use With Sharing”的类 // 以便访问LoginHistory对…

如何在淘~宝接单和解决别人问题-java开发

如下这是一个连接&#xff1a;https://s.tb.cn/c.0vDtL3https://s.tb.cn/c.0vDtL3 解决各种问题。可付费咨询

【JAVA基础篇教学】第四篇:Java条件语句

博主打算从0-1讲解下java基础教学&#xff0c;今天教学第四篇&#xff1a; Java条件语句。 在Java中&#xff0c;条件语句用于根据不同的条件执行不同的代码块。Java提供了if、else if和else等关键字来实现条件判断。 一、if语句 if语句用于执行一个代码块&#xff0c;如果给…

TripoSR: Fast 3D Object Reconstruction from a Single Image 论文阅读

1 Abstract TripoSR的核心是一个基于变换器的架构&#xff0c;专为单图像3D重建设计。它接受单张RGB图像作为输入&#xff0c;并输出图像中物体的3D表示。TripoSR的核心包括&#xff1a;图像编码器、图像到三平面解码器和基于三平面的神经辐射场&#xff08;NeRF&#xff09;。…