网站备案花钱么/小说百度搜索风云榜

网站备案花钱么,小说百度搜索风云榜,长春市最新疫情轨迹,青浦郑州阳网站建设一般来说,提到自然语言处理,我们都会涉及到循环神经网络(RNN),这是因为自然语言可以被看作是一个时间序列,这个时间序列中的元素是一个个的token。传统的前馈神经网络结构简单,但是不能很好的处…

一般来说,提到自然语言处理,我们都会涉及到循环神经网络(RNN),这是因为自然语言可以被看作是一个时间序列,这个时间序列中的元素是一个个的token。传统的前馈神经网络结构简单,但是不能很好的处理时间序列数据,RNN便应运而生。

一、RNN概述

语言模型给出了单词序列发生的概率,具体来说就是评估一个单词发生的可能性。我们之前的CBOW模型就是这种(可以参考我的前两篇文章《自然语言处理入门2》《自然语言处理入门3》),但是CBOW模型有个问题,就是长度限制,因为CBOW需要选择一个窗口window来作为上下文,也就是说它只能根据前后一定窗口的大小来预测中间缺失的单词。如果不断加大窗口大小也会造成速度和性能的困扰,并且CBOW这种模型的目的其实主要是为了获取单词的分布式表示方法,基于此所以语言模型一般都使用RNN。

RNN有一个特点,就是不受上下文长度限制(其实也不是不受限制,只是很大程度上可以不受限制,如果长度过长,一样会引起梯度消失等等无法训练的问题,所以才有后面的截断时序训练和门控循环神经网络LSTM等等)。RNN最大的特征就是模型中存在回路,所以才被叫做循环神经网络,结构图如下:

跟一般的前馈神经网络的区别就是,RNN的输出除了流向下一个节点的结果之外,还要把这个结果重新作为输入传到模型中,我们称之为隐藏信息h。把循环网络展开来后,就是上图右边的样子了。每个节点的输入都是原始输入数据本身以及上一个节点传过来的隐藏信息。

举个实际的例子:对于"you say goodbye and i say hello."这句话,传递流程如下图所示:

1. 第一个单词you,先进行向量化也就是embedding操作,序列没有上一个节点传过来的信息,因此输入向量直接经过RNN得到一个输出,转变为概率,可以看到下一个输出概率最高的是say,同时,RNN的输出传递到下一个节点;

2.第二个单词say,先进行embedding得到向量化表示,这次RNN有上一个节点传过来的隐藏信息了,所以要把这个隐藏信息传递到RNN,并且将say的embedding表示数据也一并传入RNN,得到一个输出,转变为概率,得到概率最高的goodbye,同时再把RNN的输出传递到下一个节点;

3.第三个单词goodbye,先进行embedding得到向量化表示,再把上一个的节点的隐藏信息一起传递到RNN中得到输出,转变为概率得到概率最高的输出and,同时再把RNN的输出传递掉下一个节点,这里输出的隐藏信息已经包括了前面的you say goodbye三个单词的信息了,然后以此类推;

... ...

4.最终遍历完时间序列中的所有单词。

不过这里要注意,其实真正的RNN并不存在这样的铺开式结构,这里的示意图只是为了便于理解把RNN在时间方向上展开了而已。

二、RNN的实现

下面我们来实现一下RNN。

有顺序的序列数据训练一般采用“按时间顺序展开的神经网络的误差反向传播法”,简称BPTT。处理长时序数据时,通常的做法是将网络连接截成适当的长度。具体来说,就是将时间轴方向上过长的网络在合适的位置进行截断,从而创建多个小型网络,然后对截出来的小型网络执行误差反向传播法,称为Truncated BPTT。

这是书中提供的方法,因为当序列长度太长的时候,梯度会变得不稳定,容易出现梯度消失问题,并且消耗的计算资源也会很大,所以对网络进行了截断训练,后面的LSTM,GRU等等模型也是为了解决RNN时序过长等引起的问题的方法。

Truncated BPTT的特点就是前馈网络中正常传递,但是反向传播进行截断,以“块”为单位进行误差反向传播,其实也就是等于分块训练,结构如下:

RNN的正向传播用公式表示就是:

