由于我主要研究问答系统,因此本博客仅更新NLP及问答相关内容,最近创了一个群,如果大家感兴趣可加q群号:376564367
github:https://github.com/makeplanetoheaven/NlpModel/tree/master/SpeechRecognition/AcousticModel/dfsmn_v2
背景知识
FSMN和DFSMN系列模型的结构及其实现原理可参考如下两篇博客:
1.FSMN结构快速解读
2.DFSMN结构快速解读
基于CNN+DFSMN的声学模型实现
本模型是在传统CNN模型的基础上,引入2018年阿里提出的声学模型DFSMN,论文地址:https://arxiv.org/pdf/1803.05030.pdf。
该声学模型使用的输入是经过fbank特征提取以后的具有16ms采样率,单声道音频数据。
DFSMN结构如下图,与语音识别|基于CNN+DFSMN(简化版:标量+无步长因子)的声学模型实现及代码开源(keras)相比:
![语音识别|基于CNN+DFSMN(完整版:向量+有步长因子)的声学模型实现及代码开源(tensorflow) 语音识别|基于CNN+DFSMN(完整版:向量+有步长因子)的声学模型实现及代码开源(tensorflow)](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzI5OS8yYzE0MzUyM2IzNjFkN2Y0NDk1ODUxMTYxMzFjYTM3Yi5wbmc=)
(1)简化版
在记忆单元计算上,使用的是类似sfsmn中的标量权重来计算第t时刻的隐藏状态,且没有引入步长因子stride,即
ptl=ptl−1+ptl+i=1∑l_mem_sizemem_weightl_mem_size−i⋅pt−il+i=0∑r_mem_sizemem_weightl_mem_size+i⋅pt+il
其中,l表示dfsmn的第l层,t表示第t时刻的隐藏状态,l_mem_siz表示前向记忆单元长度,r_mem_siz表示后向记忆单元长度,mem_weight用于存储权重,是一个长度为l_mem_si+r_mem_siz+1一维向量。
(2)完整版
在记忆单元计算上,使用的是类似vfsmn中的向量权重来计算第t时刻的隐藏状态,且引入步长因子stride,即
ptl=ptl−1+ptl+i=1∑l_mem_sizemem_weightl_mem_size−i⊙pt−i∗stridel+i=0∑r_mem_sizemem_weightl_mem_size+i⊙pt+i∗stridel
此时,mem_weight是一个形状为[l_mem_si+r_mem_siz+1,hidden_num]的二维矩阵。
在该模块中,主要包含了以下4个部分内容:
模型结构和模型调用方式和简化版基本相同,这里不再描述,主要区别在dfsmn单元的实现方式。