Advertisement

循环神经网络模型及应用,循环神经网络应用举例

阅读量:

神经网络算法的三大类分别是?

属于神经网络算法的主要类别有:1)前馈神经网络;其主要特点包括单向数据流动特性及其在模式识别等实际应用中展现出显著的优势;2) recurrent neural networks(RNNs);这种递归架构通过允许信息在不同时间步之间保持长期记忆来解决序列建模问题;3)convolutional neural networks(CNNs);其独特的卷积操作使其成为图像和视频分析领域的重要工具。其中前馈神经网络以其简单高效的特性成为实际应用中最为常见的一种选择;它通常由输入层接收原始数据特征信息并将其传递给后续各层进行处理;如果存在多个中间(hidden)层则被称为深度(deep)神经网络;这种架构设计旨在通过多级非线性变换以更好地捕捉复杂模式并提高模型性能。

不同层级的神经元行为是上一层行为的非线性转换。2、循环网络:循环网络通过建立循环路径,在连接图中实现按箭头方向返回初始位置的能力,并由此产生复杂的动态过程。这些系统较难进行训练,并且它们更具有生物特征属性。

循环网络的主要目标是处理序列数据。传统的神经架构通常包含输入、隐藏和输出层,并通过全连接机制传递信息;然而,在面对许多复杂问题时,这样的传统架构表现欠佳。

循环神经网路,即一个序列当前的输出与前面的输出也有关。

具体表现为该系统会对前一层的信息进行记忆,并将其应用到当前输出计算过程中;即各隐藏层之间的节点不再是处于无连接状态而是建立起了有连接的关系;并且各隐藏层的输入不仅来源于前一层(即输入层)的输出结果还包含着上一个时间点本层隐藏单元自身的输出结果。

这种对称性联结网络与环状联结型神经网络相似,在单元之间建立的联系是相互对称的(即两边方向上的权重相等)。相较于环状联结型神经网络而言,在分析复杂模式时可能更为简便。这意味着该系统会受到能量函数规律的影响

不包含任何隐藏单元的对称连接网络被定义为Hopfield网络。同时,在存在隐藏单元且保持对称性的条件下形成的网络则被定义为玻尔兹曼机。

心理学家和认知科学家致力于神经网络的研究目的在于揭示人脑处理信息的基本规律及其运行机制,并深入分析人类认知活动的本质规律与内在联系,在此基础上构建人类认知过程的微观运行模型

这些领域的专家正致力于利用神经网络技术推动脑科学研究朝着更加定量化、精确化和理论化的方向演进;与此同时他们也期望临床医学能够取得新的重大进展;而信息处理与计算机科学领域的研究则致力于探索能够解决那些目前无法有效应对或计算难度极大的问题的新途径并最终构造出一类能够更接近人类大脑功能的一类新型计算机系统

谷歌人工智能写作项目:小发猫

循环神经网络的反向传播

其主要功能体现在利用MATLAB软件中的神经网络工具箱支持BP(Backpropagation)神经网络算法的设计与实现**rfid**

该系统由一个包含两层隐含层的BP神经网络构成,在matlab环境下完成设计实现。整个系统主要分为三个功能模块:输入模块负责接收并存储训练样本数据以及相关的网络参数信息;初始化权重系数后进行标准化的数据预处理;第二模块负责模型训练过程的具体操作包含前向传播过程以及反向传播算法的应用,并通过梯度下降方法修正每层权重矩阵;第三模块则用于模型评估阶段展示了网络收敛后的状态信息以及预测结果与预期目标之间的相对误差变化情况,并记录测试集上的分类准确率指标数值变化趋势;最后通过绘制训练过程中的损失函数变化曲线图以及验证集误差随训练轮次的变化趋势图来直观展示模型的学习效果

如何使用TensorFlow构建,训练和改进循环神经网络