ht-1是上一个节点传入的隐藏信息,Wh是隐藏信息的权重矩阵,xt是当前节点输入的数据,Wx是输入数据的权重矩阵,b是偏置。这几个元素进行线性组合后,再应用一次非线性的正切变换,得到的就是输出ht。

反向传播示意图:

反向传播流程:

上一个节点传入的dhnext代表传递过来的梯度信息,要对ht-1(也就是hprev),Wh,xt,Wx和b分别求偏导数,以得到他们各自的梯度(反向传播算法里面有说明,可以参考深度学习教科书)。

假设ht-1Wh + xtWx + b为Z,正向传播公式:

那么他们各自的梯度如下(由于tanh(z)对z的导数是1-(tanh(z))^2):

基于以上的推断,我们可以写出RNN的实现程序:

import numpy as npclass RNN:def __init__(self, Wx, Wh, b):self.params = [Wx, Wh, b]self.grads = [np.zeros_like(Wx), np.zeros_like(Wh), np.zeros_like(b)]self.cache = Nonedef forward(self, x, h_prev):Wx, Wh, b = self.paramst = np.dot(h_prev, Wh) + np.dot(x, Wx) + bh_next = np.tanh(t)# 暂存self.cache = (x, h_prev, h_next) return h_next # 返回正向隐藏信息def backward(self, dh_next):Wx, Wh, b = self.paramsx, h_prev, h_next = self.cachedt = dh_next*(1-h_next**2)db = np.sum(dt, axis=0)dWh = np.dot(h_prev.T, dt)dh_prev = np.dot(dt, Wh.T)dWx = np.dot(x.T, dt)dx = np.dot(dt, Wx.T)self.grads[0][...] = dWxself.grads[1][...] = dWhself.grads[2][...] = dbreturn dx, dh_prev # 返回上一个隐藏信息的梯度和输入的梯度

根据之前说的截断网络训练方法,我们在RNN的基础上构建TimeRNN。Time RNN是T个RNN层连起来的网络。其中有一个成员变量layers,保存T个RNN层,另一个成员变量h保存调用forward方法时的最后一个RNN层隐藏状态。stateful=True表示继承Time RNN层的状态,stateful=False表示不继承Time RNN层的状态。

class TimeRNN:def __init__(self, Wx, Wh, b, stateful=False):self.params = [Wx, Wh, b]self.grads = [np.zeros_like(Wx), np.zeros_like(Wh), np.zeros_like(b)]self.layers = Noneself.h, self.dh = None, Noneself.stateful = statefuldef set_state(self, h):self.h = hdef reset_state(self):self.h = Nonedef forward(self, xs):Wx, Wh, b = self.params # 传入权重矩阵和偏置# N表示batch_size,T是xs包括的时序数据个数,D是输入向量的维度N, T, D = xs.shape # H表示隐藏状态的向量维数D, H = Wx.shapeself.layers = []# 定义输出隐藏信息hs = np.empty((N,T,H), dtype='f')# 如果是第一个节点或者不继承隐藏状态if not self.stateful or self.h is None:# 则输入的隐藏信息设置为0self.h = np.zeros((N,H), dtype='f')for t in range(T):# 循环遍历T个节点,记录隐藏信息layer = RNN(*self.params)self.h = layer.forward(xs[:,t,:],self.h)hs[:,t,:] = self.hself.layers.append(layer)return hsdef backward(self, dhs):Wx, Wh, b = self.paramsN, T, D = dhs.shapeD, H = Wx.shapedxs = np.empty((N,T,D), dtype='f')dh = 0grads = [0,0,0]# 这里是反序遍历T个节点for t in reversed(range(T)):layer = self.layers[t]# 每个节点内部做反向传播dx,dh = layer.backward(dhs[:,t,:]+dh) # 求和后的梯度dxs[:,t,:] = dx# 获取Wx,Wh和b的梯度,并进行累加for i, grad in enumerate(layer.grads):grads[i] += gradfor i,grad in enumerate(grads):self.grads[i][...] = gradself.dh = dhreturn dxs

