Deep learning Part Five RNN--24.4.29

接着上期,CBOW模型无法解决文章内容过长的单词预测的,那该如何解决呢?

除此之外,根据图中5-5的左图所示,在CBOW模型的中间层求单词向量的和,这时就会出现另一个问题的,那就是上下文的单词的顺序将会被打乱的;举个例子:(you, say)和(say, you)会被视为相同内容处理的,这又该如何解决呢?

 方案一:拼接法,就如5-5图右侧的那样,在中间层“拼接”上下文的单词向量的。

但是,这时候新的问题又出现了的,采用拼接法固然可以解决上一个问题的,但是,这时候就会发生一系列连锁反应的,出现新的问题的:权重参数等比例增加,处理的数据量爆炸式增加!

这时候有该如何解决呢?嘿嘿!

主角终于还是在最后登场的啦,有请RNN大哥善良登场的

RNN有一个特性:

是不是感觉用RNN解决这个问题,专业且对口,哈哈。

总结:专业的领域就应该派出合适的人解决它的,不禁让老夫想到“万物相生相克!”大道就在脚下,冲啊!热血少年

小故事驿站:

5.2 RNN

RNN(Recurrent Neural Network)中的 Recurrent 源自拉丁语,意思是“反复发生。

RNN核心:RNN 的特征就在于拥有这样一个环路(或回路)。这个环路可以使数据不断循环。通过数据的循环,RNN 一边记住过去的数据,一边更新到最新的数据。

5.2.2 展开循环

从图中可以看出:RNN类似于曾经的前馈神经网络结构是相同的

二者区别:前馈神经网络的数据是一个方向传播的,而RNN是向两个方向传播的嘛,为啥?分叉呗,他的输出数据被复制了一份返回输入了的。

还有多个RNN都是同一个层,怎么理解呢?就是他是个循环的,所以就相当于在同一个层的,这一点也是与之前的神经网络不一样的。

为什么说RNN具有状态呢?因为:RNN不是输出时复制了一份吗?我个人的理解就是他在每一个计算的结束留下了一个表明时间的影子的,以此来处理时序问题。

5.2.3 Backpropagation Through Time

这个东西是干什么的?

用来计算“按时间顺序展开的神经网络的误差反向传播法”,所以引入Backpropagation Through Time的,(中文:基于时间的反向传播法),方便起见,就把他简称为BPTT吧。

用来常规的误差反向传播法,看似就可以让RNN学习了的,但是,又有新问题了的,随着RNN学习长时序的问题时,随着数据的不断增多,BPTT消耗的计算机资源也会不断增加的,当增加到一定程度时,反向传播的梯度也会变得极其不稳定的,就等同盖的高楼是豆腐渣工程,很可能一夜回到解放前,崩溃掉。

然后呢,引入了新的伙伴:Truncated BPTT

他是干啥子的?帮忙解决上述问题的;

他的核心:就是将一条长长的网络连接分成小段的,分开处理,间接减小他的处理太长时序数据的工作量,避免累垮掉Backpropagation Trough Time的(也就是处理时序问题的反向传播法的)。

登场:

5.2.4 Truncated BPTT

抽象剪刀图片:

这时我们剪断了反向传播的连接的,以使它可以以10个RNN层为单位进行反向传播的。但是要注意的是:他斩断的只是反向传播的,不影响正向传播的正常进行的。

然后呢,困难又来了的,正向传播前后数据之间不是都有关系的嘛,这就可以间接的想到我们最初的问题中的数据的顺序问题的,这意味着数据必须是按照顺序输入的

困难已至,我们该怎么办的?躲不掉,那就干掉他!

干掉他的方法如下:

总结:核心就是保留上一个斩断部分的隐藏层h的(说人话就是曾经被我们复制的两份输出的嘞)

原理类似于数据结构的链表的指针域的,(指针域中会存储着上一个数据的位置的,可以认为是间接排序)。

好处:不会乱序的,解决掉了斩断乱序的困难的。

接着嘞,困难又来了,mini-batch学习,需要考虑批数据的,这咋办,接着干掉他。

这时,又请来了“偏移”来干掉他。

抽象理解:就是假如数据有一千份,可以把他从中间斩断,变成两批数据去完成mini-batch的

原理解释:

