【深度学习模型】循环神经网络RNN

理解循环神经网络(RNN)及其重要结构LSTM

循环神经网络(recurrent neural network,RNN)是专门用于处理序列数据的深度学习模型,其广泛应用在自然语言处理、语音识别、情感分析、机器翻译等领域。本博文原创,转载需注明出处。

RNN的网络结构

在循环神经网络中,一个非常重要的概率就是时刻,因为序列是按照时刻输入的。循环神经网络会对每个时刻的输入结合当前模型的状态给出一个输出。其标准的网络结构为:
RNN网络结构
其中x为输入序列向量,h为输出向量,s代表网络隐层的状态。输入与隐层之间通过参数矩阵u连接,隐层与输出层之间通过参数矩阵v连接,不同时刻的隐层之间通过参数矩阵w连接。
上图中,左边是RNN网络的经典结构,主体结构s的输入有输入层x,还有一个循环的边来提供当前的状态,同时s的状态会传递到下一步。右边是RNN网络展开的结构层次,可以看到循环神经网络在每一时刻会有一个输入Xt,当前状态也会有一个输出ht,但是循环神经网络当前的状态St是由上一时刻的状态St-1和当前输入Xt决定的。循环神经网络要求每一时刻都有一个输入,但不一定每一时刻都有输出。

RNN的前向传播

RNN的前向传播
RNN网络有个特点就是参数共享,即对于每一时刻,参数U,V,W都没变化,使用的是同一组参数。

为了更加直观地理解RNN是如何计算的,下面展示一个循环神经网络的前向传播的具体计算过程。

前向传播的计算过程
上图中,输入输出的维度都为1,网络权重w为3x2和b为1x2,而连接输出层权重w为2x1,b为1x1,具体如下:
权重参数
在t=0时刻,输入序列x0=1,初始状态为[0.0 0.0],将初始状态与输入拼接一起得到[0.0 0.0 1.0],与网络权重w相乘,再加上b,得到[0.6 0.5]经过激活函数tanh,激活得到[0.537 0.884],这个结果为s0,将作为下一个时刻t=1的输入状态,同时也作为该状态的输出,连接全连接层的权重w并加上b,得到最终输出1.56。t=0这一状态完成后,接着到t=1状态,重复上述过程,于是在t=1的输出为2.73,其状态s1=[0.86 0.88]又将输入到下一个时刻中去。

tensorflow中的实现

以下在tensorflow中实现上面的过程(前向传播)

import numpy as np

X = [1, 2]
state = [0.0  0.0]
# 分开定义不同的输入部分的权重
w_rnn_state = np.asarray([[0.1  0.2], [0.3  0.4]])
w_rnn_input = np.asarray([0.5  0.6])
b_rnn = np.asarray([0.1  -0.1])

#定义用于输出的全连接层参数
w_output = np.asarray([[1.0], [2.0]])
b_output = 0.1

#按时间顺序执行循环神经网络的前向传播过程
for i in range(len(X)):
	#计算循环体中的全连接层网络
	before_activation_result = np.dot(state, w_rnn_state) + X[i] * w_rnn_input + b_rnn
	state = np.tanh(before_activation_result)
	#根据当前时刻状态计算最终输出
	final_output = np.dot(state, w_output) + b_output
	# 输出每个时刻的信息
	print("before activation: " , before_activation_result)
	print("state :" , state)
	print("output :” , final_output) 

运行以上程序,得到的结果如下:
程序结果

重要结构LSTM

LSTM (long short term memory ) 又称长短时记忆网络。它主要解决RNN网络不能处理的长期依赖问题,而长期依赖是指当前系统的状态,可能受很长时间之前系统状态的影响。LSTM结构的特别之处是,拥有三个“门”,即遗忘门、输入门、输出门。这三个门能让信息有选择性地影响循环神经网络中的每一个时刻的状态。
三个门分别的作用:

  • 遗忘门,作用于记忆细胞状态,作用效果为选择性遗忘记忆细胞中的信息
  • 输入门,作用于记忆细胞状态,作用效果为将新的信息选择性的记录到新的细胞状态
  • 输出门,作用于记忆细胞状态,作用效果为使得最后输出既包括细胞状态,又包括输入,将其结果更新到下一个隐层

这三个伟大的门,结构其实就是一个使用sigmoid神经网络和一个按位做乘法的操作,由于sigmoid函数作为激活函数会将全连接网络层输出一个0到1的之间的数值,当sigmoid输出为1时(门打开),信息全部可以通过,当输出为0时(门关上),任何信息都不能通过。
LSTM的单元结构图:
LSTM结构
从上图可以看到,遗忘门是根据当前输入xt、上一时刻状态Ct-1和上一时刻输出ht-1共同决定的,而输出门是根据当前输入xt、上一时刻状态Ct-1和上一时刻输出ht-1决定哪些信息将进入当前状态Ct的。在经过遗忘门之后,还需要从输入门中补充最新的记忆。

在tensorflow中的实现

# 定义一个lstm结构,tensorflow已经对其封装好了,直接导入调用即可
from tensorflow.models.rnn import rnn_cell
lstm = rnn_cell.BasicLSTMCell(lstm_hidden_size)

# BasicLSTMCell类提供了zeros_state函数生成全零的初始状态
state = lstm.zeros_state(batch_size, tf.float32)

# 定义损失函数
loss = 0.0
for i in range(num_steps):
    if i>0:
        tf.get_variable_scope().reuse_variables()
        
        # 每一步处理时间序列中的一个时刻
        # current_input当前输入,state前一时刻状态
        lstm_output, state = lstm(current_input, state)
        # 将当前时刻lstm结构的输出传入一个全连接层得到最后的输出
        final_output = fully_connected(lstm_output)
        # 计算损失值
        loss += calc_loss(final_output, expected_output)
        

上述为lstm结构,代码略写了网络层次的计算方法和一些参数定义。
今天的学习到此结束!愉快~~,资料来源是博主查看各类tensorflow书籍总结得到的笔记,本博文为原创,转载需注明出处。

发布了15 篇原创文章 · 获赞 37 · 访问量 4234

猜你喜欢

转载自blog.csdn.net/Resume_f/article/details/93758985