在TimeRNN的基础上构建了RNNLM,RNNLM是指基于RNN的语言模型(language model)。这个模型就是把我们之前的信息都合并在一起,输入的一串时序数据,每串时序数据都要先进行Embedding操作(每串时序数据包含T个单独的时序数据,或者叫token),然后传入TimeRNN层,最后把输出的隐藏信息传入到Affine层,Affine就是一个简单的神经网络,进行计算得到输出结果。(《深度学习入门:基于Python的理论与实现》有详细论述),把这三个操作串联起来形成一个layer。输出的分类结果进行softmax操作,并计算出损失值,传递到Affine层,得到输入的梯度dx,再输入到TimeRNN,这里进行分块,块内反向传播,得到的梯度相加,得到总的梯度,再传递到Emebedding,进行反向传播,最后用优化器optimizer进行梯度更新,完成训练。

class SimpleRnnlm:def __init__(self, vocab_size, wordvec_size, hidden_size):V,D,H = vocab_size, wordvec_size, hidden_sizern = np.random.randn# 初始化权重embed_W = (rn(V,D)/100).astype('f')rnn_Wx = (rn(D,H)/np.sqrt(D)).astype('f')rnn_Wh = (rn(H,H)/np.sqrt(H)).astype('f')rnn_b = np.zeros(H).astype('f')affine_W = (rn(H,V)/np.sqrt(H)).astype('f')affine_b = np.zeros(V).astype('f')# 生成层self.layers = [TimeEmbedding(embed_W),TimeRNN(rnn_Wx, rnn_Wh, rnn_b, stateful=True),TimeAffine(affine_W, affine_b)]self.loss_layer = TimeSoftmaxWithLoss()self.rnn_layer = self.layers[1]# 将所有的权重和梯度整理到列表中self.params, self.grads = [],[]for layer in self.layers:self.params += layer.paramsself.grads += layer.gradsdef forward(self, xs, ts):for layer in self.layers:xs = layer.forward(xs)loss = self.loss_layer.forward(xs, ts)return lossdef backward(self, dout=1):dout = self.loss_layer.backward(dout)for layer in reversed(self.layers):dout = layer.backward(dout)return doutdef reset_state(self):self.rnn_layer.reset_state()

我们可以用之前用到的一个英文语料库ptb进行训练。语言模型是基于已经出现的单词预测将要出现的单词的概率分布。困惑度(perplexity)是一个比较常用的指标,它是概率的倒数,如果预测一个单词出现的概率是0.2,则它的困惑度是5,如果预测一个单词出现的概率是0.8,则它的困惑度是1.25,我们的模型训练过程可视化指标选择用困惑度来表示。困惑度自然是越低越好。

import numpy as np# 设定超参数
batch_size = 10
wordvec_size = 100
hidden_size = 100  # RNN的隐藏状态向量的元素个数
time_size = 5  # RNN的展开大小
lr = 0.1
max_epoch = 100# 读入训练数据
corpus, word_to_id, id_to_word = load_data('train')
corpus_size = 1000  # 缩小测试用的数据集
corpus = corpus[:corpus_size]
vocab_size = int(max(corpus) + 1)
xs = corpus[:-1]  # 输入
#print(xs.shape)
ts = corpus[1:]  # 输出(监督标签)# 生成模型
model = SimpleRnnlm(vocab_size, wordvec_size, hidden_size)
optimizer = SGD(lr)
trainer = RnnlmTrainer(model, optimizer)trainer.fit(xs, ts, max_epoch, batch_size, time_size)
trainer.plot()
# 输出
| epoch 1 |  iter 1 / 19 | time 0[s] | perplexity 417.35
| epoch 2 |  iter 1 / 19 | time 0[s] | perplexity 387.39
| epoch 3 |  iter 1 / 19 | time 0[s] | perplexity 272.27
| epoch 4 |  iter 1 / 19 | time 0[s] | perplexity 224.16
| epoch 5 |  iter 1 / 19 | time 0[s] | perplexity 210.55
| epoch 6 |  iter 1 / 19 | time 0[s] | perplexity 208.73
| epoch 7 |  iter 1 / 19 | time 0[s] | perplexity 200.27
| epoch 8 |  iter 1 / 19 | time 0[s] | perplexity 200.94
| epoch 9 |  iter 1 / 19 | time 0[s] | perplexity 194.13
| epoch 10 |  iter 1 / 19 | time 0[s] | perplexity 189.88
... ...
| epoch 95 |  iter 1 / 19 | time 2[s] | perplexity 6.94
| epoch 96 |  iter 1 / 19 | time 2[s] | perplexity 6.83
| epoch 97 |  iter 1 / 19 | time 2[s] | perplexity 6.54
| epoch 98 |  iter 1 / 19 | time 2[s] | perplexity 6.41
| epoch 99 |  iter 1 / 19 | time 2[s] | perplexity 5.99
| epoch 100 |  iter 1 / 19 | time 2[s] | perplexity 5.89

