自然语言处理(一):RNN

代码探风鹤
• 阅读 256

循环神经网络(Recurrent Neural Network,RNN)是一个非常经典的面向序列的模型,可以对自然语言句子或是其他时序信号进行建模。进一步讲,它只有一个物理RNN单元,但是这个RNN单元可以按照时间步骤进行展开,在每个时间步骤接收当前时间步的输入和上一个时间步的输出,然后进行计算得出本时间步的输出。

Why

  1. CNN 需要固定长度的输入、输出,RNN 的输入和输出可以是不定长且不等长的
  2. CNN 只有 one-to-one 一种结构,而 RNN 有多种结构,如下图:

自然语言处理(一):RNN

Model

  • 简单模型示例

    自然语言处理(一):RNN

循环神经网络的隐藏层的值s不仅仅取决于当前这次的输入x,还取决于上一次隐藏层的值s。权重矩阵 W就是隐藏层上一次的值作为这一次的输入的权重。

  • RNN时间线展开

自然语言处理(一):RNN

$t$ 时刻的输入,不仅是$X_t$,还应该包括上一个时刻所计算的 $S_{t-1}$ 。

  • 使用公式表示

自然语言处理(一):RNN

示例

下面我们举个例子来讨论一下,如图所示,假设我们现在有这样一句话:”我爱人工智能”,经过分词之后变成”我,爱,人工,智能”这4个单词,RNN会根据这4个单词的时序关系进行处理,在第1个时刻处理单词”我”,第2个时刻处理单词”爱”,依次类推。

自然语言处理(一):RNN

从图上可以看出,RNN在每个时刻$t$均会接收两个输入,一个是当前时刻的单词$X_t$,一个是来自上一个时刻的输出$h_{t-1}$ ,经过计算后产生当前时刻的输出$h_t$。例如在第2个时刻,它的输入是”爱”和$ℎ_1$,它的输出是$h_2$;在第3个时刻,它的输入是”人工”和$h_2$, 输出是$h_3$,依次类推,直到处理完最后一个单词。

总结一下,RNN会从左到右逐词阅读这个句子,并不断调用一个相同的RNN Cell来处理时序信息,每阅读一个单词,RNN首先将本时刻$t$的单词$X_t$和这个模型内部记忆的状态向量$h_{t-1}$融合起来,形成一个带有最新记忆的状态向量 $h_t$。

  • Tip:当RNN读完最后一个单词后,那RNN就已经读完了整个句子,一般可认为最后一个单词输出的状态向量能够表示整个句子的语义信息,即它是整个句子的语义向量,这是一个常用的想法。

Code

  • 数据准备
import torch
import torch.nn as nn
import numpy as np

torch.manual_seed(0)  # 设置随机种子以实现可重复性

seq_length = 5
input_size = 1
hidden_size = 10
output_size = 1
batch_size = 1

time_steps = np.linspace(0, np.pi, 100)
data = np.sin(time_steps)
data.resize((len(time_steps), 1))

# Split data into sequences of length 5
x = []
y = []
for i in range(len(data)-seq_length):
    _x = data[i:i+seq_length]
    _y = data[i+seq_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_first=True)
        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(), lr=0.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(f'Epoch {epoch}, Loss: {total_loss}')

缺点

  • 当阅读很长的序列时,网络内部的信息会逐渐变得越来越复杂,以至于超过网络的记忆能力,使得最终的输出信息变得混乱无用。

参考

  1. https://zhuanlan.zhihu.com/p/30844905
  2. https://paddlepedia.readthedocs.io/en/latest/tutorials/sequen...
  3. https://saturncloud.io/blog/building-rnn-from-scratch-in-pyto...
  4. https://pytorch.org/docs/stable/generated/torch.nn.RNN.html

本文由mdnice多平台发布

