Day32_【 NLP _2.RNN及其变体 _(1)传统RNN模型】
·
一、简述
循环神经网络(RNN)是一种专门设计用于处理序列数据的深度学习模型。与传统的神经网络(如全连接网络或卷积神经网络)不同,RNN具有“记忆”能力,它能够利用其内部状态(或称为“隐藏状态”)来存储和利用序列中先前信息,从而影响对当前输入的处理和未来输出的预测。
序列数据:后面的数据跟前面的数据有关系
二、分类
-
按照输入和输出的结构进行分类:
- N vs N - RNN
- N vs 1 - RNN
- 1 vs N - RNN
- N vs M - RNN
-
按照RNN的内部构造进行分类:
- 传统RNN
- LSTM
- GRU
三、结构

名称由来:将每个token循环在一个神经元里
展开:

- 每次输入两个值:上一个时间步的隐藏状态h0、当前状态的输入值input。
- 每次输出两个值:输出当前时间步的隐藏状态hn、当前时间步的预测结果output。
- 当前时间步输入与上一个时间步的输出加权求和作为本次输入
- h表示隐藏状态,具有记忆功能:每次学习到上一个神经元的结果、规律(上下文语意信息),保存序列数据中的历史信息,并将这些信息传递给下一个时间步
四、API
传统rnn的激活函数使用tanh

# input_size:输入数据的维度,一般设为词向量的维度
# hidden_size:隐藏层h的维度,也是当前层神经元的输出维度
# num_layers: 隐藏层h的层数,默认为1
RNN = nn.RNN(input_size, hidden_size,num_layers)
output, hn = RNN(input, h0)
1. input的表示形式为[seq_len, batch_size, input_size],
即[句子的长度,batch的大小,词向量的维度] = [词语个数,句子的个数,词向量的维度]
2. h0的表示形式为[num_layers, batch_size, hidden_size],即[隐藏层的层数,batch的大小,隐藏层h的维度],h0的所有参数由RNN和input决定,h0一般是全零初始化。
五、规律
形状上:
1. output输出与输入的形状中 只有维度改变,
2. hn的 torch.Size([1, 1, 8]) = h0的size,
输出层面:
1. 单层(重要):hn的输出 = 每个样本的最后一个token的输出
2. 多层(少见):hn的最后一个层的输出 = 每个样本的最后一个token的输出
拓展深层理解
- 一个一个送样本和一次性送一批样本给模型结果是一样的(原因:内部经过矩阵运算)
- 省略h0与不省略的结果是一样的 (默认全零初始化,一般建议加上便于理解)
- 设置nn.RNN(batch_first=True)时,只为使语句通顺,此时input的数据形状改变为=(batch_size,seq_len,input_size)
六、优缺点
- 优点
- 结构简单
- 资源要求低
- 短序列任务表现好
- 缺点
- 不适用长序列任务
- tanh导数0-1,会梯度消失 连乘会爆炸,训练失败
- 串行
- 无法提速
- 不适用长序列任务
更多推荐


所有评论(0)