用Wavenet做中文语音识别

2016年Google发布的Wavenet语音合成系统,因为没有相关实践,暂且不说。因为偶然的机会看到一篇博客TensorFlow练习15: 中文语音识别。当时,恍然大悟,Wavenet也可以用来做语音识别,后来就深入进去;其实,论文中就有阐述,但是泛泛而谈,实现的话需要很多的tricks:

而且Wavenet的系统架构非常有意思,融合了dilated CNN,残差网络,CTC,LSTM中的门,1*1卷积核等经典结构:

我是基于清华30小时中文数据集进行实践,因为没有充足的时间进行模型调参优化,目前识别准确率并不高,记录于此,聊作备忘。

① CTC可以说是现在端到端语音识别系统的标配,它解决了文本序列和神经网络模型输出的一对多映射问题,因此可以搭建端到端系统。

② 1*1卷积核的研究最早见于14年的论文Network In Network,后来谷歌在Inception的模型中发扬光大。它的作用是整合多通道信息进行非线性变换,并且可以进行通道升降维(卷积核都有升降维的左右,但1*1卷积核的优点是参数更少),因此在神经网络模型中可以跳跃链接(见Residual部分,匹配相连层的通道数)。

③ 残差神经网络结构的核心是将之前的输入跳跃连接到n层后的输出,可以解决深层网络的梯度弥撒问题;Wavenet模型采用分block策略,每个block的输入和输出相加,然后再作为下一个block的输入,每层包含128。

④ 经典的门结构见于LSTM模型,可以对输入信息进行有效选择,应用在长距离(长时)有效信息相关性的架构中,比如自然语言处理。

⑤ dilated CNN模型可以增加卷积核的感受野,利用更长距离的上下文信息:

如上如所示,网络模型的层数n_layers为4,卷积核的大小filter_width为2,左图为经典CNN模型,感受野大小为2+4-1=5,只利用输入数据的5维信息,而dilated CNN模型的感受野大小则是2的4次幂为16,利用了更长的输入数据信息,而且可以不用pooling层。

程序实现中,采用的策略有:

a) Xavier权值初始化策略;

b) 每次epoch的数据随机打乱策略;

c) Batch Normalization策略;

d) 因为硬件资源GPU的限制,目前只实现了3个block,每个block包含五层dilated卷积层;

e) 采用Adam参数学习策略。

程序代码:Deeper/tensorflow-wavenet

编辑于 2017-05-24