使用d-Vector的流程

本文基于Deep Speaker: an End-to-End Neural Speaker Embedding System论文进行阐述。

1 预处理 Preprocessing

  1. 读取.wav文件,把它读进一个数组中.
  2. 遍历数组,分chunk检查(50ms),如果该chunk是静音(使用能量检测),那么省略该chunk.
  3. 如果数组长度不够(音频长度不够1.6s),那么在末尾补0。

2 特征提取 Feature Extraction

  1. 先分帧25ms, 移帧10ms, sample rate 16k, 滤波器64个,也就是mfcc有64维。
  2. 使用python自带的fbank()将filter-bank提取出来,然后normalize,得到的特征的维度是:(num_frames,64, 1)

3 CNN 训练 Training

3.1 预训练

使用部分数据来预先训练,使得收敛更快。不是强制。
输入应当是当前的语音所有的帧提取出来的mfcc放在一起,输入进去。y_label应该是one-hot对应说话人。
注意的是,在建立CNN模型的class中,没有加入输出层softmax,因为我们只想要last hidden layer's activation output。因此,在训练的时候,需要加上一层softmax output layer。
Loss function 使用 categorical-crossentropy loss

求导数:


好处是当误差大的时候更新步伐大,小的时候步伐小,因为取决于实际值和预期值之间的差距,也就是只是取决于误差大小。

3.2 训练

  1. 可以分batch来训练,使用triplet loss的方法。这一步在百度的论文中很关键:挑选出两个不同的说话人,一个说话人挑选两个音频,也就是一个anchor一个positive,另一个说话人挑选出一段作为negative。
  2. 在挑选postive 和 negative的时候,为了提升网络的性能,可以使用预训练训练好的网络,分别看一看embedding,尽量在每一组中,选择最不相似的postive,和最相似的negative,这样能够cover极端情况。


    DNN.png
  3. 一般使用6层,该论文使用的是5层,一层input, 3层hidden layer, 1层output。
  4. 从最后一层隐藏层中得到向量并且使用L2归一。也就是说,对于属于新发言者的给定话语的每一帧,我们使用训练好的DNN中的标准前馈传播计算最后隐藏层的输出激活,然后累积这些激活以形成该发言者的新紧凑表示,也就是 d-vector. L2归一化的解释可以参考附加链接。这样能够使得向量中的每一个值都在一定范围内。
  5. 如果一个说话人注册了多次语音,那么使用这些 d-vector 的平均值来表示说话人。

使用最后一层隐藏层而不是输出层的原因:

  1. 首先,我们可以通过修剪输出层来减少运行时的DNN模型大小,这也使我们能够在运行时使用大量开发说话人而不增加DNN大小(举例说明,我们训练在10000个人或者1000个人的情况下,可以只通过修改最后的softmax层的大小,前面的结构保持不变,这样实现了增加训练类比和数目,特征向量不变)
  2. 使用最后一层隐藏层更能被推广,因为softmax很敏感,一般用来表达哪一个说话人而不是特征向量。

3 DNN 训练中可以加入的技术

3.1 使用Dropout防止过拟合(Overfitting)

我们在前向传播的时候,让某个神经元的激活值以一定的概率p停止工作,这样可以使模型泛化性更强,因为它不会太依赖某些局部的特征。


Dropout.png

流程:

  1. 首先随机(临时)删掉网络中一半的隐藏神经元,输入输出神经元保持不变(图3中虚线为部分临时被删除的神经元)


    image.png
  2. 然后把输入x通过修改后的网络前向传播,然后把得到的损失结果通过修改的网络反向传播。一小批训练样本执行完这个过程后,在没有被删除的神经元上按照随机梯度下降法更新对应的参数(w,b)
  3. 恢复被删掉的神经元(此时被删除的神经元保持原样,而没有被删除的神经元已经有所更新)
  4. 重复

为什么dropout防止过拟合?

  1. 取平均的作用: 先回到标准的模型即没有dropout,我们用相同的训练数据去训练5个不同的神经网络,一般会得到5个不同的结果,此时我们可以采用 “5个结果取均值”或者“多数取胜的投票策略”去决定最终结果。这种“综合起来取平均”的策略通常可以有效防止过拟合问题。因为不同的网络可能产生不同的过拟合,取平均则有可能让一些“相反的”拟合互相抵消。dropout掉不同的隐藏神经元就类似在训练不同的网络,随机删掉一半隐藏神经元导致网络结构已经不同,整个dropout过程就相当于对很多个不同的神经网络取平均。而不同的网络产生不同的过拟合,一些互为“反向”的拟合相互抵消就可以达到整体上减少过拟合。
  2. 减少神经元之间复杂的共适应关系: 因为dropout程序导致两个神经元不一定每次都在一个dropout网络中出现。这样权值的更新不再依赖于有固定关系的隐含节点的共同作用,阻止了某些特征仅仅在其它特定特征下才有效果的情况 。迫使网络去学习更加鲁棒的特征 ,这些特征在其它的神经元的随机子集中也存在。换句话说假如我们的神经网络是在做出某种预测,它不应该对一些特定的线索片段太过敏感,即使丢失特定的线索,它也应该可以从众多其它线索中学习一些共同的特征。从这个角度看dropout就有点像L1,L2正则,减少权重使得网络对丢失特定神经元连接的鲁棒性提高。

3.2 Maxout激活函数

本来传统的MLP算法在第i层到第i+1层,参数只有一组,然而现在在这一层同时训练n组参数,然后选择激活值最大的作为下一层神经元的激活值。


Figure.png
  1. 要计算层,则是:


    f是激活函数,可以是tanh, sigmoid等等。
  2. 使用maxout的话,则是在中间插入隐藏层。maxout本身是一层,但是内在有好几层隐藏。此时
    image.png







    所以采用maxout的时候,参数个数成k倍增加。它的拟合能力非常强,可以任意逼近凸函数。一般和Dropout一起配合使用。

4 思考

4.1为什么d-vector比i-vector更适应嘈杂环境?

  1. Dropout 和 Maxout使得它在不同环境下适应更快。
  2. GMM 最多只能处理7-9frames,但是DNN可以处理40frames的背景

4.2

混合系统的性能表现比i-vector 和 d-vector都要更好。

5 Reference List

  1. L2范数归一化概念和优势
    https://www.cnblogs.com/Kalafinaian/p/11180519.html
  2. 深度学习中Dropout原理解析
    https://blog.csdn.net/program_developer/article/details/80737724
  3. [论文品读]·d-vector解读(Deep Neural Networks for Small Footprint Text-Dependent Speaker Verification)
    https://blog.csdn.net/xiaosongshine/article/details/89102964
  4. 深度学习(二十三)Maxout网络学习
    https://blog.csdn.net/hjimce/article/details/50414467
  5. Deep Speaker: an End-to-End Neural Speaker Embedding System

你可能感兴趣的:(使用d-Vector的流程)