(论文阅读笔记)OLE:正交低秩嵌入,即插即用的几何损失

论文阅读笔记:OLE: Orthogonal Low-rank Embedding, A Plug and Play Geometric Loss for Deep Learning


Cite as: J. Lezama, Q. Qiu, P. Muse, and G. Sapiro. Ole: Orthogonal low-rank embedding - a plug and play geometric loss for deep learning. In Proceedings of IEEE International Conference on Computer Vision and Pattern Recognition, pages 8109–8118, 2018.

摘要

深度神经网络在顶部使用softmax层进行训练,交叉熵损失是图像分类的普遍工具。然而,这并不能自然而然地加强所学深度表征的类内相似性或类间界限。为了同时实现这两个目标,人们提出了不同的解决方案,如pairwise或triplet loss。然而,这样的解决方案带来了选择成对或三重的额外任务,以及它们的许多组合的计算和学习的额外计算负担。在本文中,我们提出了一个适用于深度学习的即插即用损失项,该项以简单而优雅的几何方式,明确地减少了类内方差,同时增加了类间裕度对于类内,深度特征collapse成一个线性子空间或它们的并集,类间子空间被推到尽可能多或正交的位置。我们提出的正交低秩嵌入(OLE)不需要仔细制作成对或三组样本进行训练,并且作为分类损失独立工作。由于不同类别的特征之间的差距得到了改善,因此产生的深度网络具有更好的泛化性、更具区分性和更健壮性。

简介

在过去几年中,深度神经网络(DNN)在学习复杂任务的的表征能力已得到充分证明。DNN通常由一系列具有非线性激活函数的卷积或全连接层组成,这些层生成“深层”特征向量,然后在最后一层中使用线性分类器对其进行分类。该线性分类器通常使用具有交叉熵损失的softmax函数。在本文的其余部分中,这两者的结合称为softmax损失。最后一个线性分类器之前的层称为深层特征层。

使用标准softmax损耗训练DNN不会明确强制嵌入已学习的深度特征,因为同一类别的样本距离其他类别更近,距离更远。为了提高深层神经网络的识别能力,以前的方法试图通过作用于深层特征之间的欧几里德距离的辅助监督损失函数来实现这种嵌入。这种度量学习技术在人脸识别领域特别流行,其两个最具代表性的例子是成对损失和三重损失。这些方法的缺点是需要仔细选择成对或三组样本,以及额外的数据处理。最近,有人提出了一些方法,通过在每个随机训练小批量中强制表示类内紧性来克服这一限制。

在这项工作中,我们建议通过一个简单而优雅的即插即用损失项来提高神经网络的可辨别性,该项作用于深层特征层,鼓励同一类的已学习深层特征位于一个线性子空间(或它们的并集),同时类间子空间是正交的。 据我们所知,这是第一次提出一个深度学习框架,它可以同时减少类内差异和增加类间差异。

我们的直觉基于以下观察。首先,softmax损失的决策边界由特征向量和最后一个线性分类器中每个类对应的向量之间的角度确定。由于权重是随机初始化的,因此类向量在初始化时很可能是正交的,并且在训练后通常保持正交。此外,如果整流线性单元(ReLU)是最后一个激活函数,则深部特征将存在于正正切中。因此,改善深度特征之间的边界的一种方法是将它们嵌入正交的低维线性子空间,并与每个类的分类器向量对齐。

我们证明了我们提出的技术在小数据场景中特别成功。并表明OLE相对于标准softmax损耗的优势随着训练样本的减少而增加。我们还通过一个人脸识别应用程序表明,由于改进的可辨别性,网络在检测新类(训练集之外)方面更好。

OLE的源代码:https://github.com/jlezama/OrthogonalLowrankEmbedding

2 相关工作

少深层特征的类内相似性并增加其类间分离的最初尝试是基于度量学习的方法。他们的目标是最小化同一类深层特征之间的欧几里德距离,同时保持其他类之间的距离。开创性的对比损失使用孪生网络施加了这种约束。这种pairwise策略在人脸识别中特别流行,后来扩展到三重损失。三重损失的图像表示被强制接近同一类的正例并且远离不同类的负例。这些方法的主要缺点是需要仔细挖掘成对或三元组。

