2024年7月

监督对比损失(
SCL
)在视觉表征学习中很流行。但在长尾识别场景中,由于每类样本数量不平衡,对两类正样本进行同等对待会导致类内距离的优化出现偏差。此外,
SCL
忽略了负样本之间的相似关系的语义线索。为了提高长尾识别的性能,论文通过解耦训练目标来解决
SCL
的这两个问题,将
SCL
中的原正样本和增强正样本解耦并针对不同目标来优化他们的关系,从而减轻数据集不平衡的影响。论文进一步提出了一种基于块的自蒸馏方法,将知识从头类转移到尾类,以缓解尾类表征不足的问题。该方法挖掘不同实例之间共享的视觉模式,并利用自蒸馏过程来传输此类知识

来源:晓飞的算法工程笔记 公众号

论文: Decoupled Contrastive Learning for Long-Tailed Recognition

Introduction


在实际应用中,训练样本通常呈现长尾分布,其中少数头类贡献了大部分观察结果,而许多尾类仅与少数样本相关。长尾分布给视觉识别带来了两个挑战:

  • 为平衡数据集设计的损失函数很容易偏向头部类别。
  • 每个尾部类别包含的样本太少,无法表示视觉差异,导致尾部类别的代表性不足。

通过优化类内和类间距离,监督对比损失(
SCL
)在平衡数据集上取得了很不错的性能。给定锚定图像,
SCL
将两种正样本聚在一起,即(a)由数据增强生成的锚定图像的不同视图,以及(b)来自同一类的其他图像。这两种类型的正样本监督模型学习不同的表征:(a)来自相同类别的图像强制学习语义线索,而(b)通过外观差异增强的样本主要导致低级外观线索的学习。

如图 1(a)所示,
SCL
有效地学习了头类的语义特征,例如,学习到的语义“蜜蜂”对于杂乱的背景具有鲁棒性。而如图 1 (b) 所示,
SCL
学习的尾部类别表征对于形状、纹理和颜色等低级外观线索更具辨别力。

通过对
SCL
的梯度进行分析后,论文提出了解耦监督对比损失(
DSCL
)来处理这个问题。具体来说,
DSCL
解耦了两种正样本,重新制定了类内距离的优化策略,缓解了两种正样本的梯度不平衡。如在图 1(b)所示,
DSCL
学习到的特征对语义线索具有区分性,并且大大提高了尾部类别的检索性能。

为了进一步缓解长尾分布的挑战,论文提出了基于图像块的自蒸馏(
PBSD
),利用头类来促进尾类中的表征学习。
PBSD
采用自蒸馏策略,通过挖掘不同类之间的共享视觉模式并将知识从头类迁移到尾类,更好地优化类间距离。论文引入块特征来表示目标的视觉模式,计算块特征和实例级特征之间的相似度以挖掘共享视觉模式。如果实例与基于块特征共享视觉模式,则它们将具有很高的相似性,然后利用自蒸馏损失来维持样本之间的相似关系,并将知识融入到训练中。

Analysis of SCL


后面的分析有点长,总结起来,论文发现了
SCL
的三个问题:

  • 过于关注头类的训练。
  • 原样本和增强样本之间的梯度存在差异。
  • 负样本可以更好地处理。

给定训练数据集
\(D=\lbrace x_{i},y_{i}\rbrace_{i=1}^{n}.\)
,其中
\(x_{i}\)
表示图像,
\(y_{i}\ \in\ \left\{1,\cdot\cdot\cdot,\ K\right\}\)
是其类标签。假设
\({n}^k\)
表示
\({\mathcal{D}}\)

\(k\)
类的数量,并且类的索引按数量降序排序,即如果
\(a < b\)
,则
\(n^{a}\geq n^{b}\)
。在长尾识别中,训练数据集是不平衡的,即
\(n^1\gg n^{K}\)
,不平衡比的计算为
\(n^{1}/n^{K}\)

对于图像分类任务,算法旨在学习特征提取主干
\(\mathrm{v}_{i} = \mathrm{f}_\theta(\mathrm{x}_i)\)
和线性分类器,先将图像
\(\mathrm{x}_{i}\)
映射为全局特征图
\(\mathrm{u}_{i}\)
并使用全局池化来获取
\(d\)
维特征向量,随后将特征向量分为
\(k\)
维分类分数。通常来说,测试数据集是平衡的。

特征提取主干一般采用监督对比学习(
SCL
)来训练。给定锚定图像
\(\mathrm{x}_{i}\)
,定义
\(\mathrm{z}_{i}=\mathrm{g}_{\gamma}({v}_{i})\)
为用主干和额外投影头
\(\mathrm{g}_{\gamma}\)
提取的归一化特征,
\(\mathrm{z}^{+}_{i}\)
为正样本
\(\mathrm{x}_{i}\)
通过数据增强生成的图片的归一化特征。定义
\(M\)
为可通过内存队列获取的一组样本特征,
\(P_{i}=\{\mathrm{z}_t\in M:y_t=y_i\}\)
为从
\(M\)
中抽取的
\(\mathrm{x}_{i}\)
的正样本特征集。

SCL
通过拉近锚定图像与其它正样本来减小类间距离,同时通过将具有不同类别标签的图像推开来扩大类间距离,即

