说话人识别中的损失函数

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)=yiy^i22
  • 神经网络的训练过程就是寻找一组参数 θ \\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=1NL(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=1Kpilnqi
    其中,
    • 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 WSoftmaxR1000×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,思路如下:
    1. 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 wre=∣∣e∣∣cosθi
    2. W S o f t m a x ⋅ e W_Softmax \\cdot e WSoftmaxe的运算结果,就是 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(xjxmax)exp(xixmax)=j=iK[exp(xj)/exp(xmax)]exp(xi)/exp(xmax

    以上是关于说话人识别中的损失函数的主要内容,如果未能解决你的问题,请参考以下文章

    说话人识别中的损失函数

    SFSpeechRecognizer - 检测话语结束

    说话人识别的数据需求

    如何在 Python 中实现 Microsoft 说话人识别/验证 API?

    说话人识别概述

    向预先训练的说话人识别模型中添加新说话人