循环神经网络与文本处理:深度循环神经网络的实现与应用

深度循环神经网络

学习目标

通过学习本课程,学员将了解深度循环神经网络的函数依赖关系,简洁实现,训练与预测。

相关知识点

  • 深度循环神经网络

学习内容

讨论一个具有单向隐藏层的循环神经网络。其中,隐变量和观测值与具体的函数形式的交互方式是相当随意的。只要交互类型建模具有足够的灵活性,这就不是一个大问题。然而,对一个单层来说,这可能具有相当的挑战性。而在循环神经网络中,我们首先需要确定如何添加更多的层,以及在哪里添加额外的非线性。

事实上,我们可以将多层循环神经网络堆叠在一起,通过对几个简单层的组合,产生了一个灵活的机制。特别是,数据可能与不同层的堆叠有关。

下图描述了一个具有LLL个隐藏层的深度循环神经网络,每个隐状态都连续地传递到当前层的下一个时间步和下一层的当前时间步。

图1 深度循环神经网络结构

1 深度循环神经网络

1.1 函数依赖关系

我们可以将深度架构中的函数依赖关系形式化,这个架构是由 图1 中描述了LLL个隐藏层构成。

假设在时间步ttt有一个小批量的输入数据Xt∈Rn×d\mathbf{X}_t \in \mathbb{R}^{n \times d}XtRn×d
(样本数:nnn,每个样本中的输入数:ddd)。同时,将lthl^\mathrm{th}lth隐藏层(l=1,…,Ll=1,\ldots,Ll=1,,L)的隐状态设为Ht(l)∈Rn×h\mathbf{H}_t^{(l)} \in \mathbb{R}^{n \times h}Ht(l)Rn×h
(隐藏单元数:hhh),输出层变量设为Ot∈Rn×q\mathbf{O}_t \in \mathbb{R}^{n \times q}OtRn×q
(输出数:qqq)。设置Ht(0)=Xt\mathbf{H}_t^{(0)} = \mathbf{X}_tHt(0)=Xt,第lll个隐藏层的隐状态使用激活函数ϕl\phi_lϕl,则为公式(1):

Ht(l)=ϕl(Ht(l−1)Wxh(l)+Ht−1(l)Whh(l)+bh(l)),(1)\mathbf{H}_t^{(l)} = \phi_l(\mathbf{H}_t^{(l-1)} \mathbf{W}_{xh}^{(l)} + \mathbf{H}_{t-1}^{(l)} \mathbf{W}_{hh}^{(l)} + \mathbf{b}_h^{(l)})\tag{1},Ht(l)=ϕl(Ht(l1)Wxh(l)+Ht1(l)Whh(l)+bh(l)),(1)
eq_deep_rnn_H

其中,权重Wxh(l)∈Rh×h\mathbf{W}_{xh}^{(l)} \in \mathbb{R}^{h \times h}Wxh(l)Rh×hWhh(l)∈Rh×h\mathbf{W}_{hh}^{(l)} \in \mathbb{R}^{h \times h}Whh(l)Rh×h和偏置bh(l)∈R1×h\mathbf{b}_h^{(l)} \in \mathbb{R}^{1 \times h}bh(l)R1×h
都是第lll个隐藏层的模型参数。
最后,输出层的计算仅基于第lll个隐藏层最终的隐状态,如公式(2)所示:

Ot=Ht(L)Whq+bq,(2)\mathbf{O}_t = \mathbf{H}_t^{(L)} \mathbf{W}_{hq} + \mathbf{b}_q\tag{2},Ot=Ht(L)Whq+bq,(2)

其中,权重Whq∈Rh×q\mathbf{W}_{hq} \in \mathbb{R}^{h \times q}WhqRh×q和偏置bq∈R1×q\mathbf{b}_q \in \mathbb{R}^{1 \times q}bqR1×q都是输出层的模型参数。