一种鼓励类内紧性的中心损失在每次训练中更新每个特征类的质心,并且对质心的欧几里德距离进行惩罚。这个简单的策略为每个类生成紧凑的集群,但类间没有显式地强制执行较大间隔。与我们的方法相反,中心损失不能单独用作分类损失,因为所有质心都趋向于塌陷为零

在无监督学习领域,最近的一系列方法建议在深度表示中实施局部线性结构,这样子空间聚类可以在以后应用于深度表示。这些属性将自然出现在通过OLE学习的深层表征中,尽管是以监督的方式施加的。

我们在每个小批量中强制类内紧性。然而,我们的目标函数同时鼓励了类间的正交性。这项工作源于用于浅层学习的正交化技术。正交化是通过线性变换实现的,线性变换对同一类的特征施加低秩约束,对所有类的特征矩阵施加高秩约束。更确切地说,考虑一个矩阵 Y = [ y 1 ∣ y 2 ∣ … ∣ y n ] \textbf Y= [y_1|y_2|…|y_n] Y=[y1y2yn],其中每一列 y i ∈ R d , i = 1 , . . . , N y_i∈\mathbb R^d,i=1,...,N yiRdi=1,...,N为来自于第C个类别的数据点,|表示水平连接。设 Y C \textbf Y_C YC表示由属于第C类中的Y列构成的子矩阵。一种线性变换 T : R d ↦ R d \textbf T: \mathbb R^d \mapsto \mathbb R^d T:RdRd最小化下列目标:
∑ c = 1 C ∥ T Y C ∥ ∗ − ∥ T Y ∥ ∗   , s . t . ∥ T ∥ 2 = 1 ( 1 ) \sum_{c=1}^C {\bf \|TY_C\|_*-\|TY\|_*}\ ,\quad s.t. \|\textbf T\|_2 =1 \qquad (1) c=1CTYCTY ,s.t.T2=1(1)
其中*表示核范数,即矩阵奇异值之和。核范数是矩阵单位球上秩函数的凸包络。最初约束 ∥ T ∥ 2 = 1 \|\textbf T\|_2 =1 T2=1来防止平凡解 T = 0 \textbf T=0 T=0

在这里,我们将(1)中的损失调整到深度学习框架中,并在一个适合于反向传播训练的人工神经网络中重新表述损失及其优化。

3 正交损失

3.1 动机

考虑一个神经网络,其最后一层全连接层为 W ∈ R C × D W∈\mathbb R^{C×D} WRC×D,其中D为特征维数,C为类别数。每一行 W c ∈ R D W_c∈\mathbb R^D WcRD表示类别c的一个线性分类器。如果W被随机初始化,则这些行(有高概率)是正交的。现在把x看作是图像(或任何其他被分类的数据)的深度表示。如果深度特征层的激活函数是x与0 (ReLU)之间元素方向上的最大值,则x始终处于正交。从这两个观察结果可以推导出,在网络训练成功后,分类器向量 x c x_c xc应该保持正交,以使类之间有最大的分离。因此,学习大裕度深度特征的一种策略是使类内特征落在与相应分类向量对齐的线性子空间中,而不同类的特征应该相互正交。在目前,最后一层分类器并没有强加这种学习特征的自然几何形状。

3.2 定义

假设给定一个训练小批量 Y Y Y的N个样本, X = Φ ( Y ; θ ) X = Φ(Y;θ) X=Φ(Y;θ) N × D N × D N×D的嵌入 Φ Φ Φ的数据。设 X c X_c Xc为属于第c类的深度特征的子矩阵,X为整个小批量特征矩阵,我们提出如下OLE loss:

L o ( X ) : = ∑ c = 1 C m a x ( Δ , ∥ X c ∥ ∗ ) − ∥ X ∥ ∗ = ∑ c = 1 C m a x ( Δ , ∥ Φ ( Y c ; θ ) ∥ ∗ ) − ∥ Φ ( Y ; θ ) ∥ ∗ ( 2 ) \mathcal L_o(X):=\sum_{c=1}^C max(\Delta,\|X_c\|_*)-\|X\|_* =\sum_{c=1}^C max(\Delta,\|Φ(Y_c;θ)\|_*)-\|Φ(Y;θ)\|_* \qquad (2) Lo(X):=c=1Cmax(Δ,Xc)X=c=1Cmax(Δ,Φ(Yc;θ))Φ(Y;θ)(2)

