2_Recurrent Neural Networks (RNNs)循环神经网络 —Simple RNNs

本文介绍了如何使用RNN(循环神经网络)对时序数据进行建模,包括一对一和多对一模型。重点讨论了简单RNN模型在IMDB影评文本分类任务中的应用,解释了为何需要双曲正切激活函数,并展示了模型的搭建过程、训练和评估。此外,还探讨了简单RNN的优点和局限性,以及参数数量的计算。文章最后提到了通过改变模型结构以利用所有RNN状态来提高模型性能的方法。

一、How to model sequential data?(怎样对时序数据建模)

1.1 one to one模型

one to one模型:一个输入对应一个输出。包括:全连接神经网络和卷积神经网络。

人脑并不需要one to one模型来处理时序数据,并不会把一整段文字直接输入大脑。

  • 整体处理一个段落。
  • 固定大小的输入(例如图像)。
  • 固定大小的输出(例如,预测概率)。

1.2 many to one模型

RNNs对于输入和输出的长度都不需要固定

RNNs适合文本,语音,时序序列数据

更新状态向量h的时候,需要参数矩阵A。整个RNNs只有一个参数A,A随机初始化,然后利用训练数据来学习A。

image-20210330160329235

二、Simple RNN Model(简单循环神经网络)

矩阵和向量的乘积是一个向量。

image-20210330161408901

问题:Why do we need the tanh function?(为什么需要双曲正切函数作为激活函数)

答:每次让h恢复到(-1,+1)之间。

训练参数:矩阵A

  • A的行:shape(h)
  • A的列:shape(h)+shape(x)
  • 矩阵A的大小=shape(h)× [ shape(h)+shape(x)]

2.1 Simple RNN for IMDB Review

from keras.models import Sequential
from keras.layers import SimpleRNN,Embedding,Dense

# 设置超参数
vocabulary = 10000   # 词典里面有10000个词汇
embedding_dim=32     # shape(x)=32,词向量x的维度为32
word_num = 500       # 每个电影评论有500个单词,如果超过500个单词,就会被截掉;如果不到500,就会补够。
state_dim =32        # shape(h) = 32,状态向量h的维度为32


# 开始搭建网络
model = Sequential()     # 建立Sequential()模型
# 往model里面加层,Embedding层,把词映射成向量
model.add(Embedding(vocabulary,embedding_dim,input_length=word_num))
# 需要指定状态向量h的维度,设置RNN层的return_sequences=False,表示RNN只输出最后一个状态向量h,把之前的状态向量舍去。
model.add(SimpleRNN(state_dim,return_sequences=False))
# 全连接层,输入RNN的最后一个状态h,输出0-1之间的数
model.add(Dense(1, activation="sigmoid"))

model.summary()

image-20210330174608615

from keras import optimizers

# 迭代最大次数
epochs = 3    # Early stopping alleviates overfitting

# 编译模型
# 指定算法为 RMSprop,loss为损失函数,metrics为评价标准
model.compile(optimizer = optimizers.RMSprop(lr=0.001),
              loss="binary_crossentropy",metrics=["acc"])
# 用训练数据来拟合模型,
history=model.fit(x_train,y_train,epochs=epochs,
                  batch_size=32,validation_data=(x_valid,y_valid))

image-20210330180644526

# 用测试数据来评价模型的表现
# 把测试数据作为输入,返回loss 和 acc。
loss_and_acc = model.evaluate(x_test,labels_test)
print("loss = " + str(loss_and_acc[0]))
print("acc = " + str(loss_and_acc[1]))

image-20210330181159118

2.2 改动

刚才搭建模型只使用了RNN的最后一个状态ht ,把之前的状态全部舍去了。

如果返回所有状态,RNN的输出为一个矩阵,矩阵的每一行为一个状态向量h。

如果用所有状态,则需要加一个Flatten层,把状态矩阵变成一个向量。然后把这个向量作为分类器的输入,进行判断。

image-20210330182251287

from keras.models import Sequential
from keras.layers import SimpleRNN,Embedding,Dense

# 设置超参数
vocabulary = 10000   # 词典里面有10000个词汇
embedding_dim=32     # shape(x)=32,词向量x的维度为32
word_num = 500       # 每个电影评论有500个单词,如果超过500个单词,就会被截掉;如果不到500,就会补够。
state_dim =32        # shape(h) = 32,状态向量h的维度为32


# 开始搭建网络
model = Sequential()     # 建立Sequential()模型
# 往model里面加层,Embedding层,把词映射成向量
model.add(Embedding(vocabulary,embedding_dim,input_length=word_num))
# 需要指定状态向量h的维度,设置RNN层的return_sequences=False,表示RNN输出所有状态
model.add(SimpleRNN(state_dim,return_sequences=True))
model.add(Flatten())
# 全连接层,输入RNN的最后一个状态h,输出0-1之间的数
model.add(Dense(1, activation="sigmoid"))

model.summary()

2.3 优缺点