基本使用TensorFlow,你必须了解TensorFlow:它以图(graph)的形式表示计算任务.这些图在特定的上下文中执行,称为会话(Session).数据通过张量(tensor)传递,而状态则由变量(Variable)维护.无论是feed还是fetch操作,都能对任意的操作(arbitraryoperation)进行赋值或获取数据.综上所述,TensorFlow是一个编程系统,它以图的形式描述计算过程.图中的节点被称为op(operation),每个节点接收多个张量作为输入,执行计算后生成多个输出张量.这些输出张量是一种经过类型化处理的多维数组.例如,你可以将一组图像表示为一个四维浮点数数组[batch,height,width,channels].TensorFlow中的图描述了完整的计算流程.为了执行这些计算,必须在会话中启动图.会话将运算分配到CPU或其他设备上运行,并提供执行运算的方法.这些方法完成后,将返回相应的张量结果.在Python环境中,默认返回的是numpyndarray对象;而在C/C++环境中则返回tensorflow::Tensor实例。

如何有效的区分和理解RNN循环神经网络与递归神经网络

基于相同的计算单元架构,在实现功能的同时却选择了更为简洁的训练方式。该种方式虽然无法完全保留其功能性特征但确实在一定程度上降低了复杂度。其中信息流动方向明确,并且是从输入层传递到输出层的具体环节中不存在反向或不定向的循环连接。这种前馈神经网络架构以其层次化的组织结构著称。

因此,在构建更强大的计算系统的目标下,我们让RNN能够突破那些由人类预先设定的一些固定规则。在现实中允许神经元之间相互连接的情况下,“两者之间的区别主要在于:由这些神经元相互关联所构成的架构有所不同”,而我们仍然保留了这些限制条件。

事实上:RNN没有在层面之间构建结构,并且会出现定向循环。然而,在大脑的神经元连接中存在不定向循环。

如何用PyTorch实现递归神经网络

深度神经网络已经在机器理解自然语言方面实现了显著的进步

这些主要模型普遍地将语言视为线性排列的单词或字符序列,并主要采用循环神经网络(recurrentneuralnetwork/RNN)这一架构来处理这种序列

但是许多语言学家持认为语言最常被用来描述具有树状结构的层次化词组。一种特别关注这种结构的深度学习模型被称为递归神经网络(recursiveneuralnetwork)。这一领域已有大量研究。

尽管这些模型在应用上存在巨大挑战且效率显著低下,然而PyTorch则显著降低了开发者的复杂性。

尽管递归式神经网络很好地体现了PyTorch的灵活性特征,但它却广泛支持多种深度学习框架,其中最突出的就是对其计算机视觉(computervision)计算能力的有力支撑

PyTorch是由Facebook AI Research团队及其合作伙伴开发而成。这一框架整合了基于GPU的强大加速功能与用户友好的Python界面设计。它以其高效的模型构建能力、简洁易懂的代码风格以及兼容性极强的支持范围著称。

开始SPINN链接中的文章详细说明了一个递归神经网络的PyTorch实现,该方法包含一个循环跟踪器(reurrenttracker)以及TreeLSTM单元,也被称作SPINN——该模型作为深度学习技术在自然语言处理领域的一个典型实例,其构建过程在主流深度学习框架中仍较为复杂

在本研究中所采用的模型实现环节基于批处理(batch)技术。因此,在计算资源允许的情况下该算法被优化地利用GPU进行加速运算,并且其计算效率较传统批处理方法具有显著提升

SPINN意为stack-augmented parser-interpreter neural network(堆栈增强的解析器-解释器神经网络),该概念由Bowman等人于2016年首次提出以解决自然语言推理问题,在该研究中他们采用了斯坦福大学SNLI数据集作为实验基础

该分类任务旨在将每对语句划分为三个类别:假设第一句话是一幅不可见图像的确切标题,则第二句话(a选项)明确指出了这一事实、(b选项)有可能成为合适的标题、而(c选项)则不可能作为合适的标题。

(这些类分别被称为蕴含(entailment)、中立(neutral)和矛盾(contradiction))。

举例来说,在分析这句话时

