1. CNN、RNN、DNN的一般解释
CNN(卷积神经网络)、RNN(循环神经网络)、DNN(深度神经网络)的内部网络结构有什么区别?
转自知乎 科言君 的回答
神经网络技术起源于上世纪五、六十年代,当时叫 感知机 (perceptron),拥有输入层、输出层和一个隐含层。输入的特征向量通过隐含层变换达到输出层,在输出层得到分类结果。早期感知机的推动者是Rosenblatt。 (扯一个不相关的:由于计算技术的落后,当时感知器传输函数是用线拉动变阻器改变电阻的方法机械实现的,脑补一下科学家们扯着密密麻麻的导线的样子…)
但是,Rosenblatt的单层感知机有一个严重得不能再严重的问题,即它对稍复杂一些的函数都无能为力(比如最为典型的“异或”操作)。连异或都不能拟合,你还能指望这货有什么实际用途么o(╯□╰)o
随着数学的发展,这个缺点直到上世纪八十年代才被Rumelhart、Williams、Hinton、LeCun等人(反正就是一票大牛)发明的 多层感知机 (multilayerperceptron)克服。多层感知机,顾名思义,就是有多个隐含层的感知机(废话……)。好好,我们看一下多层感知机的结构:
图1 上下层神经元全部相连的神经网络——多层感知机
多层感知机可以摆脱早期离散传输函数的束缚,使用sigmoid或tanh等连续函数模拟神经元对激励的响应,在训练算法上则使用Werbos发明的反向传播BP算法。对,这货就是我们现在所说的 神经网络 NN ——神经网络听起来不知道比感知机高端到哪里去了!这再次告诉我们起一个好听的名字对于研(zhuang)究(bi)很重要!
多层感知机解决了之前无法模拟异或逻辑的缺陷,同时更多的层数也让网络更能够刻画现实世界中的复杂情形。相信年轻如Hinton当时一定是春风得意。
多层感知机给我们带来的启示是, 神经网络的层数直接决定了它对现实的刻画能力 ——利用每层更少的神经元拟合更加复杂的函数[1]。
(Bengio如是说:functions that can be compactly
represented by a depth k architecture might require an exponential number of
computational elements to be represented by a depth k − 1 architecture.)
即便大牛们早就预料到神经网络需要变得更深,但是有一个梦魇总是萦绕左右。随着神经网络层数的加深, 优化函数越来越容易陷入局部最优解 ,并且这个“陷阱”越来越偏离真正的全局最优。利用有限数据训练的深层网络,性能还不如较浅层网络。同时,另一个不可忽略的问题是随着网络层数增加, “梯度消失”现象更加严重 。具体来说,我们常常使用sigmoid作为神经元的输入输出函数。对于幅度为1的信号,在BP反向传播梯度时,每传递一层,梯度衰减为原来的0.25。层数一多,梯度指数衰减后低层基本上接受不到有效的训练信号。
2006年,Hinton利用预训练方法缓解了局部最优解问题,将隐含层推动到了7层[2],神经网络真正意义上有了“深度”,由此揭开了深度学习的热潮。这里的“深度”并没有固定的定义——在语音识别中4层网络就能够被认为是“较深的”,而在图像识别中20层以上的网络屡见不鲜。为了克服梯度消失,ReLU、maxout等传输函数代替了sigmoid,形成了如今DNN的基本形式。单从结构上来说, 全连接的 DNN 和图 1 的多层感知机是没有任何区别的 。
值得一提的是,今年出现的高速公路网络(highway network)和深度残差学习(deep resial learning)进一步避免了梯度消失,网络层数达到了前所未有的一百多层(深度残差学习:152层)[3,4]!具体结构题主可自行搜索了解。如果你之前在怀疑是不是有很多方法打上了“深度学习”的噱头,这个结果真是深得让人心服口服。
图2 缩减版的深度残差学习网络,仅有34 层,终极版有152 层,自行感受一下
如图1所示,我们看到 全连接 DNN 的结构里下层神经元和所有上层神经元都能够形成连接 ,带来的潜在问题是 参数数量的膨胀 。假设输入的是一幅像素为1K*1K的图像,隐含层有1M个节点,光这一层就有10^12个权重需要训练,这不仅容易过拟合,而且极容易陷入局部最优。另外,图像中有固有的局部模式(比如轮廓、边界,人的眼睛、鼻子、嘴等)可以利用,显然应该将图像处理中的概念和神经网络技术相结合。此时我们可以祭出题主所说的卷积神经网络CNN。对于CNN来说,并不是所有上下层神经元都能直接相连,而是 通过“卷积核”作为中介。同一个卷积核在所有图像内是共享的,图像通过卷积操作后仍然保留原先的位置关系。 两层之间的卷积传输的示意图如下:
图3 卷积神经网络隐含层(摘自Theano 教程)
通过一个例子简单说明卷积神经网络的结构。假设图3中m-1=1是输入层,我们需要识别一幅彩色图像,这幅图像具有四个通道ARGB(透明度和红绿蓝,对应了四幅相同大小的图像),假设卷积核大小为100*100,共使用100个卷积核w1到w100(从直觉来看,每个卷积核应该学习到不同的结构特征)。用w1在ARGB图像上进行卷积操作,可以得到隐含层的第一幅图像;这幅隐含层图像左上角第一个像素是四幅输入图像左上角100*100区域内像素的加权求和,以此类推。同理,算上其他卷积核,隐含层对应100幅“图像”。每幅图像对是对原始图像中不同特征的响应。按照这样的结构继续传递下去。CNN中还有max-pooling等操作进一步提高鲁棒性。
图4 一个典型的卷积神经网络结构,注意到最后一层实际上是一个全连接层(摘自Theano 教程)
在这个例子里,我们注意到 输入层到隐含层的参数瞬间降低到了 100*100*100=10^6 个 !这使得我们能够用已有的训练数据得到良好的模型。题主所说的适用于图像识别,正是由于 CNN 模型限制参数了个数并挖掘了局部结构的这个特点 。顺着同样的思路,利用语音语谱结构中的局部信息,CNN照样能应用在语音识别中。
全连接的DNN还存在着另一个问题——无法对时间序列上的变化进行建模。然而, 样本出现的时间顺序对于自然语言处理、语音识别、手写体识别等应用非常重要 。对了适应这种需求,就出现了题主所说的另一种神经网络结构——循环神经网络RNN。
在普通的全连接网络或CNN中,每层神经元的信号只能向上一层传播,样本的处理在各个时刻独立,因此又被成为前向神经网络(Feed-forward Neural Networks)。而在 RNN 中,神经元的输出可以在下一个时间戳直接作用到自身 ,即第i层神经元在m时刻的输入,除了(i-1)层神经元在该时刻的输出外,还包括其自身在(m-1)时刻的输出!表示成图就是这样的:
图5 RNN 网络结构
我们可以看到在隐含层节点之间增加了互连。为了分析方便,我们常将RNN在时间上进行展开,得到如图6所示的结构:
图6 RNN 在时间上进行展开
Cool, ( t+1 )时刻网络的最终结果O(t+1) 是该时刻输入和所有历史共同作用的结果 !这就达到了对时间序列建模的目的。
不知题主是否发现,RNN可以看成一个在时间上传递的神经网络,它的深度是时间的长度!正如我们上面所说, “梯度消失”现象又要出现了,只不过这次发生在时间轴上 。对于t时刻来说,它产生的梯度在时间轴上向历史传播几层之后就消失了,根本就无法影响太遥远的过去。因此,之前说“所有历史”共同作用只是理想的情况,在实际中,这种影响也就只能维持若干个时间戳。
为了解决时间上的梯度消失,机器学习领域发展出了 长短时记忆单元 LSTM ,通过门的开关实现时间上记忆功能,并防止梯度消失 ,一个LSTM单元长这个样子:
图7 LSTM 的模样
除了题主疑惑的三种网络,和我之前提到的深度残差学习、LSTM外,深度学习还有许多其他的结构。举个例子,RNN既然能继承历史信息,是不是也能吸收点未来的信息呢?因为在序列信号分析中,如果我能预知未来,对识别一定也是有所帮助的。因此就有了 双向 RNN 、双向 LSTM ,同时利用历史和未来的信息。
图8 双向RNN
事实上, 不论是那种网络,他们在实际应用中常常都混合着使用,比如 CNN 和RNN 在上层输出之前往往会接上全连接层,很难说某个网络到底属于哪个类别。 不难想象随着深度学习热度的延续,更灵活的组合方式、更多的网络结构将被发展出来。尽管看起来千变万化,但研究者们的出发点肯定都是为了解决特定的问题。题主如果想进行这方面的研究,不妨仔细分析一下这些结构各自的特点以及它们达成目标的手段。入门的话可以参考:
Ng写的Ufldl: UFLDL教程 - Ufldl
也可以看Theano内自带的教程,例子非常具体: Deep Learning Tutorials
欢迎大家继续推荐补充。
当然啦,如果题主只是想凑个热闹时髦一把,或者大概了解一下方便以后把妹使,这样看看也就罢了吧。
参考文献:
[1]
Bengio Y. Learning Deep
Architectures for AI[J]. Foundations & Trends® in Machine Learning, 2009,
2(1):1-127.
[2]
Hinton G E, Salakhutdinov R R.
Recing the Dimensionality of Data with Neural Networks[J]. Science, 2006,
313(5786):504-507.
[3]
He K, Zhang X, Ren S, Sun J. Deep
Resial Learning for Image Recognition. arXiv:1512.03385, 2015.
[4]
Srivastava R K, Greff K,
Schmidhuber J. Highway networks. arXiv:1505.00387, 2015.
2. 百度知道
为了训练的需要,要不然会出差错
1. 背景介绍
近些年来,随着Siri的走红,类似Siri、搜狗语音助手这样利用语音实现控制,语义理解的系统开始大量涌现。而语音识别系统作为这类系统的入口,很大程度上决定了这类应用的质量。没有一个好的语音识别系统做支撑,再好的助手也只能干瞪眼。
与此同时,随着微信的发展,越来越多的用户反馈,在多种场合下不方便收听语音,需要将语音转换成文字。许多微信公众号也表示需要将语音识别成文字,以便进一步的处理。在此形势下,提高我司现有语音识别系统的准确率成为了迫切的任务。
之前主流的语音识别系统都是采用HMM-GMM技术。近些年来,随着深度神经网络(Deep neural network)技术的的发展,越来越多的系统采用HMM-DNN技术。这项技术把描述特征发射概率的模型从混合高斯模型(GMM)替换为深度神经网络(DNN),从而使系统的错误率下降了20%~30%。
2. 相关产品
当前市场上的采用DNN技术的主要竞品有讯飞的相关产品,包括讯飞语音输入法和讯飞口讯等产品、以及某互联网公司的输入法等。
科大讯飞是当前语音行业的领航者,在语音行业有十几年的历史,在Siri推出前就已经推出了讯飞语音输入法等产品,在数据积累方面具有其他公司无法比拟的优势。而行业内另一家互联网公司则是声称国内最早将DNN技术应用到语音识别产品中的公司。
3. 技术介绍
3.1 深度神经网络
为了描述神经网络,我们先介绍最简单的神经网络,该神经网络只由一个神经元构成,如图1所示。
图1 神经元
图1所示的神经元接受3个输入,x1,x2,x3,和一个偏置+1, 其输出为
其中Wi 为xi在输入中的权重。函数f(x)被称作激活函数。
图2. 神经网络
神经网络将许多个单一的神经元连接在一起,如图2所示。神经网络最左边的一层叫做输入层,最右的一层叫做输出层。中间节点组成的一层叫做隐藏层.
3.2 深度神经网络在声学模型中的应用
深度神经网络则是层数较多的神经网络。虽然神经网络很早之前就已经提出,但因为计算量的问题,神经网络的层数一直无法提升。近年来随着神经网络理论的进一步发展和计算能力的不断提高,特别是GPU的出现,才使得深度神经网络得以发挥其威力。
图3. 使用DNN作为声学模型[1]
图3说明了DNN是如何替代GMM应用到声学模型中的。图3中上半部分是HMM的结构,HMM的结构和转移概率是HMM-GMM模型训练的结果。图3中间部分是描述了一个DNN,这个DNN模型来决定HMM的发射概率。通常情况下这个DNN模型的层数不会小于5层,每层大概数千个神经元组成。图3中的下半部分是DNN模型的输入,需要注意的是DNN模型的输入是多帧特征,而不是GMM模型中一帧。在识别语音的过程中,一小段语音都会被提取成上图中所对应的Observation,并根据HMM中的状态计算发射概率(也就是跟不同的发音比较相似度),选择发射概率最大路径作为最终的结果。
图4. DNN声学模型的训练流程
图4说明了DNN声学模型的训练流程。在训练DNN模型之前,我们首先训练出一个HMM-GMM模型来做强制对齐(forced alignment)。强制对齐的结果作为DNN训练的样本提交GPU上训练DNN模型,这个过程包含了两部分,首先是基于GPU的Pretrain,使神经网络有一个好的起点。然后使用BP算法对神经网络进行Fine Tuning,得到最终的模型。
3.3 DNN训练与识别系统的工程优化
DNN网络具有数据巨大的参数需要学习,每一层网络都有数百万的参数,而下一层网络的输入又是上一层网络的输出,通常情况下训练一个3.2节中所述的声学模型需要近两千个CPU内核运行近一个月。此外,由于声学模型所用到的DNN较为特殊:每一层的一个神经元都依赖上一层的所有神经元,因此,如果把模型不同层次切分到不同的服务器上分别进行训练的话,会带来巨大的网络开销,使系统实际上不可用,因此我们在训练DNN的过程中使用了GPU,并通过不断的优化,使得训练速度相比单台服务器有近两千倍的速度提高,从而使DNN模型的训练成为现实。
此外,为了使DNN模型可以应用到线上的服务中,我们对DNN在CPU上的计算也做了优化,在几乎不影响准确率的情况下,将计算速度提升了将近10倍。
4. 实验结果
通过DNN模型的应用,我们语音识别系统的字错误率下降了40%左右,根据第三方的测试已经超过网络,并有望追上讯飞。