good of SimpleRNN(优点):

  • RNN擅长在短期文本依赖(RNN只需看最近的几个词即可)

image-20210330184320503

Shortcomings of SimpleRNN(缺点):

  • RNN的记忆较短,会遗忘很久之前的输入X;
  • 如果时间序列很长,好几十步,最终的ht 忘记之前的输入X0

image-20210330184839850

2.4 Summary(总结)

ht 包含了之前所有的输入信息

image-20210330185001087

2.5 Number of Parameters

  • SimpleRNN has a parameter matrix (and perhaps an intercept vector).
  • Shape of the parameter matrix is

​ shape(h)× [ shape(h)+shape(x)]

  • 参数矩阵一开始随机初始化,然后从训练数据中学习这个参数矩阵A,

训练参数:矩阵A

  • A的行:shape(h)
  • A的列:shape(h)+shape(x)

说明:简单循环神经网络只有一个参数矩阵A,不论这个序列有多长,所有模块里面的参数都是一样的。

### 循环神经网络及其变体LSTM/GRU的原理和应用 #### 1. **循环神经网络 (Recurrent Neural Network, RNN)** 传统的前馈神经网络无法很好地捕捉序列数据之间的依赖关系,而RNN通过引入隐藏状态 \( h_t \),能够将之前时刻的信息传递到当前时刻。其基本公式如下: \[ h_t = f(Ux_t + Wh_{t-1} + b_1) \] 其中: - \( x_t \) 是第 \( t \) 时刻的输入, - \( h_t \) 是第 \( t \) 时刻的隐藏状态, - \( U \), \( W \) 和 \( b_1 \) 分别是权重矩阵和偏置项[^3]。 然而,标准RNN存在梯度消失或梯度爆炸的问题,在处理长序列时难以保持长期依赖关系。 --- #### 2. **长短时记忆网络 (Long Short-Term Memory, LSTM)** 为解决RNN的不足,Hochreiter等人提出了LSTM模型。LSTM的核心在于引入了细胞状态(cell state)以及三种门控机制:输入门、遗忘门和输出门。这使得LSTM既能保存短期信息也能存储长期信息。 ##### 工作原理 LSTM的关键组件包括: - **遗忘门** (\( f_t \)) 控制丢弃多少旧信息; - **输入门** (\( i_t \)) 决定更新哪些新信息; - **候选值** (\( \tilde{C}_t \)) 计算潜在的新信息; - **输出门** (\( o_t \)) 确定最终输出的内容。 具体公式如下: \[ f_t = \sigma(W_f[x_t, h_{t-1}] + b_f) \] \[ i_t = \sigma(W_i[x_t, h_{t-1}] + b_i) \] \[ \tilde{C}_t = tanh(W_C[x_t, h_{t-1}] + b_C) \] \[ C_t = f_tC_{t-1} + i_t\tilde{C}_t \] \[ o_t = \sigma(W_o[x_t, h_{t-1}] + b_o) \] \[ h_t = o_tanh(C_t) \][^1] 这种设计让LSTM能有效缓解梯度消失问题,并在需要记住较长上下文的任务中表现良好[^2]。 --- #### 3. **门控循环单元 (Gated Recurrent Unit, GRU)** 作为LSTM的一种简化版本,GRU通过减少参数数量提高了计算效率。它仅包含两个门控单元:更新门和重置门。 ##### 更新门与重置门的作用 - **更新门** (\( z_t \)) 控制当前输入和过去状态对当前状态的影响程度; - **重置门** (\( r_t \)) 判断是否忽略过去的隐藏状态。 核心公式如下: \[ z_t = \sigma(W_z[x_t, h_{t-1}] + b_z) \] \[ r_t = \sigma(W_r[x_t, h_{t-1}] + b_r) \] \[ \tilde{h}_t = tanh(W_h[x_t, r_th_{t-1}] + b_h) \] \[ h_t = (1-z_t)h_{t-1} + z_t\tilde{h}_t \][^4] 相较于LSTM,GRU省去了独立的细胞状态,同时减少了参数复杂度,使其更适合资源受限环境下的快速训练需求。 --- #### 4. **应用场景** ##### (1)语音识别 无论是端到端的声学建模还是语言解码阶段,RNN系列模型都发挥了重要作用。例如,CTC损失函数配合双向LSTM可以显著提高自动语音识别系统的性能[^2]。 ##### (2)时间序列预测 对于股票价格走势分析、天气预报等任务而言,基于RNN的时间序列预测框架能够充分利用历史趋势进行未来值推测。特别是当面对具有明显周期性的信号时,LSTM往往展现出更强的学习能力[^4]。 --- ```python import tensorflow as tf from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense, LSTM, GRU # 构建一个简单的LSTM模型用于时间序列预测 model_lstm = Sequential([ LSTM(units=50, return_sequences=True, input_shape=(None, 1)), Dense(1) ]) # 或者构建一个类似的GRU模型 model_gru = Sequential([ GRU(units=50, return_sequences=True, input_shape=(None, 1)), Dense(1) ]) ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

少云清

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值