Python深度学习——理解RNN

本文介绍了RNN(循环神经网络)的工作原理,通过Numpy代码展示了RNN的前向传播,并探讨了在Keras中如何使用SimpleRNN和更复杂的LSTM层处理序列数据,特别是在IMDB电影评论分类任务中的应用。LSTM层的设计旨在解决梯度消失问题,使其更适合处理长序列,如文本数据。
摘要由CSDN通过智能技术生成

序列数据使用什么样的神经网络

密集连接网络和卷积神经网络)都有一个主要特点,那就是它们都没有记忆。它们单独处理每个输入,在输入与输入之间没有保存任何状态。对于这样的网络,要想处理数据点的序列或时间序列,你需要向网络同时展示整个序列,即将序列转换成单个数据点。例如,在IMDB电影评论数据集中,我们将全部电影评论转换为一个大向量,然后一次性处理。这种网络叫作前馈网络(feedforward network)。

与此相反,当你在阅读句子时,你是一个词一个词地阅读,同时会记住之前的内容。这让你能够动态理解这个句子所传达的含义。生物智能以渐进的方式处理信息,同时保存一个关于所处理内容的内部模型,这个模型是根据过去的信息构建的,并随着新信息的进入而不断更新。

循环神经网络(RNN,recurrent neural network)采用同样的原理,不过是一个极其简化的版本:它处理序列的方式是,遍历所有序列元素,并保存一个状态(state),其中包含与已查看内容相关的信息。实际上,RNN 是一类具有内部环的神经网络。在处理两个不同的独立序列(比如两条不同的IMDB 评论)之间,RNN 状态会被重置,因此,你仍可以将一个序列看作单个数据点,即网络的单个输入。真正改变的是,数据点不再是在单个步骤中进行处理,相反,网络内部会对序列元素进行遍历。
在这里插入图片描述

用Numpy代码理解RNN前向传递

RNN 的伪代码如下所示:

state_t = 0
for input_t in input_sequence:
	output_t = f(input_t, state_t)
	state_t = output_t

这个RNN 的输入是一个张量序列input_sequence,我们将其编码成大小为(timesteps, input_features)的二维张量。它对时间步(input_t)进行遍历,在每个时间步,它考虑t时刻的当前状态state_t,与t时刻的输入[形状为(input_ features,)],对二者计算得到t时刻的输出output_t。(这里的f可以更具体地表示为:activation(dot(W, input_t) + dot(U, state_t) + b))然后,我们将下一个时间步的状态设置为上一个时间步的输出。对于第一个时间步,上一个时间步的输出没有定义,所以它没有当前状态。因此,你需要将状态初始化为一个全零向量,这叫作网络的初始状态(initial state)。

使用Numpy简单显示RNN代码如下:

import numpy as np

timesteps = 100 #输入序列的时间步数
input_features = 32 #输入特征空间的维度
output_features = 64 #输出特征空间的维度

inputs = np.random.random((timesteps, input_features)) #输入数据 (100,32):随机噪声,仅作为示例 

state_t = np.zeros((output_features,)) #初始状态:全零向量(64,)

#创建随机的权重矩阵
W = np.random.random((output_features, input_features)) #(64,32)
U = np.random.random((output_features, output_features)) #(64,64)
b = np.random.random((output_features,)) #(64,)

successive_outputs = []
for input_t in inputs: #input_t 是形状为(input_features,) 的向量 (32,)
	output_t = np.tanh(np.dot(W, input_t) + np.dot(U, state_t) + b) #由输入和当前状态(前一个输出)计算得到当前输出
	
	successive_outputs.append(output_t) #将这个输出保存到一个列表中
	
	state_t = output_t #更新网络的状态,用于下一个时间步
	
final_output_sequence = np.stack(successive_outputs, axis=0) #最终输出是一个形状为(timesteps,output_features) 的二维张量

总之,RNN 是一个for 循环,它重复使用循环前一次迭代的计算结果,仅此而已。当然,你可以构建许多不同的RNN,它们都满足上述定义。这个例子只是最简单的RNN表述之一。RNN 的特征在于其时间步函数,比如前面例子中的这个函数:
o u t p u t t = n p . t a n h ( n p . d o t ( W , i n p u t t ) + n p . d o t ( U , s t a t e t ) + b ) output_t = np.tanh(np.dot(W, input_t) + np.dot(U, state_t) + b) o

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值