导航:首页 > 网络问题 > 循环神经网络应用在哪些方面

循环神经网络应用在哪些方面

发布时间:2022-09-23 11:32:10

A. 入门 | 一文简述循环神经网络

入门 | 一文简述循环神经网络

本文简要介绍了什么是循环神经网络及其运行原理,并给出了一个 RNN 实现示例。

什么是循环神经网络(RNN)?它们如何运行?可以用在哪里呢?本文试图回答上述这些问题,还展示了一个 RNN 实现 demo,你可以根据自己的需要进行扩展。

循环神经网络架构

基础知识。Python、CNN 知识是必备的。了解 CNN 的相关知识,是为了与 RNN 进行对比:RNN 为什么以及在哪些地方比 CNN 更好。

我们首先从“循环”(Recurrent)这个词说起。为什么将其称为循环?循环的意思是:

经常或重复出现

将这类神经网络称为循环神经网络是因为它对一组序列输入重复进行同样的操作。本文后续部分将讨论这种操作的意义。

我们为什么需要 RNN?

也许你现在想的是,已经有像卷积网络这样表现非常出色的网络了,为什么还需要其他类型的网络呢?有一个需要用到 RNN 的特殊例子。为了解释 RNN,你首先需要了解序列的相关知识,我们先来讲一下序列。

序列是相互依赖的(有限或无限)数据流,比如时间序列数据、信息性的字符串、对话等。在对话中,一个句子可能有一个意思,但是整体的对话可能又是完全不同的意思。股市数据这样的时间序列数据也是,单个数据表示当前价格,但是全天的数据会有不一样的变化,促使我们作出买进或卖出的决定。

当输入数据具有依赖性且是序列模式时,CNN 的结果一般都不太好。CNN 的前一个输入和下一个输入之间没有任何关联。所以所有的输出都是独立的。CNN 接受输入,然后基于训练好的模型输出。如果你运行了 100 个不同的输入,它们中的任何一个输出都不会受之前输出的影响。但想一下如果是文本生成或文本翻译呢?所有生成的单词与之前生成的单词都是独立的(有些情况下与之后的单词也是独立的,这里暂不讨论)。所以你需要有一些基于之前输出的偏向。这就是需要 RNN 的地方。RNN 对之前发生在数据序列中的事是有一定记忆的。这有助于系统获取上下文。理论上讲,RNN 有无限的记忆,这意味着它们有无限回顾的能力。通过回顾可以了解所有之前的输入。但从实际操作中看,它只能回顾最后几步。

本文仅为了与人类大体相关联,而不会做任何决定。本文只是基于之前关于该项目的知识做出了自己的判断(我甚至尚未理解人类大脑的 0.1%)。

何时使用 RNN?

RNN 可用于许多不同的地方。下面是 RNN 应用最多的领域。

1. 语言建模和文本生成

给出一个词语序列,试着预测下一个词语的可能性。这在翻译任务中是很有用的,因为最有可能的句子将是可能性最高的单词组成的句子。

2. 机器翻译

将文本内容从一种语言翻译成其他语言使用了一种或几种形式的 RNN。所有日常使用的实用系统都用了某种高级版本的 RNN。

3. 语音识别

基于输入的声波预测语音片段,从而确定词语。

4. 生成图像描述

RNN 一个非常广泛的应用是理解图像中发生了什么,从而做出合理的描述。这是 CNN 和 RNN 相结合的作用。CNN 做图像分割,RNN 用分割后的数据重建描述。这种应用虽然基本,但可能性是无穷的。

5. 视频标记

可以通过一帧一帧地标记视频进行视频搜索。

深入挖掘

本文按照以下主题进行。每一部分都是基于之前的部分进行的,所以不要跳着读。

前馈网络循环网络循环神经元基于时间的反向传播(BPTT)RNN 实现

前馈网络入门

前馈网络通过在网络的每个节点上做出的一系列操作传递信息。前馈网络每次通过每个层直接向后传递信息。这与其他循环神经网络不同。一般而言,前馈网络接受一个输入并据此产生输出,这也是大多数监督学习的步骤,输出结果可能是一个分类结果。它的行为与 CNN 类似。输出可以是以猫狗等作为标签的类别。

前馈网络是基于一系列预先标注过的数据训练的。训练阶段的目的是减少前馈网络猜类别时的误差。一旦训练完成,我们就可以用训练后的权重对新批次的数据进行分类。

一个典型的前馈网络架构

还有一件事要注意。在前馈网络中,无论在测试阶段展示给分类器的图像是什么,都不会改变权重,所以也不会影响第二个决策。这是前馈网络和循环网络之间一个非常大的不同。

与循环网络不同,前馈网络在测试时不会记得之前的输入数据。它们始终是取决于时间点的。它们只会在训练阶段记得历史输入数据。

循环网络

也就是说,循环网络不仅将当前的输入样例作为网络输入,还将它们之前感知到的一并作为输入。

我们试着建立了一个多层感知器。从简单的角度讲,它有一个输入层、一个具备特定激活函数的隐藏层,最终可以得到输出。

多层感知器架构示例

如果在上述示例中的层数增加了,输入层也接收输入。那么第一个隐藏层将激活传递到下一个隐藏层上,依此类推。最后到达输出层。每一个隐藏层都有自己的权重和偏置项。现在问题变成了我们可以输入到隐藏层吗?

每一层都有自己的权重(W)、偏置项(B)和激活函数(F)。这些层的行为不同,合并它们从技术层面上讲也极具挑战性。为了合并它们,我们将所有层的权重和偏置项替换成相同的值。如下图所示:

现在我们就可以将所有层合并在一起了。所有的隐藏层都可以结合在一个循环层中。所以看起来就像下图:

我们在每一步都会向隐藏层提供输入。现在一个循环神经元存储了所有之前步的输入,并将这些信息和当前步的输入合并。因此,它还捕获到一些当前数据步和之前步的相关性信息。t-1 步的决策影响到第 t 步做的决策。这很像人类在生活中做决策的方式。我们将当前数据和近期数据结合起来,帮助解决手头的特定问题。这个例子很简单,但从原则上讲这与人类的决策能力是一致的。这让我非常想知道我们作为人类是否真的很智能,或者说我们是否有非常高级的神经网络模型。我们做出的决策只是对生活中收集到的数据进行训练。那么一旦有了能够在合理时间段内存储和计算数据的先进模型和系统时,是否可以数字化大脑呢?所以当我们有了比大脑更好更快的模型(基于数百万人的数据训练出的)时,会发生什么?

另一篇文章(https://deeplearning4j.org/lstm.html)的有趣观点:人总是被自己的行为所困扰。

我们用一个例子来阐述上面的解释,这个例子是预测一系列字母后的下一个字母。想象一个有 8 个字母的单词 namaskar。

namaskar(合十礼):印度表示尊重的传统问候或姿势,将手掌合起置于面前或胸前鞠躬。

如果我们在向网络输入 7 个字母后试着找出第 8 个字母,会发生什么呢?隐藏层会经历 8 次迭代。如果展开网络的话就是一个 8 层的网络,每一层对应一个字母。所以你可以想象一个普通的神经网络被重复了多次。展开的次数与它记得多久之前的数据是直接相关的。

循环神经网络的运作原理

循环神经元

这里我们将更深入地了解负责决策的实际神经元。以之前提到的 namaskar 为例,在给出前 7 个字母后,试着找出第 8 个字母。输入数据的完整词汇表是 {n,a,m,s,k,r}。在真实世界中单词或句子都会更复杂。为了简化问题,我们用的是下面这个简单的词汇表。

在上图中,隐藏层或 RNN 块在当前输入和之前的状态中应用了公式。在本例中,namaste 的字母 n 前面什么都没有。所以我们直接使用当前信息推断,并移动到下一个字母 a。在推断字母 a 的过程中,隐藏层应用了上述公式结合当前推断 a 的信息与前面推断 n 的信息。输入在网络中传递的每一个状态都是一个时间步或一步,所以时间步 t 的输入是 a,时间步 t-1 的输入就是 n。将公式同时应用于 n 和 a 后,就得到了一个新状态。

用于当前状态的公式如下所示:

h_t 是新状态,h_t-1 是前一个状态。x_t 是时间 t 时的输入。在对之前的时间步应用了相同的公式后,我们已经能感知到之前的输入了。我们将检查 7 个这样的输入,它们在每一步的权重和函数都是相同的。

现在试着以简单的方式定义 f()。我们使用 tanh 激活函数。通过矩阵 W_hh 定义权重,通过矩阵 W_xh 定义输入。公式如下所示:

上例只将最后一步作为记忆,因此只与最后一步的数据合并。为了提升网络的记忆能力,并在记忆中保留较长的序列,我们必须在方程中添加更多的状态,如 h_t-2、h_t-3 等。最后输出可以按测试阶段的计算方式进行计算:

其中,y_t 是输出。对输出与实际输出进行对比,然后计算出误差值。网络通过反向传播误差来更新权重,进行学习。本文后续部分会对反向传播进行讨论。

基于时间的反向传播算法(BPTT)

本节默认你已经了解了反向传播概念。如果需要对反向传播进行深入了解,请参阅链接:?http://cs231n.github.io/optimization-2/?。

现在我们了解了 RNN 是如何实际运作的,但是在实际工作中如何训练 RNN 呢?该如何决定每个连接的权重呢?如何初始化这些隐藏单元的权重呢?循环网络的目的是要准确地对序列输入进行分类。这要靠误差值的反向传播和梯度下降来实现。但是前馈网络中使用的标准反向传播无法在此应用。

与有向无环的前馈网络不同,RNN 是循环图,这也是问题所在。在前馈网络中可以计算出之前层的误差导数。但 RNN 的层级排列与前馈网络并不相同。

答案就在之前讨论过的内容中。我们需要展开网络。展开网络使其看起来像前馈网络就可以了。

展开 RNN

在每个时间步取出 RNN 的隐藏单元并复制。时间步中的每一次复制就像前馈网络中的一层。在时间步 t+1 中每个时间步 t 层与所有可能的层连接。因此我们对权重进行随机初始化,展开网络,然后在隐藏层中通过反向传播优化权重。通过向最低层传递参数完成初始化。这些参数作为反向传播的一部分也得到了优化。

展开网络的结果是,现在每一层的权重都不同,因此最终会得到不同程度的优化。无法保证基于权重计算出的误差是相等的。所以每一次运行结束时每一层的权重都不同。这是我们绝对不希望看到的。最简单的解决办法是以某种方式将所有层的误差合并到一起。可以对误差值取平均或者求和。通过这种方式,我们可以在所有时间步中使用一层来保持相同的权重。

RNN 实现

本文试着用 Keras 模型实现 RNN。我们试着根据给定的文本预测下一个序列。

代码地址:?https://gist.github.com/.git?

该模型是 Yash Katariya 建的。我对该模型做了一些细微的改动以适合本文的要求。

B. 是一种处理时序数据的神经网络,常用于语音识别,机器翻译等领域

LSTM(Long Short-Term Memory)是长短期记忆网络,是一种时间循环神经网络,适合于处理和预测时间序列中间隔和延迟相对较长的重要事件。长短期记忆(Long short-term memory, LSTM)是一种特殊的RNN,主要是为了解决长序列训练过程中的梯度消失和梯度爆炸问题。简单来说,就是相比普通的RNN,LSTM能够在更长的序列中有更好的表现。
LSTM 已经在科技领域有了多种应用。基于 LSTM 的系统可以学习翻译语言、控制机器人、图像分析、文档摘要、语音识别图像识别、手写识别、控制聊天机器人、预测疾病、点击率和股票、合成音乐等等任务。

C. DNN、RNN、CNN分别是什么意思

DNN(深度神经网络),是深度学习的基础。

DNN可以理解为有很多隐藏层的神经网络。这个很多其实也没有什么度量标准, 多层神经网络和深度神经网络DNN其实也是指的一个东西,当然,DNN有时也叫做多层感知机(Multi-Layer perceptron,MLP)。

从DNN按不同层的位置划分,DNN内部的神经网络层可以分为三类,输入层,隐藏层和输出层,如下图示例,一般来说第一层是输出层,最后一层是输出层,而中间的层数都是隐藏层。

CNN(卷积神经网络),是一种前馈型的神经网络,目前深度学习技术领域中非常具有代表性的神经网络之一。

CNN在大型图像处理方面有出色的表现,目前已经被大范围使用到图像分类、定位等领域中。相比于其他神经网络结构,卷积神经网络需要的参数相对较少,使的其能够广泛应用。

RNN(循环神经网络),一类用于处理序列数据的神经网络,RNN最大的不同之处就是在层之间的神经元之间也建立的权连接。

从广义上来说,DNN被认为包含了CNN、RNN这些具体的变种形式。在实际应用中,深度神经网络DNN融合了多种已知的结构,包含卷积层或LSTM单元,特指全连接的神经元结构,并不包含卷积单元或时间上的关联。

D. 深度学习的职业发展方向有哪些

当前,人工智能发展借助深度学习技术突破得到了全面关注和助力推动,各国政府高度重视、资本热潮仍在加码,各界对其成为发展热点也达成了共识。本文旨在分析深度学习技术现状,研判深度学习发展趋势,并针对我国的技术水平提出发展建议。
一、深度学习技术现状
深度学习是本轮人工智能爆发的关键技术。人工智能技术在计算机视觉和自然语言处理等领域取得的突破性进展,使得人工智能迎来新一轮爆发式发展。而深度学习是实现这些突破性进展的关键技术。其中,基于深度卷积网络的图像分类技术已超过人眼的准确率,基于深度神经网络的语音识别技术已达到95%的准确率,基于深度神经网络的机器翻译技术已接近人类的平均翻译水平。准确率的大幅提升使得计算机视觉和自然语言处理进入产业化阶段,带来新产业的兴起。
深度学习是大数据时代的算法利器,成为近几年的研究热点。和传统的机器学习算法相比,深度学习技术有着两方面的优势。一是深度学习技术可随着数据规模的增加不断提升其性能,而传统机器学习算法难以利用海量数据持续提升其性能。二是深度学习技术可以从数据中直接提取特征,削减了对每一个问题设计特征提取器的工作,而传统机器学习算法需要人工提取特征。因此,深度学习成为大数据时代的热点技术,学术界和产业界都对深度学习展开了大量的研究和实践工作。
深度学习各类模型全面赋能基础应用。卷积神经网络和循环神经网络是两类获得广泛应用的深度神经网络模型。计算机视觉和自然语言处理是人工智能两大基础应用。卷积神经网络广泛应用于计算机视觉领域,在图像分类、目标检测、语义分割等任务上的表现大大超越传统方法。循环神经网络适合解决序列信息相关问题,已广泛应用于自然语言处理领域,如语音识别、机器翻译、对话系统等。
深度学习技术仍不完美,有待于进一步提升。一是深度神经网络的模型复杂度高,巨量的参数导致模型尺寸大,难以部署到移动终端设备。二是模型训练所需的数据量大,而训练数据样本获取、标注成本高,有些场景样本难以获取。三是应用门槛高,算法建模及调参过程复杂繁琐、算法设计周期长、系统实施维护困难。四是缺乏因果推理能力,图灵奖得主、贝叶斯网络之父Judea Pearl指出当前的深度学习不过只是“曲线拟合”。五是存在可解释性问题,由于内部的参数共享和复杂的特征抽取与组合,很难解释模型到底学习到了什么,但出于安全性考虑以及伦理和法律的需要,算法的可解释性又是十分必要的。因此,深度学习仍需解决以上问题。
二、深度学习发展趋势
深度神经网络呈现层数越来越深,结构越来越复杂的发展趋势。为了不断提升深度神经网络的性能,业界从网络深度和网络结构两方面持续进行探索。神经网络的层数已扩展到上百层甚至上千层,随着网络层数的不断加深,其学习效果也越来越好,2015年微软提出的ResNet以152层的网络深度在图像分类任务上准确率首次超过人眼。新的网络设计结构不断被提出,使得神经网络的结构越来越复杂。如:2014年谷歌提出了Inception网络结构、2015年微软提出了残差网络结构、2016年黄高等人提出了密集连接网络结构,这些网络结构设计不断提升了深度神经网络的性能。
深度神经网络节点功能不断丰富。为了克服目前神经网络存在的局限性,业界探索并提出了新型神经网络节点,使得神经网络的功能越来越丰富。2017年,杰弗里辛顿提出了胶囊网络的概念,采用胶囊作为网络节点,理论上更接近人脑的行为,旨在克服卷积神经网络没有空间分层和推理能力等局限性。2018年,DeepMind、谷歌大脑、MIT的学者联合提出了图网络的概念,定义了一类新的模块,具有关系归纳偏置功能,旨在赋予深度学习因果推理的能力。
深度神经网络工程化应用技术不断深化。深度神经网络模型大都具有上亿的参数量和数百兆的占用空间,运算量大,难以部署到智能手机、摄像头和可穿戴设备等性能和资源受限的终端类设备。为了解决这个问题,业界采用模型压缩技术降低模型参数量和尺寸,减少运算量。目前采用的模型压缩方法包括对已训练好的模型做修剪(如剪枝、权值共享和量化等)和设计更精细的模型(如MobileNet等)两类。深度学习算法建模及调参过程繁琐,应用门槛高。为了降低深度学习的应用门槛,业界提出了自动化机器学习(AutoML)技术,可实现深度神经网络的自动化设计,简化使用流程。
深度学习与多种机器学习技术不断融合发展。深度学习与强化学习融合发展诞生的深度强化学习技术,结合了深度学习的感知能力和强化学习的决策能力,克服了强化学习只适用于状态为离散且低维的缺陷,可直接从高维原始数据学习控制策略。为了降低深度神经网络模型训练所需的数据量,业界引入了迁移学习的思想,从而诞生了深度迁移学习技术。迁移学习是指利用数据、任务或模型之间的相似性,将在旧领域学习过的模型,应用于新领域的一种学习过程。通过将训练好的模型迁移到类似场景,实现只需少量的训练数据就可以达到较好的效果。
三、未来发展建议
加强图网络、深度强化学习以及生成式对抗网络等前沿技术研究。由于我国在深度学习领域缺乏重大原创性研究成果,基础理论研究贡献不足,如胶囊网络、图网络等创新性、原创性概念是由美国专家提出,我国研究贡献不足。在深度强化学习方面,目前最新的研究成果大都是由DeepMind和OpenAI等国外公司的研究人员提出,我国尚没有突破性研究成果。近几年的研究热点生成式对抗网络(GAN)是由美国的研究人员Goodfellow提出,并且谷歌、facebook、twitter和苹果等公司纷纷提出了各种改进和应用模型,有力推动了GAN技术的发展,而我国在这方面取得的研究成果较少。因此,应鼓励科研院所及企业加强深度神经网络与因果推理模型结合、生成式对抗网络以及深度强化学习等前沿技术的研究,提出更多原创性研究成果,增强全球学术研究影响力。
加快自动化机器学习、模型压缩等深度学习应用技术研究。依托国内的市场优势和企业的成长优势,针对具有我国特色的个性化应用需求,加快对深度学习应用技术的研究。加强对自动化机器学习、模型压缩等技术的研究,加快深度学习的工程化落地应用。加强深度学习在计算机视觉领域应用研究,进一步提升目标识别等视觉任务的准确率,以及在实际应用场景中的性能。加强深度学习在自然语言处理领域的应用研究,提出性能更优的算法模型,提升机器翻译、对话系统等应用的性能。
来源:产业智能官
END
更多精彩内容请登录http://www.innov100.com官方网站
往期精选▼
1. 饮鹿网2018-2019年中国人工智能产业创新百强榜单发布!
2. 饮鹿网2018-2019年中国人工智能产业Top20投资机构榜单发布!
3. 饮鹿网2018-2019年中国大数据产业创新百强榜单发布!
4. 饮鹿网2018-2019年中国大数据产业Top20投资机构榜单发布!
5. 饮鹿网2018-2019年中国物联网产业创新百强榜单发布!
6. 饮鹿网2018-2019年中国5G与物联网产业TOP20投资机构榜单发布!
7. 饮鹿网2018-2019年中国集成电路产业创新百强榜单发布!
8. 饮鹿网2018-2019年中国集成电路产业Top20投资机构榜单发布!
9. 饮鹿网2018-2019年中国企业服务产业创新百强榜单发布!
10. 饮鹿网2018-2019年中国企业服务产业TOP20投资机构榜单发布!

E. 循环神经网络(RNN)浅析

RNN是两种神经网络模型的缩写,一种是递归神经网络(Recursive Neural Network),一种是循环神经网络(Recurrent Neural Network)。虽然这两种神经网络有着千丝万缕的联系,但是本文主要讨论的是第二种神经网络模型——循环神经网络(Recurrent Neural Network)。

循环神经网络是指一个随着时间的推移,重复发生的结构。在自然语言处理(NLP),语音图像等多个领域均有非常广泛的应用。RNN网络和其他网络最大的不同就在于RNN能够实现某种“记忆功能”,是进行时间序列分析时最好的选择。如同人类能够凭借自己过往的记忆更好地认识这个世界一样。RNN也实现了类似于人脑的这一机制,对所处理过的信息留存有一定的记忆,而不像其他类型的神经网络并不能对处理过的信息留存记忆。

循环神经网络的原理并不十分复杂,本节主要从原理上分析RNN的结构和功能,不涉及RNN的数学推导和证明,整个网络只有简单的输入输出和网络状态参数。一个典型的RNN神经网络如图所示:

由上图可以看出:一个典型的RNN网络包含一个输入x,一个输出h和一个神经网络单元A。和普通的神经网络不同的是,RNN网络的神经网络单元A不仅仅与输入和输出存在联系,其与自身也存在一个回路。这种网络结构就揭示了RNN的实质:上一个时刻的网络状态信息将会作用于下一个时刻的网络状态。如果上图的网络结构仍不够清晰,RNN网络还能够以时间序列展开成如下形式:

等号右边是RNN的展开形式。由于RNN一般用来处理序列信息,因此下文说明时都以时间序列来举例,解释。等号右边的等价RNN网络中最初始的输入是x0,输出是h0,这代表着0时刻RNN网络的输入为x0,输出为h0,网络神经元在0时刻的状态保存在A中。当下一个时刻1到来时,此时网络神经元的状态不仅仅由1时刻的输入x1决定,也由0时刻的神经元状态决定。以后的情况都以此类推,直到时间序列的末尾t时刻。

上面的过程可以用一个简单的例子来论证:假设现在有一句话“I want to play basketball”,由于自然语言本身就是一个时间序列,较早的语言会与较后的语言存在某种联系,例如刚才的句子中“play”这个动词意味着后面一定会有一个名词,而这个名词具体是什么可能需要更遥远的语境来决定,因此一句话也可以作为RNN的输入。回到刚才的那句话,这句话中的5个单词是以时序出现的,我们现在将这五个单词编码后依次输入到RNN中。首先是单词“I”,它作为时序上第一个出现的单词被用作x0输入,拥有一个h0输出,并且改变了初始神经元A的状态。单词“want”作为时序上第二个出现的单词作为x1输入,这时RNN的输出和神经元状态将不仅仅由x1决定,也将由上一时刻的神经元状态或者说上一时刻的输入x0决定。之后的情况以此类推,直到上述句子输入到最后一个单词“basketball”。

接下来我们需要关注RNN的神经元结构:

上图依然是一个RNN神经网络的时序展开模型,中间t时刻的网络模型揭示了RNN的结构。可以看到,原始的RNN网络的内部结构非常简单。神经元A在t时刻的状态仅仅是t-1时刻神经元状态与t时刻网络输入的双曲正切函数的值,这个值不仅仅作为该时刻网络的输出,也作为该时刻网络的状态被传入到下一个时刻的网络状态中,这个过程叫做RNN的正向传播(forward propagation)。注:双曲正切函数的解析式如下:

双曲正切函数的求导如下:

双曲正切函数的图像如下所示:

这里就带来一个问题:为什么RNN网络的激活函数要选用双曲正切而不是sigmod呢?(RNN的激活函数除了双曲正切,RELU函数也用的非常多)原因在于RNN网络在求解时涉及时间序列上的大量求导运算,使用sigmod函数容易出现梯度消失,且sigmod的导数形式较为复杂。事实上,即使使用双曲正切函数,传统的RNN网络依然存在梯度消失问题,无法“记忆”长时间序列上的信息,这个bug直到LSTM上引入了单元状态后才算较好地解决。

这一节主要介绍与RNN相关的数学推导,由于RNN是一个时序模型,因此其求解过程可能和一般的神经网络不太相同。首先需要介绍一下RNN完整的结构图,上一节给出的RNN结构图省去了很多内部参数,仅仅作为一个概念模型给出。

上图表明了RNN网络的完整拓扑结构,从图中我们可以看到RNN网络中的参数情况。在这里我们只分析t时刻网络的行为与数学推导。t时刻网络迎来一个输入xt,网络此时刻的神经元状态st用如下式子表达:

t时刻的网络状态st不仅仅要输入到下一个时刻t+1的网络状态中去,还要作为该时刻的网络输出。当然,st不能直接输出,在输出之前还要再乘上一个系数V,而且为了误差逆传播时的方便通常还要对输出进行归一化处理,也就是对输出进行softmax化。因此,t时刻网络的输出ot表达为如下形式:

为了表达方便,笔者将上述两个公式做如下变换:

以上,就是RNN网络的数学表达了,接下来我们需要求解这个模型。在论述具体解法之前首先需要明确两个问题:优化目标函数是什么?待优化的量是什么?

只有在明确了这两个问题之后才能对模型进行具体的推导和求解。关于第一个问题,笔者选取模型的损失函数作为优化目标;关于第二个问题,我们从RNN的结构图中不难发现:只要我们得到了模型的U,V,W这三个参数就能完全确定模型的状态。因此该优化问题的优化变量就是RNN的这三个参数。顺便说一句,RNN模型的U,V,W三个参数是全局共享的,也就是说不同时刻的模型参数是完全一致的,这个特性使RNN得参数变得稍微少了一些。

不做过多的讨论,RNN的损失函数选用交叉熵(Cross Entropy),这是机器学习中使用最广泛的损失函数之一了,其通常的表达式如下所示:

上面式子是交叉熵的标量形式,y_i是真实的标签值,y_i*是模型给出的预测值,最外面之所以有一个累加符号是因为模型输出的一般都是一个多维的向量,只有把n维损失都加和才能得到真实的损失值。交叉熵在应用于RNN时需要做一些改变:首先,RNN的输出是向量形式,没有必要将所有维度都加在一起,直接把损失值用向量表达就可以了;其次,由于RNN模型处理的是序列问题,因此其模型损失不能只是一个时刻的损失,应该包含全部N个时刻的损失。

故RNN模型在t时刻的损失函数写成如下形式:

全部N个时刻的损失函数(全局损失)表达为如下形式:

需要说明的是:yt是t时刻输入的真实标签值,ot为模型的预测值,N代表全部N个时刻。下文中为了书写方便,将Loss简记为L。在结束本小节之前,最后补充一个softmax函数的求导公式:

由于RNN模型与时间序列有关,因此不能直接使用BP(back propagation)算法。针对RNN问题的特殊情况,提出了BPTT算法。BPTT的全称是“随时间变化的反向传播算法”(back propagation through time)。这个方法的基础仍然是常规的链式求导法则,接下来开始具体推导。虽然RNN的全局损失是与全部N个时刻有关的,但为了简单笔者在推导时只关注t时刻的损失函数。

首先求出t时刻下损失函数关于o_t*的微分:

求出损失函数关于参数V的微分:

因此,全局损失关于参数V的微分为:

求出t时刻的损失函数关于关于st*的微分:

求出t时刻的损失函数关于s_t-1*的微分:

求出t时刻损失函数关于参数U的偏微分。注意:由于是时间序列模型,因此t时刻关于U的微分与前t-1个时刻都有关,在具体计算时可以限定最远回溯到前n个时刻,但在推导时需要将前t-1个时刻全部带入:

因此,全局损失关于U的偏微分为:

求t时刻损失函数关于参数W的偏微分,和上面相同的道理,在这里仍然要计算全部前t-1时刻的情况:

因此,全局损失关于参数W的微分结果为:

至此,全局损失函数关于三个主要参数的微分都已经得到了。整理如下:

接下来进一步化简上述微分表达式,化简的主要方向为t时刻的损失函数关于ot的微分以及关于st*的微分。已知t时刻损失函数的表达式,求关于ot的微分:

softmax函数求导:

因此:

又因为:

且:

有了上面的数学推导,我们可以得到全局损失关于U,V,W三个参数的梯度公式:

由于参数U和W的微分公式不仅仅与t时刻有关,还与前面的t-1个时刻都有关,因此无法写出直接的计算公式。不过上面已经给出了t时刻的损失函数关于s_t-1的微分递推公式,想来求解这个式子也是十分简单的,在这里就不赘述了。

以上就是关于BPTT算法的全部数学推导。从最终结果可以看出三个公式的偏微分结果非常简单,在具体的优化过程中可以直接带入进行计算。对于这种优化问题来说,最常用的方法就是梯度下降法。针对本文涉及的RNN问题,可以构造出三个参数的梯度更新公式:

依靠上述梯度更新公式就能够迭代求解三个参数,直到三个参数的值发生收敛。

这是笔者第一次尝试推导RNN的数学模型,在推导过程中遇到了非常多的bug。非常感谢互联网上的一些公开资料和博客,给了我非常大的帮助和指引。接下来笔者将尝试实现一个单隐层的RNN模型用于实现一个语义预测模型。

F. 循环神经网络(RNN)简介

循环神经网络英文名称为 ( Recurrent Neural Network, RNN ),其通过使用带自反馈的神经元,能够处理任意长度的 时序 数据。

给定输入时序序列

式中, 表示一段时序数据, 为时间长度

以一段英文段落为例,其时序数据可以表示为:

若是一段视频,将其每一帧通过CNN网络处理得到相应的编码向量

循环神经网络通过以下公式更新隐藏层的活性值

循环神经网络图示

RNN的基本模型如下图所示,为便于理解,图中将RNN的模型展开,按照时序方向对其前向传播流程进行介绍

RNN的基本模型

利用数学表达式整个过程可以变得更加清晰,RNN的前向传播公式如下:

将上述过程整合到一个RNN cell中,可以表示为如下图所示的过程:

RNN的前向传播示意图

缺陷:

没有利用到模型后续的信息,可以通过双向RNN网络进行优化

RNN主要有两种计算梯度的方式:随时间反向传播(BPTT)和实时循环学习法(RTRL)算法

本文中主要介绍随时间反向传播的方法 ( BackPropagation Through Time

RNN的损失函数与任务有关,对于同步的序列对序列任务,其loss可以用交叉熵公式表示

然后通过BPTT算法便可以进行梯度的反向传播计算

梯度爆炸的解决方法:梯度修剪

梯度消失的解决方法:增加长程依赖 LSTM,GRU

GRU的基本思路:增加相关门(Relate Gate)和更新门(Update Gate),进而使得RNN单元具有记忆能力

首先从数学角度对GRU的前向传播过程进行介绍,具体公式如下:

公式中各变量的含义:

将上述数学公式转化为图像,可得

GRU Cell的前向传播流程

LSTM意为长短时记忆网络 (Long Short-Term Memory Network,LSTM) ,可以有效地解决简单神经网络的梯度消失和爆炸问题

在LSTM中,与GRU主要有两点不同

同样,先从数学公式入手,对LSTM的前向传播过程进行了解

基于数学公式的过程,可将LSTM CELL的前向传播过程总结为(图片借用于nndl):

LSTM Cell的前向传播示意图

从上图中可以看出,LSTM在前向传播的过程中传输了两个状态:内部状态 以及外部状态 ,在整个传播过程中 外部状态(隐状态) 每个时刻都会被重写,因此可以看作一种 短时记忆 ,而 内部状态 可以在某个时刻捕捉一些关键信息,并将此信息保存一段时间间隔,可以看作一种 长时记忆 (长的短时记忆)

此外,在LSTM网络初始化训练的时候,需要手动将遗忘门的数值设置的大一些,否则在参数初始化的时候,遗忘门的数据会被初始化为一个很小的值,前一时刻的内部状态 大部分都会丢失,这样网络很难获取到长距离的依赖信息,并且相邻时间间隔的梯度会非常小,导致 梯度弥散 问题,因此遗忘门的 偏置变量 的初始值 一般很大,取 1或2

将 设置为1即可,但是长度非常的大的时候会造成记忆单元的饱和,降低性能

三个门不仅依赖于 和 ,也依赖于

将两者合并为一个门,即:

首先,我们要理解什么是深层的RNN,对于单个的RNN cell,若将其在时间维度上展开,其深度与时间维度的长度成正比,但若将一个RNN cell看作为单个从 的映射函数,则单个cell实际上是很浅显的一层,因此深层循环神经网络要做的就是把多个RNN cell组合起来,换句话说,就是增加从输入 到输出 的路径,使得网络的深度更深。

如何增加从输入 到输出 的路径呢?两种途径:

堆叠循环神经网络示意图

将网络带入到实际应用场景中:假如我们要翻译一段句子

在这里,is和are实际上是由后面的Lucy和they所决定的,而这种单向的按照时序进行传播的方式没有利用到后面的信息。因此诞生了双向循环网络

双向循环神经网络示意图

双向循环神经网络实际上就是简单的双层循环神经网络,只不过第二层网络的传播方式为按时序的逆向传播,其传播公式为:

G. 循环神经网络 擅长解决什么样的问题

RNN建立在与FNN相同的计算单元上,两者之间区别在于:组成这些神经元相互关联的架构有所不同。FNN是建立在层面之上,其中信息从输入单元向输出单元单向流动,在这些连通模式中并不存在不定向的循环。尽管大脑的神经元确实在层面之间的连接上包含有不定向循环,我们还是加入了这些限制条件,以牺牲计算的功能性为代价来简化这一训练过程。因此,为了创建更为强大的计算系统,我们允许RNN打破这些人为设定强加性质的规定:RNN无需在层面之间构建,同时定向循环也会出现。事实上,神经元在实际中是允许彼此相连的。

H. 深度学习的现状和趋势

论坛

活动

招聘

专题

打开CSDN APP
Copyright © 1999-2020, CSDN.NET, All Rights Reserved

搜索博文/帖子/用户
登录

喜欢打酱油的老鸟
关注
深度学习技术发展趋势浅析 转载
2019-04-09 08:37:11
1点赞

喜欢打酱油的老鸟

码龄2年

关注
https://mp.weixin.qq.com/s/FtIhKiENv483iHE053RPkg

当前,人工智能发展借助深度学习技术突破得到了全面关注和助力推动,各国政府高度重视、资本热潮仍在加码,各界对其成为发展热点也达成了共识。本文旨在分析深度学习技术现状,研判深度学习发展趋势,并针对我国的技术水平提出发展建议。

一、深度学习技术现状

深度学习是本轮人工智能爆发的关键技术。人工智能技术在计算机视觉和自然语言处理等领域取得的突破性进展,使得人工智能迎来新一轮爆发式发展。而深度学习是实现这些突破性进展的关键技术。其中,基于深度卷积网络的图像分类技术已超过人眼的准确率,基于深度神经网络的语音识别技术已达到95%的准确率,基于深度神经网络的机器翻译技术已接近人类的平均翻译水平。准确率的大幅提升使得计算机视觉和自然语言处理进入产业化阶段,带来新产业的兴起。

深度学习是大数据时代的算法利器,成为近几年的研究热点。和传统的机器学习算法相比,深度学习技术有着两方面的优势。一是深度学习技术可随着数据规模的增加不断提升其性能,而传统机器学习算法难以利用海量数据持续提升其性能。二是深度学习技术可以从数据中直接提取特征,削减了对每一个问题设计特征提取器的工作,而传统机器学习算法需要人工提取特征。因此,深度学习成为大数据时代的热点技术,学术界和产业界都对深度学习展开了大量的研究和实践工作。

深度学习各类模型全面赋能基础应用。卷积神经网络和循环神经网络是两类获得广泛应用的深度神经网络模型。计算机视觉和自然语言处理是人工智能两大基础应用。卷积神经网络广泛应用于计算机视觉领域,在图像分类、目标检测、语义分割等任务上的表现大大超越传统方法。循环神经网络适合解决序列信息相关问题,已广泛应用于自然语言处理领域,如语音识别、机器翻译、对话系统等。

二、深度学习发展趋势

深度神经网络呈现层数越来越深,结构越来越复杂的发展趋势。为了不断提升深度神经网络的性能,业界从网络深度和网络结构两方面持续进行探索。神经网络的层数已扩展到上百层甚至上千层,随着网络层数的不断加深,其学习效果也越来越好,2015年微软提出的ResNet以152层的网络深度在图像分类任务上准确率首次超过人眼。新的网络设计结构不断被提出,使得神经网络的结构越来越复杂。如:2014年谷歌提出了Inception网络结构、2015年微软提出了残差网络结构、2016年黄高等人提出了密集连接网络结构,这些网络结构设计不断提升了深度神经网络的性能。

深度神经网络节点功能不断丰富。为了克服目前神经网络存在的局限性,业界探索并提出了新型神经网络节点,使得神经网络的功能越来越丰富。2017年,杰弗里•辛顿提出了胶囊网络的概念,采用胶囊作为网络节点,理论上更接近人脑的行为,旨在克服卷积神经网络没有空间分层和推理能力等局限性。2018年,DeepMind、谷歌大脑、MIT的学者联合提出了图网络的概念,定义了一类新的模块,具有关系归纳偏置功能,旨在赋予深度学习因果推理的能力。

深度神经网络工程化应用技术不断深化。深度神经网络模型大都具有上亿的参数量和数百兆的占用空间,运算量大,难以部署到智能手机、摄像头和可穿戴设备等性能和资源受限的终端类设备。为了解决这个问题,业界采用模型压缩技术降低模型参数量和尺寸,减少运算量。目前采用的模型压缩方法包括对已训练好的模型做修剪(如剪枝、权值共享和量化等)和设计更精细的模型(如MobileNet等)两类。深度学习算法建模及调参过程繁琐,应用门槛高。为了降低深度学习的应用门槛,业界提出了自动化机器学习(AutoML)技术,可实现深度神经网络的自动化设计,简化使用流程。

I. 循环神经网络

为什么卷积神经网络不会出现严重的数值问题呢?
卷积神经网络中每一层的权重矩阵 W 是不同的,并且在初始化时它们是独立同分布的,因此可以相互抵消,在多层之后一般不会出现严重的数值问题。
循环神经网络采用 ReLu 激活函数,只有当 W 的取值在单位矩阵附近时才能取得比较好的效果,因此需要将 W 初始化为单位矩阵。

Seq2Seq 模型最基础的解码方法是贪心法,即选取一种度量标准后,每次都在当前状态下选择最佳的一个结果,直到结束。贪心法的计算代价低,适合作为基准结果与其他方法相比较。贪心法获得的是一个局部最优解,由于实际问题的复杂性,该方法往往不能取得最好的结果。
集束搜索: 是一种启发式算法,会保存 beam size 个当前的较佳选择,然后解码时每一步根据保存的选则进行下一步扩展和排序,接着选择前 b 个进行保存,循环迭代,知道结束时选择最佳的一个作为解码的结果。 b 往往选择一个适中的范围,以 8-12 为佳。

Seq2Seq 模型引入注意力机制是为了解决什么问题?为什么选用了双向的循环神经网络模型?
编码时输入序列的全部信息压缩到了一个向量中,随着序列增长,句子越前面的词的信息丢失越严重。同时,Seq2Seq 模型的输出序列中,常常会损失部分输入序列信息,这是解码时,当前词及对应的源语言词的上下文信息和位置信息在编解码过程中丢失了。 引入注意力机制,解决上述问题 。使用双向的循环神经网络进行建模,可以获取前后文的信息。

J. Pytorch_循环神经网络RNN

RNN是Recurrent Neural Networks的缩写,即循环神经网络,它常用于解决序列问题。RNN有记忆功能,除了当前输入,还把上下文环境作为预测的依据。它常用于语音识别、翻译等场景之中。

RNN是序列模型的基础,尽管能够直接调用现成的RNN算法,但后续的复杂网络很多构建在RNN网络的基础之上,如Attention方法需要使用RNN的隐藏层数据。RNN的原理并不复杂,但由于其中包括循环,很难用语言或者画图来描述,最好的方法是自己手动编写一个RNN网络。本篇将介绍RNN网络的原理及具体实现。

在学习循环神经网络之前,先看看什么是序列。序列sequence简称seq,是有先后顺序的一组数据。自然语言处理是最为典型的序列问题,比如将一句话翻译成另一句话时,其中某个词汇的含义不仅取决于它本身,还与它前后的多个单词相关。类似的,如果想预测电影的情节发展,不仅与当前的画面有关,还与当前的一系列前情有关。在使用序列模型预测的过程中,输入是序列,而输出是一个或多个预测值。

在使用深度学习模型解决序列问题时, 最容易混淆的是,序列与序列中的元素 。在不同的场景中,定义序列的方式不同,当分析单词的感情色彩时,一个单词是一个序列seq;当分析句子感情色彩时,一个句子是一个seq,其中的每个单词是序列中的元素;当分析文章感情色彩时,一篇文章是一个seq。简单地说,seq是最终使用模型时的输入数据,由一系列元素组成。

当分析句子的感情色彩时,以句为seq,而句中包含的各个单词的含义,以及单词间的关系是具体分析的对象,此时,单词是序列中的元素,每一个单词又可有多维特征。从单词中提取特征的方法将在后面的自然语言处理中介绍。

RNN有很多种形式,单个输入单个输入;多个输入多个输出,单个输入多个输出等等。

举个最简单的例子:用模型预测一个四字短语的感情色彩,它的输入为四个元素X={x1,x2,x3,x4},它的输出为单个值Y={y1}。字的排列顺序至关重要,比如“从好变坏”和“从坏变好”,表达的意思完全相反。之所以输入输出的个数不需要一一对应,是因为中间的隐藏层,变向存储中间信息。

如果把模型设想成黑盒,如下图所示:

如果模型使用全连接网络,在每次迭代时,模型将计算各个元素x1,x2...中各个特征f1,f2...代入网络,求它们对结果y的贡献度。

RNN网络则要复杂一些,在模型内部,它不是将序列中所有元素的特征一次性输入模型,而是每一次将序列中单个元素的特征输入模型,下图描述了RNN的数据处理过程,左图为分步展示,右图将所有时序步骤抽象成单一模块。

第一步:将第一个元素x1的特征f1,f2...输入模型,模型根据输入计算出隐藏层h。

第二步:将第二个元素x2的特征输入模型,模型根据输入和上一步产生的h再计算隐藏层h,其它元素以此类推。

第三步:将最后一个元素xn的特征输入模型,模型根据输入和上一步产生的h计算隐藏层h和预测值y。

隐藏层h可视为将序列中前面元素的特征和位置通过编码向前传递,从而对输出y发生作用,隐藏层的大小决定了模型携带信息量的多少。隐藏层也可以作为模型的输入从外部传入,以及作为模型的输出返回给外部调用。

本例仍使用上篇中的航空乘客序列数据,分别用两种方法实现RNN:自己编写程序实现RNN模型,以及调用Pytorch提供的RNN模型。前一种方法主要用于剖析原理,后一种用于展示常用的调用方法。

首先导入头文件,读取乘客数据,做归一化处理,并将数据切分为测试集和训练集,与之前不同的是加入了create_dataset函数,用于生成序列数据,序列的输入部分,每个元素中包括两个特征:前一个月的乘客量prev和月份值mon,这里的月份值并不是关键特征,主要用于在例程中展示如何使用多个特征。

第一步:实现模型类,此例中的RNN模型除了全连接层,还生成了一个隐藏层,并在下一次前向传播时将隐藏层输出的数据与输入数据组合后再代入模型运算。

第二步,训练模型,使用全部数据训练500次,在每次训练时,内部for循环将序列中的每个元素代入模型,并将模型输出的隐藏层和下一个元素一起送入下一次迭代。

第三步:预测和作图,预测的过程与训练一样,把全部数据拆分成元素代入模型,并将每一次预测结果存储在数组中,并作图显示。

需要注意的是,在训练和预测过程中,每一次开始输入新序列之前,都重置了隐藏层,这是由于隐藏层的内容只与当前序列相关,序列之间并无连续性。

程序输出结果如下图所示:

经过500次迭代,使用RNN的效果明显优于上一篇中使用全连接网络的拟合效果,还可以通过调整超参数以及选择不同特征,进一步优化。

使用Pytorch提供的RNN模型,torch.nn.RNN类可直接使用,是循环网络最常用的解决方案。RNN,LSTM,GRU等循环网络都实现在同一源码文件torch/nn/moles/rnn.py中。

第一步:创建模型,模型包含两部分,第一部分是Pytorch提供的RNN层,第二部分是一个全连接层,用于将RNN的输出转换成输出目标的维度。

Pytorch的RNN前向传播允许将隐藏层数据h作为参数传入模型,并将模型产生的h和y作为函数返回值。形如: pred, h_state = model(x, h_state)

什么情况下需要接收隐藏层的状态h_state,并转入下一次迭代呢?当处理单个seq时,h在内部前向传递;当序列与序列之间也存在前后依赖关系时,可以接收h_state并传入下一步迭代。另外,当模型比较复杂如LSTM模型包含众多参数,传递会增加模型的复杂度,使训练过程变慢。本例未将隐藏层转到模型外部,这是由于模型内部实现了对整个序列的处理,而非处理单个元素,而每次代入的序列之间又没有连续性。

第二步:训练模型,与上例中把序列中的元素逐个代入模型不同,本例一次性把整个序列代入了模型,因此,只有一个for循环。

Pythorch支持批量处理,前向传递时输入数据格式是[seq_len, batch_size, input_dim),本例中输入数据的维度是[100, 1, 2],input_dim是每个元素的特征数,batch_size是训练的序列个数,seq_len是序列的长度,这里使用70%作为训练数据,seq_len为100。如果数据维度的顺序与要求不一致,一般使用transpose转换。

第三步:预测和作图,将全部数据作为序列代入模型,并用预测值作图。

程序输出结果如下图所示:

可以看到,经过500次迭代,在前100个元素的训练集上拟合得很好,但在测试集效果较差,可能存在过拟合。

阅读全文

与循环神经网络应用在哪些方面相关的资料

热点内容
网络共享中心没有网卡 浏览:521
电脑无法检测到网络代理 浏览:1374
笔记本电脑一天会用多少流量 浏览:578
苹果电脑整机转移新机 浏览:1376
突然无法连接工作网络 浏览:1062
联通网络怎么设置才好 浏览:1224
小区网络电脑怎么连接路由器 浏览:1037
p1108打印机网络共享 浏览:1212
怎么调节台式电脑护眼 浏览:698
深圳天虹苹果电脑 浏览:935
网络总是异常断开 浏览:612
中级配置台式电脑 浏览:995
中国网络安全的战士 浏览:630
同志网站在哪里 浏览:1413
版观看完整完结免费手机在线 浏览:1459
怎样切换默认数据网络设置 浏览:1110
肯德基无线网无法访问网络 浏览:1286
光纤猫怎么连接不上网络 浏览:1477
神武3手游网络连接 浏览:965
局网打印机网络共享 浏览:1000