深度学习(9):循环神经网络

简介: 深度学习(9):循环神经网络 2018-02-20 随深度学习技术的发展,使用循环神经网络(Recurrent Neural Network,RNN)建立的各种序列模型,使语音识别、机器翻译及自然语言理解等应用成为可能。

深度学习(9):循环神经网络

随深度学习技术的发展,使用循环神经网络(Recurrent Neural Network,RNN)建立的各种序列模型,使语音识别、机器翻译及自然语言理解等应用成为可能。

表示与类型

自然语言、音频等数据都是前后相互关联的数据,比如理解一句话要通过一整句而不是其中的几个词,分析一段音频要通过连续的片段而不是其中的几帧。前面所学的DNN以及CNN处理的都是前后毫无关联的一个个单独数据,对于这些序列数据则需要采用RNN进行处理。

序列

用循环神经网络处理时间序列时,首先要对时间序列进行标记化。对一个序列数据 x ,用符号 x t 来表示这个序列数据中的第 t 个元素。这个元素的类型因数据类型而异,对一段音频,它可能其中的几帧,对一句话,它可能是一个或几个单词,如下图所示。

Harry Potter

i 个序列数据的第 t 个元素用符号 x ( i ) t 表示,其标签用符号 y ( i ) t 表示。

序列中的每个元素有相应的标签,一般需要先建立一个包含序列中所有类型的元素的字典(Dictionary)。例如对上图中的句子,建立一个含有10000个单词的列向量词典,单词顺序以A~Z排列,然后根据单词在列向量中的位置,用one—hot向量来表示该单词的标签,部分表示如下图:

字典

标记化完成后,将训练数据输入网络中。一种循环神经网络的结构如下图:
RNN结构

左边的网络可简单表示为右图的结构,其中元素 x t 输入对应时间步(TIme Step)的隐藏层的同时,该隐藏层也会接收上一时间步的隐藏层激活 a t 1 ,其中 a 0 一般直接初始化为零向量。一个时间步输出一个对应的预测结果 y ^ t ,输入、激活、输出有对应的参数 W a x W a a W y

以上结构的前向传播过程,有:

a 0 = 0
a t = g 1 ( W a a a t 1 + W a x x t + b a )
y ^ t = g 2 ( W y a t + b y )

其中 b a b y 是两个偏差参数,激活函数 g 1 通常选择tanh,有时也用ReLU, g 2 的选择取决于需要的输出类型,可选sigmoid或Softmax。

具体计算中以上的式子还可以进一步简化,以方便运算。将 W a x W a a 堆叠成一个矩阵 W a a t 1 x t 也堆叠成一个矩阵,有:

W a = [ W a x , W a a ]
a t = g 1 ( W a [ a t 1 , x t ] + b a )

反向传播的过程类似于深度神经网络,如下图所示:
RNN反向传播

这种结构的一个缺陷是,某一时刻的预测结果仅使用了该时刻之前输入的序列信息。根据所需的输入及输出数量,循环神经网络可分为“一对一”、“多对一”、“多对多”等结构:

类型

这些网络结构可在不同的领域中得到应用。

RNN应用:语言模型

语言模型(Language Model)是根据语言客观事实而进行的语言抽象数学建模。例如对一个语音识别系统,输入的一段语音可能表示下面两句话:
English

其中的“pair”和“pear”读音相近,但是在日常表达及语法上显然这段语音是第二句的可能性要大,要使这个语音识别系统能够准确判断出第二句话为正确结果,就需要语言模型的支持。这个语言模型能够分别计算出语音表示以上两句话的概率,以此为依据做出判断。

建立语言模型所采用的训练集是一个大型的语料库(Corpus)。建立过程中,如之前所述,需要先建立一个字典,之后将语料库中每个词表示为对应的one-hot向量。此外需要额外定义一个标记EOS(End Of Sentence)表示一个句子的结尾,也可以将其中的标点符号加入字典后也用one=hot向量表示。对于语料库中部分(英语)人名、地名等特殊的不包含在字典中的词汇,可在词典中加入再用一个UNK(Unique Token)标记来表示。

将标志化后的训练集输入网络中的训练过程,如下例所示:

语言模型

第一个时间步中输入的 a 0 x 1 都是零向量, y ^ 1 是通过softmax预测出的字典中每一个词作为第一个词出现的概率;第二个时间步中输入的 x 2 是下面的训练数据中第一个单词“cats”的标签 y 1 和上一层的激活 a 1 ,输出的 y 2 表示的是单词“cats”后面出现字典中的其他词,特别是“average”的条件概率。后面的时间步与第二步类似,到最后就可以得到整个句子出现的概率。

这样,损失函数将表示为:

L ( y ^ t , y t ) = t y i t l o g   y ^ t

成本函数表示为:

J = t L t ( y ^ t , y t )

训练好一个这个语言模型后,可通过采样(Sample)新的序列,来了解这个模型中都学习到了一些什么。从模型中采样出新序列的过程如下:
采样新序列