核心:斩断后的两组数据同样按照一组数据处理的操作进行的,只不过将一组变为了两组的额,类似之前让你计算一个1+1,现在拓展一下,计算两个1+1的。

5.3 RNN的实现

CORE(核心):引入两个大箱子:hs,xs;hs装RNN每次输出的数据h,xs装RNN每次输入的数据x的。

5.3.1 RNN的实现

class 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
# params:用来保存列表类型的成员变量的。
# grads:保存各个参数对应的形状初始化梯度的
# cache:保存反向传播时用到的中间层数据

RNN的backward:

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

Time RNN:

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 forward:
 

def forward(self, xs):Wx, Wh, b = self.paramsN, T, D = xs.shapeD, H = Wx.shapeself.layers = []hs = np.empty((N, T, H), dtype='f')if not self.stateful or self.h is None:self.h = np.zeros((N, H), dtype='f')for t in range(T):layer = RNN(*self.params)self.h = layer.forward(xs[:, t, :], self.h)hs[:, t, :] = self.hself.layers.append(layer)return hs

第t个RNN的反向传播的实现:

def backward(self, dhs):Wx, Wh, b = self.paramsN, T, H = dhs.shapeD, H = Wx.shape    dxs = np.empty((N, T, D), dtype='f')dh = 0grads = [0, 0, 0]for t in reversed(range(T)):layer = self.layers[t]dx, dh = layer.backward(dhs[:, t, :] + dh) # 求和后的梯度dxs[:, t, :] = dxfor i, grad in enumerate(layer.grads):grads[i] += gradfor i, grad in enumerate(grads):self.grads[i][...] = gradself.dh = dhreturn dxs

5.5.2 语言模型的评价

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

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

相关文章

PC通过串口发送指令控制LED+串口中断

如何让单片机接收数据? 首先要打开SCON中的串行接收控制位REN。当REN1时为允许接收状态,可以接收信息。 因此令SCON 0x50; 怎么知道收到数据? 利用RI接收中断请求标志位。当串行接收到第8位结束时由内部硬件自动置为RI1&#…

机器人系统ros2-开发实践04-ROS2 中 tf2的定义及示例说明

1. what ros2 tf2 ? tf2的全称是transform2,在ROS(Robot Operating System)中,它是专门用于处理和变换不同坐标系间位置和方向的库。这个名字来源于“transform”这个词,表示坐标变换,而“2”则…

【抽代复习笔记】17-群(十一):置换的练习题(1)

练习1:计算: 解: 解析:①左边的置换是1保持不变,2变成3,3变成4,4变成5,5变成2,因此可以简写为(2345);右边的置换是2和5保持不变,1变成3&#xff…

k8s环境部署gpu以及CUDA兼容性分析

本文记录和学习在实用gpu搭建k8s支持上层应用时的功能实践和遇到的问题。 1. 基础概念 CUDA本质上就是NVIDIA专为通用高性能并行计算设计的一套计算平台和编程模型,换句话使用GPU并行编程的规范方法,所以CUDA在软件层面包含了众多库, 那这里…

万兴PDF专家 PDFelement Pro v10.3.8 破姐版!

