海南网站制作公司,云南app开发公司哪家好,微建网站,网站开发的概要设计模板「循环神经网络」#xff08;Recurrent Neural Network#xff0c;RNN#xff09;是一个非常经典的面向序列的模型#xff0c;可以对自然语言句子或是其他时序信号进行建模。进一步讲#xff0c;它只有一个物理RNN单元#xff0c;但是这个RNN单元可以按照时间步骤进行展开… 「循环神经网络」Recurrent Neural NetworkRNN是一个非常经典的面向序列的模型可以对自然语言句子或是其他时序信号进行建模。进一步讲它只有一个物理RNN单元但是这个RNN单元可以按照时间步骤进行展开在每个时间步骤接收当前时间步的输入和上一个时间步的输出然后进行计算得出本时间步的输出。 Why CNN 需要固定长度的输入、输出RNN 的输入和输出可以是不定长且不等长的 CNN 只有 one-to-one 一种结构而 RNN 有多种结构如下图 Model 简单模型示例 循环神经网络的隐藏层的值s不仅仅取决于当前这次的输入x还取决于上一次隐藏层的值s。「权重矩阵」 W就是「隐藏层」上一次的值作为这一次的输入的权重。 RNN时间线展开 时刻的输入不仅是 还应该包括上一个时刻所计算的 。 使用公式表示 示例 下面我们举个例子来讨论一下如图所示假设我们现在有这样一句话”我爱人工智能”经过分词之后变成”我爱人工智能”这4个单词RNN会根据这4个单词的时序关系进行处理在第1个时刻处理单词”我”第2个时刻处理单词”爱”依次类推。 从图上可以看出RNN在每个时刻 均会接收两个输入一个是当前时刻的单词 一个是来自上一个时刻的输出 经过计算后产生当前时刻的输出 。例如在第2个时刻它的输入是”爱”和 它的输出是 在第3个时刻它的输入是”人工”和 , 输出是 依次类推直到处理完最后一个单词。 总结一下RNN会从左到右逐词阅读这个句子并不断调用一个相同的RNN Cell来处理时序信息每阅读一个单词RNN首先将本时刻 的单词 和这个模型内部记忆的「状态向量」 融合起来形成一个带有最新记忆的状态向量 。 「Tip」当RNN读完最后一个单词后那RNN就已经读完了整个句子一般可认为最后一个单词输出的状态向量能够表示整个句子的语义信息即它是整个句子的语义向量这是一个常用的想法。 Code 数据准备 import torchimport torch.nn as nnimport numpy as nptorch.manual_seed(0) # 设置随机种子以实现可重复性seq_length 5input_size 1hidden_size 10output_size 1batch_size 1time_steps np.linspace(0, np.pi, 100)data np.sin(time_steps)data.resize((len(time_steps), 1))# Split data into sequences of length 5x []y []for i in range(len(data)-seq_length): _x data[i:iseq_length] _y data[iseq_length] x.append(_x) y.append(_y)x np.array(x)y np.array(y) Model class RNN(nn.Module): def __init__(self, input_size, hidden_size, output_size): super(RNN, self).__init__() self.hidden_size hidden_size self.rnn nn.RNN(input_size, hidden_size, batch_firstTrue) self.fc nn.Linear(hidden_size, output_size) def forward(self, x, hidden): out, hidden self.rnn(x, hidden) out out.view(-1, self.hidden_size) out self.fc(out) return out, hidden Train model RNN(input_size, hidden_size, output_size)criterion nn.MSELoss()optimizer torch.optim.Adam(model.parameters(), lr0.01)for epoch in range(100): total_loss 0 hidden None for i in range(len(x)): optimizer.zero_grad() input_ torch.Tensor(x[i]).unsqueeze(0) target torch.Tensor(y[i]) output, hidden model(input_, hidden) hidden hidden.detach() loss criterion(output, target) loss.backward() optimizer.step() total_loss loss.item() if epoch % 10 0: print(fEpoch {epoch}, Loss: {total_loss}) 缺点 当阅读很长的序列时网络内部的信息会逐渐变得越来越复杂以至于超过网络的记忆能力使得最终的输出信息变得混乱无用。 参考 https://zhuanlan.zhihu.com/p/30844905 https://paddlepedia.readthedocs.io/en/latest/tutorials/sequence_model/rnn.html https://saturncloud.io/blog/building-rnn-from-scratch-in-pytorch/ https://pytorch.org/docs/stable/generated/torch.nn.RNN.html 本文由 mdnice 多平台发布