下拉菜单实现树状结构_初识神经网络循环结构

b3158312a7f8859f10319d08cd493e1d.png

循环神经网络(Recurrent Neural Network, RNN)是一类以序列(sequence)数据为输入,在序列的演进方向进行递归(recursion)且所有节点(循环单元)按链式连接的递归神经网(recursive neural network) 。

对循环神经网络的研究始于二十世纪80-90年代,并在二十一世纪初发展为深度学习(deep learning)算法之一 ,其中双向循环神经网络(Bidirectional RNN, Bi-RNN)和长短期记忆网络(Long Short-Term Memory networks)是常见的的循环神经网络 。

循环神经网络具有记忆性、参数共享并且图灵完备,因此在对序列的非线性特征进行学习时具有一定优势 。循环神经网络在自然语言处理(Natural Language Processing, NLP),例如语音识别、语言建模、机器翻译等领域有应用,也被用于各类时间绪列预报。引入了卷积神经网络(Convoutional Neural Network,CNN)构筑的循环神经网络可以处理包含序列输入的计算机视觉问题。

def821fcbb31da24bc1f054c3518670d.png

几种常见的循环神经网络结构RNN、LSTM、GRU

RNN循环神经网络却能很好地处理文本数据变长并且有序的输入序列。

它模拟了人阅读一篇文章的顺序,从前到后阅读文章中的每一个单词,将前面阅读到的有用信息编码到状态变量中去,从而拥有了一定的记忆能力,可以更好地理解之后的文本。
其网络结构如下图所示:

554969f270cea62cc2734b68f1be0297.png

RNN按序列演进方向的递归可以被扩展到树(tree)结构和图(graph)结构中,得到递归神经网络(recursive neural network)和图网络(Graph Network, GN)。

递归神经网络是RNN由链式结构向树状结构的推广 。不同于RNN的链式连接,递归神经网络的每个子节点都可以和多个父节点相连并传递状态。当其所有子节点都仅与一个父节点相连时,递归神经网络退化为RNN [4] 。递归神经网络的节点可加入门控机制,例如通过LSTM门控得到树状长短期记忆网络(tree-structured LSTM)。图网络是RNN和递归神经网络的推广,或者说后两者是图网络在特定结构下的神经网络实现 。在图网络观点下,全连接的RNN是一个有向无环图,而上下文连接的RNN是一个有向环图。递归神经网络和图网络通常被用于学习数据具有结构关系的场合,例如语言模型中的语法结构 。

350953e5669c9bd2badb22a58d312fca.png

LSTM的网络机构图如下所示:

06e0ad9d4602ef992204ea0563a6713c.png


与传统的循环神经网络相比,LSTM仍然是基于xt和ht−1来计算ht,只不过对内部的结构进行了更加精心的设计,加入了输入门it 、遗忘门ft以及输出门ot三个门和一个内部记忆单元ct。输入门控制当前计算的新状态以多大程度更新到记忆单元中;遗忘门控制前一步记忆单元中的信息有多大程度被遗忘掉;输出门控制当前的输出有多大程度上取决于当前的记忆单元。GRU是在LSTM上进行简化而得到的,GRU的网络结构如下所示:

1ad1039e53f9ffe6ae08b9fabc92329f.png

Zt代表更新门,更新门的作用类似于LSTM中的遗忘门和输入门,它能决定要丢弃哪些信息和要添加哪些新信息。

推荐一文章:https://www.jianshu.com/p/0cf7436c33ae

我们还会遇到将循环神经网络分为elman network和jordan network,他们的区别只在于,前者是将隐层的输出作为下一个时间步隐层的输入,后者是将输出层的输出作为下一个时间步隐层的输入。

d9e9175eb0b18115afad42b27ab113f9.png

在具体任务上,性能上不好确定孰优孰劣,但在搭建网络的过程中,elman network是更为灵活的方式,因为它直接可以将循环的部分包装为一层。在keras中,我们可以使用simpleRNN层来快速实现全连接循环层的搭建,由于涉及一些数据,故展示代码中略过这一部分:

rnn=RNN_model(num_words,maxlen)

his=rnn.fit(x_train, y_train,batch_size=512,epochs=10,validation_data=(x_test, y_test))

import matplotlib.pyplot as plt
import seaborn as sns

sns.set(style='whitegrid')
plt.figure(figsize=(10,8))
plt.plot(range(10),his.history['val_loss'],'y-',label='test accuracy')
plt.plot(range(10),his.history['loss'],'r-',label='train accuracy')
plt.xlabel('epochs')
plt.ylabel('accuracy')
plt.legend()
plt.show()

除此之外,我们还可以不单单采用单向循环结构,因为结合下文可能会得到更准确的意思,在keras中,我们可以使用Bidirect封装器来封装一个双向的RNN结构:

def Bidirect_model(num_words,maxlen):
input_tensor= Input(shape=(maxlen,))
x=Embedding(num_words,50,input_length=maxlen)(input_tensor)
x=Bidirectional(SimpleRNN(32))(x)
y=Dense(1, activation='sigmoid')(x)
model = Model(inputs=input_tensor, outputs=y)
model.compile(optimizer=optimizers.Adam(),loss='binary_crossentropy',
metrics=['accuracy'])
return(model)

最后奉上一张趣图

df71f6e682c0dba7e1f089eb3342a39e.png
循环神经网络常见的结构(学习笔记)_TH_NUM的博客-CSDN博客_循环神经结构图​blog.csdn.net
c45ad4bfaef78fdcd3e17bb1b79e2ba3.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值