循环神经网络 RNN

目录

循环神经网络 RNN

长短时记忆网络 LSTM

循环神经网络 RNN

循环神经网络的主要用途是处理和预测序列数据。循环神经网络刻画了一个序列当前的输出与之前信息的关系。从网络结构上,循环神经网络会记忆之前的信息,并利用之前的信息影响后面节点的输出。

循环神经网络的一个重要的概念就是时刻。上图中循环神经网络的主体结构A的输入除了来自输入层的x_t,还有一个自身当前时刻的状态。在每一个时刻,A会读取t时刻的输入X_t,并且得到一个输出h_t。同时还会得到一个当前时刻的状态S_t,传递给下一时刻t+1。将循环神经网络按照时间序列展开,如下图所示:

链式的特征揭示了 RNN 本质上是与序列和列表相关的。在标准的 RNN 中,这个重复的模块只有一个非常简单的结构,例如一个tanh层。

下图展示了一个循环神经网络的前向传播算法的具体计算过程:

在得到前向传播计算结果之后,可以和其他网络类似的定义损失函数。神经网络的唯一区别在于它每一个时刻都有一个输出,所以循环神经网络的总损失为前面所有时刻的损失函数的总和。

import numpy as np

X = [1,2,1,2,1,2,3,1]
state = [0.0,0.0]
# 定义不同输入部分的权重
w_cell_state = np.asarray([[0.1,0.2],[0.3,0.4]])
w_cell_input = np.asarray([0.5,0.6])
b_cell = np.asarray([0.1,-0.1])
# 定义输出层的权重
w_output = np.asarray([[0.1],[0.2]])
b_output = 0.1
# 按照时间顺序执行循环神经网络的前向传播过程
for i in range(len(X)):
    before_activetion = np.dot(state, w_cell_state) + X[i] * w_cell_input + b_cell
    state = np.tanh(before_activetion)
    #计算当前时刻的最终输出
    final_output = np.dot(state,w_output) + b_output
    #输出每一时刻的信息
    print("before_activation",before_activetion)
    print("state",state)
    print("final_output",final_output)

长短时记忆网络 LSTM

循环神经网络工作的关键点就是使用历史的信息来帮助当前的决策。循环神经网络能很好的利用传统的神经网络不能建模的信息,但同时,也带来了更大的挑战——长期依赖的问题。在有些问题中,模型仅仅需要短期内的信息来执行当前的任务。但同时也会有一些上下文场景更加复杂的情况。当间隔不断增大时,简单的循环神经网络可能会丧失学习到如此远的信息的能力。或者在复杂的语言场景中,有用的信息的间隔有大有小,长短不一,循环神经网络的性能也会受限。

LSTM与单一tanh循环结构不同,LSTM拥有三个门:“输入门”、“输出门”、“遗忘门”。 

细胞状态类似于传送带。直接在整个链上运行,只有一些少量的线性交互。信息在上面流传保持。

LSTM 有通过精心设计的称作为“门”的结构来去除或者增加信息到细胞状态的能力。门是一种让信息选择式通过的方法。他们包含一个sigmod神经网络层和一个按位的乘法操作。

在我们 LSTM 中的第一步是决定我们会从细胞状态中丢弃什么信息。这个决定通过一个称为忘记门层完成。该门会读取h_{t-1}x_t,输出一个在0到1之间的数值给每个在细胞状态C_{t-1}中的数字。1表示“完全保留”,0表示“完全舍弃”。例如,当我们在句子中希望通过主语选择相应的代词,细胞状态可能包含当前主语的性别,因此正确的代词可以被选择出来。当我们看到新的主语,我们希望忘记旧的主语。

丢弃信息

下一步是确定什么样的新信息被存放在细胞状态中。这里包含两个部分。第一,sigmod层称 “输入门层” 决定什么值我们将要更新。然后,一个tanh层创建一个新的候选值向量\widetilde{C}_t,会被加入到状态中。

这样就把细胞状态从C_{t-1}更新为C_t了。

我们把旧状态与f_t相乘,丢弃掉我们确定需要丢弃的信息。接着加上i_t\times \widetilde{C}_t。这就是新的C_t,根据我们决定更新每个状态的程度进行变化。

更新细胞状态

在语言模型的例子中,这里就是实际根据前面确定的目标,丢弃旧代词的性别信息并添加新的信息的地方。

最终,输出门层需要确定输出什么值,这个输出将会基于我们的细胞状态。首先,运行一个sigmod层来确定细胞状态的哪个部分将输出出去。接着,把细胞状态通过tanh进行处理(得到一个在-1到1之间的值)并将它和sigmod门的输出相乘。

单个细胞的输入和输出入下图所示: 

demo参考自:

【TensorFlow】 利用LSTM进行情感分析

demo:github

参考文献

TensorFlow对于自然语言序列(PTB)的预测----RNN模型

TensorFlow学习笔记(六)循环神经网络

如何简单的理解LSTM——其实没有那么复杂

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值