与公式(1)相比,我们去掉线性变换T(网络已经在变换数据)及其归一化限制,在类内核范数损失上加上一个 ∆ ∈ R ∆∈R R的边界,在某一点后不再进行类内核范数降低,从而避免了特征崩溃(因此不需要标准化)。在本文的实验中,我们总是使用 ∆ = 1 ∆= 1 =1

3.3 讨论

  • 它不需要精心制作成对或三个正、负样本,而是简单地作为一个即插即用损失,可以附加到任何现有的网络架构。
  • 与center loss相比,我们的深层目标函数同时鼓励类内紧密性和类间分离,而只做center loss前者。此外,Center Loss不能单独使用而我们的可以。
  • OLE将深层特征分解为线性子空间。当与softmax损失结合使用时,最后一层的线性分类器找到一个自然形式,这是一个与线性子空间对齐的向量。

3.4 实验设置

在所有实验中,我们寻求最小化softmax分类损失和OLE损失的组合:
min ⁡ θ L s ( X , y , θ ) + λ L s ( X , y , θ ∗ ) + μ ∥ θ ∥ 2 ( 3 ) \min_\theta \mathcal L_s(X,y,\theta)+\lambda \mathcal L_s(X,y,\theta^*)+\mu\|\theta\|^2\qquad (3) θminLs(X,y,θ)+λLs(X,y,θ)+μθ2(3)

其中 L s \mathcal L_s Ls为标准softmax损失(即softmax层加上交叉熵损失)。第二项 L o \mathcal L_o Lo是提议的OLE loss。参数 λ λ λ控制OLE loss的权重。 θ ∗ θ^∗ θ是指网络中除了最后一个全连接层(即线性分类器)之外的所有权值。这是因为OLE损失应用于倒数第二层的深层特征。第三项表示标准的权重衰减。我们选择λ=0.25,实际使用中可以在 [ 1 16 , 1 2 ] [\frac{1}{16},\frac{1}{2}] [161,21]之间尝试λ。

3.5 优化与反向传播推导

为了通过反向传播优化,我们需要计算一个矩阵的核范数的次梯度。设 A = U Σ V ⊤ \bf A = {\bf UΣV}^\top A=UΣV为m × n矩阵 A \bf A A的SVD分解。设 δ δ δ为一个小阈值, s s s A \bf A A奇异值大于 δ δ δ的个数。设 U 1 \bf U_1 U1 U \bf U U的前 s s s列, V 1 \bf V_1 V1 V \bf V V的前 s s s列(对应于大于δ特征值的那些列)。相应地,设 U 2 \bf U_2 U2 U \bf U U的剩余列, V 2 V_2 V2为v的剩余列,则核范数的一个次微分为:

∥ A ∥ ∗ ′ = U 1 V 1 ⊤ + U 2 W V 2 ⊤ , w i t h ∥ W ∥ ≤ 1 \|\textbf A\|_*'=\textbf U_1\textbf V_1^\top+\textbf U_2 \textbf W \textbf V_2^\top, with \|\textbf W\|\leq 1 A=U1V1+U2WV2,withW1

这里我们令 W = 0 \bf W=0 W=0,得到核范数最小化问题的投影次梯度如下:
g ∥ A ∥ ∗ ( A ) = U 1 V 1 ⊤ g_{\|A\|_*}(A)=\textbf U_1 \textbf V_1^\top gA(A)=U1V1

直观地说,为了避免数值问题,我们去掉了数据矩阵已经没有或非常低能量的次梯度的方向(即,它们对应的奇异值已经接近于0)。这改进了直接使用核范数的公式,因为其中所有的方向都使用了。

