语音识别背后的技术
——GPU集群+DNN算法
专业名词:
1、Automatic Speech Recognition (ASR): 自动语音识别
2、deep neural network(DNN): 深度神经网络
3、Deep learning(DL):深度学习
4、Restricted Boltzmann Machine (RBM):限制波尔兹曼机
5、Deep Belief Networks(DBNs):深度信念网络
6、NVIDIA GeForce GTX 1080:8G显存,训练DNN的GPU
关键字:
语音识别、语义分析、深度神经网络、深度学习、深度信念网络、标签
*:标准空管指令的训练语音数据大约800小时,字错误率10%左右。
*:语音识别和语义解析 都是主要基于DNN实现的。
问题:
1、 使用成都空管记录仪的管制语音的训练的模型不适合用于太原现场。那在实验室使用PCM传输的管制语音训练的模型,适用直接从内话引接语音的情况吗?还有假如更换内话系统之后呢?或使用VHF共用系统通过传输设备来到语音呢?
2、 当识别率达到80%以上,即管制员可作为参考使用的水平时,做标签训练的工作由管制员完成更合适,需要提供维护界面,用于持续提高识别率水平。
3、 增加一台终端放置在管制大厅管制主任席,引接实验室语音识别的信号。
4、 开发的Pad终端,建议每个Pad只显示当前席位管制扇区的管制状态综合航迹,并引接当前扇区的对空指挥话音用于完成辅助提示等应用。
一、深度学习框架:
学习深度学习框架,要用到keras库,keras可以搭建在tensorflow和theano上。Keras 可以基于两个Backend,一个是 Theano,一个是 Tensorflow。如果我们选择Theano作为Keras的Backend, 那么Keras就用 Theano 在底层搭建你需要的神经网络;同样,如果选择 Tensorflow 的话呢,Keras 就使用 Tensorflow 在底层搭建神经网络。Keras 切换后端(Theano和TensorFlow)
keras的GPU模式安装- theano 后端:
http://blog.csdn.net/dexter_morgan/article/details/53872900
二、训练DNN 声学模型:
一个神经网络就是一个分类工具,能够将一些新的特征(如声学特征)分类到某一个 class。DNN 的输入 nodes 一般为 39 维的 MFCC 特征,输出的 nodes 为相关的 labels(eg: 900 个输出 <-> 900 个 context-dependent triphones[即 decision tree leaves])。也就是说:Acoustic features 用于训练 GMM-HMM 和 decision tree,这两部分是 Acoustic model(input layer and outlayer) 建模的关键部分。
Keras用MNIST数据集训练一个DNN。
——带标签数据训练, Keras以Numpy数组作为输入数据和标签的数据类型。训练模型一般使用fit函数。Keras用带标签数据训练集训练DNN。
标签分两种:一种是语音识别的标签,也就是我们识别出来的语音文本,要去人工修改为正确的。另一种是语义解析的标签,也就是基于语音识别的文本信息,我们要标出来哪些是航班号,哪些的意图等等。
三、语音识别:
微软研究人员通过与hinton合作,首先将RBM和DBN引入到语音识别声学模型训练中,并且在大词汇量语音识别系统中获得巨大成功,使得语音识别的错误率相对减低30%。但是,DNN还没有有效的并行快速算法,很多研究机构都是在利用大规模数据语料通过GPU平台提高DNN声学模型的训练效率。
——2006 年,Hinton 等人基于受限波尔兹曼机(Re- stricted Boltzmann Machines, RBMs)提出的深度信念网络(Deep Belief Networks, DBNs)是深度学习理论在机器学习领域打响的第一枪,并成为了其后至今深度学习算法的主要框架。
——(cnn深度神经网络)最开始的改进是使用GPU来加速训练,GPU可以看成一种SIMT的架构,和SIMD有些类似,但是执行相同指令的warp里的32个core可以有不同的代码路径。对于反向传播算法来说,基本计算就是矩阵向量乘法,对一个向量应用激活函数这样的向量化指令,而不像在传统的代码里会有很多if-else这样的逻辑判断,所以使用GPU加速非常有用。
在国际上,IBM、google等公司都快速进行了DNN语音识别的研究,并且速度飞快。理论认为人的认知模式,处事方式是存储在神经元与神经元之间的连接上的,称为“神经元连接权重”,人脑神经布局类似网状结构,神经元是网的交叉点,权重就是网的连线,这些连线有粗有细,也就是权重的大小不同。而人类的学习能力就是去不断改变权重的值,从而改变自己的认知模式和处事方式,简单的说,不同人对同一个外部事物有不同看法,就是因为同样的初始信号,在不同粗细的神经元连线放大或缩小后,变成了侧重点不同的最终信号。
神经网络简单说就是输入是训练数据,中间是隐藏节点,输出是标签。训练数据可以以一定的权重激活隐藏节点,隐藏节点激活输出标签。
如何训练:
既然我们希望网络的输出尽可能的接近真正想要预测的值。那么就可以通过比较当前网络的预测值和我们真正想要的目标值,再根据两者的差异情况来更新每一层的权重矩阵(比如,如果网络的预测值高了,就调整权重让它预测低一些,不断调整,直到能够预测出目标值)。因此就需要先定义“如何比较预测值和目标值的差异”,这便是损失函数或目标函数(loss function or objective function),用于衡量预测值和目标值的差异的方程。loss function的输出值(loss)越高表示差异性越大。那神经网络的训练就变成了尽可能的缩小loss的过程。
所用的方法是梯度下降(Gradient descent):通过使loss值向当前点对应梯度的反方向不断移动,来降低loss。一次移动多少是由学习速率(learning rate)来控制的。
四、开源TensorFlow:
Google发布的第二代深度学习系统Tensor Flow(TensorFlow核心以C++写成,前端支持Python和C++,并且容易扩展对其他语言的支持):Google发布的第二代深度学习系统。
TensorFlow最早是在2015年10月的湾区机器学习会(BayLearn 2015)上亮相的。当时,Google 资深系统专家Jeff Dean做了题为Large-Scale Deep Learning for Intelligent Computer Systems的演讲,介绍了Google未曾在论文上发表过的第二代深度学习系统TensorFlow。TensorFlow支持CNN、RNN/LSTM等机器学习算法,拥有C++/Python编程接口。
Google开源TensorFlow的意义:
这一次的Google开源深度学习系统TensorFlow在很多地方可以应用,如语音识别,自然语言理解,计算机视觉,广告等等。但是,基于以上论点,我们也不能过分夸大TensorFlow这种通用深度学习框架在一个工业界机器学习系统里的作用。在一个完整的工业界语音识别系统里, 除了深度学习算法外,还有很多工作是专业领域相关的算法,以及海量数据收集和工程系统架构的搭建。
不过总的来说,这次谷歌的开源很有意义,尤其是对于中国的很多创业公司来说,他们大都没有能力理解并开发一个与国际同步的深度学习系统,所以TensorFlow会大大降低深度学习在各个行业中的应用难度。
——Tensor(张量)意味着N维数组,Flow(流)意味着基于数据流图的计算,TensorFlow即为张量从图的一端流动到另一端。
——TensorFlow 表达了高层次的机器学习计算,大幅简化了第一代系统,并且具备更好的灵活性和可延展性。TensorFlow一大亮点是支持异构设备分布式计算,它能够在各个平台上自动运行模型,从电话、单个CPU / GPU到成百上千GPU卡组成的分布式系统。从目前的文档看,TensorFlow支持CNN、RNN和LSTM算法,这都是目前在Image,Speech和NLP最流行的深度神经网络模型。
——从目前Tensor Flow的release来看,他们只支持单机多卡,不支持多机的分布式环境。开源的TensorFlow是单机实现,其最有价值的分布式数据流实现,并没有开源。
——深度学习系统或软件不是一装上就能用的,它在发布前期需要通过使用者数据进行很多测试、调整,顾名思义就是一个学习的过程。调整这些参数需要不断试错,初次接触的人要花费很长时间。
问题NOTE:
1、 语音识别主机系统重启有时会出现NVIDIA掉驱动的问题,需要重新安装驱动,Gcc4.7版本时安装驱动提示DKMS Building内核模块失败,改为Gcc5.0版本OK。
遇到编译内核等问题可能会依赖于某个gcc版本,需要改变到合适的版本。在/usr/bin/目录下,gcc开头的文件,其中有一个是gcc,是个链接文件,链接到当前的gcc文件(例如ubuntu16.04链接的是gcc-5),改变他的链接源文件就可以了,假如我们现在的gcc是gcc-5.4,我们要降级到gcc-4.7:
apt install gcc-4.7 (在/usr/bin目录下看到gcc-4.7这个文件,然后在/usr/bin目录下删除gcc这个文件)
rm /usr/bin/gcc
ln -s gcc gcc-4.7
gcc -v
1)ctrl + alt + F1 切换到控制台,停止图形界面: sudo service lightdm stop
2)降级到gcc-4.7后,先卸载原来的驱动:sudo apt-get --purge remove nvidia-*
3)然后安装安装nvidia依赖包: sudo apt-get install nvidia-384
编译依赖:sudo apt-get install build-essential pkg-config xserver-xorg-dev linux-headers-`uname -r`
若命令不成功:单独执行 uname -r 而后将输出添加到上一行命令行尾
sudo ./NVIDIA-Linux-x86_64-384.59.run –no-x-check –no-nouveau-check –no-opengl-files
最后会询问是否更新配置文件,选择否! 否则可能会进不去图形化界面!
2、Ubuntu系统起来后,Internet网默认未连接,需要在桌面右上角点击一下“有线连接2”,提示“已连接”即OK。
3、在一个网卡设两个IP(192.168.1.51/168.192.11.90),cdc.bat和adapter.exe一启动就退出,会初始化网络失败,使用两个网卡OK。
4、通过Internet使用SSH连接到内网主机(Ubuntu):
cat /usr/local/bin/runssh.sh #runssh.sh可能需要安装teamviewer后才有。查看端口号和ID
ssh username@WAN-IP -p 端口号
2018/4/11