说话人识别中的损失函数
Posted DEDSEC_Roger
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了说话人识别中的损失函数相关的知识,希望对你有一定的参考价值。
损失函数
- 损失函数 L ( y i , y ^ i ) L(y_i,\\haty_i) L(yi,y^i)用来描述神经网络的输出 y ^ i \\haty_i y^i和基本事实(Ground Truth,GT) y i y_i yi的差异
- 对于回归问题,常用均方误差(Mean Square Error,MSE)损失函数
L ( y i , y ^ i ) = ∥ y i − y ^ i ∥ 2 2 L(y_i,\\haty_i)=\\left \\| y_i-\\haty_i \\right \\|_2^2 L(yi,y^i)=∥yi−y^i∥22 - 神经网络的训练过程就是寻找一组参数
θ
\\theta
θ,使得神经网络在一个batch的训练上,损失函数的和最小
θ = arg min θ ∑ i = 1 N L ( y i , y ^ i ) \\theta=\\arg\\min_\\theta\\sum_i=1^NL(y_i,\\haty_i) θ=argθmini=1∑NL(yi,y^i) - 对于说话人识别,通常有两种类型的损失函数
- 将说话人识别看作一个多说话人分类问题,即模拟说话人辨认问题
- 将说话人识别看作一个二值决策问题,即模拟说话人验证问题
多说话人分类
- 在该问题中,假设不同的说话人属于不同的类
- 训练时
- 每个说话人都有一个全局唯一标签
- 每个话语(Utterance)都有一个说话人标签
- 运行时
- 需要识别在训练集中未出现过的说话人,因此无法使用训练数据的标签作为输出
- 得到嵌入码之后,需要经过一个MLP(该MLP的激活函数是Softmax),得到该嵌入码属于训练数据中哪一个说话人的概率分布
Cross Entropy Loss
- 得到概率分布后,使用交叉熵(Cross Entropy,CE)损失函数,计算预测的概率分布,与真实的概率分布之间的差距,假设概率分布的向量维度为K
H ( p , q ) = − ∑ i = 1 K p i ⋅ ln q i H(p,q)=-\\sum_i=1^Kp_i\\cdot\\ln q_i H(p,q)=−i=1∑Kpi⋅lnqi
其中,- p p p是真实的概率分布,采用独热向量(One-hot Vector),即只有真实说话人对应的值为1,其他的值都为0
- q q q是预测的概率分布,经过Softmax激活函数之后,最大值接近1,所有值求和等于1
- 由于 p p p为独热向量,所以损失函数简化为 H ( p , q ) = − ln q j H(p,q)=-\\ln q_j H(p,q)=−lnqj, q j q_j qj指预测的概率分布中,真实说话人对应的概率
- H ( p , q ) H(p,q) H(p,q)的值越小,代表两个分布越接近
- 训练时:在训练数据上,最小化 H ( p , q ) H(p,q) H(p,q)来优化参数
- 运行时:直接使用嵌入码,用于说话人识别(可用余弦相似度、欧氏距离等)
- 这种方法的缺点
- 用于计算概率分布的MLP,其参数会随着训练数据说话人数量线性增加
- 例如嵌入码的维度是1280,训练数据有1000人,那么MLP的参数矩阵 W S o f t m a x ∈ R 1000 × 1280 W_Softmax \\in R^1000 \\times 1280 WSoftmax∈R1000×1280,光是MLP的参数量就达到了128万
- 训练集中,部分说话人的数据量较少,这意味着 W S o f t m a x W_Softmax WSoftmax中,有部分参数极少发挥作用,但是前向传播时每次都需要计算整个矩阵,这导致训练过程中,花费了大量的资源用于优化几乎没有用的参数
- W S o f t m a x W_Softmax WSoftmax只在训练时发挥作用,与运行时的相似度计算不完全一致,这会导致网络难以泛化到训练集中未出现过的说话人
Angular Softmax
- 为了改善训练和运行时,目标不匹配的问题,Softmax有一个变种,叫做Angular Softmax,思路如下:
- 将 W S o f t m a x W_Softmax WSoftmax中的每个行向量 w r w_r wr都限制为单位长度的向量,设嵌入码为 e e e,那么 w r ⋅ e = ∣ ∣ e ∣ ∣ cos θ i w_r \\cdot e=||e|| \\cos \\theta_i wr⋅e=∣∣e∣∣cosθi
- W S o f t m a x ⋅ e W_Softmax \\cdot e WSoftmax⋅e的运算结果,就是 e e e的范数,乘以一个余弦值,此时的优化过程,会与运行时的相似度计算更加一致
- 注意,关于Softmax的计算,如果幂的值很大,取指数会导致溢出(即便是Python也要考虑这个问题),此时需要令输入向量中的每一个值,都减去向量中的最大值,然后再进行标准的Softmax运算,这不影响运算结果,但是保证了数值计算的稳定,原因如下
y i = e x p ( x i − x m a x ) ∑ j = i K e x p ( x j − x m a x ) = e x p ( x i ) / e x p ( x m a x ) ∑ j = i K [ e x p ( x j ) / e x p ( x m a x ) ] = e x p ( x i ) ∑ j = i K e x p ( x j ) \\beginaligned y_i&=\\fracexp(x_i-x_max)\\sum_j=i^Kexp(x_j-x_max) \\\\ &=\\fracexp(x_i)/exp(x_max)\\sum_j=i^K[exp(x_j)/exp(x_max)] \\\\ &=\\fracexp(x_i)\\sum_j=i^Kexp(x_j) \\\\ \\endaligned yi=∑j=iKexp(xj−xmax)exp(xi−xmax)=∑j=iK[exp(xj)/exp(xmax)]exp(xi)/exp(xmax以上是关于说话人识别中的损失函数的主要内容,如果未能解决你的问题,请参考以下文章