对循环神经网络(RNN)中time step的理解

微信公众号

1. 传统的循环神经网络

传统的神经网络可以看作只有两个time step。如果输入是“Hello”(第一个time step),它会预测“World”(第二个time step),但是它无法预测更多的time step。

2. LSTM、GRU等

【知乎】如何理解LSTM中的time step? - 知乎 https://www.zhihu.com/question/271774530

比较好理解的回答:

文本处理中,一个单词代表一个timestep,在inference的时候,只能一个单词一个单词地输出;而在train的时候,我们有整个句子,因此可以一次feed若干个单词,比如Google is better than Apple,timestep为5,同时训练目标为is better than Apple [END]。
作者:尤洋
链接:https://www.zhihu.com/question/271774530/answer/364711129
来源:知乎

知乎中比较好的问题:

如何理解LSTM中的time step? - 尤洋的回答 - 知乎 https://www.zhihu.com/question/271774530/answer/364711129 评论中其他用户比较好的提问如下:

【1】鸟与声俱去(提问):假如train的时候time step是5,那weight的纬度不应该和time step的维度一致吗?所以在test时,只输入time step为1的数据,和weight的纬度不符啊?

HankGuo(回答):这个不是维度,既然是循环神经网络,循环的次数就是任意的,time step是循环次数。每次循环是一个单词,维度是单词的词向量。另外train和test的时候应该time step不一致。seq2seq的编码是大于1,解码等于1。

尤洋(回答):训练的时候会给如[batch_size, time_step, word_dim]维度的数据,最后一维是每个单词的embedding向量,每循环一次就将[batch_size, word_dim]输入一次,一共输入time_step次。

【2】荀日新(提问):请教一下,time_step就是rnn单元的个数吗?

尤洋(回答):两者不是一个东西,rnn个数是hidden layer和cell state的维度,time step是循环次数。

【3】q娃娃(提问):您好,请教一下,在时间序列中,time_step该如何理解?期待您的回复,非常感谢!

尤洋(回答):好比你有[batch, t, w]的数据,第一维是Batch,第二维是句子长度,第三维是每个单词的embedding,那么rnn就会循环t次,每次循环拿上一次的结果,以及这次的[batch, w]作为y输入。

【4】以梦为马(提问):您好,我还有个问题想问下,time step为1的时候,是不是可以理解为用前一个数据去预测后一个数据?但是这样感觉很不靠谱?

尤洋(回答):因为有Hidden state,前一个数据实际上是[hidden state, x],是整合了之前的信息的。

3. 我的理解

time steps 就是循环神经网络认为每个输入数据与前多少个陆续输入的数据有联系。例如具有这样一段序列数据 “…ABCDBCEDF…”,当 time steps 为 3 时,在模型预测中如果输入数据为 “D”,那么之前接收的数据如果为 “B” 和 “C” 则此时的预测输出为B的概率更大,之前接收的数据如果为 “C” 和 “E”,则此时的预测输出为F的概率更大。

### 循环神经网络 (RNN) 原理 循环神经网络是一种用于处理序列数据的神经网络架构。其核心特点是具有反馈连接,允许信息在网络内部传递并影响后续时间步的操作[^2]。 #### 结构特点 - **输入层**:接收外部输入的数据流。 - **隐藏层**:这是RNN的核心部分,在不同时间步骤间共享相同的权重参数,并通过状态向量\(h_t\)来保存上下文信息。 - **输出层**:基于当前时刻的状态以及可能的历史信息给出预测结果。 然而,标准形式下的RNN存在梯度消失或爆炸的问题,这使得它们难以捕捉非常长距离依赖关系中的模式[^1]。 ```python import torch.nn as nn class SimpleRNN(nn.Module): def __init__(self, input_size, hidden_size, output_size): super(SimpleRNN, self).__init__() self.rnn = nn.RNN(input_size=input_size, hidden_size=hidden_size, batch_first=True) self.fc = nn.Linear(hidden_size, output_size) def forward(self, x, h0=None): out, hn = self.rnn(x, h0) out = self.fc(out[:, -1, :]) return out ``` ### 长短期记忆网络 (LSTM) 原理 为了克服传统RNN存在的局限性,LSTM引入了一种特殊的结构设计——细胞状态(cell state),并通过三个门控机制(遗忘门、输入门和输出门)精确控制信息流动路径[^3]: - **遗忘门**:决定哪些过去的信息应该被丢弃; - **输入门**:更新新的候选值进入细胞状态; - **输出门**:计算最终要输出的内容; 这些特性使LSTM能够有效地记住更长时间跨度内的事件关联,从而更好地解决自然语言理解等问题[^4]。 ```python import torch.nn as nn class LSTMModel(nn.Module): def __init__(self, input_dim, hidden_dim, layer_dim, output_dim): super(LSTMModel, self).__init__() # Hidden dimensions self.hidden_dim = hidden_dim # Number of hidden layers self.layer_dim = layer_dim # Building your LSTM self.lstm = nn.LSTM( input_size=input_dim, hidden_size=hidden_dim, num_layers=layer_dim, batch_first=True ) # Readout layer self.fc = nn.Linear(hidden_dim, output_dim) def forward(self, x): # Initialize hidden state with zeros h0 = torch.zeros(self.layer_dim, x.size(0), self.hidden_dim).requires_grad_() # Initialize cell state c0 = torch.zeros(self.layer_dim, x.size(0), self.hidden_dim).requires_grad_() # We need to detach the hidden states to prevent exploding/vanishing gradients. out, (hn, cn) = self.lstm(x, (h0.detach(), c0.detach())) # Index hidden state of last time step out = self.fc(out[:, -1, :]) # out.size() --> 100, 10 return out ```
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值