自然语言处理(一):RNN

news2024/7/6 17:46:49

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

Why

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

Model

  • 简单模型示例

    alt

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

  • RNN时间线展开
alt

时刻的输入,不仅是 ,还应该包括上一个时刻所计算的

  • 使用公式表示
alt

示例

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

alt

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

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

  • 「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/sequence_model/rnn.html
  3. https://saturncloud.io/blog/building-rnn-from-scratch-in-pytorch/
  4. https://pytorch.org/docs/stable/generated/torch.nn.RNN.html

本文由 mdnice 多平台发布

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1185586.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

发电机综合特性测试仪

发电机综合特性测试仪是可以测量发电机的电压、电流、功率因数、频率等参数,以评估发电机的质量和性能。可以测量发电机的输出电压,以确保其符合规定的标准和要求。测量发电机的输出电流,以确定其负载能力和稳定性。可以测量发电机的功率因数…

我是如何快速入门音视频开发的?

最近有读者留言,说“想转行音视频开发,怎么做”,正巧,前几天我还在知乎上,看到有人在问音视频的学习资料,还是个大一的学生。 想说一句:真有眼光。 如今这个时代,想赚钱&#xff0c…

2010年07月13日 Go生态洞察:通过通信来共享内存

🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…

霍尼韦尔pda手持终端 移动护理终端pda扫描手持机

pda手持终端的特点:具有数据存储及计算能力,能与其它设备进行数据通讯,具有 专业条码扫描,能够快速、准确采集各种一/二维码、破损码、弯折码、屏幕码等光学图形条码。有可拆卸4600mAh聚合物锂电池,续航有保障。 And…

【小白专用】VSCode下载和安装与配置PHP开发环境(详细版) 23.11.08

1. 下载VSCode2. 解决VSCode下载速度特别慢3. 安装VSCode 一、VSCode介绍 VSCode 是一款由微软开发且跨平台的免费源代码编辑器;该软件支持语法高亮、代码自动补全、代码重构、查看定义功能,并且内置了命令行工具和 Git 版本控制系统。 二、官方下载地址…

剑指JUC原理-15.ThreadLocal

👏作者简介:大家好,我是爱吃芝士的土豆倪,24届校招生Java选手,很高兴认识大家📕系列专栏:Spring源码、JUC源码🔥如果感觉博主的文章还不错的话,请👍三连支持&…

基于指数分布算法的无人机航迹规划-附代码

基于指数分布算法的无人机航迹规划 文章目录 基于指数分布算法的无人机航迹规划1.指数分布搜索算法2.无人机飞行环境建模3.无人机航迹规划建模4.实验结果4.1地图创建4.2 航迹规划 5.参考文献6.Matlab代码 摘要:本文主要介绍利用指数分布算法来优化无人机航迹规划。 …

传感器融合是什么?及其类型和应用

什么是传感器融合? 目前,几乎各行各业都在使用传感器:在汽车、工厂,甚至我们的智能手机中,都有传感器的身影。虽然单个传感器本身就可以提供有用的数据,但如何能同时从多个传感器的输出中提取信息呢&#…

Bean的四种实例化方式以及BeanFactory和FactoryBean的区别

2023.11.8 Spring为Bean提供了多种实例化方式,通常包括4种方式。 第一种:通过构造方法实例化第二种:通过简单工厂模式实例化第三种:通过factory-bean实例化第四种:通过FactoryBean接口实例化 通过构造方法实例化 创…

MySQL基础操作

注:mysql是大小写不敏感的. 1.数据库基础操作(展示) //1.展示当前数据库 show databases;//2.创建数据库 create database 数据库名;//3.使用数据库 use 数据库名;//4.删除数据库 drop database 数据库名;2.SQL中基本类型 2.1 数值类型(整数和浮点型) 注:decimal和numeric…

cortex-A7核IIC实验--采集温湿度传感器的值

1.IIC总线---同步串行半双工 1)一根数据线SDA--PF15,一根时钟线SCL--PF14 2)传输速率:低速:100K 中速:400K 全速:3.4M 3)外接两个上拉电阻的作用:总线空闲状态时&am…

浅谈顺序表基本操作

🤷‍♀️🤷‍♀️🤷‍♀️ 今天给大家带来的是数据结构——顺序表的实现(增删查改)。 清风的CSDN博客主页 🎉欢迎👍点赞✍评论❤️收藏 😛😛😛希望我的文章能对你有所帮助&#xff…

刷题笔记day14-二叉树01

前序遍历 前序遍历的方式是:根节点、左节点、右节点。 /*** Definition for a binary tree node.* type TreeNode struct {* Val int* Left *TreeNode* Right *TreeNode* }*/ import "container/list"func preorderTraversal(root *TreeNode…

如何高效处理IT中的突发事件?

在当今快节奏的商业环境中,IT中的重大事件可能会意外发生,从而影响生产力和客户满意度。无论哪个行业,制定恢复计划并建立ITSM事件管理对于在危机时期确保业务连续性至关重要。 让我们来看一下某航空公司的运营,航空公司的运营很…

Alphago Zero的原理及实现:Mastering the game of Go without human knowledge

近年来强化学习算法广泛应用于游戏对抗上,通用的强化学习模型一般包含了Actor模型和Critic模型,其中Actor模型根据状态生成下一步动作,而Critic模型估计状态的价值,这两个模型通过相互迭代训练(该过程称为Generalized …

YOLOv8-Seg推理详解及部署实现

目录 前言一、YOLOv8-Seg推理(Python)1. YOLOv8-Seg预测2. YOLOv8-Seg预处理3. YOLOv8-Seg后处理4. YOLOv8-Seg推理 二、YOLOv8-Seg推理(C)1. ONNX导出2. YOLOv8-Seg预处理3. YOLOv8-Seg后处理4. YOLOv8推理 三、YOLOv8-Seg部署1. 源码下载2. 环境配置2.1 配置CMakeLists.txt2.…

JavaScript 作用域链(Scope Chain)是什么?有什么作用?

结论先行: 当在函数内部访问一个变量的时候,(JS 引擎)程序会先在当前作用域中查找(是否存在该变量),如果找到了就直接使用。否则就会向上层作用域逐级查找,直到找到全局作用域为止。…

高等数学教材重难点题型总结(一)函数与极限

强化阶段的另一个专题,本专题主要总结高数课本上的经典例题与课后题,尤其一部分加*标的题目,对于冲击高分的同学来说,必须熟练掌握。 (蓝色代表难点,红色代表重点,紫色代表重难点) …

Origin2023绘制双轴

在水文气象研究中,经常是把降水右轴并在顶部。具体操作如下: 1.先绘制径流曲线图 2.再添加一个图层,insert→new layer→Top-X-Right-Y 3.图层设置,添加降水序列,样式为柱状图 4.设置右轴的标注为600到0(保证倒立)&am…

没有接口文档如何进行接口测试(超详细~)

前言 在进行接口测试之前,一般开发会提供接口文档,给出一些接口参数和必要熟悉,便于我们编写接口脚本。但如果没有提供接口开发文档的请求下,我们该如何编写接口测试脚本呢?在编写测试脚本前要做哪些必要的准备呢&…