\[
\mathcal{L}_{s c l}=\frac{-1}{|P_{i}|+1}\sum\limits_{\mathrm{z}_{t}\in\{\mathrm{z}_{i}^{+}\cup P_{i}\}}\log p(\mathrm{z}_{t}|\mathrm{z}_{i}),

\quad\quad(1)
\]

其中
\(|P_{i}|\)

\(P_{i}\)
的数量。使用
\(\tau\)
来表示预定义的温度参数,条件概率
\(p(\mathrm{z}_{t}\vert\mathrm{z}_{i})\)
的计算如下:

\[p(\mathrm{z}_{t}\vert\mathrm{z}_{i})={\frac{\exp(\mathrm{z}_{t}\cdot\mathrm{z}_{i}/\tau)}{\sum\limits_{\mathbf{z}_{m}\epsilon(\mathrm{z}_{i}^{+}\cup M)}\exp(\mathrm{z}_{m}\cdot\mathrm{z}_{i}/\tau)}}.

\quad\quad(2)
\]

公式 1 可以表示为分布对齐任务,

\[
\mathcal{L}_{align}={\sum\limits_{\mathrm{z}_t\in\{\mathrm{z}_{i}^{+}\cup M\}}}-\hat{p}({\mathrm{z}_t|\mathrm{z}_i})\log\hat{p}({\mathrm{z}_t|\mathrm{z}_i}).

\quad\quad(3)
\]

其中
\(\hat{p}({\mathrm{z}_t|\mathrm{z}_i})\)
是目标分布的概率。对于增强
\(\mathrm{z}^+_i\)
和原
\(\mathrm{z}_{t}\in P_{i}\)

SCL
将它们同等地视为正样本,并将其目标概率设置为
\(1/(|P_{i}|+1)\)
。对于
\(M\)
中其它具有不同类标签的图像,
SCL
将它们视为负样本,并将其目标概率设置为 0。

对于锚定图像
\(\mathrm{z}_{i}\)
的特征
\(\mathrm{x}_{i}\)

SCL
的梯度为:

\[
\begin{align}
\frac{\partial\mathcal{L}_{scl}}{\partial{{\mathrm{z}_{i}}}} = \frac{1}{\tau} &
\{
\sum\limits_{\mathrm{z}_j\in N_i}p(\mathrm{z}_j|\mathrm{z}_i)+\mathrm{z}_i^{+}(p(\mathrm{z}_i^{+}|\mathrm{z}_i))-\frac{1}{|P_i|+1}) \notag
\\
& +\sum\limits_{\mathrm{z}_t\in P_i}\mathrm{z}_t(p(\mathrm{z}_t|\mathrm{z}_i)-\frac{1}{|P_i|}+1)\} \notag
\end{align}

\quad\quad(4)
\]

其中
\(N_{i}\)

\(\mathrm{x}_{i}\)
的负集,包含从
\(\{\mathrm{z}_{j}\ \in\ M\ : \mathrm{y}_{j}\ \ne\ \mathrm{y}_{i}\}\)
中提取的特征。

SCL
包含两种类型的正样本
\(\mathrm{z}_i^{+}\)

\(z_{t}\in P_{i}\)
,锚定图像对于两种正样本的梯度计算分别为:

\[\begin{align}
& \left.\frac{\partial\mathcal{L}_{scl}}{\partial{\mathrm{z}_{i}}}\right|_{\mathrm{z}_i^{+}}={{\mathrm{z}_{i}}^{+}}(p(\mathrm{z}_{i}^{+}\vert\mathrm{z}_{i})-\frac{1}{{\vert{P_{i}}\vert}+1}), \notag
\\
& \left.\frac{\partial\mathcal{L}_{scl}}{\partial{\mathrm{z}_{i}}}\right|_{\mathrm{z}_i}={{\mathrm{z}_{i}}}(p(\mathrm{z}_{i}\vert\mathrm{z}_{i})-\frac{1}{{\vert{P_{i}}\vert}+1}),\mathrm{z}_t\in P_i. \notag
\end{align}

\quad\quad(5)
\]

训练开始时,两种正样本的梯度
L2
范数之比为,

\[
\frac{\left\Vert\left.\frac{\partial\mathcal{L}_{scl}}{\partial{\mathrm{z}_{i}}}\right|_{\mathrm{z}_i^{+}}\right\Vert_2}{\sum\limits_{\mathrm{z}_t\in P_i}\left\Vert\left.\frac{\partial\mathcal{L}_{scl}}{\partial{\mathrm{z}_{i}}}\right|_{\mathrm{z}_i}\right\Vert_2}
\approx
\frac{1}{P_i}.

\quad\quad(6)
\]


SCL
收敛时,
\(\mathrm{z}_{i}^{+}\)
的最优条件概率为:

\[
p(\mathrm{z}_{i}^{+}|\mathrm{z}_{i})={\frac{1}{|P_{i}|+1}}.

\quad\quad(7)
\]


SCL
中,内存队列
\(M\)
是从训练集中均匀采样的,这导致
\(|P_{i}|\approx{\frac{n^{y_{i}}}{n}}|M|\)
。在平衡数据集中,
\(n^{1}\;\approx\;n^{2}\;\approx\cdots\;\approx\;n^{K}\)
,不同类别的
\(|P_{i}|\)
数量是平衡的。对于具有不平衡
\(|P_{i}|\)
的长尾数据集,
SCL
则会更加关注将头部类的锚点
\({\mathrm{z}}_{i}\)
与从
\(P_{i}\)
得到的特征拉在一起,因为梯度由公式 4 中的第三项主导。