经过100个世代的训练,可以看到困惑度从训练一开始的417.35多下降到5.89,说明预测的概率也在不断提升,效果还是不错的,当然5.89的困惑度还是比较高的,继续训练有望进一步降低困惑度。我测试了一下,当训练200个世代后,困惑度下降到了1.15,这就是一个比较好的结果了。

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

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

相关文章

数据结构之链表(双链表)

目录 一、双向带头循环链表 概念 二、哨兵位的头节点 优点: 头节点的初始化 三、带头双向链表的实现 1.双链表的销毁 2.双链表的打印 3.双链表的尾插和头插 尾插: 头插: 4.双链表的尾删和头删 尾删: 头删: …

ASP3605同步降压调节器——满足汽车电子严苛要求的电源芯片方案

ASP3605高效同步降压调节器,通过AEC-Q100 Grade1认证,输入电压4V至15V,输出电流5A,峰值效率94%。车规级型号ASP3605A3U支持-40C至125C工作温度,适用于ADAS、车载信息娱乐系统等场景。 面向汽车电子的核心功能设计 1. …

vue3+Ts+elementPlus二次封装Table分页表格,表格内展示图片、switch开关、支持

目录 一.项目文件结构 二.实现代码 1.子组件(表格组件) 2.父组件(使用表格) 一.项目文件结构 1.表格组件(子组件)位置 2.使用表格组件的页面文件(父组件)位置 3.演示图片位置 ele…

逆向中常见的加密算法识别

1、base64及换表 base64主要是将输入的每3字节(共24bit)按照每六比特分成一组,变成4个小于64的索引值,然后通过一个索引表得到4个可见的字符。 索引表为一个64字节的字符串,如果在代码中发现引用了这个索引表“ABCDEF…

【机器学习chp14 — 2】生成式模型—变分自编码器VAE(超详细分析,易于理解,推导严谨,一文就够了)

目录 二、变分自编码器 VAE 1、自编码器 AE (1)自编码器的基本结构与目标 1.1 编码器-解码器结构 1.2 目标函数:重构误差最小化 (2)自编码器与 PCA 的对比 2.1 PCA 与线性降维 2.2 非线性映射的优势 &#xf…

Linux 一步部署DHCP服务

#!/bin/bash #脚本作者和日期 #author: PEI #date: 20250319 #检查root权限 if [ "$USER" ! "root" ]; then echo "错误:非root用户,权限不足!" exit 0 fi #防火墙与高级权限 systemctl stop firewa…

Vue3 核心特性解析:Suspense 与 Teleport 原理深度剖析

Vue3 核心特性解析:Suspense 与 Teleport 原理深度剖析 一、Teleport:突破组件层级的时空传送 1.1 实现原理图解 #mermaid-svg-75dTmiektg1XNS13 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-s…

Python功能完美的宝库——内置的强大“武器库”builtins

builtins模块包含了Python大量的内置对象(函数、异常和类型等),她是Python的内置武器库,堪称功能完美的宝库。 笔记模板由python脚本于2025-03-19 08:16:27创建,本篇笔记适合喜欢探究python的coder翻阅。 【学习的细节…

PyTorch 深度学习实战(17):Asynchronous Advantage Actor-Critic (A3C) 算法与并行训练

在上一篇文章中,我们深入探讨了 Soft Actor-Critic (SAC) 算法及其在平衡探索与利用方面的优势。本文将介绍强化学习领域的重要里程碑——Asynchronous Advantage Actor-Critic (A3C) 算法,并展示如何利用 PyTorch 实现并行化训练来加速学习过程。 一、A…

【深度学习】多目标融合算法(五):定制门控网络CGC(Customized Gate Control)

目录 一、引言 二、CGC(Customized Gate Control,定制门控网络) 2.1 技术原理 2.2 技术优缺点 2.3 业务代码实践 2.3.1 业务场景与建模 2.3.2 模型代码实现 2.3.3 模型训练与推理测试 2.3.4 打印模型结构 三、总结 一、引言 上一…