与多层感知机一样,隐藏层数目LLL和隐藏单元数目hhh都是超参数。它们可以进行调整。另外,用门控循环单元或长短期记忆网络的隐状态来代替eq_deep_rnn_H中的隐状态进行计算,可以很容易地得到深度门控循环神经网络或深度长短期记忆神经网络。

1.2 深度循环神经网络的简洁实现

实现多层循环神经网络所需的许多逻辑细节在高级API中都是现成的。简单起见,我们仅示范使用此类内置函数的实现方式。以长短期记忆网络模型为例,我们指定了层的数量,而不是使用单一层这个默认值。我们从加载时间机器数据集开始。

1.2.1 安装环境依赖与加载数据集
%pip install d2l==0.17.6--no-deps%pip install matplotlib-inline
%matplotlib inlineimportmathimporttorchimportrandomimportrefromtorchimportnnfromtorch.nnimportfunctionalasFfromd2limporttorchasd2limportcollections
#获取数据集!wget https://model-community-picture.obs.cn-north-4.myhuaweicloud.com/ascend-zone/notebook_datasets/0f19d2300e0711f09b46fa163edcddae/timemachine.txt

本课程采用本地加载数据集的方式加载数据集,需要定义以下函数:

defread_time_machine_local(file_path):"""从本地文件加载时间机器数据集"""withopen(file_path,'r',encoding='utf-8')asf:lines=f.readlines()return[re.sub('[^A-Za-z]+',' ',line).strip().lower()forlineinlines]deftokenize(lines,token='word'):"""分词器:将文本行拆分为单词或字符标记"""iftoken=='word':return[line.split()forlineinlines]eliftoken=='char':return[list(line)forlineinlines]else:print('ERROR: unknown token type: '+token)

定义Vocab类:

classVocab:def__init__(self,tokens=None,min_freq=0,reserved_tokens=None):iftokensisNone:tokens=[]ifreserved_tokensisNone:reserved_tokens=[]counter=count_corpus(tokens)self._token_freqs=sorted(counter.items(),key=lambdax:x[1],reverse=True)self.idx_to_token=['<unk>']+reserved_tokens self.token_to_idx={token:idxforidx,tokeninenumerate(self.idx_to_token)}fortoken,freqinself._token_freqs:iffreq<min_freq:breakiftokennotinself.token_to_idx:self.idx_to_token.append(token)self.token_to_idx[token]=len(self.idx_to_token)-1def__len__(self):returnlen(self.idx_to_token)def__getitem__(self,tokens):ifnotisinstance(tokens,(list,tuple)):returnself.token_to_idx.get(tokens,self.unk)return[self.__getitem__(token)fortokenintokens]defto_tokens(self,indices):ifnotisinstance(indices,(list,tuple)):returnself.idx_to_token[indices]return[self.idx_to_token[index]forindexinindices]@propertydefunk(self):return0@propertydeftoken_freqs(self):returnself._token_freqs

定义计算token频率、本地文件加载语料库和词汇表、随机采样生成小批量数据等用于本地数据加载的函数:

defcount_corpus(tokens):"""计算token频率"""iflen(tokens)==0orisinstance(tokens[0],list):tokens=[tokenforlineintokensfortokeninline]returncollections.Counter(tokens)defload_corpus_time_machine_local(file_path,max_tokens=-1):"""从本地文件加载语料库和词汇表"""lines=read_time_machine_local(file_path)tokens=tokenize(lines,'char')vocab=Vocab(tokens)corpus=[vocab[token]forlineintokensfortokeninline]ifmax_tokens>0:corpus=corpus[:max_tokens]returncorpus,vocabdefseq_data_iter_random(corpus,batch_size,num_steps):"""随机采样生成小批量数据"""corpus=corpus[random.randint(0,num_steps-1):]num_subseqs=(len(corpus)-1)//num_steps initial_indices=list(range(0,num_subseqs*num_steps,num_steps))random.shuffle(initial_indices)defdata(pos):returncorpus[pos:pos+num_steps]num_batches=num_subseqs//batch_sizeforiinrange(0,batch_size*num_batches,batch_size):initial_indices_per_batch=initial_indices[i:i+batch_size]X=[data(j)forjininitial_indices_per_batch]Y=[data(j+1)forjininitial_indices_per_batch]yieldtorch.tensor(X),torch.tensor(Y)defseq_data_iter_sequential(corpus,batch_size,num_steps):"""顺序分区生成小批量数据"""offset=random.randint(0,num_steps)num_tokens=((len(corpus)-offset-1)//batch_size)*batch_size Xs=torch.tensor(corpus[offset:offset+num_tokens])Ys=torch.tensor(corpus[offset+1:offset+1+num_tokens])Xs,Ys=Xs.reshape(batch_size,-1),Ys.reshape(batch_size,-1)num_batches=Xs.shape[1]//num_stepsforiinrange(0,num_steps*num_batches,num_steps):X=Xs[:,i:i+num_steps]Y=Ys[:,i:i+num_steps]yieldX,YclassSeqDataLoader:"""序列数据加载器"""def__init__(self,file_path,batch_size,num_steps,use_random_iter,max_tokens):self.data_iter_fn=seq_data_iter_randomifuse_random_iterelseseq_data_iter_sequential self.corpus,self.vocab=load_corpus_time_machine_local(file_path,max_tokens)self.batch_size,self.num_steps=batch_size,num_stepsdef__iter__(self):returnself.data_iter_fn(self.corpus,self.batch_size,self.num_steps)defload_data_time_machine_local(file_path,batch_size,num_steps,use_random_iter=False,max_tokens=10000):"""从本地加载时间机器数据集的主函数"""data_iter=SeqDataLoader(file_path,batch_size,num_steps,use_random_iter,max_tokens)returndata_iter,data_iter.vocab
# 从本地加载数据集file_path="./timemachine.txt"batch_size,num_steps=32,35train_iter,vocab=load_data_time_machine_local(file_path,batch_size,num_steps)

我们有不同的词元,所以输入和输出都选择相同数量,即vocab_size。隐藏单元的数量仍然是256256256。唯一的区别是,我们现在通过num_layers的值来设定隐藏层数

importtorch_npu vocab_size,num_hiddens,num_layers=len(vocab),256,2num_inputs=vocab_size device=torch.device('npu:0')lstm_layer=nn.LSTM(num_inputs,num_hiddens,num_layers)model=d2l.RNNModel(lstm_layer,len(vocab))model=model.to(device)
1.2.2 深度循环神经的训练预测

由于使用了长短期记忆网络模型来实例化两个层,因此训练速度被大大降低了。

num_epochs,lr=100,2d2l.train_ch8(model,train_iter,vocab,lr*1.0,num_epochs,device)

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

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

相关文章

Promise 吞错太坑?前端老鸟教你揪出那些藏起来的错误

Promise 吞错太坑&#xff1f;前端老鸟教你揪出那些藏起来的错误Promise 吞错太坑&#xff1f;前端老鸟教你揪出那些藏起来的错误错误去哪了&#xff1f;—— 一场“无声”的坠机Promise 为啥爱“吃白食”&#xff1f;现场还原&#xff1a;四个最容易踩的坑1. then 里 throw 完…

长尾关键词如何助力SEO策略优化与网站流量提升

长尾关键词是SEO策略中不可或缺的组成部分&#xff0c;因其能够为网站带来更精准的流量。通常&#xff0c;这些关键词由多个词组成&#xff0c;比传统关键词更具针对性&#xff0c;帮助满足用户特定的搜索需求。在实施长尾关键词策略时&#xff0c;网站需要关注内容的相关性&am…

【笔试真题】- 华子-2026.01.07-研发岗