另外,
SCL
还存在两种正样本的梯度的
L2
范数的比例不平衡的问题,如图 2 所示。当
SCL
的训练收敛时,
\({p}({\mathrm{z}_{i}^{+}|\mathrm{z}_{i})}\)
的最优值也受到
\(\left|{{P}}_{i}\right|\)
的影响,如公式 7 所示。此外,如图 1(a) 和 (b) 所示,跨类别学习到的特征也不一致。

等式 4 还表明,
SCL
均匀地推开所有负样本,从而扩大了类间距离。这种策略忽略了不同类别之间有价值的相似性线索。为了寻求更好的方法来优化类内和类间距离,论文提出了解耦监督对比损失(
DSCL
)来解耦两种正样本以防止有偏差的优化,以及基于补丁的自蒸馏(
PBSD
)来利用类之间的相似性线索。

Decoupled Supervised Contrastive Loss

DSCL
的提出是为了确保不同类别的类内距离进行更平衡的优化,将两种正样本解耦并添加不同的权重,使梯度
L2
范数比和
\(p(z_{i}^{+}|z_{i})\)
的最优值不受类别的样本数量影响。

DSCL
可表示为:

\[
\mathcal{L}_{dscl}=\frac{-1}{|P_{i}|+1}\sum\limits_{\mathrm{z}_{i}\in\{\mathrm{z}_{i}^{+}\cup P_{i}\}}\log \frac{\exp w_{t}(\mathrm{z}_{t}\cdot \mathrm{z}_{i}/\tau)}{\sum\limits_{\mathrm{z}_{m}\in \{ \mathrm{z}_{i}^{+}\cup M \}}\exp (\mathrm{z}_{m}\cdot \mathrm{z}_{i}/\tau)},
\quad\quad(8)
\]

