EBET易博官网模型训练——Loss函数

  新闻资讯     |      2023-09-16 19:48

  上一篇文章《语音降噪模型归纳汇总》,很意外地收到了点赞和关注,这里就再梳理了一下loss函数相关的知识,以求方便能作为一份工具性质的文章展现出来。能力一般,水平有限,欢迎大家指正。

  预测值(估计值)与实际值(预期值、参考值、ground truth)之间会存在差异, “损失”意味着模型因未能产生预期结果而受到的惩罚。

  损失函数将通过比较模型的预测输出和预期输出来确定模型的性能,进而寻找优化方向。如果二者之间的偏差非常大,则损失值会很大;如果偏差很小或值几乎相同,损失值会非常低。因此,需要使用合适的损失函数,当模型在数据集上进行训练时,该函数可以适当地惩罚模型。

  平均绝对误差(MAE)损失,也称L1范数损失,计算实际值和预测值之间绝对差之和的平均值。

  EBET易博

  适用于回归问题,MAE loss对异常值更具鲁棒性,尤其是当目标变量的分布有离群值时(小值或大值与平均值相差很大)。

  均方误差(MSE)损失,也称为L2范数损失,计算实际值和预测值之间平方差的平均值。

  平方意味着较大的误差比较小的误差会产生更大的惩罚,所以MSE的收敛速度要比L1-loss要快得多。但是,L2 Loss对异常点更敏感,鲁棒性差于L1。

  正则化的基本思想是向损失函数添加一个惩罚项(L1/L2)用于惩罚大的权重\omega,隐式地减少自由参数的数量。假设L\left( \hat{y},y \right)是未加正则项的损失,\lambda是一个超参,用于控制正则化项的大小。

  正则化之所以能够降低过拟合的原因在于,正则化是结构风险最小化的一种策略实现。给loss function加上正则化项,能使得新得到的优化目标函数h = f+normal,需要在f和normal中做一个权衡(trade-off),如果还像原来只优化f的情况下,那可能得到一组解比较复杂,使得正则项normal比较大,那么h就不是最优的,因此可以看出加正则项能让解更加简单,符合奥卡姆剃刀理论,同时也比较符合在偏差和方差(方差表示模型的复杂度)分析中,通过降低模型复杂度,得到更小的泛化误差,降低过拟合程度。L1正则化与L2正则化

  注:根据公式,添加正则化项,loss值会随着超参\lambda设定不同程度的变大,而实际pytorch实现过程中却并未出现如此现象,原因是loss在计算的时候没有把权重损失算进去。

  残差比较小时,此函数是二次函数;残差比较大时,此函数是线性函数。残差,即观测值和预测值之间的差值。与平方误差损失相比,Huber损失对数据中的异常值不那么敏感。使函数二次化的小误差值是多少取决于“超参数”\delta,它可以调整。当\delta=1时,退化成SmoothL1Loss。

  物理意义和解析过程引自台湾省台湾大学李宏毅教授的教材,其中符号的使用有些非常规,注意观察。

  从图中可以看出来X^{*}的方向和长度对SDR loss的值都有影响。但是,如果方向不变长度变小的话,SDR loss也可能会变小,似乎存在一些不合理之处。

  结合公式,从图中可以看出来,SI-SDR表示的是X^{*}和\hat{X}的方向偏差。X_{T}和X_{E}为同一个向量的一组垂直分量,二者能量比值与原向量的长度无关。

  值得注意的是,如果单独使用SI-SDR,可能会导致模型估计输出与输入之间的幅值不稳定,并且如果训练数据中存在0值时,单独使用SISDR时会出现问题,公式计算不稳定,SDR的值都会爆炸,所以一般会结合一定尺度的MSE loss一起使用。

  PMSQE损失函数是用于近似PESQ metric的一种语音质量算法。经过处理的语音信号的PESQ分数是1到4.5之间值,其中1表示质量极差,4.5表示完全没有失真。PMSQE loss函数的设计与PESQ成反比,低PMSQE值对应高PESQ值。PMSQE的定义范围为3到0,其中0相当于未失线相当于极低的质量。

  在语音分离/降噪任务中,将估计语音和clean语音做loss是常规操作,在此基础上,将噪声也作为一种估计与noise做loss,构成多任务降噪的一个实例。

  其中,x是mix的noisy(带噪)信号,y是mix前的clean(干净语音)信号,z是mix前的noise(噪声)信号;\hat{y}是估计的语音信号,\hat{z}=x-\hat{y}是估计的噪声信号。

  多任务学习loss,上面提到过的wSDR可以看做是多任务学习loss的一个案例。

  但是,由于不同任务loss的量级可能不尽相同,这种直接相加的方式显然欠妥,导致效果变差。

  但是,这种配置方式只能解决初期的收敛,随着训练的进行,每个loss的收敛速度和收敛阶段也会出现差异,这又引导我们优化出一套随着时间t动态变化的权重参数:

  测量给定输入向量y和标签向量label(包含1或-1)的损耗。这通常用于测量两个输入是否相似,通常用于学习非线性嵌入或半监督学习。

  负对数似然损失函数(NLL)仅适用于以softmax函数作为输出激活层的模型。用于多分类问题。

  因为交叉熵描述了两个概率分布的差异,然而神经网络输出的是向量,并不是概率分布的形式。所以需要 softmax激活函数将一个向量进行“归一化”成概率分布的形式,再采用交叉熵损失函数计算 loss。

  KL散度,用于计算两个概率分布之间的差异。输出两个概率分布的接近程度,如果预测的概率分布与真实的概率分布差别较大,将导致加大的损失,如果KL散度的值为零,则意味着概率分布相同。

  用于测量给定输入向量x1、x2和向量标签label(值为1或-1)的损失。这用于使用余弦距离测量两个输入是否相似,通常用于学习非线性嵌入或半监督学习。

  余弦相似度的损失,目的是让两个向量尽量相近。注意这两个向量都是有梯度的。