为了实现其主要目标,在对语句之间的关系进行分析之前, 研究者采用了将每个单独句子转换为固定长度向量序列的方法 (encoding) 来表征语义信息 (此外, 在注意力机制中 (attention mechanism), 通过软化关注的方式对各个句子成分进行比较)。

该数据集是基于句法解析树这一手段由机器生成的。句法解析树被用来将每个句子中的单词分解为包含独立意义的短语和子句。这些短语如两个词或子短语构成。

该数据集是基于句法解析树这一手段由机器生成的。 sentence parsing tree被用来将每个句子中的单词分解为包含 independent meaning 的 phrases 和 clauses. 这些 phrases 如 two words or subphrases 构成.

许多语言学家视作这一过程为基本原理的人类自然会采用类似的层级结构来进行信息处理与意义构建。这也促使研究者试图仿照人类的语言处理机制——以层级结构为基础建立神经网络模型——作为一种可行且值得探索的方向。

在数据集中存在以下示例句子:其语法结构通过嵌套括号明确表示为((Thechurch)((has(cracks(in(theceiling)))))。为了实现对这种句子的有效编码方案之一是构建一种基于解析树的神经网络架构:该网络层称为Reduce层能够整合词语对(以词嵌入形式)以及/或短语并递归应用该层函数最终输出作为整个句子的编码结果X=Reduce(“the”,“ceiling”)Y=Reduce(“in”,X)...依此类推。然而如果我希望该网络能够模仿人类处理语言的方式从左至右逐步处理并保持语境信息同时依然能够利用解析树结构进行短语整合操作则需要采取不同的设计策略

或者

The church同样存在天花板上的裂缝)。或者采用第三种表示方式:WORDS:The church exists with cracks in the ceiling. PARSES:SSRSSSSSRRRRSRR我的做法仅仅是去除开括号,并在shift操作中使用S标记,在reduce操作中使用R替换闭括号。

但是现在可以从左到右按顺序读取信息作为一系列指令来操作一个stack(堆栈)和一个类似于该数据结构的数据缓冲区(buffer),其结果与前述递归方法完全一致:1.将单词加入数据缓冲区。

2.从缓冲区头部取出「The」并推送到堆栈的上一层位置。随后取出「church」并执行同样的操作。
3.依次取出堆栈中的前两个值,并对它们执行降级操作后将结果返回到堆栈中。

4.从缓冲区弹出 «has» ,随后将其推送到堆栈中;接着是 «cracks» ,紧接着是在 «in» 的状态下继续;随后为 «the» ,最终到达 «ceiling» 的位置。

5.依次进行四次操作:每次取出两个栈顶元素并用于计算约简(Reduce),随后将计算结果返回至堆栈中。
6.从缓冲区中取出一个特定的操作符「.'」并将其推送到堆栈的上一层位置。
7.依次执行两次操作:每次取出两个栈顶元素并用于计算约简(Reduce),随后将计算结果返回至堆栈中。

8.将剩余元素从堆栈中弹出,并将其编码为对应的句柄。为了确保后续处理能够基于当前已解析的部分进行优化,在处理完当前句段后仍需保留完整的上下文信息。

因此, 我打算用一个三参数函数取代双参数的Reduce函数. 其输入包括三个元素: 左子句, 右子句以及当前句子所处的上下文状态. 这些状态由神经网络中的第二层构建(此层被命名为循环跟踪器单元).

当基于当前句子上下文状态、缓冲区顶部条目b以及堆栈前两个条目s₁和s₂时,在每一次堆栈操作后生成一个新的状态:context[t+1]等于 Tracker(context[t], b, s₁, s₂);容易想象的是用你最熟悉的编程语言来实现这些操作。

对于每个需要处理的句子来说,在缓冲区中加载下一个单词并触发跟踪器来检查是否将其推送到堆栈并调用Reduce函数以进行相应的处理操作;依次重复这一过程直至完成整个句子的处理过程。

基于每个单独的句子的处理,该流程由一个规模庞大且复杂的深度神经网络构成,并反复进行其两个可训练层的处理。

