从头认识AI-----循环神经网络(RNN)

article/2025/6/27 19:19:12

前言

前面我们讲了传统的神经网络,如MLP、CNN,这些网络中的输入都被单独处理,没有上下文之间的信息传递机制,这在处理序列数据(如语音、文本、时间序列)时很鸡肋:

  • 如何理解一句话中“前后文”的含义?
  • 如何预测下一个时刻的股价?
  • 如何让模型记住历史信息?

为了解决现实世界中的序列建模问题,循环神经网络应运而生。


一、什么是RNN?

其实RNN就是一种带有“记忆功能”的神经网络架构,它能够处理长输入序列,在每个时刻都利用前一时刻的隐藏转态作为“上下文信息”。也可以说,RNN就是一个隐变量模型,隐变量转态是一个向量,RNN做的就是如何更新这个向量

假设现在有一条文本:“你好,明天!”,使用RNN预测下一个词,则RNN中隐变量的更新如下如所示:

 其中,前一个隐藏转态:h_{t-1},需要当前输入:x_t ,当前隐藏转态为:h_t 


二、RNN的数学原理

其实RNN的核心公式很简单,前面我已经说过,RNN其实就是一个隐变量模型,隐变量转态是一个向量,RNN就是如何更新这个隐变量向量。

具体隐状态更新公式如下:

H_t=tanh(W_{xh}@X_t+W_{hh}@H_{t-1}+b_h)

O_{t}=W_{ho}@H_t+b_o

其中:

  • W_{xh}:输入到隐藏的权重
  • W_{hh}:隐藏到隐藏的权重
  • W_{ho}:隐藏到输出的权重

三、手写一个简单的RNN

我们已经知道了RNN隐转态具体的更新流程,接下来,我来手写一个最简单的RNN:

1. 初始化参数

我先初始化所需要更新的参数:

import torchdef params(input_size, output_size, hidden_size):W_xh = torch.randn((input_size, hidden_size)) * 0.1W_hh = torch.randn((hidden_size, hidden_size)) * 0.1b_h = torch.zeros(hidden_size)W_ho = torch.randn((hidden_size, output_size)) * 0.1b_o = torch.zeros(output_size)params = [W_xh, W_hh, b_h, W_ho, b_o]for param in params:param.requires_grad=Truereturn params

2. 初始化隐藏转态

因为在0时刻时,没有隐藏转态,因此我们需要初始化一个隐藏状态:

def init_state(batch_size, hidden_size):return (torch.zeros((batch_size, hidden_size))

3. 隐状态更新

import torchdef rnn(X, state, params):W_xh, W_hh, b_h, W_ho, b_o = paramsH = stateoutputs = []for x in X:H = torch.tanh(torch.mm(x, W_xh) + torch.mm(H, W_hh) + b_h)O = torch.mm(H, W_ho) + b_ooutputs.append(O)return torch.cat(outputs, dim=1), (H, )

4. 总的架构

接下来,将所有的模块整合在一起:

import torch
import torch.nn as nn
import torch.nn.functional as Fdef params(input_size, output_size, hidden_size):W_xh = torch.randn((input_size, hidden_size)) * 0.1W_hh = torch.randn((hidden_size, hidden_size)) * 0.1b_h = torch.zeros(hidden_size)W_ho = torch.randn((hidden_size, output_size)) * 0.1b_o = torch.zeros(output_size)params = [W_xh, W_hh, b_h, W_ho, b_o]for param in params:param.requires_grad(True)return paramsdef init_state(batch_size, hidden_size):return (torch.zeros((batch_size, hidden_size))def rnn(X, state, params):W_xh, W_hh, b_h, W_ho, b_o = paramsH = stateoutputs = []for x in X:H = torch.tanh(torch.mm(x, W_xh) + torch.mm(H, W_hh) + b_h)O = torch.mm(H, W_ho) + b_ooutputs.append(O)return torch.cat(outputs, dim=1), (H, )class myrnn(nn.Module):def __init__(self, input_size=None, output_size=None, hidden_size=None, params=None, init_state=None, fn=None):self.input_size = input_sizeself.output_size = output_sizeself.hidden_size = hidden_sizeself.params = params(self.input_size, self.output_size, self.hidden_size)self.init_state = init_stateself.fn = fndef __call__(self, X, state):X = F.one_hot(X.T, self.input_size).type(torch.float32)return self.fn(X, state, self.params)def state(self, batch_size):return self.init_state(batch_size, self.hidden_size)# 示例
hidden_size = 256
input_size = output_size = 10
X = torch.arange(10).reshape(2,5)
model = myrnn(input_size=input_size, output_size=output_size, hidden_size=hidden_size, params=params, init_state=init_state, fn=rnn)
state = model.state(X.shape[0])
output, new_state = model(X, state)
print(output.shape)

四、使用Pytorch实现

Pytroch中已经内置了RNN模块,在实际应用中,我们只需要调用相应的RNN即可,接下来我简单演示一下:

import torch
import torch.nn as nnclass Rnn(nn.Module):def __init__(self, input_size, hidden_size, output_size):super(Rnn, self).__init__()self.rnn = nn.RNN(input_size, hidden_size, batch_first=True)self.fc = nn.Linear(hidden_size, output_size)def forward(self, x, h0):out, hn = self.rnn(x, h0)out = self.fc(out)return out, hn# 示例
model = Rnn(input_size=10, hidden_size=256, output_size=10)
x = torch.randn(1,5,10)
h0 = torch.zeros(1,1,256)
output, hn = model(x, h0)
print(output.shape, hn.shape)

五、RNN的优缺点

RNN相比与MLP与CNN来说,能够更好的处理序列类型数据,能够捕捉时间序列的上下文信息,并且结构简答,但是缺点也很明显:

  • 梯度消失/爆炸:难以捕捉长距离依赖
  • 训练速度慢:时间步多时训练不稳定

RNN的缺点限制了它的使用环境,为了解决RNN所具有的问题,LSTM和GRU相继被提出,我将在下一篇内容中详细解释LSTM。


六、总结

以上就是本文的全部内容,相信小伙伴们读到这里已经对RNN的原理十分了解了:RNN为序列建模打开了新纪元,它通过隐藏转态在时间维度上传递“记忆”,成为自然语言处理与时间序列建模的基础架构。尽管其在长序列建模上容易造成梯度爆炸等问题,但仍在很多场景中大方光彩。


如果小伙伴们觉得本文对各位有帮助,欢迎:👍点赞 | ⭐ 收藏 |  🔔 关注。我将持续在专栏《人工智能》中更新人工智能知识,帮助各位小伙伴们打好扎实的理论与操作基础,欢迎🔔订阅本专栏,向AI工程师进阶!


http://www.hkcw.cn/article/FOoEaxcQKD.shtml

相关文章

大陆武统台湾,韩国是否出手?李在明回答就很迷

【文/观察者网 刘程辉】韩国新一届总统选举前夕,韩国共同民主党总统候选人李在明接受美国《时代》杂志专访,期间谈及涉华问题。当被问到如果台湾遭大陆武统,韩国是否会对台湾伸出援手时,李在明给出了谜一般的回应——“等外星人入侵地球时,我才会考虑这个问题的答案”。值…

国羽女单包揽新加坡赛冠亚军 王祉怡陈雨菲会师决赛

5月31日,2025新加坡羽毛球公开赛半决赛中,王祉怡以2-1战胜日本选手山口茜,三局比分分别为21-12、12-21和21-17。这场胜利使得王祉怡与陈雨菲在决赛中会师,中国女单提前锁定了本次比赛的冠亚军。在此之前进行的另一场女单半决赛里,陈雨菲同样以2-1的成绩击败了队友韩悦,成…

法国多地户外禁烟违者罚款 儿童区域全面禁烟

法国即将实施一项严格的户外禁烟令,卫生与家庭部长卡特琳沃特兰宣布,所有儿童可能出入的户外场所将禁止吸烟。这项禁令将于7月1日生效,涵盖海滩、公园、花园、学校外、公交车站和体育场馆等区域。咖啡馆和酒吧的户外露台不受此禁令限制。违反规定者将面临135欧元(约合人民币…

江苏一医院推出“药膳粽” 特色养生受追捧

淮安一家医院近期推出五款特色药膳粽,包括纤体美容粽、宁心安神粽、健脾养胃粽、辛润养肺粽和益气固肾粽。这些粽子一经预告便被抢购一空,食堂不得不临时增加人手,在短短六天内售出7000多个。端午节自古以来就蕴含着丰富的健康文化内涵,挂艾草、菖蒲以驱邪避瘟,饮雄黄酒以…

特朗普:马斯克将继续往返白宫 政府效率部争议不断

5月31日,埃隆马斯克在白宫椭圆形办公室的新闻发布会上结束了他在特朗普政府的任期。会上,他与美国总统特朗普一起为政府效率部的工作站台,并承诺即使他离开,该部门的工作也不会停滞。特朗普表示马斯克“并非真的离开”,还会继续往返白宫,并称政府效率部是马斯克的心血结晶…

美计划扩大对中国公司技术制裁 从芯片到发动机的全方位封锁

近日,美国商务部工业和安全局再次升级对华技术出口管制,将矛头直指中国半导体和航空工业的关键领域。这些措施不仅限制了中国获取先进计算芯片和超级计算机技术,还首次将喷气发动机技术纳入禁运范围,标志着中美科技竞争进入全新阶段。10月7日颁布的新规是美国对华技术封锁的…

樊振东慕尼黑观看欧冠决赛 晒照与大耳朵杯合影

在欧冠决赛前夕,乒乓球奥运冠军樊振东通过社交媒体分享了一张照片,显示他已经抵达决赛举办地慕尼黑。照片中,樊振东与大耳朵杯合影,并配文:“早上好,慕尼黑。”巴黎圣日耳曼与国际米兰的欧冠决赛将于北京时间明天凌晨3:00在慕尼黑安联竞技场举行。责任编辑:zx0001

李晟演唱《枯叶蝶》 舞台封神时刻

家人们,李晟在浪姐上的《枯叶蝶》舞台简直封神!从初舞台凭《当》惊艳众人,到如今演唱《枯叶蝶》,她的每一次亮相都让人惊喜。她用实力证明,“枯叶蝶”也能在舞台上绽放耀眼光芒。责任编辑:zx0001

樊振东现身慕尼黑看欧冠 特邀嘉宾直击决赛

5月31日下午,乒乓球运动员樊振东发博晒出自己在慕尼黑的照片。据了解,樊振东将作为特邀嘉宾现身欧冠决赛现场,直击巴黎圣日耳曼vs国际米兰巅峰对决。责任编辑:zx0001

十个勤天他在叫他在笑 泥潭大战欢乐多

在最新一期的《五哈5》节目中,超大泥潭接力赛成为了欢乐的源泉,“十个勤天”在这片泥潭中仿佛找到了自己的主场,贡献了无数让人捧腹的笑点。赵小童在泥潭接力赛中遇到了麻烦,泥水没过了膝盖,她直接陷在泥潭里动弹不得。陈赫试图拉她一把,但赵小童却调侃道:“我起不来,你…

超深掩蔽联合改进YOLOv8实现温室番茄果实精准计数——93.8%精度突破与智慧农业应用

【导读】 番茄作为重要经济作物,其成熟度精准计数对优化采摘、品种改良等农艺管理至关重要。然而,传统视觉技术易受光照、果实重叠等因素干扰,而现有深度学习模型在复杂温室环境中跟踪稳定性不足,导致计数精度难以满足需求。沈阳…

STM32F103RCT6引脚图

系列文章目录 文章目录 系列文章目录前言 前言 STM32F103RCT6引脚图

校门口的“游烟”该管管了 校园成“重灾区”

“游烟”是指吸烟者在室外一边走路或骑车一边吸烟形成的烟雾,其实质就是二手烟。被动吸烟者往往猝不及防,尤其是在中小学校门口等场所,“游烟”问题尤为严重。近年来,多地已开始治理这一现象,但禁烟范围模糊、监管困难等问题仍待解决。例如,北京市民陈女士表示,尽管室内…

县政府收到信访后不作为引发舆情 25名官员被处理

5月30日,吉林省纪委监委公开通报了4起形式主义、官僚主义典型问题。其中一例是农安县政府办公室在督办解决群众信访诉求方面不作为慢作为的问题。2023年11月至2024年5月,农安县政府收到上级转办的关于群众反映合隆镇“桃花源著”回迁房二期项目建设存在质量、逾期回迁等问题后…

当地辟谣儿童节孩子淋雨演出 实为老师术后护眼打伞

5月30日,贵州毕节黔西市杜鹃街道办关工委举行六一儿童节文艺演出。期间,一位女士在台下打伞的视频在网络上传播,引发热议。有人质疑:“孩子在淋雨表演,老师却在打伞吗?”次日,黔西市政府相关部门回应称,经调查核实,“学生淋雨老师打伞”的说法并不属实。当天并未下雨,…

专家称不明飞行物是国外侦查卫星烧毁 夜空火光引多地关注

5月30日晚,山东潍坊、日照等地的网友在社交媒体上发布视频,称夜空中出现了不明飞行物。江苏、安徽等地的网友也报告了类似现象,有人猜测是火流星。一位天体物理学博主解释说,这是一颗国外发射的侦查卫星。5月31日早上,潍坊市昌邑县的王女士表示,她在30日晚8点45分左右看到…

吃饭越快肝脏更容易变胖吗 5分钟吃完饭的影响

快节奏的现代生活让人们常常为了赶时间而压缩吃饭时间,匆忙地吃完一顿饭。一项研究发现,经常在五分钟内吃完饭的人,肝脏更容易变胖。“吃饭太快”不再是简单的生活习惯问题,而是可能威胁肝脏健康的隐形推手。2024年8月,《营养与糖尿病》发表的一项研究表明,经常快速进食可…

美媒为劝特朗普放弃针对中国留学生,搬出了钱学森 历史教训不可忘

特朗普政府再次针对在美中国留学生,此举被批评为开启了“新学术冷战”。《纽约时报》专栏作者凯瑟琳金斯伯里首先想到了钱学森的故事。5月30日,她在文章中警告特朗普政府不要重蹈覆辙,因为疏远世界人才最终只会让美国得不偿失。钱学森23岁时来到美国,在加州与一群年轻科学家…

小伙亚硝酸盐中毒尿液呈蓝色 紧急救治挽回生命

前不久的一个深夜,浙江省立同德医院ICU收治了一名25岁的年轻小伙。他全身青紫,口唇发紫,送到医院时已陷入深昏迷状态。在之后的治疗过程中,他的尿液甚至变成了蓝色。医生检查后发现,小伙的血氧饱和度仅有64%,血压只有70/40mmHg,高铁血红蛋白浓度高达75%。心脏和大脑已处…

C++写入CSV的操作读取、写入、追加以及文件删除

说明 在C的实际开发中,输出CSV文件是非常常见的任务,特别是在需要将数据导出到表格或其他工具中进行分析时。CSV文件本质上是以逗号分隔的纯文本文件,因此可以使用标准的文件流(std::ofstream)来生成和写入CSV文件。 以…