在百度deepspeech 2 上的改进点
1.框架选择
背景:2019年3月12号接受了新采购的GPU机器一台,由于新机器适配的驱动版本太高(2019年2月发布),deepspeech 2转写模型使用的深度学习框>架theano偏学术研究,theano的开发团队在17年就加入了google,已经停止维护,theano不支持分布式,相比之下tensorflow框架更偏工程,已经是 主流框架,支持分布式,支持新硬件,我们有必要对转写工程做框架调整。
deepspeech 2模型框架:theano_0.8.2、keras_1.1.0
deepspeech-enhance模型框架:tensorflow_1.13.1、keras_2.2.4
分析:根据调研资料显示,tensorflow新版本相比theano可以带来性能上一倍的提升,同时需要更大的内存。
2.声学模型结构
在模型结构上主要做了6项调整,分析了每个调整项带来的影响:
调整项 | deepspeech 2模型 | deepspeech-enhance模型 | 准确率 | 性能 | 资源占用 | 说明 |
---|---|---|---|---|---|---|
网络结构 | 1D_CNN+3*GRU | 1_DCNN+3*BiGRU | 有提升 | 降低近一倍 | 更大的内存 | 现在双向网络已是主流,transformer、bert等都是双向>网络 |
损失函数 | warp-ctc(baidu出品) | tensorflow-ctc(google出品) | 不确定 | 降低一点 | 不确定 | 前者是batch纬度计算损失,并行度高,但是训练阶段容易出现长尾问题;后者是样本纬度计算损失,训练过程不会出现长尾问题 |
输出节点数 | 26个英文字母+2 | 4563个常用汉字 | 降低 | 降低一点 | 增加 | 汉字共有6000左右,统计发现有一千五百多个生僻字出现在日常对话中的概率极低 |
语音帧长 | 20ms | 25ms | 有一点提升 | 提升一点 | 更小的内存 | - |
采样率 | 16k | 8k | 有一点降低 | 提升 | 更小的内存和磁盘 | 工业使用中在保证效果的前提下节省一半空间 |
3.其他调整项
(1)卷积层输出处理:忽略卷积层的前两位输出,因为它们通常无意义,且会影响模型最后的输出;
(2)BN层处理:最后一次训练冻结BN层,传入加载模型(纯开源数据训练的)的移动均值和方差。 调整后准确率平均提升2个百分点
4.增加beam search和n-gram组合解码模块(这里是重点)
- deepspeech 2 模型是贪婪搜索解码
- deepspeech-enhance的解码模块使用现在GitHub 上比较热门的mozilla基金会实现的beam search解码模型,n-gram的作用就是进一步纠错。
关于解码
为了在解码过程中整合语言模型信息,Graves&Jaitly(2014)使用其经过CTC训练的神经网络对由基于HMM的最新系统生成的晶格或n最佳假设列>表进行评分。 这引入了潜在的混淆因素,因为n最佳列表会很大程度上限制可能的转录集。 另外,它导致整个系统仍然依靠HMM语音识别基础结构来 获得最终结果。 相反,我们提出的首遍解码结果使用神经网络和语言模型从头开始解码,而不是对现有假设进 行重新排序。