ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

深度残差收缩网络如何灵活删除冗余特征:机制与实战解析

深度残差收缩网络如何灵活删除冗余特征:机制与实战解析 1. 为什么我越来越关注深度残差收缩网络对“删除冗余特征”的执行方式做深度学习模型落地最烦人的往往不是网络不够深而是输入里那些说不清道不明的冗余特征。前几年我在做工业振动信号分类和带噪图像识别时频繁遇到同一个问题模型在训练集上表现很好换到真实环境准确率直接掉一截。后来排查来排查去发现主要原因是模型把噪声、背景信号、与任务无关的纹理特征也当成了“有效证据”学进去了。这类特征就是典型的冗余特征——它们对最终分类没有正向贡献却消耗了模型的表达能力还会在数据分布抖动时带来错误干扰。那会儿最常用的做法是加正则项、做特征筛选、或者在数据预处理阶段滤波降噪。但这些都是外部手段处理方式和模型内部的表示学习过程是割裂的。直到我开始深入使用深度残差收缩网络Deep Residual Shrinkage NetworkDRSN才意识到原来可以把“删除冗余特征”这件事直接内化到网络结构里而且删除的灵活程度比预想的高很多。深度残差收缩网络这个名字懂行的人一听就知道它做了三件事用残差结构保证深层网络的梯度稳定用注意力机制判断哪些特征更重要再用软阈值化把不重要的特征收缩掉。它的核心卖点不是单纯的降噪而是让网络在训练过程中自己学会“删掉什么、保留什么、删到什么程度”。这篇内容我想专门从删除冗余特征时的灵活程度来展开讨论DRSN到底是靠什么机制实现灵活删除的这种灵活是有限度的还是有风险的以及在实操中怎么把握这个度。2. 残差结构、软阈值化和“删除”这件事的关系2.1 残差结构最擅长保留特征但它不区分有效和冗余在聊DRSN之前得先把ResNet的底层逻辑重新捋一遍。ResNet的核心设计是恒等映射也就是让每一层去学习输入到输出的残差而不是直接学习完整的映射。假设某一层网络提取到的特征已经足够好它可以把残差部分学成接近零输出基本等于输入这样一来深层网络就不会因为层数增加而出现明显的性能退化。这种结构带来了一个容易被忽略的副作用它倾向于保留所有对训练损失有贡献的特征包括一部分其实是噪声拟合出来的模式。你训练一个标准的残差网络如果数据里有一些固定频率的干扰信号网络完全有可能把它当成稳定特征学到深层特征图里。因为从损失函数的角度看这个干扰信号确实能帮助降低训练误差尤其是在训练样本数量有限、干扰模式又比较一致的情况下网络甚至会优先学习这些“捷径特征”。我在实际测试中也验证过这个现象用同样的ResNet结构分别训练纯噪声数据和带干扰的数据可视化最后一层特征图的激活分布能明显看到一些与目标类别无关的强激活区域。这部分就是冗余特征它们没有被网络主动删除而是被当作有效信息存储了下来。DRSN想要改变的就是这个局面。它不满足于“保留有效信号”而是希望网络能自行判断哪些特征是冗余的并把它们收缩到对后续层影响可忽略的程度。问题是什么样的机制能实现这种删除答案不是采样或者随机屏蔽而是软阈值化。2.2 软阈值化的删除本质连续收缩而不是一刀切软阈值化这个操作在信号处理里应用很久了标准定义是对输入x应用以下变换当x大于阈值τ时输出为x - τ当x小于负阈值-τ时输出为x τ当x的绝对值小于等于τ时输出为0。如果你熟悉ReLU乍看之下会觉得软阈值化和ReLU有点像ReLU是把所有负数归零保留正数部分软阈值化是把绝对值小于τ的特征直接归零然后把绝对值大于τ的特征向零方向收缩。但两者的差异极其关键。ReLU做的是单侧硬截断它删除所有负激活对正激活不做任何压缩。这在特征表示上有一定好处因为稀疏性和非线性都有了但它不够“精细”一个负值可能只是轻微噪声ReLU照样直接删一个正值可能包含大量高频干扰ReLU却原封不动地保留。软阈值化则不一样它把删除阈值提升为可学习的参数小于阈值的冗余特征归零大于阈值的部分也只是减掉阈值对应的量特征幅度越大的保留得越完整。这张连续收缩的性质是DRSN在删除冗余特征时表现出高灵活度的基础。它不像Dropout那样随机二值化也不像剪枝那样直接移除整个神经元而是对每个特征值做“削峰填谷式”的调整。我个人的理解是这种删除方式更接近人对噪声的感知方式轻微的背景噪声我可以不完全忽略它而是在大脑里自动降低它的权重只有严重干扰时才会彻底屏蔽。2.3 人为设定阈值为什么不现实如果只是软阈值化本身那还不是什么新鲜事。传统信号处理里小波降噪就用了类似思路但阈值是人工设定的。问题在于真实数据的冗余特征没有固定形态。一个网络在不同阶段要处理的特征分布差异很大浅层特征图里的高频纹理和深层特征图里的语义特征它们的取值范围和噪声特性完全不同。就算在同一个阶段不同样本的冗余程度也不同某个样本可能是在干净环境中采集的冗余特征很少另一个样本可能是在强噪声环境中采集的冗余特征占了特征图的很大比例。如果阈值是固定的就很难做到对每个样本都合理。这还不是最麻烦的。最麻烦的是不同特征通道的“冗余定义”可能完全不同。有的通道承载着重要的边缘信息有的通道几乎完全是高频干扰的响应。用一种全局阈值去删除要么下手太轻删除不彻底要么下手太重把有效信号也削掉了。DRSN解决这个问题的方式是把阈值生成变成一个子网络让网络根据输入自身来决定阈值。这就是它和传统软阈值方法的本质区别阈值不是超参数而是特征图的函数。一个输入样本噪声大它就会生成偏大的阈值噪声小则生成偏小的阈值。删除冗余特征的灵活度首先就体现在这里——它实现了逐样本、逐通道的个性化删除。3. DRSN的灵活程度具体体现在哪几个维度3.1 通道共享阈值与通道独立阈值灵活度是有选项的深度残差收缩网络有几种典型结构最容易混淆的是DRSN-CS和DRSN-CU。CS版本是通道共享阈值所有特征通道共用一个阈值CU版本是通道独立阈值每个通道都有各自的阈值。这两种设计体现的灵活程度不同。DRSN-CS的阈值生成流程通常是对特征图做全局均值池化得到一维向量然后经过全连接层输出一个缩放系数再乘以一个基准值得到单个标量阈值。这个标量对所有通道生效。优点是参数少不容易过拟合网络更稳缺点是如果两个通道的信号幅值差异很大共享阈值很难同时兼顾。DRSN-CU则是把池化后的向量通过全连接层输出一个长度等于通道数的向量再经过sigmoid归一化与特征图每个通道的平均绝对值相乘得到逐通道阈值。这种方式下网络可以单独加大噪声通道的收缩力度同时保持有效通道的特征强度灵活程度明显更高。我在实验里测过这两种结构在强噪声背景下DRSN-CU的准确率通常比DRSN-CS高出1到3个百分点。而干净数据情况下差距很小DRSN-CS有时反而更稳因为它的约束更强不容易出现个别通道阈值异常波动。所以到底选择哪种结构取决于你对“灵活度”的取舍灵活度越高参数空间越大优化难度也随之上升。3.2 注意力机制让阈值生成变成一种动态决策DRSN里的阈值不是凭空产生的它的生成过程和Squeeze-and-ExcitationSE注意力机制高度相关。基本流程是先对特征图每通道做全局均值池化把空间信息压缩成一个通道描述向量然后通过两个全连接层得到一组权重。这组权重经过sigmoid函数映射到0到1之间再与某个比例系数相乘最终形成阈值。为什么要用注意力权重来生成阈值因为注意力机制擅长从全局信息里提取通道之间的关系它知道哪些通道对当前任务是重要的。如果一个通道经过注意力权重计算后重要性很低那么它对应的阈值就会被放大删除作用增强如果通道重要性很高阈值就会被压低保证有效特征顺利通过。把这种机制和软阈值化结合起来等于网络在每一层都有了一个“特征审查器”它先快速扫描当前特征图的整体状况然后决定每个通道的删除力度。这种决定不是一次性的每一层的特征都在变化审查器也会跟着调整策略。从删除冗余特征的灵活性来看这正是DRSN相比普通注意力网络或者普通残差网络最核心的差异。我甚至会把它类比成管理团队的过程ResNet相当于把所有员工提交的内容都直接向上汇报不做筛选注意力机制相当于让领导给每个员工的表现打个分软阈值化则相当于根据打分决定哪些人的意见需要被弱化或者忽略。DRSN就是把这个打分和弱化的过程放进了网络每一层而且是自动化的。3.3 与Dropout、剪枝相比DRSN的删除粒度完全不同聊删除冗余特征很多人会立刻想到Dropout、权重衰减、剪枝这些经典手段。它们确实都在做某种意义上的“删除”但和DRSN的删除灵活度差了不止一个层次。我用一个表格来对比它们的特点。方法 | 删除粒度 | 是否随输入变化 | 是否随通道变化 | 是否可学习 | 是否连续处理 Dropout | 神经元 | 否随机 | 否 | 否超参数 | 否二值 权重衰减 | 整个权重矩阵 | 否 | 否 | 通过正则强度 | 是但无针对性 剪枝 | 连接或整个滤波器 | 否 | 是 | 部分是取决于策略 | 否结构突变 DRSN | 特征值 | 是逐样本 | 是逐通道 | 是阈值由网络生成 | 是软收缩从这个表格能很直观地看出DRSN在“灵活程度”上几乎是全维度的。Dropout不管样本是什么都是随机删一些神经元它在训练时有效推理时通常关闭并不真正改变网络处理特征的方式剪枝虽然可以按通道删除但删除决策是在训练后根据重要性离线做出的网络推理时结构已经固定无法根据输入改变权重衰减则更加盲目它对所有参数一视同仁地施加大幅衰减并不区分特征重要性。DRSN则是在推理时实时计算每个样本、每个通道的阈值真正确保了灵活删除。这种特性在面对数据分布复杂、噪声水平不断变化的场景时特别重要。比如设备在不同转速下运行振动信号的噪声底数完全不同一个固定结构的模型很难同时适配所有工况但DRSN可以通过自适应的阈值动态调整特征保留程度。3.4 阈值本身就在隐式估计数据的复杂度我在观察DRSN训练过程时发现一个有意思的现象如果输入数据的信噪比比较低训练稳定后网络各通道的阈值普遍偏高如果输入数据非常干净阈值会自动收敛到很小的值软阈值化模块逐渐退化成近似恒等映射。这说明阈值大小的变化趋势其实就在隐式地估计当前任务和数据中的冗余程度。这个特性对于工程实践非常有用。我们可以把训练好的模型在各噪声水平测试集上跑一遍统计网络最后一个收缩模块的阈值均值直接把阈值均值当作一个“数据复杂度指标”来用。如果阈值均值持续很高说明网络在大量删除特征这时可能要从数据采集端降低噪声而不是一味增加网络容量如果阈值均值偏低且方差大则说明部分样本存在突发干扰网络只能针对性地删除部分特征。这种把内部参数映射到数据质量分析的方法是我觉得DRSN除了分类精度之外最有价值的副产品。它相当于给深度学习模型的“黑盒”打开了一个小窗口让你多少能看到网络对特征冗余程度的判断。4. 实操中的配置经验与失效模式4.1 残差收缩模块的基本搭建顺序很多初学者第一次接触DRSN时最不知道的就是软阈值化模块到底放在残差块的哪个位置。从原论文和实践经验来看一个标准的残差收缩模块通常按以下顺序搭建输入特征图先经过第一个卷积层和批归一化激活函数一般用ReLU然后经过第二个卷积层和批归一化此时不急着激活接着对特征图做全局均值池化得到通道描述向量这个向量通过全连接层和sigmoid函数生成注意力权重再通过一次全连接映射把注意力权重转换为与特征图尺度匹配的阈值阈值应用到第二个卷积层输出的特征图上执行软阈值化最后和输入特征图做恒等映射相加。这个顺序里有两个关键细节值得注意。第一个是软阈值化要放在残差分支的末端、恒等映射相加之前这样能保证被删除的是残差分支里新提取的特征而不是输入里已经保留的信息。如果顺序反了先做软阈值化再进残差结构容易出现输入信息被过度删除造成信息丢失。第二个细节是阈值生成过程中的全连接层设计。如果通道数太少建议先用全连接把通道数压缩到原来的四分之一或者二分之一再用全连接还原到原始通道数形成一个瓶颈结构。这种设计与SE模块类似能减少参数量同时增强非线性表达能力让阈值生成更稳定。我用过直接映射的方式发现阈值波动明显加大训练收敛速度也慢了。4.2 阈值塌缩和阈值激增两个最常踩的坑DRSN训练中最大的不稳定因素来自阈值本身。阈值塌缩是指模型经过一段时间训练后所有通道的阈值都变得接近零软阈值化模块形同虚设网络退化为一个普通残差网络。而阈值激增则是相反的情况阈值变得过大大量有效特征被删除训练损失居高不下。我自己遇到阈值塌缩的频率非常高尤其是在数据集本身比较干净、模型容量又较大的时候。网络发现不删除特征也能把损失降下来就会倾向于把阈值压低因为这样可以减少对特征表示的扰动。解决办法主要有两个一是给阈值生成模块增加一个下限约束比如阈值最低不低于特征图平均绝对值的0.01倍二是在训练初期用较小的学习率让阈值模块有一个缓慢的适应过程而不是一上来就被其他模块带偏。阈值激增则通常和激活函数有关。如果特征图里存在一些极端离群值全局均值池化计算出的平均绝对值会被拉高阈值也跟着变大最终导致整个通道的特征被压掉。这种情况我建议对特征图做一次clip操作限制极端值的影响或者使用更稳健的统计量来生成阈值比如使用绝对值的分位数而不是均值。虽然这会增加一些计算但训练稳定性提升很明显。4.3 低信噪比数据、小样本场景下的实际表现DRSN最出彩的场景是低信噪比数据。我在轴承故障数据集上做过一个对比把同一批信号先加入强高斯噪声再分别用ResNet、SE-ResNet和DRSN训练。在信噪比降到0dB以下时DRSN的测试准确率比其他两个结构高出5个百分点以上而且训练曲线更平滑。这说明冗余特征占比高时自适应阈值删除确实发挥了作用。但如果数据本身已经非常干净DRSN的优势就会缩小有时候甚至会略低于普通ResNet。原因也不难理解干净数据中冗余特征稀少可删除的目标不多而DRSN额外引入了阈值生成模块的参数增加了过拟合风险。在小样本场景下这个问题尤其突出。如果你的训练样本量连几千都不到我建议要么使用较小的DRSN结构要么在阈值生成模块里加上强dropout避免参数过多。还有一个容易被忽略的点DRSN对输入数据的尺度很敏感。因为阈值是通过特征图的统计量计算出来的如果输入特征本身方差很大不同批次之间的统计量波动也会很大导致训练不稳定。我习惯在数据进入网络之前先做一次标准化把每个样本的均值和方差调到单位尺度这样阈值模块学起来容易得多。5. 灵活度是不是越高越好边界与代价5.1 更灵活的代价是更大的搜索空间和更低的可解释性DRSN的灵活性确实让人心动但它不是免费的。每增加一个自适应阈值生成模块相当于给网络增加了一组额外的参数和一条额外的信息通路。在训练数据充足时这组参数能带来精度提升一旦数据量不足这组参数就容易记住训练集中的噪声模式导致过拟合。我在一个微型数据集上测试了DRSN-CU训练集只有每类40个样本测试结果比普通ResNet低了将近8个百分点。问题就出在逐通道阈值太灵活了网络可以把大量无关紧要的通道在训练数据上精确删除但这种删除模式并不具有泛化能力换一批样本就失效了。可解释性方面也要正视。普通ResNet的特征图可视化至少还能看出哪些区域被激活得更多。加入软阈值化后特征图被大幅收缩而且每个样本收缩方式不同可视化结果变得很碎片化。想从特征图里解释模型到底“看到了什么”难度比以前大不少。如果项目对可解释性有硬性要求可能需要额外设计一些探针来监控阈值变化而不是指望事后直接分析。5.2 部署灵活度与计算成本之间的矛盾从部署角度看DRSN也有一点尴尬。传统的剪枝方法是把模型结构精简掉一部分推理时计算量是固定的而且减少了。DRSN则不同它在推理时增加了一个动态的阈值生成分支意味着每个样本都要额外计算一次全局池化、全连接和阈值映射。如果模型本身不大这部分额外计算占比相当可观。在一些实时性要求很高的场景比如设备端嵌入式推理DRSN带来的延迟可能反过来成为瓶颈。我做过一次简单测试在树莓派上跑一个12层的DRSN-CU相对于同规模的ResNet单次推理时间增加了约28%其中阈值生成分支占了大部分额外耗时。如果你需要极致低延迟可能就要考虑把阈值生成分支在训练后做一次近似简化或者干脆只在浅层使用收缩模块深层保持普通残差。5.3 哪些场景其实用不上DRSNDRSN并不适合所有场景。如果任务的特征本身已经非常稀疏比如文本分类中的词袋表示冗余特征问题并不突出引入软阈值化反而会破坏有用的稀疏结构。同样如果每个输入样本的长度极短特征图只有几个像素或者几个时间步全局池化后的统计量极不稳定阈值生成也会变得不可靠。还有一个场景是迁移学习。如果直接用预训练好的ResNet权重来初始化DRSN新加进来的阈值生成模块和已有卷积层的初始分布不匹配微调阶段很容易震荡。我的经验是要么把阈值生成模块单独训练几个epoch后再联合微调要么放弃预训练权重从头开始训练。不要指望直接拿ResNet预训练权重微调成DRSN还能保持原有权重带来的性能增益。6. 我在实际项目里沉淀下来的一些经验DRSN用了两三年踩过不少坑也积累了一些比较实用的经验。挑几条我觉得最值得分享的。第一个是关于阈值初始化的。很多开源实现里阈值是通过一个全连接层直接输出的初始值可能是随机的这会导致训练初期阈值过小或者过大影响收敛速度。我自己会把阈值初始化为特征图平均绝对值乘以0.1左右的结果这样训练初期的删除力度比较温和网络可以慢慢调整。具体做法是在模型初始化时跑一小批数据统计特征图平均绝对值然后用这个统计量去初始化阈值生成模块中的缩放系数。第二个经验是残差收缩模块的数量并不是越多越好。我试过在网络每一层都加入软阈值化模块结果训练时间翻倍精度反而没有提升。比较合理的做法是在网络的深层阶段每隔几个残差块加入一个收缩模块浅层特征通常包含丰富的低级信息过度删除会破坏后续特征提取的基础。根据我的测试在网络后四分之一位置加入两到三个收缩模块是比较平衡的选择。第三点如果任务数据和我的场景类似也是带噪信号分类建议在损失函数中加入一个针对阈值的辅助正则项比如让阈值均值落在一个合理范围内。这样做的好处是防止阈值漂移得太极端让模型在训练过程中保持一定的保守性。虽然这会让训练多调一个超参数但从稳定性的角度看这笔投入是值得的。另外看到阈值的变化趋势是很重要的监控手段。我一般会在训练日志里记录每个epoch各层阈值的均值、标准差和最大值。如果训练正常阈值应该会随着训练进程缓慢调整并在后期趋于稳定。如果阈值一直震荡不停优先检查学习率和批大小比盲目调网络结构有效得多。如果阈值在前几个epoch就迅速降到接近零多半是初始化和学习率搭配出了问题尽早干预比等到精度下降再排查要省时间。DRSN这套方法真正打动我的不是它在某些公开数据集上刷新了多少个点的准确率而是它提供了一种把“删除冗余特征”从外部预处理变成网络自主行为的新思路。灵活程度高意味着它适应复杂数据的能力强但同时也意味着它在简单数据上可能存在过度设计的嫌疑。理解这层边界在实际项目里选结构时就更有的放矢了。
返回列表