\[
w_{t}=\left\{\begin{array}{l l}{{\alpha(|P_{i}|+1),}}&{{\mathrm{z}_{t}=\mathrm{z}_{i}^{+}}}
\\
{{{\frac{(1-\alpha)(|P_{i}|+1)}{|P_{i}|}},}}&{{\mathrm{z}_{t}\in P_{i}}}\end{array}\right.
\quad\quad (9)
\]

其中
\(\alpha\in[0,1]\)
是预定义的超参数。
DSCL

SCL
在平衡环境和不平衡环境的统一范式。如果数据集是平衡的,通过设置
\(\alpha = 1/(|P_{i}|\,+\,{\bf1})\)
可以使得
DSCL

SCL
相同。

训练开始时,两种正样本的梯度
L2
范数比为:

\[
\frac{\left\Vert\left.\frac{\partial\mathcal{L}_{dscl}}{\partial{\mathrm{z}_{i}}}\right|_{\mathrm{z}_i^{+}}\right\Vert_2}{\sum\limits_{\mathrm{z}_t\in P_i}\left\Vert\left.\frac{\partial\mathcal{L}_{dscl}}{\partial{\mathrm{z}_{i}}}\right|_{\mathrm{z}_i}\right\Vert_2}
\approx
\frac{\alpha}{1-\alpha}.
\quad\quad(10)
\]


DSCL
收敛时,
\(\mathrm{z}\)
的最优条件概率为
\(p(\mathrm{z}_{i}^{+}|{\mathrm{z}_i})=\alpha\)

如公式 10 可以看出,两种正样本的梯度比不受
\(|P_{i}|\)
的影响。
DSCL
也保证了
\(p(\mathrm{z}_{i}^{+}|{\mathrm{z}_i})\)
的最优值不受
\(|P_{i}|\)
的影响,从而缓解了头部类和尾部类之间特征学习不一致的问题。

Patch-based Self Distillation

视觉模式可以在不同的类之间共享,例如视觉模式“车轮”在“卡车”、“汽车”和“公共汽车”共享。因此,尾类中的许多视觉特征也可以从共享这些视觉模式的头类中学习,从而降低了尾类表征学习的难度。
SCL
将来自不同类的两个实例在特征空间中推开,不管它们是否共享有意义的视觉模式。如图 4 所示,从黄色边界框中提取查询块特征,并从数据集中检索前 3 个相似样本。由
w/o PBSD
标记的
SCL
检索结果在语义上与查询块无关,表明
SCL
在学习和利用图像块级语义线索方面无效。

受细粒度图像识别中基于图像块的方法的启发,论文引入了基于图像块的特征来编码视觉模式。给定主干提取的图像
\(\mathrm{x}_{i}\)
的全局特征图
\(\mathrm{u}_{i}\)
,首先随机生成块
\(\{B_i[j]\}^L_{j=1}\)
,其中
\(L\)
是块的数量。根据这些块的坐标应用
ROI
池化并将池化特征发送到投影头中,得到归一化的嵌入特征
\(\{c_i[j]\}^L_{j=1}\)

\[
c_i[j]=\mathrm{g}_{\gamma}(\mathrm{ROI}(\mathrm{u}_i,\mathrm{B}_i[j])).
\quad\quad(11)
\]

然后,类似于公式 2 利用条件概率计算实例之间的相似关系:

\[
p(\mathrm{z}_{t}|\mathrm{c}_{i}^{j})=\frac{\exp(\mathrm{z}_{t}\cdot\mathrm{c}_{i}[j]/\tau)}{\sum\limits_{\mathrm{z}_{m}\in \{ \mathrm{z}_{i}^{+}\cup M \}}\mathrm{exp}(\mathrm{z}_{m}\cdot\mathrm{c}_{i}[j]/\tau)}.
\quad\quad(12)
\]

如果
\(\mathrm{z}_{t}\)
对应的图像与基于块的特征共享视觉模式,则
\(\mathrm{z}_{t}\)

\(\mathrm{c}_{i}\left[j\right]\)
将具有很高的相似度。因此,使用公式 12 可对每对实例之间的相似性线索进行编码。

基于上述定义,将相似性线索作为知识来监督训练过程。为了保持这些知识,论文还根据
\(\{B_i[j]\}^L_{j=1}\)
额外从图像中裁剪多个图像块(前面直接从整图的全局特征做
ROI
,这里剪图过网络),并使用主干网络提取其特征嵌入
\(\{s_i[j]\}^L_{j=1}\)

\[{s}_{i}[j]={\mathrm{g}_{\gamma}}(\mathrm{f}_{\theta}(\mathrm{Crop}(\mathrm{x}_{i},B_{i}[j]))).
\quad\quad(13)
\]

PBSD
强制图像块的特征嵌入通过以下损失,产生与基于块的特征相同的相似度分布,

\[{\mathcal{L}}_{p b s d}={\frac{1}{L}}\sum\limits_{j=1}^{L}\sum\limits_{\mathrm{z}_{t}\in\{\mathrm{z}_{i}^{+}\cup M\}}-p(\mathrm{z}_{t}|\mathrm{c}_{i}[j])\log p(\mathrm{z}_{t}|\mathrm{s}_{i}[j]),
\quad\quad(14)
\]

请注意,
\(p(\mathrm{z}_{t}|\mathrm{c}_{i}[j])\)
与计算图分离以阻止梯度。

物体的局部视觉模式可以由不同类共享,因此可以使用基于块的特征来表示视觉模式。
\({p}(\mathrm{z}_{t}|\mathrm{c}_{i}[j])\)
是为了挖掘图像之间共享模式的关系而计算的,通过最小化公式 14 来传递知识给
\({p}(\mathrm{z}_{t}|\mathrm{s}_{i}[j])\)
,缓解尾类表征性不足的问题。图 4 所示的检索结果表明,
PBSD
有效地加强了块级特征和图像块与图像相似性的学习,使得挖掘不同类别的共享视觉模式成为可能。

Multi-crop
技巧通常用于自监督学习中以生成更多锚图像的增强样本,采用低分辨率截图以降低计算复杂性。与
Multi-crop
策略不同,
PBSD
的动机是利用头类和尾类之间的共享模式来帮助尾类的学习,通过
ROI
池化得到基于块的特征来获得共享模式。公式 14 执行自蒸馏以维持共享模式。论文通过用
Multi-crop
技巧代替
PBSD
进行了对比实验,
ImageNet-LT
上的性能从 57.7% 下降到 56.1% ,表明
PBSD

Multi-crop
策略更有效。

Training Pipeline


整体训练逻辑如图 3 所示,为了维护内存队列,使用动量更新模型。训练由两个损失来监督,即解耦监督对比损失和基于块的自蒸馏损失:

\[\mathcal{L}_{o v e r a l l}\,=\,\mathcal{L}_{d s c l}\,+\,\lambda\mathcal{L}_{p b s d},
\quad\quad(15)
\]

论文的方法专注于表征学习,并且可以通过添加对应的损失来在不同的任务中使用。在主干训练之后,丢弃学习的投影头
\(\mathrm{g}_\gamma(\cdot)\)
并使用标准交叉熵损失在预训练的主干之上基于类平衡抽样策略训练线性分类器。

Experiments




如果本文对你有帮助,麻烦点个赞或在看呗~
更多内容请关注 微信公众号【晓飞的算法工程笔记】

work-life balance.

一.事件回放
二.主要问题剖析
三.对博客园团队的忠告

一.事件回放

7 月 15 日,知名的经典博客站点 —— 博客园再次发布了求救信,大概的意思是说现在园子又到了生死攸关的时候,需要开发者开通会员来相救。我用红圈给大家标注了一些重点:

可以看出园子现在真的是很难了。。。不管怎么样,作为在博客园多年的作者,我先开通会员支持了一波,希望园子能挺过去。

但我对博客园的求救感到不可思议。为什么这么说呢?我们先看一波数据:

可以看到,博客园每个月的访问量基本上可以稳定在3200万左右!而且搜索引擎的总收录量
超过 1 个亿
(你自己可以去百度看看数据)

说实在的,你很难想象流量这么大的站点会落魄到找用户开会员求助。。。打个也许不太恰当的比喻,感觉就像是一个地主换一身破烂衣裳,来找农民求粮食的感觉!

这么大的一个流量体量,如果真的商业化运作起来,别说养一个博客园,就算100个应该也不在话下吧???

二.主要问题剖析
个人感觉,博客园最近这些年来,整体的商业模式与运营都存在很大的问题。下面分析一下它的几个主要问题:

问题1:不能通过走“赚程序员的钱”这条路来经营发展
在我看来,
程序员的钱是最难赚的!

我的一位开发好友,曾有句经典名言:
程序员的钱,比马桶的粪还难掏。

刚看到这句话的时候,给我笑的肚子疼,然而转头一想,这确实是一个不争的事实。

这个群体,大多数人都有一种不服输的精神,一种钻死牛角尖的态度。

当看到一个小工具或者一个小功能付费,他们大概率是不会去花这个“冤枉钱”的,会想着法的自己去研究。

所以说,单单靠几个“有良心”的程序员去支撑园子的发展,这个模式大概率行不通啊!!!?

问题2:经营管理模式有问题
我也是很早注册过博客园,并且在上面分享一些技术类文章,但是只要是自荐到首页的文章都被同一理由给移除了,经多方询问之后没有任何回复,这就给人感觉对创作者不太友好了(如下图)

国内的其它平台至少会给出一定的理由,我不知道是博客园运营方怎么想的,是自我感觉良好,还是一直喜欢特立独行,我行我素?

问题3:落后于时代的产品+技术
博客园最早起步时,曾是编程世界的宠儿,它专业、真实、干净,深受大家喜爱,也颇受搜索引擎的青睐。
但它渐渐落后于时代了,主要体现在“产品+技术”方面。

博客园最早的危机,其实在移动互联网诞生时就埋下了伏笔。那时是在2010年左右...?到现在,博客园都没有一个像样的APP客户端(Android+IOS),让人不可思议。

后来,SNS大行其道,社交电商如雨后春笋般爆发。博客园空有着巨大的资源存量(用户+信息+技术资料),
但却由于没有推出好的SNS产品
,使得这些资源存量无法有效激活+互通、无法爆发更大的互联网价值。渐渐沦落成为了一个仅仅是
信息丰
富的展示网站??

再后来,基于视频带货的知识付费兴起,CSDN等都赶上了这波潮流+往这个方向进行产品改造,但博客园却毫无动静!!!

我个人推测,博客园之所以一而再再而三的错过上述多个风口,主要原因在于
内部真正的“产品力/产品团队”太弱
,而它那基于.NET+K8S看似强大技术力量,也仅仅停留在基础表面上,
它内部应该也没有很强的研发团队...

三.对博客园团队的忠告

博客园团队,
我忠告你们

你们若想翻身,就要好好研究知识付费这个赛道。并且要提高“产品+技术”的实例,尤其是产品团队的实力,懂么?
这是你们商业化成功的
底层逻辑
...

时代变了,任何人、事物都需要去改变,而不是固步自封,不愿意自我蜕变。

作为一位平台老用户、创作者,还是非常期待园子能渡过此次难关,早日实现能支撑运营的商业化道路。

加油!博客园。


关心.NET社区大事?学习C#顶阶技术?请关注下方公众号。
向大佬学习、探行业内幕、享时代机遇。
进名企+拿高新!

好久没更了,近期开发遇到的需求,抽空梳理一下~

需求:实现一个复杂的拓扑图,图中元素的个数,以及各个参数内容是动态展示的。

于是让ui提供了对应的svg图片。

解决思路:使用iframe嵌入svg图片,运用D3.js修改其文本及样式。

html:

<iframeclass="systemFrame"ref="systemFrame":src="exportImg(topoSrc)"width="100%"height="100%"frameborder="0" ></iframe>

js:
要从svg图里找到对应的元素id

onMounted(() =>{
let frameObj
=systemFrame.value;if(frameObj.attachEvent) {
frameObj.attachEvent(
"onload", function() {});
}
else{
frameObj.onload
= function() {
onIframeLoaded()
loading.value
= false};
}
getTopo()
})
const onIframeLoaded = () => {
const iframeWindow = systemFrame.value.contentWindow.document;
const svg = iframeWindow.getElementsByTagName('svg')
if(!svg.length) return
svg[0].style.background = '#242424'


// iframe加载完成后要进行的操作
var iframeSvg = systemFrame.value.contentDocument; //!!!!这里获取svgDom,一定要先获取父元素,才会展示子元素!!否则找不到
var svgObj = iframeSvg.getElementById("drawing"); //获取父元素下面id是drawing的子元素,接下来就可以对svgDom进行操作,绑定元素点击事件,改变元素的属性等等
let d3svg = d3.select(svgObj);
// 实现拓扑图缩放功能
svgPanZoom(svgObj, {
zoomEnabled: true,
panEnabled: false,
maxZoom: 2,
minZoom: 0.5,
preventMouseEventsDefault: false,
})
svgEdit(d3svg)
};
const svgEdit = (d3svg) => {
// 改变样式 流动的虚线
d3svg.select("#Right")
.style("animation", "path-animation " + 18 + "s")
.style("animation-timing-function", "linear")
.style("animation-iteration-count", "infinite");
// 循环各个元素  topoSrc是需要展示的元素个数
for(let i=1; i<topoSrc.value*1 + 1; i++) {
// 找到元素并移动位置
d3svg.selectAll('#power-'+ i).attr('transform', 'translate(-15)')
// 找到元素替换文本
d3svg.selectAll('#power-'+ i + ' .cls-20:nth-child(1)').text(topoData.value.packs[i-1].power + 'kW')
// 找到元素替换颜色
d3svg.select('#sys'+ i + ' .cls-24').style("fill", '#fff')
d3svg.select('#cu'+ i).style("fill", '#fff')
}
}
 

随着预训练视觉模型的兴起,目前流行的视觉微调方法是完全微调。由于微调只专注于拟合下游训练集,因此存在知识遗忘的问题。论文提出了基于权值回滚的微调方法
OLOR
(One step Learning, One step Review),把权值回滚项合并到优化器的权值更新项中。这保证了上下游模型权值范围的一致性,有效减少知识遗忘并增强微调性能。此外,论文还提出了逐层惩罚,采用惩罚衰减和多样化衰减率来调整不同层的权值回滚级别,以适应不同的下游任务。通过对图像分类、对象检测、语义分割和实例分割等各种任务的广泛实验,证明了
OLOR
的普遍适用性和最先进的性能

来源:晓飞的算法工程笔记 公众号

论文: One Step Learning, One Step Review

Introduction


随着深度学习技术的快速发展,大量的大规模图像数据集已经建立,产生了许多有前途的预训练视觉模型。这些预训练模型可以通过迁移学习和微调技术有效地解决相关但不同的视觉任务。基本的微调方法是线性探测和完全微调。

  • 在线性探测中,预训练模型的主干被冻结,仅训练特定于下游任务的头部。然而,这种方法通常会限制预训练主干的性能。
  • 另一方面,完全微调涉及直接训练整个网络,但这通常会导致知识遗忘。

为了进行有效的微调,许多研究提出了不同的方法:

  • 基于重放机制的方法需要在学习新任务的同时对存储的上游样本子集进行再训练,效率相当低。
  • EWC
    提出了一种基于正则化的微调方法,使用
    Fisher
    信息矩阵来确定权值参数的重要性。这有助于调整上游和下游任务之间的参数,减少遗忘。
  • L2-SP
    使用
    L2
    惩罚来限制参数的更新,解决微调过程中的知识遗忘问题。然而,它与自适应优化器不兼容,这可能会产生错误的正则化方向。
  • 参数隔离方法为下游任务的不同网络模型和任务创建新的分支或模块。但它引入了额外的新训练参数,需要一定的训练技巧,并且通用性低于排练方法。

在本文中,论文提出了一种结合优化器来解决知识遗忘的新颖微调方法,称为
OLOR
(One step Learning, One step Review)。具体来说,
OLOR
在微调阶段将权值回滚项引入到权值更新项中,使模型在学习下游任务的同时逐渐逼近预训练的权值。这个过程避免了延迟缺陷,并使上下游模型的权值更加相似。此外,还设计了逐层惩罚,利用惩罚衰减和多样化衰减率来调整各层的权值回滚水平。惩罚衰减将特征金字塔与迁移学习相结合,对与颜色、纹理等浅层特征相关的浅层给予更显着的权值回滚力度,对与语义信息等深层特征相关的深层给予更小的权值回滚力度。具有逐层惩罚的
OLOR
使模型的每一层都可以根据其需要进行更新,从而更好地提取广义特征。最后,
OLOR
合并到优化器中,引入的额外计算开销可以忽略不计。与
Adam

SGD
等流行优化器配合良好,满足各种条件下的特定需求。

论文主要贡献总结如下:

  • 提出了新颖的微调方法
    OLOR
    ,与优化器合作解决知识遗忘问题,从而提高微调性能。
  • 设计的权值回滚通过将当前梯度纳入惩罚项,避免延迟缺陷,从而修正惩罚目标,平滑回滚过程。
  • 提出逐层惩罚,采用惩罚衰减和多样化衰减率来调整层的权值回滚级别,以适应不同的下游任务。
  • 所提出的方法在广泛的下游任务上实现了最先进的性能,包括不同类型的图像分类、不同的预训练模型以及图像检测和分割。

Method


Previous Regularization Mechanisms Have a Delay Defect

OLOR
的实现受到
L2
正则化和权值衰减的启发,这是用于正则化模型参数的常用方法。然而,论文的研究结果表明它们的有效性与最初的预期并不相符。

在经典
SGD
优化器的场景下,
L2
正则化可以被视为等价于权值衰减,其定义如下:

\[\theta_{t}=(1-\lambda)\theta_{t-1}-\eta_{t}g_{t},

\quad\quad(1)
\]

其中
\({\theta}_{t}\)
表示迭代
\(t\)
时的模型权值,
\({\theta}_{t-1}\)
是前一次迭代的相应权值,
\(\lambda\)
是正则化因子(权重衰减强度)
\({\eta}_{t}\)
是迭代时的学习率,
\(g_{t}\)
是在迭代
\(t\)
时根据损失函数计算得出的当前批量的梯度。权值衰减通过将前一次迭代获得的权值推向 0 来对其进行惩罚。

然而,在实践中,
\(\mathrm{lim}_{\lambda\to1}\theta_{t}=-\eta_{t}g_{t}\)
,权值往往会被推向当前梯度的负值而不是 0,行为与最初的期望不同。此外,与不应用权值衰减相比,应用权值衰减实际上会增加当前权值:

\[(\theta_{t-1}-\eta_{t}g_{t}-\lambda\theta_{t-1})^{2}>(\theta_{t-1}-\eta_{t}g_{t})^{2},

\quad\quad (2)
\]

简化为:

\[\begin{cases}
{{\eta g_{t}>(1-\frac{\lambda}{2})\theta_{t-1},}}&{{\mathrm{if}\,\theta_{t-1}>0,}}
\\
{{\eta g_{t}<(1-\frac{\lambda}{2})\theta_{t-1},}}&{{\mathrm{if}\,\theta_{t-1}<0,}}
\end{cases}
\]

如果
\(\eta\)

\(g_t\)

\(\lambda\)

\(\theta_{t-1}\)
处于上述条件下,使用权值衰减将使当前权重远离 0,这与目标相反。同样,衰减效应的问题也存在于其他正则化机制中,例如
L1
正则化、
L2-SP
等方法。

Weight Rollback

权值回滚是一种实时正则化方法,紧密跟踪每个权值的更新步骤,使当前模型权值更接近预先训练的权值以进行知识回顾(
knowledge review
)。

具体来说,第一步是通过梯度计算预权值
\(\theta_{\mathrm{pre}}\)

\[\theta_{\mathrm{pre}}=\theta_{t-1}-\eta_{t}g_{t},

\quad\quad (3)
\]

其中
\(\theta_{t-1}\)
表示前一步的模型权值,
\({\eta}_{t}\)
是当前步的学习率,
\(g_t\)
表示当前梯度。随后,
\(\theta_{\mathrm{pre}}\)
和预训练权值
\(\theta_{0}\)
之间的差异
\(\Delta d\)
计算如下:

\[\Delta d=\theta_{p r e}-\theta_{0}.

\quad\quad (4)
\]

最后,权值更新过程加入了
\(\Delta d\)
,从而得到调整后的模型权值
\({\theta}_{t}\)

\[\theta_{t}=\theta_{t-1}-\eta_{t}g_{t}-\lambda\Delta d.

\quad\quad (5)
\]

通过代入公式 3 和公式 4 到等式 5,可得到:

\[\theta_{t}=(1-\lambda)(\theta_{t-1}-\eta_{t}g_{t})+\lambda\theta_{0}.

\quad\quad (6)
\]

公式 6 确保
\(\mathrm{lim}_{\lambda\rightarrow1}\theta_{t}=\theta_{0}\)
,符合论文的期望并防止异常情况。此外,由于梯度
\(g_t\)
也受到惩罚,可能也有助于减轻梯度爆炸。

综上所述,权值回滚技术可以缓和每一步
\({\theta}_{t}\)

\(\theta_{0}\)
之间的偏差,从而减轻对当前任务的过度拟合和对前一个任务的知识遗忘。

Layer-Wise Penalty

  • Penalty Decay

对于深度学习神经网络,每一层都可以被概念化为处理其输入的函数。给定层索引
\(i\)
,该过程可以描述如下:

\[{x}_{i+1}=f_{i}(x_{i}^{*}),

\quad\quad (7)
\]

其中
\(f_{i}\)
代表
\({i}_{th}\)
层。令
\({x}_{i}^{u}\)
表示上游任务中
\(f_{i}\)
的输入,分布为
\(q_{i}\bigl(x_{i}^{u}\bigr)\)

\({x}_{i}^{d}\)
表示下游任务中
\(f_{i}\)
的输入,分布为
\(p_{i}\left(x_{i}^{\tilde{d}}\right)\)
。因为
\(q_{i}\bigl(x_{i}^{u}\bigr)\)
总是与
\(p_{i}\left(x_{i}^{\tilde{d}}\right)\)
不同,所以先解冻所有层以确保
\(f_i\)
将有充足的更新来更好地处理此差距。

在图像特征提取的研究中,普遍的理解是浅层主要负责捕获颜色、纹理和形状等表面特征。相比之下,更深的层专注于提取更深刻的特征,例如语义信息。这意味着浅层与数据的分布密切相关,而深层则与特定任务的目标更加一致。

迁移学习的一个基本假设是
\(q_{i}\bigl(x_{i}^{u}\bigr)\)

\(p_{i}\left(x_{i}^{\tilde{d}}\right)\)
具有一定程度的相似性。因此,浅层往往在预训练和微调阶段表现出相似性。此外,与较深的层相比,浅层需要的更新较少。

基于这些观察,论文提出了一种用于权值回滚的分层惩罚衰减机制。随着层深度的增加,逐渐降低回滚级别,鼓励浅层在下游任务中提取更通用的特征,同时保留整体模型容量。对于
\(i\)
层,惩罚因子
\(\lambda_{i}\)
的计算如下:

\[\lambda_{i}=\iota_{2}+(1-\frac{i}{n})(\iota_{1}-\iota_{2}),

\quad\quad (8)
\]

其中
\(n\)
表示预训练模型中的总层数,
\({\iota_{1}\)

\({\iota_{2}\)
分别表示最大和最小回滚级别。

  • Diversified Decay Rate

在各种下游任务中,训练目标通常与上游任务表现出不同程度的差异。为了适应这种可变性,论文通过向权值回滚值引入幂指数
\(\gamma\)
来调整层之间的惩罚衰减率,具体为:

\[1\,-\,{\frac{i}{n}}\,\longrightarrow\,\left(1\,-\,{\frac{i}{n}}\right)^{\gamma}.

\quad\quad(9)
\]

这种动态调整有助于减轻不同层的
\(q_{i}\bigl(x_{i}^{u}\bigr)\)

\(p_{i}\left(x_{i}^{\tilde{d}}\right)\)
之间的相似性由于固定衰减速率而产生的偏差。因此,惩罚衰减变得更具适应性和通用性,满足各种下游规定的一系列任务的要求。

Experiments




如果本文对你有帮助,麻烦点个赞或在看呗~
更多内容请关注 微信公众号【晓飞的算法工程笔记】

work-life balance.

对于大多数App来说,如何快速建立与用户的联系、提高用户活跃度、提升用户转化率,是产品运营过程中十分关心的问题,在常见的运营手段中,Push推送消息以其高性价比成为首选策略。但在实际运营过程中,推送消息的打开率和转化率远远达不到预期,App日活难以提升。那么如何才能有效提高打开和转化率,快速实现App的拉新促活呢?

针对以上问题,
HarmonyOS SDK推送服务
(Push Kit)提供了多重解决方案,可以帮助App在实际推送场景中实现消息展示多样化、服务个性化、内容显性化、操作人性化,有效提升用户消息互动体验。

多样化展示形态,匹配不同消息类型

推送服务目前有多种不同类型的消息推送形态,通常可展示于设备的关键界面,包括桌面、通知中心、状态栏、熄屏、锁屏等位置,推送时可基于不同场景以不同形式通知用户,深入用户使用设备的各个环节,全方位吸引用户点开通知信息,从而拉起应用提升转化率。

从消息通知场景上划分,消息形态可分为以下类型:

image

通知中心

通知中心是常见的通知浏览界面,大多展示普通的消息通知内容,可细分为普通通知样式、通知大图标样式、大文本样式、多行文本样式等,此外,推送服务还支持实况窗卡片的通知形态,多种消息类型在通知中心的展现顺序依次为:实况窗>重要通知通讯&服务>其他通知内容资讯,用户能够清晰接收关键信息,快速处理任务。

image

锁屏通知

锁屏上仅显示本次锁屏期间接受的通知,支持的消息显示样式与通知中心的相同,用户无需解锁,通知内容也能一眼可见。

横幅通知

横幅通知为高提示性场景,通常以醒目的设计展示于屏幕的顶部,不会完全覆盖用户正在查看的内容界面。顶部显示 5秒后即消失,来电、闹钟类横幅通知则为长时间停留。

桌面图标角标

桌面图标角标为数字角标,表示应用有新消息的提示,以独特的展示形式在潜移默化中提醒用户拉起应用查看消息。角标上的数字与消息条数并不对应,由应用自己定义,最多可显示 "99 + "。

通知图标

通知以应用图标形式显示在状态栏和AOD(熄屏)界面,通过通知图标,用户可快速得知哪些应用推送新消息了。

个性化订阅授权,消息推送兴趣使然

在当今App使用量激增的时代,用户容易受到过多推送消息的困扰,而选择关闭通知或选择卸载App。为了给用户减少冗余信息,实现精准消息触达,推送服务提供了
授权订阅消息
的能力,即当且仅当用户同意订阅后,App才可向用户推送对应的消息,从而实现服务闭环。

image

以订阅授权的方式让用户可以自主选择感兴趣的内容类型,不仅能实现应用对受众人群的喜好进行分类解析,进一步落实精准推送,更有利于改善用户的应用使用体验,提升用户的留存率。

显性化实况推送,任务进程一目了然

实况窗是指应用将订单或服务的实时状态信息变化在设备的关键界面展示,帮助用户聚焦正在进行的应用任务,比如外卖配送、打车出行等任务场景,方便用户查看和即时处理通知内容。

image

区别于
HarmonyOS SDK实况窗服务(Live View Kit)
在本地构建和更新实况窗的能力,新版本的Push Kit已经能通过推送服务远程创建并更新结束实况窗内容,帮助用户实现在不依赖应用进程存活的情况下,完成实况窗生命周期内的正常更新和结束,促进业务快速、高效地实现服务闭环。

人性化后台操作,错误推送一键撤回

在消息推送场景中,避免发送错误或违规的推送消息至关重要,错误的信息不仅可能会对用户造成误导,更会使得用户对应用服务的专业性产生质疑,严重情况下可能会引起用户投诉或监管部门处罚等不良后果。

image

针对该场景,推送服务提供了
消息撤回
功能,以降低此类推送可能造成的影响,当然并不是所有消息都支持撤回,只有还未下发到端侧的消息,或者已在终端展示但用户还未点击的消息类型才支持撤回。

综上所述,HarmonyOS SDK推送服务为App提供了精准且高效的信息传递解决方案,让用户能够在恰当的时机和场景获取有价值的消息内容,形成以用户为中心的推送服务闭环,从而使用户产生粘性,帮助应用实现消息推送打开率和转化率的稳步提升。

了解更多详情>>

访问
推送服务联盟官网

获取
推送服务开发指导文档

获取
实况窗服务开发指导文档