但是,在你了解TensorFlow或Theano等传统深度学习框架之后你会发现它们难以实现这种动态过程。你值得花些时间回顾一下以探索为何PyTorch与其他框架不同

在图论中,图1展示了函数及其结构如何表示深度神经网络作为具有大量参数的复杂函数。深度学习的目标是通过计算损失函数(loss)所衡量的梯度来优化模型中的参数。

假设函数以计算图形式表示为图1所示,则通过逆向遍历该计算图即可完成这些梯度的计算,无需额外的工作开销

所有现有的深度学习架构都建立在反向传播(backpropagation)这一核心概念上;因此每个现有架构都需要一种表示计算图的方式

在大多数流行的深度学习框架中(如TensorFlow、Theano、Keras以及Torch7中的nngraph库等主流框架)描述的计算图示是一个预先构建好的静态对象结构。

此图采用类似于数学表达式的形式进行编码。然而,在此图中使用的这些变量本质上是未预先赋值的占位符标记。值得注意的是,在构建模型时,这些占位符变量会被整合到相应的计算流程中。在训练数据批处理过程中反复执行该计算流程运算,在每一次迭代中都能够生成相应的输出结果以及用于更新模型参数的梯度值。

该静态计算图(staticcomputationgraph)体系在固定结构卷积神经网络中的表现非常出色。然而,在许多其他应用场景中,动态调整神经网络架构是一种有效策略。

在自然语言处理领域中,研究者普遍采用循环神经网络模型,并在输入的每个时间点上持续更新以维持其动态特性

上述SPINN模型中的堆栈操作主要依赖于控制流程(如for循环与条件判断语句)来确定特定句子的计算图架构。在更为复杂的情形下,则可能需要构建基于自身架构的子网络用于生成输出模型。

这些想法中的部分(虽然并非全部)能够被直接应用到静态图系统中,然而通常会以降低透明度并导致代码复杂度上升为代价。

该框架应在其计算图中添加这些特别的节点;这些节点代表的是循环结构和条件判断等程序指令(programmaticprimitives),因此用户需要掌握并运用这些指令作为基础模块而非仅依赖于传统的for循环与if条件语句。

由于程序员所使用的任何控制流程指令仅执行一次,在构建计算图的过程中程序员必须手动指定单一计算路径。

例如, 利用词向量表示(以初始状态h0为起点)执行循环神经网络单元的操作, 依赖于TensorFlow提供的特定控制流结构.

需要单独的一个特殊标记来获取运行时的词长度,在实际执行代码时仅作为一个占位符使用。

when the code runs once during model initialization

在该种框架(也称为run-time定义型架构)中,在运行时阶段生成并重新构建了计算图结构。为此,在相同的代码基础上实现了正向传递过程,并为反向传播过程预先建立了必要的数据支持。

这种方法能够生成更为简洁明了的代码方案;由于在程序设计中采用传统的for循环和if条件语句来进行流程控制。

它还显著简化了调试流程。具体而言,在运行时设置断点(run-timebreakpoint)或进行堆栈跟踪(stacktrace)操作时,系统会精确追踪实际编写的代码内容而非执行引擎中的编译函数。

能够用基本Python for循环在该动态框架内采用来构建具有相同长度的变量循环神经网络。

#PyTorch(alsoworksinChainer)#(thiscoderunsoneveryforwardpassofthemodel)#"words"isaPythonlistwithactualvaluesinith=h0forwordinwords:h=rnn_unit(word,h)

It is noteworthy that PyTorch is the first define-by-run deep learning framework

因此让我们深入解析一下SPINN的具体实现过程。在构建网络的过程中我需要初始化相应的数据加载器(dataloader)。

基于深度学习框架设计的模型能够通过对批处理的数据样本进行操作来实现功能。借助并行化技术加快训练进程,并在每个训练步骤中都能获得更为平滑的梯度变化。

我希望在此处能够完成这一项任务。(稍后我将详细说明该堆栈操作的具体流程及其实现机制。)以下是使用PyTorch内置在该文本处理系统的数据加载方法。这些数据样本通过自动生成批次处理机制以实现高效的批量处理。