在线pdf处理网站合集

1、PDF24 Tools:https://tools.pdf24.org/zh/ 2、PDF派:https://www.pdfpai.com/ 3、ALL TO ALL:https://www.alltoall.net/ 4、CleverPDF:https://www.cleverpdf.com/cn 5、Doc Small:https://docsmall.com/ 6、Aconv…

网络编程-实现客户端通信

#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/socket.h> #include <netinet/in.h> #include <sys/select.h>#define MAX_CLIENTS 2 // 最大客户端连接数 #define BUFFER_SI…

力扣100二刷——图论、回溯

第二次刷题不在idea写代码&#xff0c;而是直接在leetcode网站上写&#xff0c;“逼”自己掌握常用的函数。 标志掌握程度解释办法⭐Fully 完全掌握看到题目就有思路&#xff0c;编程也很流利⭐⭐Basically 基本掌握需要稍作思考&#xff0c;或者看到提示方法后能解答⭐⭐⭐Sl…

【大模型实战篇】多模态推理模型Skywork-R1V

1. 背景介绍 近期昆仑万维开源的Skywork R1V模型&#xff0c;是基于InternViT-6B-448px-V2_5以及deepseek-ai/DeepSeek-R1-Distill-Qwen-32B 通过强化学习得到。当然语言模型也可以切换成QwQ-32B。因此该模型最终的参数量大小为38B。 该模型具备多模态推理能力&#xf…

识别并脱敏上传到deepseek/chatgpt的文本文件中的护照信息

本文将介绍一种简单高效的方法解决用户在上传文件到DeepSeek、ChatGPT&#xff0c;文心一言&#xff0c;AI等大语言模型平台过程中的护照号识别和脱敏问题。 DeepSeek、ChatGPT&#xff0c;Qwen&#xff0c;Claude等AI平台工具快速的被接受和使用&#xff0c;用户每天上传的文…

数据驱动进化:AI Agent如何重构手机交互范式?

如果说AIGC拉开了内容生成的序幕&#xff0c;那么AI Agent则标志着AI从“工具”向“助手”的跨越式进化。它不再是简单的问答机器&#xff0c;而是一个能够感知环境、规划任务并自主执行的智能体&#xff0c;更像是虚拟世界中的“全能员工”。 正如行业所热议的&#xff1a;“大…

【AI News | 20250319】每日AI进展

AI Repos 1、XianyuAutoAgent 实现了 24 小时自动化值守的 AI 智能客服系统&#xff0c;支持多专家协同决策、智能议价和上下文感知对话&#xff0c;让我们店铺管理更轻松。主要功能&#xff1a; 智能对话引擎&#xff0c;支持上下文感知和专家路由阶梯降价策略&#xff0c;自…

C语言自定义类型【结构体】详解,【结构体内存怎么计算】 详解 【热门考点】:结构体内存对齐

引言 详细讲解什么是结构体&#xff0c;结构体的运用&#xff0c; 详细介绍了结构体在内存中占几个字节的计算。 【热门考点】&#xff1a;结构体内存对齐 介绍了&#xff1a;结构体传参 一、什么是结构体&#xff1f; 结构是⼀些值的集合&#xff0c;这些值称为成员变量。结构…

Apache DolphinScheduler:一个可视化大数据工作流调度平台

Apache DolphinScheduler&#xff08;海豚调度&#xff09;是一个分布式易扩展的可视化工作流任务调度开源系统&#xff0c;适用于企业级场景&#xff0c;提供了一个可视化操作任务、工作流和全生命周期数据处理过程的解决方案。 Apache DolphinScheduler 旨在解决复杂的大数据…

[蓝桥杯 2023 省 B] 飞机降落

[蓝桥杯 2023 省 B] 飞机降落 题目描述 N N N 架飞机准备降落到某个只有一条跑道的机场。其中第 i i i 架飞机在 T i T_{i} Ti​ 时刻到达机场上空&#xff0c;到达时它的剩余油料还可以继续盘旋 D i D_{i} Di​ 个单位时间&#xff0c;即它最早可以于 T i T_{i} Ti​ 时刻…