ARTICLE DETAIL

资讯详情

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

深度学习中的流形:从高维数据到特征空间的底层逻辑

深度学习中的流形:从高维数据到特征空间的底层逻辑 最近做特征可视化时我又把“流形”从头啃了一遍先说个场景。你在跑图像分类或生成模型时一定听过这种话“真实数据其实分布在一个低维流形上。”我第一次听到这句话的感受是字面意思能懂但接下来该怎么用它指导调参、指导模型设计完全没概念。查资料又是一堆拓扑学、微分几何的术语直接劝退。直到后来自己动手处理高维特征、做降维可视化才慢慢把流形这个概念从“数学花瓶”变成一件趁手的工具。其实流形并不难关键是把它和深度学习里的数据分布、特征空间、生成模型串起来理解。这篇文章就是把我踩过的坑和最终理解梳理成一条线分五步讲清楚流形到底是个什么东西为什么深度学习离不开它以及流形学习经典方法到底在做什么、怎么做。适合谁看适合懂一点深度学习基础、但每次看到“流形”两个字就跳过的读者。不需要你有多深的数学功底有高中的坐标概念就足够。1. 流形到底是什么你的直觉其实已经见过它1.1 一个球面就够了流形最直观的例子想理解流形不用去翻拓扑学教材。你就看地球。地球是一个三维空间里的球体但我们平时用地图导航、用经纬度定位是在一个二维平面上操作的。为什么能把立体的地球画成平面地图因为“局部来看地球表面几乎就是平面”。你在自家小区周围用地图软件不会感觉到地球是弯的道路、街区、河流之间的相对位置用二维坐标就能准确描述。这就是流形的核心思想一个空间整体可能弯曲、可能打了结、可能绕成一团但每个局部都和平直的欧氏空间长得一样。在数学上地球表面就是一个二维流形——它的局部可以用两个坐标经纬度来刻画所以它的“内蕴维度”是2而不是它嵌入在三维空间里的那个3。这个概念对一个做深度学习的人有什么用我们处理图像、语音、文本时数据通常被表示成几千甚至几万维的向量但真正决定数据差异的自由度往往比这个向量维度小得多。一张64×64的灰度图按像素展开是4096维但自然图像不可能取满整个4096维空间——任意4096个数拼成的矩阵大概率只是一团噪点根本不是一张像样的图片。自然图像实际占据的空间就是高维像素空间里“贴着”某个低维结构的一层薄薄的区域。这个“薄薄的区域”就是流形。理解它可以换一个类比把高维空间想象成一大块面团真实数据不是均匀塞满整个面团而是被擀成了一张很薄的面皮弯弯曲曲地铺在里面。面皮本身只有两维但你是在三维的面团里去观察它的。1.2 “局部像平面”到底是什么意思这句话是流形定义里的重中之重值得单独拆开讲。所谓“局部”意思是它在每个点附近都有一条近似平直的邻域。继续用地球打比方你在任何一个城市脚下踩的都可以近似看成平面你不需要考虑曲率就能画出一张比例尺地图。但当你想画一张世界地图、想把整个球面展平就一定会出现变形——格陵兰岛在墨卡托投影下显得巨大无比这就是全局上没办法把所有局部平直区域无扭曲地拼成一个大平面导致的。拉到深度学习里这个性质对应了一个非常实用的工作方式我们在高维特征空间里做的很多几何操作其实都是“在局部把它当普通欧氏空间用”。比如找特征向量之间的余弦相似度、算欧氏距离、做线性插值这些操作默认了空间是平直的。对于局部区域来说这个假设是合理的一旦跨得远了这些距离就失去了精确意义。很多初学者容易把一个误区以为“局部像平面”等于“数据可以用线性模型拟合”。不是的。局部平直只说明局部可以用一个近似的线性坐标来编码但整个流形可能是高度卷曲的。就像瑞士卷蛋糕奶油层在每一小块看都是平的但整体卷了一圈。如果硬用一个全局线性模型去吃这个结构就只能拿到“在三维空间里斜着切一刀”的水平完全刻画不了层次。1.3 嵌入维度与内蕴维度两个经常被搞混的数字流形相关的讨论里最容易出问题的是维度。严格来说要分开两个维度。第一个是嵌入维度就是流形所在“外部空间”的维度。对图像来说就是像素数乘以通道数。这个维度通常非常大大到直接在里面算距离都会出问题。第二个是内蕴维度就是流形本身的自由度。对人的面部图像来说一张脸的姿势、表情、光照、身份常见做法里大概只有几十个自由度对MNIST手写数字来说数字形状的转动、粗细、倾斜用十来个自由度就能大概描述。深度学习中各种“表征学习”方法本质上就是在想办法逼近这张“面皮”的内蕴坐标。一张图片虽然被编码成几万维的向量但网络希望学到的特征表示是能用较少维度描述核心变化的那套坐标。这也是为什么Embedding层往往把高维稀疏输入压缩成几十上百维的稠密向量——因为数据本身的流形维度并没有想象中那么高。不过在实操中别急着说“所有高维数据内蕴维度都低”。真实数据往往包含噪声噪声会把数据从流形上推开一点让实际观测到的数据点散布在流形周围的“厚度”里。内蕴维度低不等于原始向量维度低更不等于低维空间里能完美重建原数据这两件事要分清楚。2. 为什么深度学习圈都在提流形从维度灾难说起2.1 高维空间里的反直觉现象如果只在二维三维里生活你的几何直觉在深度学习里基本是失效的。高维空间最反直觉的一点是当维度升高所有点之间的距离会变得越来越接近点与点之间的区分度下降。你辛辛苦苦把一张图编码成高维向量想在特征空间里找“最近邻”结果发现所有样本间的距离长得差不多最近邻的意义被稀释了。这就是“维度灾难”的一种表现。另一个表现是数据稀疏性在单位超立方体里均匀撒点维度越高想达到同样的点密度需要的数据量指数级暴涨。100维空间里如果你想让每个维度方向都有足够多的样本覆盖需要的数据量远超现实可获取的量级。所以高维空间不能直接硬算。必须找到一个更紧致、维度更低的结构来近似数据。而流形假设恰好就是这种近似。2.2 流形假设真实数据并没有填满高维空间流形假设说真实数据虽然位于高维观测空间但它们集中在一个维度远低于该空间的流形上或者至少分布在这个流形附近。用一个具体例子体会。假设你在做人脸识别输入是128×128的彩色图展开后是49152维。但“一张合法人脸”需要满足大量约束五官的相对位置有规律、肤色纹理有连续性、光照与阴影的关系要自洽……这些约束在像素级别上表现为长程相关性结果就是所有合法人脸要么落在像素空间的一个非常薄的区域里要么落在若干不相连但各自低维的区域里。你随便从一个标准正态分布里抽一个49152维的向量几乎百分之百是一张噪声图不可能是人脸。这个“零测度”性质就是流形假设最直观的体现。流形假设不是从数学定理推出来的而是一个经验事实是大量图像、语音、传感器数据共同表现出的一种结构特征。它之所以重要是因为它把“建模高维数据”这个看起来不可能的任务转成了“先找低维结构、再在低维结构上建模”这个可行任务。从古典的PCA到现在的VAE、扩散模型思路本质上都是顺着这条线走的。2.3 从流形视角看CNN、Transformer和一切特征工程流形观点还能帮你想通一些看似很抽象的设计选择。比如卷积神经网络为什么在图像上效果极好一种说法是图像数据在空域上具有平移局部性真实图像流形对这些变换具有结构性的对称性。用卷积共享权重相当于把模型先验设置成“这个流形的某些方向上的变化不应该改变语义”。这个先验让模型不需要从零学出平移不变性所以样本效率更高。再比如数据增强为什么有效通常解释是扩大了训练数据量。从流形角度看增强是在流形上或流形附近做邻域采样告诉模型“这些变换后的点仍然是合法样本”。这等于给模型提供了流形局部结构的额外标签信息让它学到更平滑、更稳定的决策面。还有迁移学习和预训练。预训练模型在大量通用数据上学到的特征之所以能迁移到下游任务就是因为源任务和目标任务的数据流形往往共享了大部分的底层结构——纹理、边缘、形状组织方式这些“流形主干”是相通的。下游任务只需要在预训练特征空间里找相对小的子流形去适配。当你理解了流形这个前提再去想为什么微调一小部分参数就能取得好效果就不觉得神秘了。3. 流形学习经典算法从PCA到t-SNE再到UMAP3.1 线性方法PCA和MDS在做什么流形学习不是近几年才出现的概念。在深度学习兴起之前降维和流形恢复就已经是机器学习里的一块核心阵地。最早大规模使用的方法是PCA主成分分析。PCA的流形视角非常直接它假设数据所在的低维结构是一个线性子空间是最简单的一种“平直流形”。它找一组正交方向使数据在这组方向上的投影方差最大化。说得更几何一点PCA就是找一张过数据质心、尽可能贴合数据点云的线性平面然后把数据点投影到这张平面上。你留下的前k个主成分就是数据在低维坐标系里的坐标。MDS多维缩放思路不太一样。MDS不直接处理原始特征而是处理样本间的距离矩阵。它的目标是在低维空间里重建一组点使这些点两两之间的距离尽量接近原始空间里的距离。如果距离使用欧氏距离MDS在数学上等价于PCA但MDS允许你换成其他距离定义比如地球移动距离或自定义的领域相似度这让它比PCA灵活。线性方法的共同局限是只能复原“平”的结构。遇到瑞士卷、手写数字这类高度卷曲的流形线性方法会把不同位置的卷曲结构强行压扁叠在一起结果往往是一团浆糊。这也是非线性方法出现的直接原因。3.2 非线性方法LLE、ISOMAP、t-SNE、UMAP非线性流形学习重点说四个。ISOMAP的思想是“用测地距离代替直线距离”。在一张卷曲的流形上两个点在外部空间里的欧氏距离很短但沿着流形表面走却可能非常远。ISOMAP先通过近邻关系构建图用图上的最短路径来近似流形上的测地距离然后再用类似MDS的方式在低维空间重构坐标。它的优点是全局结构保持好缺点是对噪声敏感近邻图一旦断裂结果会很难看。LLE局部线性嵌入走了另一个方向。它认为流形局部是线性的所以每个点都可以用它周围近邻点的线性组合来重构。做法分两步第一步在原始空间里为每个点求它相对近邻的重构权重第二步固定这些权重在低维空间里找一组新坐标让这些坐标仍然满足相同的局部线性重构关系。这就相当于在“保留局部几何”的约束下把整块结构展开。LLE对局部卷曲的处理比ISOMAP好但数据所在的流形如果有大范围的孔洞或断裂效果也会变差。t-SNE是可视化场景里你一定会碰到的算法。它的核心是不直接保持距离而是把高维空间里的相似度转成条件概率分布再让低维空间里的概率分布尽量接近高维空间的。t分布的使用是为了解决高维空间里点距普遍偏大导致低维表示被“挤”在中心的问题。t-SNE在揭示局部簇结构方面非常强但你几乎不能根据它来回答“这两个簇的真实远近”这类定量问题它只擅长展示“有哪些群”。而且它的超参数perplexity对结果影响巨大同一个数据集perplexity设成5和设成50画出来的图可以是两种故事。UMAP是目前最值得优先尝试的方法。它走的是拓扑数据分析路线相当于先构造高维空间的模糊拓扑表示再在低维空间里找一个拓扑上最相似的结构。UMAP在保持全局结构上明显优于t-SNE计算速度也快超参数n_neighbors和min_dist提供了从“重局部”到“重全局”的连续调节能力。如果你手里数据量不大、只是要做探索性可视化现在我的默认选择基本是UMAP而不是t-SNE。3.3 实操建议降维可视化时怎么选算法不用把这些算法都背熟我给你一套可以直接抄作业的选型逻辑。你的需求推荐算法关键超参数注意事项线性结构、需要可解释的坐标轴PCAk保留主成分数先做标准化用累计方差解释率选k已知样本间高维距离想重构坐标MDS目标维度d、距离度量距离度量选错会全盘皆输保持全局测地结构ISOMAPn_neighbors对噪声敏感需要先平滑或降噪保持局部几何、试图展开卷曲流形LLEn_neighbors流形不连通时容易出空洞探索性可视化看重聚类团块t-SNEperplexity、learning_rate先解释簇不要解释距离兼顾全局与局部、数据量中等以上UMAPn_neighbors、min_dist效果稳定推荐默认尝试实操里还有一个高频错误先做了特征标准化再算样本距离然后丢给t-SNE或UMAP最后发现可视化结果完全看不出结构。原因多半是标准化把特征的重要性全部拉平了原本主导结构的分量被噪声分量淹没。正确的做法通常是先PCA降维到合适的维度比如50维丢掉明显是噪声的方向再做UMAP或t-SNE。这一步能显著提升可视化的可读性。4. 深度学习中的流形视角生成模型、表征学习与潜在空间4.1 生成模型本质上是在学习数据流形的概率分布当你开始接触VAE、GAN或者扩散模型流形这个视角基本是绕不开的。VAE的结构是编码器把高维数据映射到一个低维潜在变量z解码器再把z映射回数据空间。从流形角度看编码器负责寻找每个样本在数据流形上的“坐标”解码器负责把坐标展开成流形上对应的点。训练目标里的重建误差就是在约束解码器学到的流形要足够贴近真实数据流形KL正则项则是在约束潜在坐标的分布不要跑太偏。GAN的思路也类似。生成器从一个简单分布通常是高斯随机采样经过一系列变换后输出一张图。生成器学到的其实是从“平凡低维分布”到“数据流形上的分布”的映射。判别器则像是一个“流形检测器”不断判断输入的样本是来自真实流形附近还是生成器伪造的流形附近。两者对抗最终生成器把低维高斯噪声映射成了近乎真实数据流形的结构。扩散模型稍微绕一点但也可以从流形角度理解前向过程逐步给数据加噪本质上是把原本集中在流形上的样本“扩散”成高维空间里非常分散的分布反向过程则是学习一步步去噪把一张噪声图从高维空间的任意角落“引导”回数据流形上。随着步数增多模型是在逐步恢复数据的低维几何结构。这也是为什么扩散模型在低维结构明显的图像数据上效果尤其突出。4.2 潜在空间的插值与语义编辑为什么在隐空间里“走直线”有意义流形视角能帮你理解一个非常有意思的现象在训练好的生成模型里对潜在向量做线性插值生成出来的内容不是机械混合而是在语义上平滑过渡。两张人脸之间逐点插值中间会经历“脸型、角度、光照逐渐变化”的过程而不是两张脸叠影。原因在于潜在空间可以理解为流形的一个“坐标图册”。生成器把这个潜在空间里的坐标映射到数据流形上。如果网络学得足够好这个映射在局部是光滑的那么潜在空间里的一条直线对应到数据流形上就是一条连续的曲线沿着这条线走观察到的就是语义层面的连续变化。潜在向量做算术也遵循同样的逻辑——“国王”减“男人”加“女人”得到“女王”这类经典现象说明模型在隐空间中找到了一组近似解耦的坐标轴不同语义属性对应了不同方向上的移动。不过这背后有个容易被忽视的前提线性插值有效依赖潜在空间局部光滑。如果潜在空间有许多不连续区域或空洞插值结果会突然生成毫无意义的中间态。一个实用技巧是在VAE里优先使用方差更小的后验、对潜在向量做白化往往能让插值更平滑。4.3 从流形视角看泛化与对抗样本流形还能给出一个理解模型泛化和鲁棒性的框架。一个图像分类模型本质上是在高维观测空间里学一个决策边界。假如训练数据集中在流形附近那么模型只要在流形附近的区域里把决策边界摆正确就能在测试集上表现出不错的准确率。这也解释了为什么测试准确率高不代表模型真的理解了数据——它很可能只是在训练数据流形周围做了一个“贴合的壳”。对抗样本的各种奇怪性质放在流形视角下会清晰很多。攻击者在原图上加一个肉眼不可见的小扰动就能让模型把“熊猫”误判成“长臂猿”。这说明模型的高置信区域覆盖到了流形之外的空间。从流形角度看对抗扰动是把样本从数据流形上“推开”了一小段距离而模型在流形附近并没有把决策边界约束好。数据增强、对抗训练等方法本质上都是在流形周围提供更多监督信号逼着模型把这层“壳”修得更贴合真实流形。从这里也能理解为什么很多鲁棒性方法强调“先降维再做分类”把数据先投影到流形附近的低维空间去掉那个方向上的自由度对抗扰动能利用的离流形方向就少了。当然真实系统里安全不是单靠这类方法就能解决的需要组合多种措施但这个几何视角确实是理解鲁棒性的一把钥匙。5. 常见误区与实操心得流形概念落地时最容易踩的坑5.1 别把流形当成“降维可视化”的同义词很多人一听到流形就想到t-SNE图以为流形学习就是降维可视化这是比较窄的理解。流形首先是一种关于数据几何结构的假设降维和可视化只是在这个假设下的一个应用方向。同样的假设还可以用在距离度量学习、生成模型设计、缺失数据填补、异常检测等多个环节。比如在做异常检测时一个很自然的做法就是先估计正常数据所在的流形然后看新样本离流形有多远。之前在工业质检项目里我们用自动编码器的重建误差来做异常检测本质上就是用网络来近似正常样本流形新样本如果偏离流形重建误差就会明显变大。这个思路比单纯用分类器要稳健得多。5.2 别把所有数据都默认成“干净的单一流形”流形假设是经验规律不是物理定律。真实数据往往比教科书里的瑞士卷复杂得多。第一数据可能由多个互不相连的流形组成。手写数字里的“0”和“6”虽然相似但在像素空间里更可能是两个靠近但不相连的团块而不是一整张连续的流形。用单一流形的假设去统一建模会忽略类间的边界结构。第二数据可能包含多尺度结构宏观上有类别分群微观上每个群内部又各自卷曲。单一降维算法很难同时兼顾两个尺度。第三噪声、离群点、采集误差都会把数据点从流形上推开变成“流形附近的游离点”。在做流形学习前先做离群点检测和噪声平滑效果会明显更好。另一个常被忽略的问题是数据量。流形学习算法对近邻结构依赖很强。如果样本量太小近邻图构建不稳定任何非线性方法都会失真。经验上想用UMAP或t-SNE看到可靠的结构样本量至少要有几百最好上千。低于这个量级解释结果时要非常谨慎。5.3 流形学习的几个实操问题速查我自己在实际项目里反复遇到的几个问题整理成一个速查表现象常见原因建议处理t-SNE图上所有点挤成一团perplexity设置偏大或学习率偏低调小perplexity增大learning_rate先做PCA预降维UMAP结果全局结构很乱n_neighbors太小只保住了局部增大n_neighbors比如设50以上再做比较PCA降维后两类完全重叠类别差异是非线性的换非线性的UMAP或t-SNE或者先把特征过一遍神经网络流形学习结果每次跑都不一样t-SNE、UMAP有随机初始化固定random_state多次运行确认稳定结构高维点距离都差不多无法区分最近邻维度灾难距离集中先降维再做距离计算或改用余弦相似度生成模型插值出现“断裂”潜在空间不连续或正则过强调整潜在空间正则权重或换更平滑的映射结构还有一个小技巧做完UMAP或t-SNE后不要只看图把低维坐标连同样本标签一起导出在低维空间里重新训练一个简单分类器看交叉验证分数是否比原始空间有明显变化。这个做法能帮你判断降维到底保留了多少有效结构也能发现特征里是否存在大量冗余维度。最后分享一点个人体会带过好几个入门深度学习的同学我发现大家卡在流形这个概念上往往不是数学不够而是缺少一座从“抽象定义”到“实际代码里的数据”的桥。如果你也想真正把流形用起来我的建议是不要从黎曼度量那些理论开始啃而是先找一个小型图像数据集跑一遍PCA再跑一遍UMAP把三维特征可视化出来亲眼看看数据是怎么聚成团的。然后再去看VAE或扩散模型的原理你会发现原来那些“隐空间”“潜在向量”的名词全都在描述同一件事在高维空间的底层数据有一张低维的、有结构的面皮而深度学习一个核心任务就是把这张面皮找出来。流形不是一个需要背下来的定义它是一种思考数据的方式。数据不是一堆孤立的点而是一张有形状的网。理解这一点比记住任何算法的细节都更有价值。
返回列表