执行此代码后, train_iter, dev_iter 和 test_iter 将依次循环遍历训练数据集中划分好的训练段落, 验证段落以及测试段落, 每个段落均遵循 SNLI 数据格式进行批量处理.

导入所需模块:torchtext中的data和datasets。
设置分词器为ParsedTextField对象,并将其lower参数设为True。
定义状态转移器为ShiftReduceField类实例。
定义标签字段为可序列化的数据类型,并将其sequential参数设为False。
使用上述设置生成训练集、开发集和测试集。
基于训练集、开发集和测试集构建词汇表。
将数据按批次生成迭代器:训练迭代器、开发迭代器和测试迭代器。
您可以在其中找到设置训练循环以及准确率(accuracy)测量的其他代码。

让我们继续。

如前所述,在SPINN编码器中包含了一个可参数化的Reduce层以及可选的循环追踪器以追踪上下文信息。这种设计使得网络能够在每次处理输入词时自动更新其隐藏状态;所给代码表明创建一个SPINN系统仅涉及构建这两个核心组件并将它们封装在一个容器中以便后续使用

importtorchfromtorchimportnn#subclasstheModuleclassfromPyTorch’sneuralnetworkpackageclassSPINN(nn.Module):def__init__(self,config):super(SPINN,self).init()self.config=configself.reduce=Reduce(config.d_hidden,config.d_tracker)ifconfig.d_trackerisnotNone:self.tracker=Tracker(config.d_hidden,config.d_tracker)当创建模型时,SPINN.__init__被调用了一次;它分配和初始化参数,但不执行任何神经网络操作或构建任何类型的计算图。

在每次处理新的批次数据时所运行的代码是由SPINN.forward方法来定义模型向前流程的标准名称,在PyTorch框架中这是常规做法。

上文阐述了堆栈操作算法的一种高效运作方式。即在标准Python环境中,在多个缓冲区与堆栈并存的情况下运行。每个示例都与一个特定的缓冲区和堆栈相对应。

基于转移矩阵(Transition)所包含的'移动'与'缩减'操作集合进行迭代运算;若可用则调用可选的Tracker;随后遍历批次处理中的每一个样本来应用'移动'操作(若请求允许),或者将它们加入需进行'缩减'操作的目标样本列表中。

然后对该列表中的所有样本执行Reduce层操作,并将最终输出返回到每个样本所在的堆栈

defforward(self,buffers,transitions):#Theinputcomesinasasingletensorofwordembeddings;#Ineedittobealistofstacks,oneforeachexamplein#thebatch,thatwecanpopfromindependently.Thewordsin#eachexamplehavealreadybeenreversed,sothattheycan#bereadfromlefttorightbypoppingfromtheendofeach#list;theyhavealsobeenprefixedwithanullvalue.buffers=[list(torch.split(b.squeeze(1),1,0))forbintorch.split(buffers,1,1)]#wealsoneedtwonullvaluesatthebottomofeachstack,#sowecancopyfromthenullsintheinput;thesenulls#areallneededsothatthetrackercanrunevenifthe#bufferorstackisemptystacks=[[buf[0],buf[0]]forbufinbuffers]ifhasattr(self,'tracker'):self.tracker.reset_state()fortrans_batchintransitions:ifhasattr(self,'tracker'):#IdescribedtheTrackerearlierastaking4#arguments(context_t,b,s1,s2),buthereI#providethestackcontentsasasingleargument#whilestoringthecontextinsidetheTracker#objectitself.tracker_states,_=self.tracker(buffers,stacks)else:tracker_states=itertools.repeat(None)lefts,rights,trackings=[],[],[]batch=zip(trans_batch,buffers,stacks,tracker_states)fortransition,buf,stack,trackinginbatch:iftransition==SHIFT:stack.append(())eliftransition==REDUCE:rights.append(())lefts.append(())trackings.append(tracking)ifrights:reduced=iter(self.reduce(lefts,rights,trackings))fortransition,stackinzip(trans_batch,stacks):iftransition==REDUCE:stack.append(next(reduced))return[()forstackinstacks]在调用self.tracker或self.reduce时分别运行Tracker或Reduce子模块的向前方法,该方法需要在样本列表上应用前向操作。

