Deep learning Part Five RNN--24.4.29

news2024/11/25 14:55:52

接着上期,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 = None

    def forward(self, x, h_prev):
        Wx, Wh, b = self.params
        t = np.dot(h_prev, Wh) + np.dot(x, Wx) + b
        h_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.params
    x, h_prev, h_next = self.cache

    dt = 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][...] = dWx
    self.grads[1][...] = dWh
    self.grads[2][...] = db

    return dx, dh_prev

Time RNN:

def backward(self, dh_next):
    Wx, Wh, b = self.params
    x, h_prev, h_next = self.cache

    dt = 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][...] = dWx
    self.grads[1][...] = dWh
    self.grads[2][...] = db

    return dx, dh_prev

RNN forward:
 

def forward(self, xs):
    Wx, Wh, b = self.params
    N, T, D = xs.shape
    D, H = Wx.shape

    self.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.h
        self.layers.append(layer)

    return hs

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

def backward(self, dhs):
    Wx, Wh, b = self.params
    N, T, H = dhs.shape
    D, H = Wx.shape    

    dxs = np.empty((N, T, D), dtype='f')
    dh = 0
    grads = [0, 0, 0]
    for t in reversed(range(T)):
        layer = self.layers[t]
        dx, dh = layer.backward(dhs[:, t, :] + dh) # 求和后的梯度
        dxs[:, t, :] = dx

        for i, grad in enumerate(layer.grads):
            grads[i] += grad

    for i, grad in enumerate(grads):
        self.grads[i][...] = grad
    self.dh = dh

    return dxs

5.5.2 语言模型的评价

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

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

相关文章

【JVM】class文件格式,JVM加载class文件流程,JVM运行时内存区域,对象分配内存流程

这篇文章本来只是想讲一下class文件格式,讲着讲着越讲越多。JVM这一块吧,知识比较散比较多,如果深研究下去如死扣《深入理解Java虚拟机》,这本书很深很细,全记住是不可能的,其实也没必要。趁这个机会直接把…

附录6-4 黑马优购项目-分类和购物车

目录 1 分类 1.1 接口 1.2 窗口限制 1.3 选中状态样式判断 1.4 点击左侧时右侧会到顶点 1.5 源码 2 购物车 2.1 store 2.2 tabBar徽标 2.3 滑动删除 2.4 结算 2.4.1 结算前登录 2.4.2 结算功能 2.5 触发组件事件 2.6 源码 1 分类 分类最上部是…

Flutter笔记:谈Material状态属性-为什么FlatButton等旧版按钮就废弃了

Flutter笔记 谈Material状态属性-为什么FlatButton等旧版按钮就废弃了 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite:http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this artic…

免安装SQL管理工具HeidiSQL建库如何选Collation字符校对

免安装SQL管理工具HeidiSQL 文章目录 免安装SQL管理工具HeidiSQL一、安装二、建库因此,通常我们选择: 一、安装 到官方网址:https://www.heidisql.com/ 下载后按不同版本安装或解压,运行目录中的heidisql应用程序。 该工具可以对…

「生存即赚」链接现实与游戏,打造3T平台生态

当前,在线角色扮演游戏(RPG)在区块链游戏市场中正迅速崛起,成为新宠。随着区块链技术的不断进步,众多游戏开发者纷纷将其游戏项目引入区块链领域,以利用这一新兴技术实现商业价值的最大化。在这一趋势中&am…

加州大学欧文分校英语中级语法专项课程02:Adjectives and Adjective Clauses 学习笔记

Adjectives and Adjective Clauses course certificate 本文是 https://www.coursera.org/learn/adjective-clauses 这门课的学习笔记。 文章目录 Adjectives and Adjective ClausesWeek 01: Adjectives and Adjective PhrasesLearning Objectives Adjectives Introduction Le…

基于Java的智慧社团综合管理系统的设计与实现(论文+源码)_kaic

摘 要 随着校园文化的不断丰富,大学里各种社团越来越多,社团活动也越来越频繁,社员也越来越多,而且大学生退社、入社比较频繁,社团管理就显得非常繁琐而又复杂,如果采用人工管理,对管理员来说将是一件很头疼的事情。设…

5个本地流畅运行大模型的免费工具

