社会焦点

教程 | 如何使用TensorFlow构建、训练和改进循环神经网络

字号+ 作者: 来源: 2017-03-26

教程 | 如何使用TensorFlow构建、训练和改进循环神经网络,字符循环怎么打c语言,tensorflow 三层神经网络,自然语言处理 rnn,bp神经网络预测模型的改进

来自 Silicon Valley Data Science 公司的研究人员为我们展示了循环神经网络(RNN)探索时间序列和开发语音识别模型的能力。目前有很多人工智能应用都依赖于循环深度神经网络,在谷歌(语音搜索)、百度(DeepSpeech)和亚马逊的产品中都能看到RNN的身影。

然而,当我们开始着手构建自己的 RNN 模型时,我们发现在使用神经网络处理语音识别这样的任务上,几乎没有简单直接的先例可以遵循。一些可以找到的例子功能非常强大,但非常复杂,如 Mozilla 的 DeepSpeech(基于百度的研究,使用 TensorFlow);抑或极其简单抽象,无法应用于实际数据。

本文将提供一个有关如何使用 RNN 训练语音识别系统的简短教程,其中包括代码片段。本教程的灵感来自于各类开源项目。

  本项目 GitHub 地址:https://github.com/silicon-valley-data-science/RNN-Tutorial

  1906 年爱迪生留声机广告的语音识别事例,其中包括声音幅度的运行轨迹,提取的频谱图和预测文本

首先,在开始阅读本文以前,如果你对 RNN 还不了解,可以阅读 Christopher Olah 的 RNN 长短期记忆网络综述:

  

语音识别:声音和转录

直到 2010 年时,最优秀的语音识别模型仍是基于语音学(Phonetics)的方法,它们通常包含拼写、声学和语言模型等单独组件。不论是过去还是现在,语音识别技术都依赖于使用傅里叶变换将声波分解为频率和幅度,产生如下所示的频谱图:

教程 | 如何使用TensorFlow构建、训练和改进循环神经网络

在训练语音模型时,使用隐马尔科夫模型(Hidden Markov Models,HMM)需要语音+文本数据,同时还需要单词与音素的词典。HMM 用于顺序数据的生成概率模型,通常使用莱文斯坦距离来评估(Levenshtein 距离,是编辑距离的一种。指两个字串之间,由一个转成另一个所需的最少编辑操作次数。可以进行的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符)。

这些模型可以被简化或通过音素关联数据的训练变得更准确,但那是一些乏味的手工任务。因为这个原因,音素级别的语音转录在大数据集的条件下相比单词级别的转录更难以实现。有关语音识别工具和模型的更多内容可以参考这篇博客:

  https://svds.com/open-source-toolkits-speech-recognition/

连接时间分类(CTC)损失函数

幸运的是,当使用神经网络进行语音识别时,通过能进行字级转录的连接时间分类(Connectionist Temporal Classification,CTC)目标函数,我们可以丢弃音素的概念。简单地说,CTC 能够计算多个序列的概率,而序列是语音样本中所有可能的字符级转录的集合。神经网络使用目标函数来最大化字符序列的概率(即选择最可能的转录),随后把预测结果与实际进行比较,计算预测结果的误差,以在训练中不断更新网络权重。

值得注意的是,CTC 损失函数中的字符级错误与通常被用于常规语音识别模型的莱文斯坦错词距离。对于字符生成 RNN 来说,字符和单词错误距离在表音文字(phonetic language)中是相同的(如世界语、克罗地亚语),这些语言的不同发音对应不同字符。与之相反的是,字符与单词错误距离在其他拼音文字中(如英语)有着显著不同。

如果你希望了解 CTC 的更多内容和百度对它最新的研究,以下是一些链接:

https://arxiv.org/abs/1703.00096

为了优化算法,构建传统/深度语音识别模型,SVDS 的团队开发了语音识别平台:

教程 | 如何使用TensorFlow构建、训练和改进循环神经网络

数据的重要性

毫无疑问,训练一个将语音转录为文字的系统需要数字语音文件和这些录音的转录文本。因为模型终将被用于解释新的语音,所以越多的训练意味着越好的表现。SVDS 的研究人员使用了大量带有转录的英文语音对模型进行训练;其中的一些数据包含 LibriSpeech(1000 小时)、TED-LIUM(118 小时)和 VoxForge(130 小时)。下图展示了这些数据集的信息,包括时长,采样率和注释。

LibriSpeech:

TED-LIUM:

VoxForge:

教程 | 如何使用TensorFlow构建、训练和改进循环神经网络

为了让模型更易获取数据,我们将所有数据存储为同一格式。每条数据由一个.wav 文件和一个.txt 文件组成。例如:Librispeech 的『211-122425-0059』 在 Github 中对应着 211-122425-0059.wav 与 211-122425-0059.txt。这些数据的文件使用数据集对象类被加载到 TensorFlow 图中,这样可以让 TensorFlow 在加载、预处理和载入单批数据时效率更高,节省 CPU 和 GPU 内存负载。数据集对象中数据字段的示例如下所示:

  classDataSet:

  def__init__(self, txt_files, thread_count, batch_size, numcep, numcontext):

  # ...

  deffrom_directory(self, dirpath, start_idx=0, limit=0, sort=None):

  returntxt_filenames(dirpath, start_idx=start_idx, limit=limit, sort=sort)

  defnext_batch(self, batch_size=None):

  idx_list =range(_start_idx, end_idx)

  txt_files =[_txt_files[i] fori inidx_list]

转载请注明出处。


1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章