在主函数的向前方法中,在不同样本上执行单独操作具有重要意义。这是因为所有依赖于批处理执行的关键数学运算以及需要GPU加速的任务都由Tracker和Reduce完成。

为了以更清洁的方式编写这些函数, 我将借助一些辅助工具(稍后将介绍)来将这些样本列表转换为批处理张量(tensor),反过来也一样。

我希望让Reduce模块自动生成批次处理以加快计算速度,并将这些数据分离批次以便单独推送和弹出。

具体整合每对左右子体表达形成父体(parentphrase)的实际函数是TreeLSTM网络单元。它属于普通循环神经网络单元的变种形式。

此组合函数要求每个子短语的状态实际上由两个张量构成,即隐式状态h和记忆单元(memorycell)的状态c。该函数通过作用于子短体隐式状态h的两个线性层(nn.Linear)来计算,并随后将这两个线性层的结果与记忆单元(memorycell)的状态c进行非线性组合以形成树状LSTM结构.

在SPINN模型中,在Trackr系统的内部运行状态中新增设了一个第三个线性层以实现扩展功能。如图2所示,在TreeLSTM组合函数中引入了新增的一个输入变量(记作x),其数值表示为该系统状态信息。

在如图所示的PyTorch实现中,在图示区域中定义了五个集合(分别以蓝色、黑色和红色箭头标识)对应的线性变换组合为三个nn.Linear模块,并且tree_lstm函数负责完成框内所有的计算过程。

图来自Chenetal.(2016)。

探讨CNN(卷积神经网络)、RNN(循环神经网络)以及DNN(深度神经网络)的内部组成及其何异

1、DNN:存在一个局限性:即无法有效建模基于时间序列的数据变化特性。这一缺陷在自然语言处理、语音识别、手写体识别等依赖于有序数据序列的应用中尤为明显。

为了满足这一需求而发展出另一种新型人工神经网络——循环神经网络RNN(RNN)。对于CNN而言,在每一层中各层神经元之间的信号传递仅限于单向连接,并且不同时间点独立处理输入数据的数据流也被认为属于前馈型人工神经网络。

3、RNN:神经元的输出可以在下一个时间戳直接影响自身状态的变化,在当前时刻m时,
第i层神经元不仅会接收前一层(i-1)层在该时刻m的输出信息,
还会将上一时刻m-1时自身的输出值纳入当前计算。

介绍神经网络技术源于上世纪五、六十年代初期,在那个时期它被称为perceptron(感知机)。该体系由输入层、隐藏层及输出层组成,并运用线性激活函数进行信息处理与学习训练。经过隐藏层的特征提取与非线性变换后到达输出端,在此阶段完成分类任务或数据预测等关键操作步骤。

早期感知机的主要推动者是Rosenblatt先生。从实践中看,在深度神经网络DNN领域内, 人们通常将这种技术称为卷积神经网络或长短期记忆单元的集成体

关于循环神经网络RNN,隐藏层是怎么来的?

在RNN模型中,隐藏层也可被称作循环核。简而言之,在这种模型架构中,“时间步”指的是每个时间点上循环核所经历的一个周期长度。而循环核的数量则对应于隐藏层的层数。

循环核具有两个输入(样本输入x与前一步的状态a)以及两个输出(传递给下一层的激活值h与传递给本循环核下一时间步的状态a),其输入与输出的形式多样。 输入与输出的形式则各有不同。 该同学想了解如何在B站搜索相关内容,“吴恩达深度学习”课程中的第五课专门讲解了RNN及其拓展知识,并且内容通俗易懂。

B站链接:网页链接参考资料:网页链接。

全部评论 (0)

还没有任何评论哟~