目录
论文概述
图正则化技术及其优点
算法流程
在标准BLS中嵌入判别图正则化的方法
模型整体架构
代码复现
图拉普拉斯矩阵的构建——generateLmatrix.py文件
复现模型整体架构——bls2deep_graph.py文件
顶层文件——GBLS.py文件
示例:公开数据集训练——MNIST、ORL
数据集介绍
使用步骤
实验结果
环境配置
论文链接:https://link.springer.com/article/10.1007/s11432-017-9421-3#citeas
论文概述
宽度学习系统 (BLS) 被提出作为深度学习的一种替代方法。 BLS 的架构是将输入随机映射到一系列形成特征节点的特征空间中,然后将特征节点的输出广泛扩展形成增强节点,然后可以通过分析确定网络的输出权重。 BLS 的最大优势是当出现新的输入数据或神经元节点时,可以增量学习而无需重新训练过程。已经证明 BLS 能够克服基于梯度的深度学习算法中训练大量参数所带来的不足。 在论文中,作者们提出了一种新颖的判别图正则化宽度学习系统 (GBLS)。 考虑到数据的局部不变性属性,这意味着相似的图像可能具有相似的属性,流形学习被纳入到标准 BLS 的目标函数中。 在 GBLS 中,输出权重受到限制以学习更具有辨别信息,分类能力可以进一步增强。 进行了多项实验证明我们提出的 GBLS 模型可以胜过标准 BLS。
在这篇论文中,作者的主要工作是对BLS进行了改进创新,但其中为BLS的目标函数设计的判别图正则化技术在我们了解其原理之后可以应用到各种图像识别领域的模型中去,对于我们进一步改善模型的判别性和提升模型效率有着很大的帮助。
图正则化技术及其优点
随着人工智能技术的持续进步,图学习已经引起了许多研究人员的关注。通常,通过构建图和图匹配,图学习方法获取数据中的拓扑结构和潜在信息。图匹配的目标是找到两个图之间的结构相似性,这可以帮助我们理解复杂的图数据。例如,林一洁等人提出了一种名为对比匹配的动量蒸馏的新方法,可以更好地探索节点之间和边之间的相关性。此外,图构建将原始数据转换为图结构,用于后续的图分析和图学习任务。基于此,彭曦等人通过构建一种名为 L2-图的稀疏相似性图提出了稳健的子空间聚类和子空间学习算法。此外,为了挖掘数据中的潜在信息,研究人员已经将图构建与 BLS 结合起来。通过构建数据的内在图,图正则化广义学习系统(GBLS)在训练过程中考虑了数据的内在关系。根据构建的图,可以将适当的图正则化项嵌入标准 BLS 的目标函数中,从而提高 BLS 的学习能力。
参考文献:
1. Mouxing Yang, Yunfan Li, Peng Hu, Jinfeng Bai, Jiancheng Lv, and Xi Peng. “Robust multi-view clustering with incomplete information.” IEEE Transactions on Pattern Analysis and Machine Intelligence, 45(1): 1055–1069, 2022.
2. Yijie Lin, Mouxing Yang, Jun Yu, Peng Hu, Changqing Zhang, and Xi Peng. “Graph matching with bi-level noisy correspondence.” arXiv preprint arXiv:2212.04085, 2022.
3. Xi Peng, Zhiding Yu, Zhang Yi, and Huajin Tang. “Constructing the l2-graph for robust subspace learning and subspace clustering.” IEEE Transactions on Cybernetics, 47(4): 1053–1066, 2016.
算法流程
在标准BLS中嵌入判别图正则化的方法
首先,假设存在输入数据集{X,Y}{X,Y}。考虑到相同类型的数据来自同一流形空间,不同类型的数据来自不同的流形空间,我们通过(8)构建图VV,图VV是相似性矩阵,代表了图顶点之间的关系。
Vij={1Ntif l(Xi)=l(Xj)0if l(Xi)≠l(Xj)(1)Vij ={Nt 1 0 if l(Xi )=l(Xj )if l(Xi ) =l(Xj ) (1)
其中 NtNt 代表 tt 类样本的数量,l(⋅)l(⋅) 代表样本的标签。通过这种方式,我们能够考虑数据的流形结构。我们可以利用图 VV 获取图正则项 EGEG 。
LG=∑i,jVij∣∣yi^−yj^∣∣2=Tr(YT^LGY^)(2)LG =i,j∑ Vij ∣∣yi ^ −yj ^ ∣∣2=Tr(YT^LG Y^)(2)
其中 yiyi ,yjyj 分别代表 xixi 和 xjxj 的预测值,LGLG 则是图拉普拉斯矩阵,关于宽度学习系统,我在前面提到过输入数据将被映射成一次和二次特征,我们叫做特征节点和增强节点,在这里为了得到图正则项,我们需要根据这部分节点层得到一个先验的预测结果Y^Y^, 计算方法可通过公式 (3) , WW 是随机初始化的权重矩阵。
Zi=ϕi(XWzi+αzi),i=1,2,...,nHj=ηj(ZnWhj+βhj),j=1,2,...,mY=AW=[Zn∣Hm]W(3)Zi =ϕi (XWzi +αzi ),i=1,2,...,nHj =ηj (ZnWhj +βhj ),j=1,2,...,mY=AW=[Zn∣Hm]W(3)
接下来获得图正则化项 LGLG 后,我们可以更新原始BLS的目标函数 (4) 得到新的目标函数 (5)。
argminW ∥AW−Y∥22+λ∥W∥22.(4)argminW ∥AW−Y∥22 +λ∥W∥22 .(4)
argminW ∥AW−Y∥22+βTr(YT^LGY^)+λ∥W∥22.(5)argminW ∥AW−Y∥22 +βTr(YT^LG Y^)+λ∥W∥22 .(5)
通过上述公式计算 WW 的偏导数,并最终可以通过公式(6)计算 WW :
W=(λI+βATLGA+AAT)−1ATY(6)W=(λI+βATLG A+AAT)−1ATY(6)
从上面可以看出,GBLS考虑了数据的基本几何结构,而标准BLS忽视了这一点,这是通过在(4)中添加一个常规图项来实现的。因此,输出权重可以受限以学习更具有区分性的信息,进一步增强分类能力。
模型整体架构
接下来我讲解一下,在加入了判别图正则化后,宽度模型的整体架构会如何变化。我将从输入数据开始到最终输出预测结果详细地介绍模型如何处理数据及内部的特征。如上所述,与标准 BLS 相比,GBLS 添加了图形正则项以考虑数据之间的内在关系,与此同时,GBLS 像 BLS 一样,使用传统的稀疏自编码器来微调获得的特征。具体的实施步骤如下:
给定数据集 {X,Y}{X,Y},我们首先随机生成一个权重矩阵 WW,将 XX 转换为映射特征节点 ZZ,然后通过稀疏自编码器算法 fSA(X,Z)fSA (X,Z) 获得所需的权重 W^TW^T。通过 W^TW^T,我们可以将原始数据 XX 转换为我们想要的 nn 组映射特征节点层 ZZ。
Zi=ε(XWzi^T+azi),i=1,2,...,n(7)Zi =ε(XWzi ^ T+azi ),i=1,2,...,n(7)
其中 Wz^T=fSA(X,Z)Wz ^ T=fSA (X,Z),ε(⋅)ε(⋅) 是非线性激活函数,aziazi 是随机生成的偏置项,因此映射特征层可以定义为 Zn=[Z1,Z2,...,Zn]Zn=[Z1 ,Z2 ,...,Zn ],通过公式(8)可以得到增强节点层 HH。
Hj=ψ(ZWHj^+βHj),j=1,2,...,m(8)Hj =ψ(ZWHj ^ +βHj ),j=1,2,...,m(8)
ψ(⋅)ψ(⋅)也是一个非线性激活函数,而 $\beta _ { Hj } $ 和 $ \hat { W_ { Hj } }$ 分别是随机生成的偏置项和权重。这样,我们可以通过合并映射特征和网络的增强节点 BB 来获得输入层。B=[Zn∣Hm]B=[Zn∣Hm]。
接下来,我们需要计算连接系数 WW,使得 Y=BWY=BW。对于数据集 X,YX,Y,通过构建数据的内在图(通过(1)和(2) ),我们可以获得图正则项 EG=Tr(YT^LGY^)EG =Tr(YT^LG Y^)。 值得注意的是,这里 Y^Y^ 是新获得的输入层 BB 的预测结果。因此,获得 WW 的优化问题可以被定义为
argminW ∥BW−Y∥22+χ1∣∣W∣∣22+χ2Tr(YT^LGY^)(9)argminW ∥BW−Y∥22 +χ1 ∣∣W∣∣22 +χ2 Tr(YT^LG Y^)(9)
通过计算 WW 的偏导数,可以得到 WW 由下式得到
W=(χ1I+χ2BTLGB+BTB)−1BTY(10)W=(χ1 I+χ2 BTLG B+BTB)−1BTY(10)
具体的算法流程图如下所示:
代码复现
为了完整复现GBLS的算法流程,我使用层次化结构在五个文件中实现了模型的不同侧面。分别是bls2deep_graph.py文件——用于实现模型的整体架构、generateLmatrix.py文件——用于构建图拉普拉斯矩阵、GBLS.py文件——顶层文件用于端到端实现、sparse_bls_autoencoder.py文件——用于稀疏自编码器微调机制的实现、util.py文件——实用方法的集成,下面我将对算法的核心部分generateLmatrix.py文件、bls2deep_graph.py文件和GBLS.py文件分别给出他们的伪代码流程图并进行讲解,具体的代码可见附件。
图拉普拉斯矩阵的构建——generateLmatrix.py文件
函数 generateLmatrix(train_x, train_y, opt):
# 获取标签
gnd = 调用 result_tra(train_y)
Label = 获取 gnd 的唯一值
nLabel = Label 的数量
nSmp = train_x 的行数 # 初始化权重矩阵 A
A = 创建一个 nSmp x nSmp 的零矩阵 # 遍历每个标签
对于每个标签 Label[idx]:
classIdx = gnd == Label[idx]
设置 A 中 classIdx 对应元素为 1 / classIdx 的和 # 减去 A 的对角线元素
A = A - A 的对角线元素 # 计算度矩阵 D
D = A 每行的和 # 计算拉普拉斯矩阵 L
如果 opt['NORMALIZE'] == 1:
D_inv_sqrt = D 的逆平方根对角矩阵
L = 单位矩阵 - D_inv_sqrt * A * D_inv_sqrt
否则:
L = D 的对角矩阵 - A 返回 L
这段代码的主要功能是生成一个拉普拉斯矩阵,该矩阵常用于图形或网络分析中,帮助理解数据之间的关系。首先通过 result_tra 函数获取标签 gnd 并通过 np.unique 获取唯一标签 Label。然后创建一个大小为 nSmp x nSmp 的零矩阵 A,其中 nSmp 是样本数。接下来,遍历每个唯一标签 Label[idx],找到属于当前标签的样本索引 classIdx,并将权重矩阵 A 中对应于 classIdx 的元素设为 1 / 当前标签的样本数。随后,将权重矩阵 A 的对角线元素置为零。计算度矩阵 D,D 是权重矩阵 A 每行元素的和。如果选项 opt['NORMALIZE'] 为 1,则计算归一化拉普拉斯矩阵 L,否则计算非归一化拉普拉斯矩阵 L,最后返回计算好的拉普拉斯矩阵 L。
复现模型整体架构——bls2deep_graph.py文件
函数 bls2deep_graph(train_x, train_y, test_x, test_y, N1, N2, N3, L, s, c):
标准化 train_x
添加偏置项到 train_x,生成 FeatureOfInputDataWithBias
初始化 OutputOfFeatureMappingLayer 和相关变量 记录开始时间 time_start 对于 i 从 0 到 N2-1:
生成权重矩阵 weightOfEachWindow
计算特征映射 FeatureOfEachWindow
缩放特征映射到 [-1, 1]
计算 betaOfEachWindow 并保存
计算输出 outputOfEachWindow 并缩放,保存到 OutputOfFeatureMappingLayer 添加偏置项到 OutputOfFeatureMappingLayer,生成 InputOfEnhanceLayerWithBias 生成增强层权重 weightOfEnhanceLayer 并计算增强层输出 OutputOfEnhanceLayer
计算伪逆矩阵 pinvOfInput 并计算输出权重 OutputWeight 记录结束时间 time_end,计算训练时间 trainTime
计算训练集上的输出 OutputOfTrain 和准确率 trainAcc 标准化 test_x 并添加偏置项,生成 FeatureOfInputDataWithBiasTest
初始化 OutputOfFeatureMappingLayerTest 记录开始时间 time_start 对于 i 从 0 到 N2-1:
计算每个窗口的测试输出 outputOfEachWindowTest 并缩放,保存到 OutputOfFeatureMappingLayerTest 添加偏置项到 OutputOfFeatureMappingLayerTest,生成 InputOfEnhanceLayerWithBiasTest
计算增强层测试输出 OutputOfEnhanceLayerTest 拼接生成 InputOfOutputLayerTest,计算测试集上的输出 OutputOfTest 记录结束时间 time_end,计算测试时间 testTime 和测试集上的准确率 testAcc 返回 testAcc 和 trainAcc
这段代码的功能主要是实现了GBLS的训练和测试过程。首先对输入数据进行预处理,然后通过特征映射层和增强层对数据进行特征提取和增强。特征映射层通过多个随机权重窗口来生成特征,而增强层则使用正交随机权重进行特征增强。随后,代码计算输出权重并通过伪逆矩阵求解。最后,代码对训练和测试数据分别计算输出并评估准确率。整个过程包括数据预处理、特征映射、增强层训练、输出层训练和测试阶段。
顶层文件——GBLS.py文件
函数 preprocess_data():
加载并预处理数据
返回 train_x, test_x, train_y, test_y#加载数据:
调用 preprocess_data 函数,获取 train_x, test_x, train_y, test_y
检查 train_x 中是否有无穷大或 NaN 值#处理测试集:
随机排列 test_x 的行顺序
设置 opt 字典,NORMALIZE 为 1
打印 train_x, train_y, test_x, test_y 的形状#生成拉普拉斯矩阵:
调用 generateLmatrix 函数,传入 train_x, train_y, opt,得到 L
打印 L 的形状#设置参数:
C = 2 ** -30
s = 0.8
par 字典,包含 lambdaG, C, s, NumLayer, range, randstate, ActFun#设置模型参数:
NumWin = 10
NumWinNode = 20
NumHid = 100#训练和测试模型:
调用 bls2deep_graph 函数,传入 train_x, train_y, test_x, test_y, NumWin, NumWinNode, NumHid, L, s, C
获取并返回训练和测试准确率 trAcc, ttAcc
这段代码的功能是实现数据预处理、生成拉普拉斯矩阵并训练和测试GBLS模型。首先,通过定义 preprocess_data 函数加载并返回训练和测试数据,从 ./ORL/ORL7.mat 文件中加载训练数据 train_x、测试数据 test_x、训练标签 train_y 和测试标签 test_y,然后调用 check_inf_nan 函数检查数据中是否有无穷大或 NaN 值。接着,调用 generateLmatrix 函数,基于训练数据和标签生成拉普拉斯矩阵 L,并打印生成的拉普拉斯矩阵的形状。之后,定义模型的超参数,包括正则化参数 C、收缩参数 s 以及其他参数 par,NumWin 表示窗口数量,NumWinNode 表示每个窗口的节点数量,NumHid 表示隐藏层节点数量。最后,调用 bls2deep_graph 函数,传入训练和测试数据、拉普拉斯矩阵和其他超参数,训练并测试基于 BLS 的模型,最终输出训练准确率 trAcc 和测试准确率 ttAcc。总结来说,这段代码的主要功能是加载和预处理数据,生成拉普拉斯矩阵,并使用深度广度学习系统(BLS)进行模型训练和测试,最终输出训练和测试的准确率。
示例:公开数据集训练——MNIST、ORL
在这里,我将展示如何将复现好的代码应用在公开数据集上进行训练和测试。由于在论文中,判别图正则化技术已经被验证在图像识别领域会给模型带来显著的效果提升,因此在这里我们使用了MNIST数据集和ORL人脸识别数据集来进行实验,看看复现代码的效果如何。
数据集介绍
- MNIST手写数字识别数据集是目前最经典的图像识别数据集,其中包括70000张图片样本,其中60000张作为训练集,10000张作为测试集。
- ORL(Olivetti Research Laboratory)人脸识别数据集由剑桥大学计算机实验室的Olivetti研究实验室于1992年创建,包含40个人的面部图像,图像尺寸为92x112像素,灰度图像。每个人的图像在时间上有不同间隔,包含不同的光照条件、面部表情和细微变化,图像格式为PGM,按照人物ID分类存储。该数据集广泛用于人脸识别算法的训练和测试,评估算法性能。常见使用方式包括将数据集分为训练集和测试集,挑战在于图像中的姿态、光照和表情变化较大,对算法的鲁棒性和泛化能力提出了高要求。其中又可以细化为ORL5、ORL6数据集
- UMIST (University of Manchester Institute of Science and Technology) 数据集是一个广泛用于人脸识别和计算机视觉研究的经典人脸图像数据集,包含来自20个人的575张人脸灰度图像,分辨率为112 x 92像素。这些图像涵盖了不同的姿态变化,包括从左侧面到右侧面的各种角度和表情,每个人的图像都保存在单独的文件夹中,并以人的身份标识符命名。UMIST数据集常用于训练和测试人脸识别算法,如PCA、LDA、SVM等,也用于姿态估计和机器学习、模式识别研究,作为基准数据集。这些图像背景统一,减少了背景干扰对识别结果的影响。可以通过相关研究机构或数据集存储库获取UMIST数据集,用于人脸识别和计算机视觉领域的研究。
使用步骤
- 首先我们需要获取想要使用的公开数据集,最好放在项目目录中,在这里我已经将这两份数据集打包放在了附件文件包中,大家也可以前往数据集官网进行下载:MNIST;ORL;UMIST
- 在获取到数据集之后我们需要进去顶层文件GBLS.py中将所要使用的数据加载到内存环境中并进行预处理,在这里我已经为大家写好了对这两份数据集的加载以及预处理方法,大家可以将对应的代码取消注释便可以使用。
- 接下来运行代码便可以进行模型的训练和测试,最后我们需要输出对模型预测的评价指标,常见的对分类任务的评价指标有准确度,F1分数和查准率等,在这里我已经在bls2deep_graph.py的show_accuracy函数中为大家实现了一些通用的评价指标,大家也可以根据自己的需要编写更对的评价指标计算方法对模型进行更多方面的评估。
- 得到输出结果,这里以ORL6数据集为例,调整模型节点数为10,200,100
实验结果
在原论文中,作者将GBLS模型在多个图像识别数据集上进行了实验以验证了他们算法的有效性,因此,我在同样的的三种经典图像识别数据集上进行了多次实验,一是向大家介绍该如何使用这份代码,二是验证了这份代码的可靠性。实验结果如下图所示:
可以看到搭建的模型在三份数据集上都能取得不错而且稳定的效果,在粗略的手调情况下,在三份数据集上的各项指标都能达到90%以上,在UMIST数据集上的效果甚至已经达到原论文数值。同时,可以看到我们在一定范围内调节网络的节点数模型的分类效果保持稳定,在网络结构拓宽时分类性能稳步提升,这说明了搭建的模型学习能力不会出现剧烈抖动,我们可以通过网格搜索来进一步寻找到能让模型收敛的最优参数。
环境配置
- python版本3.6及以上,操作系统可使用Windows、MacOs、Linux
- 安装第三方库:scipy、sklearn、mat73、time
感觉不错,点击我,立即使用