ARTICLE DETAIL

资讯详情

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

无监督音源分离:用生成先验突破配对数据瓶颈

无监督音源分离:用生成先验突破配对数据瓶颈 1. 为什么我选了这篇论文来讲组会1.1 组会选材的动机一个被重复提起的问题如果你也在音频方向做研究大概率会遇到这样的场景导师让你做音源分离你打开数据集一看好家伙每一条混合音频都要有对应的干净源文件。音乐分离还好说很多商业数据集是人工分轨录的但换到真实世界的录音比如一段会议录音里有几个人同时说话你想把每个人的声音单独拎出来标注成本直接起飞。更麻烦的是语音和音乐混合的场景里源信号的定义本身就模糊你很难说清楚“背景钢琴声”和“人声”的边界在哪。这次组会选题目的时候我特意挑了这篇关于无监督训练下音频分离的工作核心思路是用生成先验来替代成对的训练数据。简单说就是我不需要“混合音频-干净源”这种配对数据了我只需要分别准备一堆纯人声、纯伴奏、纯乐器独奏的样本让模型先去学会“一段干净的人声长什么样”“一段干净的吉他声长什么样”然后拿着这些先验知识去从一个混合信号里反推分离结果。为什么这个方向值得讲因为它切中了音源分离落地时最痛的点数据。我自己之前做的监督式分离模型效果确实是好但换一个场景、换一套录音设备、换一种乐器组合性能就崩。本质原因是模型只学会了训练集里的映射关系并没有真正理解“什么是某个声源”这件事。无监督加生成先验这条路至少从思路上是在尝试回答这个更本质的问题。1.2 这篇博文适合谁读如果你是刚接触音源分离的研究生这篇内容能帮你建立整个领域的坐标系监督方法在解决什么问题无监督方法又是在什么背景下被提出来的生成先验在里面扮演什么角色。如果你已经做过一些分离实验但对“无监督”三个字存疑那这篇内容里关于实验配置、损失函数设计、优化过程的部分应该能给你一些可以直接搬到代码里的参考。我在准备组会的时候已经把经典实现思路、常用trick、容易踩的坑都整理成了可以直接对着调的东西。如果你只是好奇“AI怎么把混合音频拆成一条条干净的轨道”也可以读。我会尽量把里面涉及的技术概念讲得贴近直觉比如用“见过苹果才知道苹果长什么样”这种例子来解释生成先验不一定严谨到推导每一个公式但保证你能理解它到底在做什么。2. 无监督音源分离到底在解决什么问题2.1 从一个鸡尾酒会问题说起音源分离在学术界有个很经典的名字叫“鸡尾酒会问题”。你去参加一个聚会屋里有很多人同时在说话还有背景音乐、碰杯声、脚步声但你的耳朵能精准地锁定对面朋友的声音还能在需要的时候把注意力切换到旁边人的对话上。这个能力对人类来说很自然但对机器来说极其困难。过去十几年主流的做法是走监督学习的路收集大量混合音频和对应的干净源喂给一个深度神经网络让网络学会从混合信号里“端到端”地预测出源信号。这套范式在特定数据集上做得非常漂亮比如在MUSDB18音乐分离数据集上人声和伴奏的分离质量早就达到了实用水平很多在线扒带工具背后就是这类模型。但问题在于这种监督范式严重依赖配对数据。你想分离人声和伴奏你得有一堆“人声和伴奏分开录制”的歌曲做训练集你想分离鼓、贝斯、吉他、人声四轨你得有一堆分轨工程文件。这种数据在真实世界中非常稀缺尤其是对于那些非主流语种、非典型乐器组合、特殊录音环境的场景你连找数据都找不到更别谈训练一个好模型。2.2 无监督方法的核心思路转变无监督方法想把这个问题彻底换一个解法我不再去学“从混合到干净”的直接映射而是分别学习“干净源数据长什么样”的概率分布然后在推理阶段利用这些分布约束从混合信号中搜索出最合理的源信号组合。打个比方假设你是一个经验丰富的果切师傅你切过无数个苹果和梨脑子里对“苹果的切面”“梨的切面”有非常清晰的印象。现在别人递给你一个打好的混合果汁你虽然看不到完整水果但你能结合果汁的颜色、气味、口感以及你对苹果和梨的先验认知推断出这杯果汁大概用了多少苹果、多少梨。生成先验做的事情本质上就是这个推理过程约束分离出来的每一部分都必须“像”它所属类别的干净样本同时两部分加起来要能还原回原来的混合信号。从“学映射”变成“学分布然后搜索”这个转变带来的最大红利就是你不再需要配对的混合-干净训练数据了。你只需要准备各个源类别单独的样本库这在很多真实场景下是更容易获得的。2.3 监督方法和无监督方法的直观对比我把两种范式放在一起对比过这样讲组会的时候同学们更容易抓住差异对比维度监督式音源分离无监督生成先验分离训练数据要求需要大量“混合-干净源”配对只需要各源类别的单类别样本核心原理学习混合到干净的映射函数学习源分布先验推理时搜索隐变量推理阶段一次前向传播速度快迭代优化计算量大泛化到新场景较差换场景容易崩相对更灵活先验可复用分离质量上限高尤其在数据充足时目前仍有差距但正在逼近这个表不是说我主张全面抛弃监督方法实际做工程的时候两者更多是互补关系。但如果你手头没有任何配对数据又必须把混合音频拆开生成先验这条路几乎是唯一可行的方向。3. 生成先验的原理与关键模块拆解3.1 什么是“生成先验”里的先验“先验”这个词听着玄乎其实意思很简单在对具体某段音频做判断之前你本来就具备的知识。我见过无数条干净的人声我知道人声应该有基频、有谐波、有发声和停顿的节律性我见过无数条干净的钢琴声我知道钢琴的频谱包络衰减很快、音符之间有明确的起音和释音。这些知识就是先验。生成先验指的是用生成模型把这种知识编码下来。最常见的做法是用生成对抗网络或者更近一些的扩散模型在大量干净源样本上训练一个生成器。训练完成后这个生成器的输入是一个低维隐变量向量输出是一段干净的源音频。换句话说生成器内部已经记住了一条“合理的人声”长什么样。于是分离问题就变成了给定一段混合信号我要找到一组隐变量让生成器生成出来的几段源音频加起来能和混合信号尽量一致。这不再是一个端到端的映射问题而是一个优化问题。3.2 从G到分离优化目标怎么写我以最直观的两人源混合场景为例假设混合信号是 (x)要分离出 (s_1) 和 (s_2)满足 (x \approx s_1 s_2)。使用两个预训练的生成器 (G_1) 和 (G_2)分别对应源1和源2的分布于是目标函数可以写成[ \min_{z_1, z_2} , | x - (G_1(z_1) G_2(z_2)) |_2^2 \lambda_1 \mathcal{R}_1(z_1) \lambda_2 \mathcal{R}_2(z_2) ]第一项是重构损失保证两个生成源加回去之后和原始混合信号足够接近。第二项和第三项是隐变量正则项用来约束隐变量落在生成器训练时见过的合理区域内防止优化过程跑到隐空间的犄角旮旯里生成出听起来很奇怪的音频。这个公式是整个方法的核心骨架。你可能会想就这么简单对就这么简单。关键不在于公式的复杂度而在于你如何选择生成器的架构、如何设计正则项、如何做优化初始化这些细节我在下面展开。3.3 生成器选择GAN还是扩散模型经典论文里用的比较多的是GAN形式的生成器。GAN生成器的一大优势是采样和反向传播都快生成一张或一段音频只需要一次前向传播这让迭代优化隐变量变得可行。而且GAN训练完成之后隐空间通常具有比较好的连续性相邻隐变量生成的样本在内容上也是相邻的这对优化过程很友好。扩散模型作为更新的生成范式在样本质量和多样性上往往更胜一筹但它的问题是推理本身就是多步迭代你再拿它做隐变量优化计算量会变得非常夸张。我之前试过用扩散先验做分离单段5秒音频的分离推理耗时是以分钟计的而GAN先验只需几十秒。所以在当前算力条件下如果目标是快速验证想法GAN先验还是更实际的选择。除了生成器架构还有一个细节值得注意生成器的输入域。音频不像图像一个天然的难点是它的时间动态性。如果直接在波形级别生成序列长度太长GAN很难训练稳定。所以在实践中很多工作选择先在短时傅里叶变换STFT的幅度谱域做生成把频谱当作“图像”来处理分离完成后再用相位恢复算法或多通道信息重建出波形。这次组会里我花了很大篇幅讲的也是这一点不是所有“音频生成”都是生成波形很多时候生成频谱图再倒回去是更稳的做法。3.4 正则项设计是决定成败的隐形手很多人第一次复现这个模型只写了重构损失结果发现优化的确能把混合信号重构得很好但分离出来的两路源信号根本没有意义的区分——所有内容都堆在了其中一个源里另一个源被优化成了一个几乎全零的静音谱。原因很简单重构损失只约束了“两个源相加等于混合”但它完全不关心两个源之间是否均衡、是否独立。如果 (G_1(z_1)) 自己就能近似重构整段混合信号那损失函数当然开心它没有必要一定要让 (G_2(z_2)) 也出力。解决办法有几个方向。一个是给两个隐变量的初始化做文章让两个生成器分别从它们各自的“典型样例”附近开始优化而不是都从原点或随机位置出发。另一个是显式地在损失函数里加入源之间的“互信息惩罚项”鼓励两个源在频谱上不要重叠过多。还有一个思路是交替优化每次都只更新一个生成器的隐变量固定另一个让两个源轮流去解释混合信号中的一部分而不是让一个生成器一口气吃掉所有内容。这些trick在论文里往往只是几行公式但在实际复现中我敢说大部分失败的实验都是栽在这个地方。4. 从想法到代码组会分享的实操配置4.1 数据准备与预处理细节我在准备组会演示时选了一个相对常规的配置两个源类别一个是人声一个是伴奏混合信号直接由这两个源的波形相加生成。这样做的原因是验证流程最方便而且人声分离本身是音源分离里落地场景最清晰的方向。数据方面我用的是公开的MUSDB18数据集的子集。预处理这一步有几个关键点。第一音频统一重采样到16kHz或者22.05kHz千万不要混合频率训练否则生成器会学到莫名其妙的伪影。第二做STFT时窗函数选择汉宁窗窗口长度建议1024hop length建议256这是我测试下来分离质量和计算量的平衡点。窗太短频率分辨率差生成出来的频谱会比较糊窗太长时间分辨率差瞬态音头会被抹掉。第三个细节是幅度谱的处理方式。直接对原始幅度谱做生成优化时梯度会被大能量频段主导小音量的细节容易被忽略。实践里我习惯对幅度谱做对数压缩用 ( \log(1 |X|) ) 作为生成器的输入输出域。等到做重构损失计算时再把对数域映射回线性域这样高频弱音和低频强音能更公平地参与优化。4.2 训练生成器时要注意的稳定性问题生成先验整个流程分为两阶段第一个阶段是训练生成器第二个阶段是推理时做隐变量优化。第一个阶段如果没做好后面全白搭。训练音频生成GAN时最典型的失败模式就是训练崩溃。我自己的经验是与其纠结各种花哨的GAN变体不如老老实实做好三件事一是在生成器和判别器里都用谱归一化能显著提升训练的稳定性二是采用Hinge Loss作为对抗损失实测比原始二分类交叉熵收敛曲线平滑得多三是学习率用Adam的默认值就行但千万别忘了给判别器做梯度惩罚或者谱归一化之外的额外约束。另外训练的时候一定要定时听生成的样本。只看loss曲线没有用GAN的loss本身没有绝对意义听起来像不像、有没有连贯的旋律、频谱结构自然不自然这些才是判断生成器训练到位的关键。我通常每5000步保存一次生成样本用整个人声验证集算一次FID风格的距离指标同时随机抽几段频谱图肉眼检查。4.3 推理阶段的优化配置细节生成器训练完之后进入分离阶段。这里有一套我实测比较稳定的参数直接列出来供参考配置项推荐值说明优化器Adam动量参数0.9, 0.999即可学习率0.01 到 0.05太高容易震荡太低收敛太慢迭代步数200 到 500视混合信号长度和复杂度调整初始化策略从各自类别的均值隐向量附近采样比随机初始化稳定得多重构权重 (\lambda_{rec})1.0主损失基本不用动隐变量正则权重0.001 到 0.01太大导致分离结果过度平滑优化策略交替更新两个隐变量每步只更新一个源交替进行交替更新这个操作我特别提一下。如果同时更新两个隐变量很容易出现一种情况两个生成器在优化过程中互相“抢”能量最终结果不伦不类。交替更新则让每个生成器在固定的另一侧条件下做局部修正很像坐标下降法虽然理论收敛速度不一定最优但在这个任务里实测效果很稳。4.4 评估指标怎么选别只盯着SDR组会讲到评估环节时我专门强调了一个事情评估无监督分离结果不能完全照搬监督方法的指标。最常用的分离质量指标是SDRSignal-to-Distortion Ratio它衡量的是分离后的源信号和干净参考源之间的整体误差。此外还有SIRSource-to-Interference Ratio衡量的是目标源里混入了多少其他源的成分SARSource-to-Artifacts Ratio衡量的是分离结果里有多少人为引入的失真。在监督场景下模型是被直接训练来优化这些指标的所以指标高通常意味着分离质量好。但在无监督场景里生成器先验本身可能就和真实源存在系统性差异所以即使分离思路正确SDR也可能不会特别高。我建议同时拍下分离结果的频谱图做主观对比以及跑一个下游任务来间接验证。比如分离出来的人声去做语音识别看识别准确率有没有提升这比单看SDR更能说明问题。5. 组会讨论环节大家最关心的几个问题5.1 “没有配对数据你怎么验证分离结果是正确的”这是组会上被问得最多的一个问题。说实话这个问题确实戳中了无监督方法的要害。目前的主流做法是在验证阶段仍然用有配对标准答案的数据集来做量化评估。也就是说训练模型时确实不碰配对数据但评估系统性能时还是要用带标签的数据算指标。这不算作弊因为评估和训练的数据使用方式本来就是两回事。类比来说你学游泳的时候可以没有教练给你打分但比赛的时候总得有裁判计时。更深一层的问题是如果连验证数据都没有怎么办那就只能靠人工主观评价和下游任务效果来间接判断。这也是目前无监督方法要真正落地到工业界之前必须面对的一个开放性难题。我个人觉得短期内的可行性路径是“半无监督”用大量无标注的真实混合数据做自监督预训练再用少量配对数据做微调这可能比纯粹的无监督更实用。5.2 “生成先验是不是只对特定类型的声音有效”这个问题问得很细。答案是对至少目前阶段确实存在偏科现象。生成器是在某种类型的干净源上训练的如果测试时的源类型和训练分布差得很远先验就会失效。举例来说你用人声生成器去分离开唱和音乐效果可能不错但如果你把一段包含狗叫或汽车引擎声的混合信号丢给它要求分离出狗叫声生成器根本没有见过“狗的叫声分布”它就没法提供有效的约束。这说明生成先验方法的上限取决于你的源类别覆盖度。这也意味着在实际应用时你需要对目标场景的源类型有一个预先的盘点到底是固定类型的源分离还是开放世界的通用分离如果是后者靠单个生成器先验是不够的可能需要配合其他通用音频表征模型一起做。5.3 “这个方法能不能扩展到两个以上声源”从原理上讲可以但计算量会随源数量线性增加而且优化难度会显著上升。每多一个源就多一个隐变量需要优化也就多一个可能陷入局部极值的维度。我在实验里试过三源分离人声、鼓、其他伴奏效果大幅下滑主要问题在于两个合成源之间容易出现互相混淆鼓的能量被人声或伴奏抢走了一部分。想改善的话一种做法是在预训练生成器时就把各源设计得更“正交”一些让他们的频谱特征空间重叠尽可能小另一种做法是把原来的整体优化拆成多阶段优化先分离出最显著的主源再从残差里分离次源。5.4 “推理这么慢有实用价值吗”这是一个很现实的问题。一轮优化要迭代几百步每一步都要做一次前向传播和反向传播处理一段10秒的混合音频可能耗时几十秒到几分钟这确实没法实时。但换个思路看很多音源分离的应用场景其实不需要实时。比如做音乐母带处理、做音频资料修复、做影视后期分轨这些都是离线任务哪怕一次处理花几分钟只要质量达标用户是可以接受的。如果真要做实时比较靠谱的路径是先用生成先验方法在离线场景批量生成一批高质量的伪配对数据然后用这些数据去蒸馏出一个轻量级的监督模型这样就可以兼顾质量和速度。5.5 “这个方法和其他无监督方法有什么本质区别”现在“无监督”这个词被用得很泛不同方法解决的核心问题不一样。有些自监督方法是在大量无标注混合数据上学习音频的通用表征然后再用少量标注做下游分离有些是基于聚类或盲源分离的传统方法比如独立成分分析它们依赖的是源信号之间的统计独立性假设。生成先验方法和其他无监督方法最大的区别在于它不仅利用了源信号的统计独立性还利用了对每一种源信号“长什么样”的深层语义知识。这种知识来自生成器在大量纯净样本上的分布学习因此它有能力在统计独立性假设不成立的复杂场景里仍然给出合理的分离结果。当然代价就是你要额外训练一个或多个高质量的生成器。6. 复现过程中踩过的坑与排查思路6.1 分离结果里两个源高度相似像是一个源换了层皮这是最常出现的问题。排查思路首先看损失函数曲线如果重构损失已经很低但分离结果相似度高说明问题出在源间约束上如果重构损失也居高不下说明生成器根本没找到合适的隐变量来拟合混合信号。针对前一种情况解决方案是加入显式的源间不相似惩罚我实测在频谱域计算两个源的余弦相似度然后作为惩罚项加进总损失函数里效果立竿见影。针对后一种情况先别急着调整损失函数先检查生成器本身的生成质量如果不是清晰可听的那无论优化算法多好都白搭。6.2 优化过程震荡不收敛我会优先怀疑学习率过高。迭代优化隐变量和训练神经网络的动态不一样隐变量在优化后期很容易在极小值附近来回跳动这时候宁可让学习率小一点、迭代步数多一点也不要贪快。另一个容易忽略的因素是输入混合信号的能量归一化。如果直接拿原始波形做STFT不同音频的响度差异会导致优化难度完全不同。我的做法是对每段混合信号做峰值归一化让幅度谱的最大值固定在一个统一的尺度上这能让优化过程稳定很多。6.3 分离结果听感很“假”有明显的生成伪影生成器在训练时会把干净源的一些共性结构刻进先验里但如果生成器本身容量不够或者训练数据量不足生成出来的样本就会带有某种“塑料感”。分离结果里这种质感也会被带出来。这个问题的根源在生成器训练阶段不在分离阶段。我的建议是如果条件允许先用大规模数据预训练一个通用音频生成模型再在小规模目标域数据上微调。直接用少量数据从零训练生成器很难得到足够细腻的先验。6.4 一个速查表留给以后踩坑的自己现象最可能原因优先尝试方案两个源分离结果高度相似缺少源间独立性约束加频谱域相似度惩罚优化震荡不收敛学习率过大或输入尺度不一致降低学习率做峰值归一化重构损失低但分离质量差一个生成器“吃掉”了全部内容交替更新限制每次更新幅度分离结果有塑料感生成器先验质量不足换更大生成器或用扩散模型某些音色完全没有分离出来生成器没见过该类别的频谱形态扩增该类别的训练数据高频细节丢失STFT窗口过长减小窗口增大hop比例7. 一些可以迁移到其他任务的经验准备这次组会的过程里我最大的收获其实不只是音源分离本身而是“用生成模型做逆问题”这套方法论。把它迁移到其他任务上通常只需要替换掉特定领域的数据和处理方式核心框架是完全共用的。比如图像领域的图像去噪、去模糊、超分辨率很早就有人用GAN先验来做无监督版本的求解。处理方式和音频分离几乎同构先训练一个高质量的干净图像生成器然后在推理时优化隐变量让生成图像通过退化模型之后能和观测图像保持一致。再比如语音增强针对特定说话人的语音生成器可以做成个性化先验在推理时约束增强结果长成“这个人的声音”。我自己总结下来用生成先验解决一类问题至少需要想清楚四件事第一你的观测模型长什么样也就是从干净信号到观测信号的退化过程是什么第二你是否有一个足够强的生成器来代表干净信号的分布第三退化过程是否可微如果不可微梯度怎么传第四隐空间优化是否容易陷入局部极值是否需要设计特殊的初始化或交替策略。这四件事想清楚方法迁移会非常快。另外说一句题外话组会后有个同学问我为什么现在很多做音频的论文都开始讲生成模型了。我的理解是过去几年音频领域的主要矛盾是“模型不够强”所以大家拼命设计更复杂的网络结构来直接拟合映射但现在的矛盾逐渐变成了“数据不够多、标注不够全”所以研究方向开始转向如何用更少的数据、更少的标签让模型真正理解音频内容本身。生成模型恰好提供了一种把理解变成约束的途径这可能是它越来越受关注的原因。如果这次组会的内容能给你带来哪怕一点点启发让你在考虑自己的课题时多了一条“也许可以试试无监督”的思路这篇内容就没白写。从论文的标题到复现的坑一路看下来生成先验的方法离完美还很远但它打开了一扇门原来没有配对数据我们也能做分离而且效果并不算差。这就值得认真对待。
返回列表