📌 点击直达笔试专栏 👉《大厂笔试突围》 💻 春秋招笔试突围在线OJ 👉 笔试突围在线刷题 bishipass.com 华子-2026.01.07-研发岗 题目一:预约订单收益最大化 1️⃣:使用动态规划思想,维护两个状态变量 2️⃣:利用状态转移方程 f[i] = max(f[i-1], f[i-2] + val[…

Flutter device_info_plus库在鸿蒙端的设备信息获取适配实践

Flutter device_info_plus库在鸿蒙端的设备信息获取适配实践 引言 OpenHarmony&#xff08;以下简称鸿蒙&#xff09;生态这几年发展很快&#xff0c;分布式架构和全场景能力吸引了越来越多开发者的目光。在这种背景下&#xff0c;跨平台开发框架与鸿蒙的深度融合&#xff0c;已…

Flutter艺术探索-Flutter状态管理入门:setState最佳实践

Flutter状态管理入门&#xff1a;setState 最佳实践指南 引言&#xff1a;从命令式到声明式的思维转变 Flutter 作为谷歌主推的跨平台 UI 框架&#xff0c;其核心特点之一是采用了声明式编程范式。这与我们熟悉的命令式 UI 开发&#xff08;比如 Android 的 View 系统或原生 iO…

AI技术赋能SEO关键词优化策略新路径解析

在数字化营销的背景下&#xff0c;AI技术的应用为SEO关键词优化带来了前所未有的可能。AI通过先进的数据分析能力&#xff0c;能够快速识别出用户的搜索需求和市场变化。这使得企业在选择关键词时更加精准&#xff0c;提高了关键词布局的科学性和有效性。运用自然语言处理和机器…

【笔试真题】- 华子-2026.01.07-算法岗

📌 点击直达笔试专栏 👉《大厂笔试突围》 💻 春秋招笔试突围在线OJ 👉 笔试突围在线刷题 bishipass.com 华子-2026.01.07-算法岗 2026.01.07 华子算法岗笔试题解 题目一:AI 算法基础知识测评 1️⃣:建立题号到答案的映射字典 2️⃣:输入题号,直接查表输出对应答…

深度测评本科生必用的8个AI论文平台

深度测评本科生必用的8个AI论文平台 2026年本科生论文写作工具测评&#xff1a;如何选择高效实用的AI平台 随着人工智能技术在学术领域的深入应用&#xff0c;越来越多的本科生开始借助AI论文平台提升写作效率与质量。然而&#xff0c;面对市场上琳琅满目的工具&#xff0c;如何…

长尾关键词在关键词优化中提升SEO效果的有效策略

在关键词优化中&#xff0c;长尾关键词扮演着至关重要的角色。它们不仅有助于提高网站在搜索引擎中的排名&#xff0c;还能吸引更精准的用户群体。长尾关键词通常更长且具体&#xff0c;通常包含三到五个词&#xff0c;不同于更为宽泛的短尾关键词。由于竞争较小&#xff0c;优…

Flutter艺术探索-Flutter响应式设计:MediaQuery与LayoutBuilder

Flutter响应式设计&#xff1a;MediaQuery与LayoutBuilder深度解析 引言&#xff1a;为什么响应式设计非做不可&#xff1f; 如今&#xff0c;用户的设备琳琅满目&#xff0c;从握在手里的手机、桌上的平板&#xff0c;到新兴的折叠屏乃至桌面应用&#xff0c;屏幕尺寸和形态千…

黑客网站大全!都在这了!速看被删就没了

黑客网站大全&#xff01;都在这了&#xff01;速看被删就没了 我们学习网络安全&#xff0c;很多学习路线都有提到多逛论坛&#xff0c;阅读他人的技术分析帖&#xff0c;学习其挖洞思路和技巧。但是往往对于初学者来说&#xff0c;不知道去哪里寻找技术分析帖&#xff0c;也…

(9-1-01)自动驾驶中基于概率采样的路径规划:RRT算法介绍+RRT算法的定义与实现(1)

提升在复杂环境中使用RRT算法族解决路径规划问题的实践能力。9.1 RRT算法介绍快速扩展随机树(Rapidly-exploring Random Trees&#xff0c;RRT)是一种用于路径规划的算法&#xff0c;特别适用于机器人、自动驾驶车辆和其他自主系统的运动规划问题。该算法通过在自由空间中随机…

Linux 文本处理工具

先创建一个测试文件data.txt# 创建并写入内容&#xff0c;执行后直接生成data.txt cat > data.txt << EOF 2026-01-01,张三,技术部,9000 2026-01-02,李四,市场部,8500 2026-01-03,王五,技术部,10000 2026-01-04,赵六,销售部,7500 2026-01-05,钱七,技术部,9500 # 这是员…

别只盯酷炫形态,CES 2026逛展,我更关注AI硬件的落地底气

刚从CES 2026展会上归来&#xff0c;仍觉余韵未消、震撼不已&#xff01;今年拉斯维加斯这场展会&#xff0c;堪称AI硬件领域的巅峰对决。服务机器人能精准听令调酒&#xff0c;智能座舱靠眼动追踪交互&#xff0c;AR眼镜轻巧却功能强大……各类展品共同描绘出智能无缝的未来生…

小白考CPA难吗?难度、通过率科目指南

对于零基础小白来说&#xff0c;CPA&#xff08;注册会计师&#xff09;考试常被贴上“难度大”“通过率低”的标签&#xff0c;但真正的关键在于是否找对了备考路径。考伯乐依托多年财经教育沉淀&#xff0c;专为小白打造从入门到持证的高效方案&#xff0c;今天就从难度、通过…

嘈杂环境秒哑火?声网让AR眼镜走出实验室

刚从CES 2026的AR眼镜展区逛完出来&#xff0c;心情五味杂陈。这赛道竞争愈发激烈&#xff0c;重量减10克、分辨率升500PPI&#xff0c;甚至有品牌塞进eSIM模块。可我作为用了近两年AR眼镜的老用户&#xff0c;站在展台前却格外平静。参数进步固然好&#xff0c;但对我这种要日…

GEO优化赛道的“隐形风险”:最新报告揭示服务商选择中的“安全红线”

在GEO&#xff08;生成式引擎优化&#xff09;带来的巨大增长诱惑面前&#xff0c;企业决策者往往容易忽略一个致命问题&#xff1a;选择错误的服务商&#xff0c;可能会给品牌带来难以预估的合规、技术与经营风险。根据《2026年-中国GEO服务商综合能力评估报告》&#xff0c;首…

甩掉软件内耗,靠国产CAD把效率拉满

干了十年设计&#xff0c;我认为选对工具比埋头画图更能提效率。我现在手头的整机项目&#xff0c;从概念雏形到工程详图&#xff0c;全程都靠CAXA 3D一个软件&#xff0c;效率非常高。CAXA 3D双模式设计刚好适配了整机设计的不同阶段。前期团队头脑风暴的时候可以使用创新模式…

釉匠水性釉面涂料防水性能深度解析:科技釉面打造长效屏障

在现代家居装修和建筑工程中&#xff0c;墙面涂料的防水防潮性能直接关系到居住质量与建筑寿命。针对消费者关注的“釉匠水性釉面涂料防水性能好吗”这一核心疑问&#xff0c;本文将结合武汉釉匠环保科技有限公司的官方技术资料及行业标准&#xff0c;从技术原理、功能特性、资…

CAXA 3D规范BOM源头数据,告别信息缺失扯皮

干采购这行&#xff0c;最头疼的不是找供应商比价&#xff0c;是跟设计部的BOM表死磕。尤其是那些信息不全的BOM&#xff0c;随便一个空白格&#xff0c;都能让我后续工作卡壳半天。以前就吃过这亏&#xff0c;有次拿到的BOM表里&#xff0c;“表面处理”那一栏是空的。我拿着表…