🧑‍💻万兴PDF专家 PDFelement Pro v10.3.8 破姐版 (https://docs.qq.com/sheet/DRVVxTHJ3RXJFVHVr)

docker mysql更新升级版本

一、环境说明 操作系统:Centos7 数据库版本:MySql 8.0.22 数据库中数据量不大,处于开发/测试环境,风险较低 二、升级原因 升级是因为测评漏洞,在进行国家三级等级保护测评过程中,漏扫发现多个MySql漏洞…

Linux学习之IP协议

前言: 在学习IP协议i前,我们其实知道网络协议栈是一层层的,上层封装好之后就传给下层,对于我们治安学习到的TCP协议,在对数据进行封装之后,并不是直接就将数据进行传输,而是交给下一层网络层进…

C++11 右值与移动语义

前言: 我们首先汇总一下在C11中新的变化: 1、新容器 —— unodered_xxx 2、新接口 cbegin等,无关痛痒initializer_list系列的构造push_xxx / insert / emplace 等增加右值引用插入版本,意义重大,提高效率容器新增移…

领域驱动设计(DDD)笔记(一)基本概念

文章链接 领域驱动设计(DDD)笔记(一)基本概念-CSDN博客领域驱动设计(DDD)笔记(二)代码组织原则-CSDN博客 DDD基本概念 DDD 是一种面向复杂需求的软件设计方法,将软件开…

【Vue3】openlayers加载瓦片地图并手动标记坐标点

目录 一、创建Vue3项目 二、openlayers加载瓦片地图(引js文件版) 2.1 将以下的文件复制到public下 2.2 index.html引入ol脚本 2.3 删除项目自带的HelloWorld.vue,创建Map.vue 2.4 编码Map.vue 2.5 修改App.vue 2.6 启动项目测试 三、…

通信光缆主要敷设方式有哪些(续)

在《通信光缆主要敷设方式有哪些》一文中,介绍了光缆的直埋、架空和管道敷设方式。此外,根据敷设场景的不同,光缆的常见敷设方式还包括:高铁槽道内敷设、水底敷设、墙壁敷设、引上、室内敷设等。 1 高铁槽道内光缆敷设 光缆顺沿高…

vscode设置免密登录远程服务器

文章目录 1. 问题描述2. 解决方案3. 原理 1. 问题描述 当我们使用vscode的ssh连接远程服务器后,过一段时间后,总是要求登录服务器的密码。 这就导致一个麻烦就是: 无论是在公司还是在学校,密码往往不是自己设置的,所以记忆起来就…

《QT实用小工具·五十二》文本或窗口炫酷有趣的滚动条——果冻条

1、概述 源码放在文章末尾 该项目实现了文本或窗口纤细的滚动条——果冻条 一个可以像弓弦一样拉出来,并且来回弹动的普通滚动条。 思路为此,但发现实际效果更像条状果冻,并且略有谐音, 故,称之为——“果冻条”&am…

【QT学习】12.UDP协议,广播,组播

一。Udp详细解释 UDP(User Datagram Protocol)是一种无连接的传输层协议,它提供了一种简单的、不可靠的数据传输服务。与TCP相比,UDP不提供可靠性、流量控制、拥塞控制和错误恢复等功能,但由于其简单性和低开销&#x…

【Linux-点灯烧录-SD卡/USB烧写】

目录 1. 烧写方式2. 烧写之代码编译2.1 led.s->led.o2.2 led.o->led.elf2.3 led.elf->led.bin2.4 反汇编:led.elf->led.dis 3. 烧写之烧录到SD卡上:3.1 开启烧录软件权限:3.2 确定SD卡的格式:FAT323.3 烧录到SD卡上3.…

学习Rust的第22天:mini_grep第2部分

书接上文,在本文中,我们学习了如何通过将 Rust 程序的逻辑移至单独的库箱中并采用测试驱动开发 (TDD) 实践来重构 Rust 程序。通过在实现功能之前编写测试,我们确保了代码的可靠性。我们涵盖了基本的 Rust 概念,例如错误处理、环境…

ChatGPT理论分析

ChatGPT "ChatGPT"是一个基于GPT(Generative Pre-trained Transformer)架构的对话系统。GPT 是一个由OpenAI 开发的自然语言处理(NLP)模型,它使用深度学习来生成文本。以下是对ChatGPT进行理论分析的几个主…

移动机器人系统与技术:自动驾驶、移动机器人、旋翼无人机

这本书全面介绍了机器人车辆的技术。它介绍了道路上自动驾驶汽车所需的概念。此外,读者可以在六足机器人的构造、编程和控制方面获得宝贵的知识。 这本书还介绍了几种不同类型旋翼无人机的控制器和空气动力学。它包括各种旋翼推进飞行器在不同空气动力学环境下的模…

基于vmware虚拟机中yum源的配置

1.首先需确保虚拟机中已经连接了光盘映像(如图在虚拟机右下方从左往右第二个) 2.在虚拟机中找到光盘映像文件(默认在/dev的sr0) 3.将光盘文件挂载(挂载后才可读取) 为方便每一次开机之后自动挂载&#xff…

学浪视频怎么下载保存到本地

你是否曾经因为想要保存一份珍贵的学浪视频却苦于无法下载而感到烦恼?现在,我将向你揭示一个简单易行的方法,让你轻松地将学浪视频保存到本地,随时随地享受学习的乐趣。你是否曾经因为想要保存一份珍贵的学浪视频却苦于无法下载而…