点赞
收藏
评论区
推荐文章
序列数据和文本的深度学习
序列数据和文本的深度学习用于构建深度学习模型的不同文本数据表示法:理解递归神经网络及其不同实现,例如长短期记忆网络(LSTM)和门控循环单元(GatedRecurrentUnit,GRU),它们为大多数深度学习模型提供文本和序列化数据;为序列化数据使用一维卷积。可以使用RNN构建的一些应用程序如下所示。文档分类器:识别推文或评论的情感,对新闻文章
不是海碗 不是海碗
2年前
超火的 ChatGPT,APISpace 让你一分钟免费接入
ChatGPT是一个基于GPT3.5(GenerativePretrainedTransformer3.5)的语言模型,用于处理自然语言问答。GPT3.5是由人工智能公司OpenAI开发的一种大型神经网络模型,能够处理自然语言文本。ChatGPT是基于GPT3.5模型构建的,能够根据用户输入的问题,生成自然语言的回答。
Easter79 Easter79
3年前
tensorflow 之循环神经网络
应用场景:应用于语音识别语音翻译机器翻译RNNRNN(RecurrentNeuralNetworks,循环神经网络)不仅会学习当前时刻的信息,也会依赖之前的序列信息。由于其特殊的网络模型结构解决了信息保存的问题。所以RNN对处理时间序列和语言文本序列问题有独特的优势。递归神经网络都具有一连串重复神经网络模
黎明之道 黎明之道
4年前
天池比赛数据挖掘心电图特征工程
Task3特征工程3.1学习目标学习时间序列数据的特征预处理方法学习时间序列特征处理工具Tsfresh(TimeSeriesFresh)的使用3.2内容介绍数据预处理时间序列数据格式处理加入时间步特征time特征工程时间序列特征构造特征筛选使用tsfresh进行时间序列特征处理
Easter79 Easter79
3年前
Tensorflow应用之LSTM
学习RNN时原理理解起来不难,但是用TensorFlow去实现时被它各种数据的shape弄得晕头转向。现在就结合一个情感分析的案例来了解一下LSTM的操作流程。一、深度学习在自然语言处理中的应用自然语言处理是教会机器如何去处理或者读懂人类语言的系统,主要应用领域:对话系统聊天机器人(小冰)情感分析对一段文本进
Stella981 Stella981
3年前
OpenTSDB在HBase中的底层数据结构设计
0.时序数据库时间序列(TimeSeries):是一组按照时间发生先后顺序进行排列的数据点序列,通常一组时间序列的时间间隔为一恒定值(如1秒,5分钟,1小时等)。时间序列数据可被简称为时序数据。实时监控系统所收集的监控指标数据,通常就是时序数据。时序数据具有如下特点:每一个时间序列通常为某一固定类型的数值
花母 花母
2年前
小白也能看懂的ChatGPT知识介绍
ChatGPT其工作原理是通过深度学习算法和自然语言处理技术,生成与给定输入相关的文本或回答。ChatGPT的核心是一个大型语言模型,它被训练成能够理解和生成自然语言,包括词语、短语、句子和段落。这个模型使用了大量的语言数据,包括文章、书籍、新闻报道和互联
递归神经网络(RNN)
递归神经网络(RNN)RNN是最强大的模型之一,它使我们能够开发如分类、序列数据标注、生成文本序列(例如预测下一输入词的SwiftKeykeyboard应用程序),以及将一个序列转换为另一个序列(比如从法语翻译成英语的语言翻译)等应用程序。大多数模型架构(如前馈神经网络)都没有利用数据的序列特性。例如,我们需要数据呈现出向量中每个样例的特征,如表示句子、段
文本的深度学习
序列数据和文本的深度学习用于构建深度学习模型的不同文本数据表示法:理解递归神经网络及其不同实现,例如长短期记忆网络(LSTM)和门控循环单元(GatedRecurrentUnit,GRU),它们为大多数深度学习模型提供文本和序列化数据;为序列化数据使用一维卷积。可以使用RNN构建的一些应用程序如下所示。文档分类器:识别推文或评论的情感,对新闻文章
递归神经网络(RNN)
递归神经网络(RNN)RNN是最强大的模型之一,它使我们能够开发如分类、序列数据标注、生成文本序列(例如预测下一输入词的SwiftKeykeyboard应用程序),以及将一个序列转换为另一个序列(比如从法语翻译成英语的语言翻译)等应用程序。大多数模型架构(如前馈神经网络)都没有利用数据的序列特性。例如,我们需要数据呈现出向量中每个样例的特征,如表示句子、段