第一个时间步中输入的 a 0 x 1 还是零向量,依据softmax预测出的字典中每一个词作为第一个词出现的概率,选取一个词 y ^ 1 作为第二个时间步的输入。后面与此类似,模型将自动生成一些句子,从这些句子中可发现模型通过语料库学习到的知识。

以上是基于词汇构建的语言模型,也就是所用的字典中包含的是一个个单词。实际应用中,还可以构建基于字符的语言模型,不过这种方法的结果中将得到过多过长的序列,计算成本也较大,在当今的NLP领域也用得较少。

GRU与LSTM

如下图中的句子时,后面的动词用“was”还是“were”取决于前面的名词“cat”是单数还是复数。
grammer
一般的循环神经网络不擅于捕捉这种序列中存在的长期依赖关系,其中的原因是,一般的循环神经网络也会出现类似于深度神经网络中的梯度消失问题,而使后面输入的序列难以受到早先输入序列的影响。梯度爆炸的问题也会出现,不过可以采用梯度修剪(Gradient Clipping)应对,相比之下梯度消失问题更难以解决。

GRU

GRU(Gated Recurrent Units, 门控循环单元)网络改进了循环神经网络的隐藏层,从而使梯度消失的问题得到改善。GRU的结构如下图:
GRU

其中的 c 代表记忆细胞(Memory Cell),用它来“记住”类似前面例子中“cat”的单复数形式,且这里的记忆细胞 c t 直接等于输出的激活 a t c ~ 代表下一个 c 的候选值; Γ u 代表更新门(Update Gate),用它来控制记忆细胞的更新与否。上述结构的具体表达式有:

c ~ t = tanh ( W c [ c t 1 , x t ] + b c )
Γ u = σ ( W u [ c t 1 , x t ] + b u )
c t = Γ u × c ~ t + ( 1 Γ u ) × c t 1
a t = c t

c ~ 的计算中以tanh作为激活函数,使用simgoid作为激活函数得到的 Γ u 值将在0到1的范围内。当 Γ u = 1 时,输出的 c 值被更新为 c ~ ,否者保持为输入的 c 值。

上面所述的是简化后的GRU,完整的GRU结构如下:
GRU-FULL
其中相关门(Relevance Gate) Γ r 表示上一个 c 值与下一个 c 的候选值的相关性。与简化的GRU相比,表达式发生如下变化:

Γ r = σ ( W r [ c t 1 , x t ] + b r )
c ~ t = tanh ( W c [ Γ r × c t 1 , x t ] + b c )

GRU其实只是一种LSTM的流行变体,其相关概念来自于2014年Cho等人发表的论文 [On the properties of neural machine translation: Encoder-decoder approaches]以及Chung等人的 [Empirical Evaluation of Gated Recurrent Neural Networks on Sequence Modeling]

LSTM

1997年Hochreiter和Schmidhuber共同在论文[Long short-term memory ]中提出的LSTM(Long Short Term Memory,长短期记忆)网络比GRU更加通用及强大,其结构如下:
LSTM

相比之前的简化版GRU,LSTM中多了遗忘门(Forget Gate) Γ f 输出门(Output Gate) Γ o ,具体表达式如下:

c ~ t = tanh ( W c [ a t 1 , x t ] + b c )
Γ u = σ ( W u [ a t 1 , x t ] + b u )
Γ f = σ ( W f [ a t 1 , x t ] + b f )
Γ o = σ ( W o [ a t 1 , x t ] + b o )
c t = Γ f t × c t 1 + Γ u t × c ~ t
a t = Γ o t × tanh ( c t )

更为常用的LSTM版本中,几个门值的计算不只取决于输入 x a 值,有时也可以偷窥上一个细胞输入的 c 值,这叫窥视孔连接(Peephole Connection)

多个LSTM单元连接在一起,形成一个LSTM网络:
LSTM网络

BRNN与DRNN

前面介绍的循环神经网络在结构上都是单向的,也提到过它们具有某一时刻的预测结果仅使用了该时刻之前输入的序列信息的缺陷,而双向循环神经网络(Bidirectional RNN)弥补了这一缺陷。BRNN的结构图如下所示:
BRNN

此外,循环神经网络的每个时间步上也可以包含多个隐藏层,形成深度循环神经网络(Deep RNN),如下图:
DRNN

参考资料

  1. 吴恩达-序列模型-网易云课堂
  2. Andrew Ng-Sequence Model-Coursera
  3. deeplearning.ai
  4. 零基础入门深度学习-循环神经网络
  5. 课程代码与资料-GitHub

注:本文涉及的图片及资料均整理翻译自Andrew Ng的Deep Learning系列课程,版权归其所有。翻译整理水平有限,如有不妥的地方欢迎指出。