大家好,随着大型语言模型(LLM)驱动的聊天机器人逐渐普及,给人们的工作和生活带来了前所未有的便利。然而,这种便捷性背后潜藏着个人隐私信息被泄露的风险,例如AI公司会收集聊天记录和元数据来优化模型&…

【Vulhub靶场】Nginx 漏洞复现

Nginx 漏洞复现 一、Nginx 文件名逻辑漏洞(CVE-2013-4547)1、影响版本2、漏洞原理3、漏洞复现 二、Nginx 解析漏洞1、版本信息:2、漏洞详情3、漏洞复现 一、Nginx 文件名逻辑漏洞(CVE-2013-4547) 1、影响版本 Nginx …

mysql 数据转excel文件

mysql 数据转excel文件 缘由 为售后拉取数据,用navicat太墨迹了,用python写一个main方法跑一下; 1.抽取共同方法,封装成传入mysql,直接下载成excel; 2.写入所有sql语句,传入参数; 代…

2024-05-02 商业分析-杭州小万科技-商业模式分析

摘要: 对杭州小万科技的商业模式进行分析,以对其做出客观的评估。 杭州小万科技的资料: 杭州小万科技有限公司 - 企知道 (qizhidao.com) 杭州小万科技有限公司网站备案查询 - 天眼查 (tianyancha.com) 杭州小万科技有限公司 - 爱企查 (baidu.com) ​ 2023年年报:

Android手写自己的路由SDK

实现自己的路由框架 ​ 在较大型的Android app中常会用到组件化技术,针对不同的业务/基础功能对模块进行划分,从上到下为壳工程、业务模块、基础模块。其中业务模块依赖基础模块,壳工程依赖业务模块。同级的横向模块(比如多个业务…

BeanFactory 源码浅析

BeanFactory 功能介绍 BeanFactory 是核心容器,负责管理 Bean 对象 BeanFactory 接口的功能只有一个 getBean() 方法BeanFactory 的实现类(DefaultListableBeanFactory)包含:控制反转、基本的依赖注入、Bean 生命周期的各种功能…

【Python】函数设计

1.联系函数的设计 2.找质数 3.找因子 4.判断水仙花数 5.斐波拉契数列递归调用,并用数组存储已计算过的数,减少重复计算 1、计算利息和本息 编写两个函数分别按单利和复利计算利息,根据本金、年利率、存款年限得到本息和和利息。调用这两个函数计算1…

【算法刷题日志】吸氧羊的StarryCoding之旅 - 贡献法计算

题目链接:https://www.starrycoding.com/problem/3 题目描述 吸氧羊终于注册了一个StarryCoding账号!(她很开心) 但是吸氧羊忘记了它的密码,她想起你是计算机大师,于是就来请教你。 她虽然不记得密码了…

java版数据结构:深入理解栈和队列:数据结构与应用(vector,stack,queue)

目录 前言 动态数组类(vector) 特点: 应用: 栈(Stack) 栈的基础概念: 栈的常用方法: 模拟栈操作: 队列(Queue) 队列的基础概念 队列的常…

golang学习笔记(协程的基础知识)

golang的协程 协程是一种轻量级的线程,它可以实现并发执行的并行操作。协程是Go语言中的一个核心特性,它使得程序能够以并发的方式运行,并且非常高效。与传统的线程相比,协程的创建和销毁成本非常低,可以方便地启动大…

三维坐标点按剖面分类

一、写在前面 ①配套文件:根据剖面对三维坐标点(X,Y,Z)分类资源-CSDN文库 ②脱敏处理:蚀变数据已采用随机数生成覆盖 ③剖面坐标按顺序排列在“剖面坐标点.xlsx”文件中 二、3点确定空间中平面方程 原理: 设3点A&…

C++深度解析教程笔记2

C深度解析教程笔记2 第3课 - 进化后的 const 分析实验-C与C的const区别实验-C与C的const区别&const作用域 第4课 - 布尔类型和引用小结 本文学习自狄泰软件学院 唐佐林老师的 C深度解析教程,图片全部来源于课程PPT,仅用于个人学习记录 第3课 - 进化后…

列转行(spark 与presto语法)

一、Presto 语法 原始数据: 期望数据: 代码: SELECT info, value FROM ( select 张三 as name,18 as age,男 as gender,清华 as schoolunion allselect 李四 as name,18 as age,男 as gender,清华 as school ) as a CROSS JOIN UNNEST(…