来自硅谷工程师的Google TensorFlow 教程:开始训练你的第一个RNN吧
本篇文章3643字,读完约9分钟
自从谷歌的搜索引擎和其他服务在2010年退出中国后,它也尝试了许多重返中国市场的方法,比如推出中文版的谷歌游戏应用商店(google play App Store),但没有取得明显的成功。即使在目前中国已经成为最大的安卓智能手机市场的趋势下,谷歌的服务也没有被使用。
七年后,谷歌试图再次回到中国,而这一次它的王牌是tensorflow,它的人工智能系统开发框架。
尽管谷歌的云服务尚未进入中国市场,但中国拥有亚洲增长最快的天梭开发者社区。目前,谷歌正在中国积极推广tensorflow,希望重返中国庞大的人工智能市场。据了解,许多谷歌美国工程师至少参加了在北京和上海举行的三次天顺开发者大会,其中两次是闭门会议,与会者不得拍照、录音甚至写博客。
Tensorflow最初是由谷歌大脑团队为谷歌的研究和生产而开发的,并于2015年11月9日在apache 2.0开源许可下发布。自发布以来,它已被下载超过790万次。
今天,让我们首先学习如何通过由硅谷数据工程师马修·鲁巴斯金和马特·莫里森编写的张量流动神经网络教程,在张量流动框架的帮助下训练语音识别的rnn本教程包含所有代码片段,您可以找到相应的github项目。教程中使用的软件是来自现有开源项目的代码。
语音识别:音频和转录
2010年,基于语音的方法成为语音识别模型的最新技术,包括语音、声学和语言模型的独立组成部分。从过去到现在,语音识别依赖于使用傅立叶变换公式将声波分解成频率和振幅,并产生以下频谱图:
传统语音识别管道的隐马尔可夫模型的声学模型的训练需要涉及语音、文本数据和从单词到音素的字典。隐马尔可夫模型(Hmm)是一种用于序列数据生成的概率模型,主要用于度量字符串之间的差异,通常由levenshtein单词错误距离来评估。
这些模型可以通过对应于音素副本的语音数据进行简化和细化,但这是一项非常繁琐的任务。因此,与音素级拷贝相比,词级拷贝更有可能拥有大量的语音数据集。
连接主义临时分类的损失函数
当使用神经网络进行语音识别时,我们可以放弃音素的概念,使用基于神经网络的时间序列分类(ctc)的目标函数,该函数允许预测字符级副本。简而言之,ctc可以计算多个序列的概率,其中序列指的是语音样本的所有可能的字符级副本的集合。如果网络使用目标函数,字符序列的概率可以最大化(即,可以选择最大可能性的副本),并且可以通过计算预测结果和实际副本之间的误差来更新训练期间的网络权重。
值得注意的是,ctc损失函数中使用的字符级错误不同于传统语音识别模型中经常使用的levenshtein单词错误距离。对于字符生成的rnn模型,字符和单词之间的错误类似于语音语言中的错误,例如西班牙语和克罗地亚语,不同的声音对应不同的字符。相反,对于非语音语言(如英语),字符和单词之间的错误非常不同。
为了进一步利用为传统或深度学习语音识别模型开发的算法,我们的团队构建了一个模块化的快速原型语音识别平台:
数据的重要性
毫无疑问,创建一个将语音转换成文本的系统需要数字音频文件和文本副本。因为该模型将适用于解码任何新的语音样本,所以我们在系统中训练的样本越多,模型的性能就越好。
在这方面,我们研究了免费的英语语音录音,包括不同的样本,如librispeech(1000小时)、ted-fluid(118小时)和voxforge(130小时)用于培训。
下图显示了这些数据集的信息,包括总持续时间、采样率和注释:
为了方便地从任何数据源访问数据,我们以平面格式存储所有数据,例如。wav格式和。txt格式。
例如,您可以在github repo中的librispeech训练数据集中找到与数据211-122425-0059相对应的文件,如211-122425-0059.wav和211-122425-0059.txt。这些数据文件名通过使用data set对象类加载到tensorflow graph中,这有助于tensorflow有效地加载和预处理数据,并将每批数据从cpu加载到gpu以下是数据集对象中数据字段的示例:
特征表示(表示)
为了使机器更好地识别音频数据,必须将数据从时域转换到频域。有几种方法可以创建用于提取机器学习特征的音频数据,包括任何频率分类(例如每100hz)和人耳可以听到的频带分类。这种典型的以人为中心的语音数据转换利用13位或26位倒谱特征计算mel-frequency倒谱系数(mfcc),该倒谱特征可用作模型的输入。转换后,数据将存储在频率系数矩阵(行)和时间矩阵(列)中。
由于语音不是孤立产生的,也没有一对一的字符映射,我们可以在当前时间索引前后的重叠窗口(10s)上训练网络捕获声音,从而捕获相互作用的影响(通过影响一个声音来影响另一个发音)。
以下是如何获取mfcc功能以及如何创建音频数据窗口的示例代码:
对于rnn示例,我们使用前9个时间段和后9个时间段,每个窗口总共包括19个时间点。当倒谱系数为26时,每25毫秒将有494个数据点。根据数据的采样率,我们建议对16000hz使用26个倒谱特征,对8000hz使用13个倒谱特征。
以下是8,000 hz数据的加载窗口示例:
语音的顺序建模
长期和短期记忆网络(lstm)层是一个循环神经网络(rnn)架构,可用于对具有长期顺序相关性的数据建模。因为它们从根本上记住了当前时间点的历史信息,这将影响结果的输出,所以它们对于时间序列数据非常重要。由于这种时间特性,上下文是连接的,这对于语音识别非常有效。
下面显示了深度语音启发双向神经网络(birnn)中lstm层的示例代码:
网络培训和监控
通过使用张量流训练网络,我们可以轻松地将计算图表可视化,还可以使用张量板从门户网站进行监控训练、验证和性能测试。根据蒲公英鬃在2017年tensorflow发展峰会上的演讲中提到的技巧,我们使用tf.name_scope来添加节点和图层名称,并在文件中写入摘要。
结果是自动生成的,是一个可以理解的计算图表。以双向神经网络(birnn)为例(如下所示),数据在不同的操作之间从左下到右上传输。为了清楚地显示,不同的节点可以用空.这个名字来标记和着色在此示例中,青色的fc框对应于完整的连接层,而绿色的B和H框分别对应于偏移量和权重。
我们使用tensorflow提供的tf.train.adamoptimizer来控制学习速率。Adamoptimizer通过使用动量(参数的移动平均)改进了传统的梯度下降,从而促进了超参数的有效动态调整。此外,我们可以通过创建标签错误率的汇总标量来跟踪丢失率和错误率:
如何提高rnn
现在我们已经建立了一个简单的lstm rnn网络,我们如何降低错误率?幸运的是,对于开源社区,许多大公司已经发布了他们最好的语音识别模型背后的数学模型。早在2016年9月,微软就发表了一篇文章,描述了他们如何将nist 200交换机数据的错误率降至6.9%。他们在卷积+递归神经网络的基础上使用了几种不同的声学和语言学模型。
微软团队和其他研究人员在过去四年中取得的几项重大改进包括:
对基于神经网络的字符使用语言模型,并使用卷积神经网络从音频中提取特征。值得注意的是,在过去的几十年中,在传统语音识别模型中开创的语言模型再次被证明在深度学习语音识别模型中是有价值的。
改进来自:语音识别的历史观点,黄,詹姆斯贝克,通信的美国计算机学会,第57卷第1号,第94-103页,2014年
训练你的第一个rnn
我们提供了一个github资源库,这个项目的脚本提供了一个简单易行的实现方案来训练具有rnns和ctc损失函数(在tensorflow中)的端到端语音识别系统。Github库包含来自librivox语料库的样本数据,该语料库分为以下文件夹:
培训:train-clean-100-wav(5个示例)test: test-clean-wav(2个示例)dev: dev-clean-wav (2个示例)在培训这些示例时,您很快会注意到培训数据将被过度拟合,这使得错误的单词率(wer)约为0%。测试错误率不是100%的原因是机器需要在29个可能的字符(a-z、省略号、空网格键、空白)之间进行选择,但是网络很快就会了解:
一些字符(e,a,空键,r,s,t)是更常见的辅音-元音-辅音是英语中的一种模式。由mfcc输入声音特性增加的信号幅度对应于字符a-z,这些字符由github库中的默认设置训练。运行结果如下图所示:
如果你想训练一个高性能的模型,你也可以添加额外的。沃夫和。或者创建一个新文件夹并使用文件夹位置更新configs/neural_network.ini'。应该注意的是,即使使用了强大的图形处理器,仅仅几百个小时的音频处理和训练也需要大量的计算能力。
|编译:技术沃克
|资料来源:特别志愿人员
标题:来自硅谷工程师的Google TensorFlow 教程:开始训练你的第一个RNN吧
地址:http://www.6st8.com/zbxw/12609.html
免责声明:联合早报中文网从世界各个维度报道世界经济新闻,时政新闻,突发新闻等,本篇的部分内容来自于网络,不为其真实性负责,只为传播网络信息为目的,非商业用途,如有异议请及时联系btr2018@163.com,联合早报中文网的小编将予以删除。
上一篇:OPPO推出首款全面屏手机R11s,起售价2999元 | 钛快讯
下一篇:没有了