一直觉得RNN是一个可玩性很高的模型,因为现实中我们需要建模的对象往往都可以理解为时间或者空间上的序列(sequence),比如语音,视频,字迹,文本,这种特性极大丰富了RNN处理问题的种类(语言模型,声学模型,机器翻译等等)。一直很火的End-to-End,比如我知道的CTC,RNN-Transducer,Attention(encoder-decoder)也全部based on RNN。既然它可以对序列建模,那么根据不同的输入和输出设计,就可以完成Classification(one-to-one),Embedding(many-to-one),序列生成(one-to-many),seq2seq(many-to-many)等任务。

阅读全文 »

平时训练模型的时候知道一些常见的防止过拟合的tricks,但是也只是拿来用一下,比如dropout和BN等等,基本没有了解过why层面的东西。最近看了一下dropout,batch-normalization的论文,以及DeepLearning Book里面正则化那一章,做一下小结。

阅读全文 »

模型训练中的学习率是最重要的超参数之一,目前的学习率优化方法主要有两大类,一类可以在训练过程中定义存在其他动态的超参数参与的调整更新规则,另一类是预先设定的更新(一般是衰减)规则,比如线性衰减,指数衰减等。

min-batch SGD从训练集中随机fetch出大小为m的batch,执行更新规则如下:

阅读全文 »

在识别任务中,我们会产生这样的一个疑问,即分类器训练的越充分,是否会带来更高的识别率?从经验上来说不能承认这一点,因为基于CE的分类只是针对frame级别的判别(误差定义在frame上)而识别的本质是一个序列mapping的任务。序列区分性训练尝试在识别序列上定义误差,从这一点上来看,更加接近于识别的最终目标,因而也会相应的获得较高的识别率。

阅读全文 »

解码是指在构建好的解码网络(图)中,根据输入的音频,生成最优序列的过程。在kaidi中,解码之前,解码网络(实际上是一个巨大的WFST)是已经构建好了的(一般称之为静态解码器),也就是熟知的HCLG。在这张图中,状态节点并无太大意义(毕竟不是自动机),信息存储在状态和状态的转移边之间。输入为tid(tid为0表示没有输入/输入为空$\epsilon$,因而可以连续跳转),输出为词,权值为语言模型的权值。解码过程中,声学模型的后验概率需要实时计算得出(特征+声学模型)。理解解码过程需要弄清以下几个方面:

阅读全文 »

kaldi中ivector的提取程序在ivector-extractivector-extract-online2中,分别提取离线和在线的ivector。考虑到后续需要分析online的解码逻辑,所以在第二篇笔记中会仔细介绍在线情况下统计信息的累计和ivector估计方法。本篇主要介绍离线方法以及在线方法的整体框架。

阅读全文 »

本篇主要解释我在学习ivector中遇到的一些比较困惑的点。在kaldi的nnet3中传统声学模型加上ivector已经成为online模型的标配。对于在线模型的特征提取,传统的方法采取全局和滑动窗的CMVN对输入特征进行归一化,而kaldi推荐的方案是使用ivector加上原始声学特征(参见论文A time delay neural network architecture for efficient modeling of long temporal contexts)。

阅读全文 »

本篇是对论文 Parallel training of DNNs with Natural Gradient and Parameter Averaging前几个部分的翻译。

摘要

我们描述了一种在kaidi语音识别工具中使用的一种面向多核,多GPU机器的神经网络训练框架。为了尽可能与硬件无关,我们需要一种方法来使用多台机器,而不会产生过多的网络流量。这里使用的方法是周期性的平均网络参数(每一或者两分钟),然后将平均之后的参数重新分布到机器上进行进一步的训练。每台机器都只能看见自己的训练数据。本身来说,这种方法并不能很好的工作。但是,我们有另外一种方法,就是正确且有效的实现了针对随机梯度下降的自然梯度,它可以允许我们的周期性平均方法工作的很好,并且极大的提高了在单个机器上的SGD收敛程度。

阅读全文 »

为什么有这个想法,因为自己有过体验,当初做的第一个语音增强的demo,傻乎乎的自己实现特征提取,自己实现网络前向,于是就需要将kaldi的网络参数转写成方便自己程序读取的格式,还需要不断对比自己实现的特征结果和HTK的结果是否一致,这期间花费的时间个人觉得已经远远的超出做demo本身的意义,最主要的是,由于当初实现的代码仅仅是针对当初的需求,而一旦后期的特征配置或者网络结构发生变化,之前的工作就要重复一次,如此低效率的事情我个人是不想重复做的。

阅读全文 »

语音唤醒任务的一种常见解决方案是通过评估连续语音中分段时间窗内的音频特征和预先置入的关键词模板之间的相似性来决定系统是否唤醒,而DTW(动态时间规整算法)能够有效的衡量两个不等长序列之间的最短距离/相似性,因此在这类解决思路下被广泛使用。这里可以采用的特征有声学特征,后验特征,embedding特征或者BN特征等等,鲁棒的特征对最终的系统表现有着积极的影响。将连续语音和关键词模板之间的距离矩阵绘制出来(关键词模板在纵轴方向),可以得到如下的结果(使用的是MFCC特征)。图中蓝色的路径为最低代价下对齐/匹配路径。在唤醒系统中,我们将当前滑动窗下的最低匹配代价作为相似性打分,调出一个合理的阈值就可以做一个简单的唤醒演示系统了(实际表现中,打分平滑,模板平均等等还是有很多trick的)。

阅读全文 »