目录
相关文章
|
9天前
|
机器学习/深度学习 人工智能 算法框架/工具
深度学习中的卷积神经网络(CNN)入门
【10月更文挑战第41天】在人工智能的璀璨星空下,卷积神经网络(CNN)如一颗耀眼的新星,照亮了图像处理和视觉识别的路径。本文将深入浅出地介绍CNN的基本概念、核心结构和工作原理,同时提供代码示例,带领初学者轻松步入这一神秘而又充满无限可能的领域。
|
16天前
|
机器学习/深度学习 人工智能 自然语言处理
深度学习中的卷积神经网络:从理论到实践
【10月更文挑战第35天】在人工智能的浪潮中,深度学习技术以其强大的数据处理能力成为科技界的宠儿。其中,卷积神经网络(CNN)作为深度学习的一个重要分支,在图像识别和视频分析等领域展现出了惊人的潜力。本文将深入浅出地介绍CNN的工作原理,并结合实际代码示例,带领读者从零开始构建一个简单的CNN模型,探索其在图像分类任务中的应用。通过本文,读者不仅能够理解CNN背后的数学原理,还能学会如何利用现代深度学习框架实现自己的CNN模型。
|
14天前
|
机器学习/深度学习 人工智能 算法框架/工具
深度学习中的卷积神经网络(CNN)及其在图像识别中的应用
【10月更文挑战第36天】探索卷积神经网络(CNN)的神秘面纱,揭示其在图像识别领域的威力。本文将带你了解CNN的核心概念,并通过实际代码示例,展示如何构建和训练一个简单的CNN模型。无论你是深度学习的初学者还是希望深化理解,这篇文章都将为你提供有价值的见解。
|
12天前
|
机器学习/深度学习 人工智能 算法
基于Python深度学习的【垃圾识别系统】实现~TensorFlow+人工智能+算法网络
垃圾识别分类系统。本系统采用Python作为主要编程语言,通过收集了5种常见的垃圾数据集('塑料', '玻璃', '纸张', '纸板', '金属'),然后基于TensorFlow搭建卷积神经网络算法模型,通过对图像数据集进行多轮迭代训练,最后得到一个识别精度较高的模型文件。然后使用Django搭建Web网页端可视化操作界面,实现用户在网页端上传一张垃圾图片识别其名称。
43 0
基于Python深度学习的【垃圾识别系统】实现~TensorFlow+人工智能+算法网络
|
28天前
|
机器学习/深度学习 搜索推荐 安全
深度学习之社交网络中的社区检测
在社交网络分析中,社区检测是一项核心任务,旨在将网络中的节点(用户)划分为具有高内部连接密度且相对独立的子群。基于深度学习的社区检测方法,通过捕获复杂的网络结构信息和节点特征,在传统方法基础上实现了更准确、更具鲁棒性的社区划分。
48 7
|
29天前
|
机器学习/深度学习 自然语言处理 TensorFlow
深度学习的奥秘:探索神经网络背后的魔法
【10月更文挑战第22天】本文将带你走进深度学习的世界,揭示神经网络背后的神秘面纱。我们将一起探讨深度学习的基本原理,以及如何通过编程实现一个简单的神经网络。无论你是初学者还是有一定基础的学习者,这篇文章都将为你提供有价值的信息和启示。让我们一起踏上这段奇妙的旅程吧!
|
28天前
|
机器学习/深度学习 人工智能 算法
【车辆车型识别】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+算法模型
车辆车型识别,使用Python作为主要编程语言,通过收集多种车辆车型图像数据集,然后基于TensorFlow搭建卷积网络算法模型,并对数据集进行训练,最后得到一个识别精度较高的模型文件。再基于Django搭建web网页端操作界面,实现用户上传一张车辆图片识别其类型。
72 0
【车辆车型识别】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+算法模型
|
15天前
|
机器学习/深度学习 人工智能 自动驾驶
深入解析深度学习中的卷积神经网络(CNN)
深入解析深度学习中的卷积神经网络(CNN)
32 0
|
18天前
|
机器学习/深度学习 人工智能 自动驾驶
深度学习的奇迹:如何用神经网络识别图像
【10月更文挑战第33天】在这篇文章中,我们将探索深度学习的奇妙世界,特别是卷积神经网络(CNN)在图像识别中的应用。我们将通过一个简单的代码示例,展示如何使用Python和Keras库构建一个能够识别手写数字的神经网络。这不仅是对深度学习概念的直观介绍,也是对技术实践的一次尝试。让我们一起踏上这段探索之旅,看看数据、模型和代码是如何交织在一起,创造出令人惊叹的结果。
26 0
|
19天前
|
机器学习/深度学习 人工智能 TensorFlow
深度学习中的卷积神经网络(CNN)及其在图像识别中的应用
【10月更文挑战第32天】本文将介绍深度学习中的一个重要分支——卷积神经网络(CNN),以及其在图像识别领域的应用。我们将通过一个简单的代码示例,展示如何使用Python和TensorFlow库构建一个基本的CNN模型,并对其进行训练和测试。
下一篇
无影云桌面