假设 X = [ X 1 ∣ X 2 ∣ … ∣ X c ] X = [X_1 | X_2 |…| X_c] X=[X1X2Xc]是一个小批量的深度特征矩阵。设 U 1 c \textbf U_{1c} U1c V 1 c \textbf V_{1c} V1c为每个类 X c X_c Xc的主要左右奇异向量, U 1 \bf U_1 U1 V 1 \bf V_1 V1是整个 X X X的主要左右奇异向量。(“主要”的含义是相应的奇异值大于阈值δ的那些。)那么,梯度下降方向如下:

g L o ( X ) : = ∑ c = 1 C [ Z c ( l ) ∣ U c 1 V c 1 ⊤ ∣ Z c ( r ) ] − U 1 V 1 ⊤ g_{\mathcal L_o}(\textbf X):=\sum_{c=1}^C[\textbf Z_c^{(l)}|\textbf U_{c1}\textbf V_{c1}^\top |\textbf Z_c^{(r)}]-\textbf U_1\textbf V_1^\top gLo(X):=c=1C[Zc(l)Uc1Vc1Zc(r)]U1V1

其中 Z c \textbf Z_c Zc用来填充0元素使 U 1 V 1 ⊤ U_1\textbf V_1^\top U1V1的维度与 X \bf X X的维度相同。上式的前一项减少了每个类特征的主成分的方差。第二项增加所有特征的方差,将特征矩阵投影到最接近的或正交形式上。这个梯度方向只有当目标函数达到全局最小值时才会消失。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要提取OLE嵌入文件,您可以使用以下步骤: 1. 打开包含OLE嵌入文件的文件。您可以使用fopen()函数打开文件,并使用fread()函数读取文件内容。 2. 查找OLE嵌入文件的起始位置。OLE嵌入文件通常以两个字节的标识符“0x15 0x1C”开始。 3. 从OLE嵌入文件的起始位置开始读取数据,直到读取到OLE嵌入文件的结尾。OLE嵌入文件的结尾通常以两个字节的标识符“0x0D 0x0A”结束。 4. 将OLE嵌入文件的数据写入到一个新的二进制文件中。您可以使用fwrite()函数将数据写入到文件中。 5. 将提取的OLE嵌入文件编译成落地库。您可以使用C语言编写一个库文件,并将提取的OLE嵌入文件编译到库中。 下面是一个简单的C语言代码示例,用于提取OLE嵌入文件并将其编译成落地库: ```c #include <stdio.h> #include <stdlib.h> void extract_ole_file(char* input_file_name, char* output_file_name) { FILE* input_file = fopen(input_file_name, "rb"); if (!input_file) { printf("Error: Failed to open input file.\n"); return; } FILE* output_file = fopen(output_file_name, "wb"); if (!output_file) { printf("Error: Failed to create output file.\n"); fclose(input_file); return; } // Find the start of the OLE embedded file. int start_found = 0; while (!start_found && !feof(input_file)) { unsigned char b1, b2; fread(&b1, sizeof(unsigned char), 1, input_file); fread(&b2, sizeof(unsigned char), 1, input_file); if (b1 == 0x15 && b2 == 0x1C) { start_found = 1; } } if (!start_found) { printf("Error: OLE embedded file not found.\n"); fclose(input_file); fclose(output_file); return; } // Extract the OLE embedded file. int end_found = 0; while (!end_found && !feof(input_file)) { unsigned char b; fread(&b, sizeof(unsigned char), 1, input_file); if (b == 0x0D) { unsigned char next_b; fread(&next_b, sizeof(unsigned char), 1, input_file); if (next_b == 0x0A) { end_found = 1; } else { fwrite(&b, sizeof(unsigned char), 1, output_file); fseek(input_file, -1, SEEK_CUR); } } else { fwrite(&b, sizeof(unsigned char), 1, output_file); } } fclose(input_file); fclose(output_file); } int main() { char* input_file_name = "input_file.doc"; char* output_file_name = "output_file.bin"; extract_ole_file(input_file_name, output_file_name); return 0; } ``` 请注意,这只是一个简单的示例,并且可能需要进行更多的错误检查和处理。此外,提取的OLE嵌入文件可能需要进行进一步的解析和处理,具体取决于您的应用程序需求。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值