3.5-RNN文本生成

news2024/9/21 19:26:55

1语言模型生成文本的顺序

  1. 前面我们已经能够实现使用下图的LSTM网络进行语言建模;

    在这里插入图片描述

  2. 对于一个已经在语料库上学习好的LSTM模型;如果语料库就只是you say goobye and i say hello;那么当把单词i输入到模型中,Time xxx层的第一个LSTM层将会输出一个概率分布,这个概率分布中概率最大的那个对应的单词应该是say;如下图所示;

    在这里插入图片描述

  3. 上图的情况是按照选择概率最大的那个作为当前输出的文本的;因此可以说是“确定的”,只要模型训练的好,他都会倾向于输出那些准确的单词;

  4. 那么我们就可以接着以这个层的输出的单词作为下一个时刻的输入,输出下一个时刻的概率分布,然后选择概率最大的,如下图所示;以此类推,就可以一直输出下去;我们可以人为控制什么时候停止,也可以设定当模型输出的下一个单词是特殊结束符号标记的时候就终止;如果模型训练的好,模型觉得要说完了,就会输出一个特殊结束符号标记,从而自动停止;

    在这里插入图片描述

  5. 另一种方法是以这个概率分布作为准则,随机的从词库中选择单词;就是之前说的np.choice方法;这样一来:

    1. 因为具有随机性,因此被选到的单词(被采样到的单词)每次都不一样
    2. 但是选到的单词又具有倾向性,即概率高的单词容易被选到,概率低的单词难以被选到。
  6. 这种引入随机性的方法,可以让模型生成训练数据中没有的文本,即新的文本;不过构成这些新文本的单词依然是那么些个单词,毕竟训练集里面只有这些单词;

2使用改进前的LSTM语言模型尝试生成文本

  1. 这里使用的是未改进的LSTMLM模型;且不使用训练好的权重;只是看一下生成的过程;
  2. 代码位于:RNN_generate/RNNLM_gen.py · GY/basicNLP - 码云 - 开源中国 (gitee.com);
  1. 生成的过程可以描述为:

    1. 给初始的单词,reshape之后输入到模型中;
    2. 由于Time xxx层是权重共享的,因此可以根据输入的数据的维度调整T值;
    3. 那么这里每次都输入一个单词,用上图中不带Time的层来输出一个概率分布;
    4. 以一定概率选择要预测的单词,然后将这个单词再次作为输入,输入到上图中不带Time的层,再输出一个概率分布;以此类推;直到全部输出完;
  2. 这里直接继承了未改进的Rnnlm类,然后实现了生成函数;生成函数代码如下:

    1. model 的 predict() 方法进行的是 mini-batch 处理,所以输入 x 必须是二维数组。因此,即使在只输入 1 个单词 ID 的情况下,也要将它的批大小视为 1,并将其整理成形状为 1 × 1 的 NumPy 数组
    class RnnlmGen(Rnnlm):
        def generate(self, start_id, skip_ids=None, sample_size=100):
            '''
            @param start_id: 第一个单词的ID
            @param skip_ids: 不生成的ID;用于排除一些填充符之类的
            @param sample_size: 生成的长度
            @return:生成的文本'''
            word_ids = [start_id]
    
            x = start_id
            while len(word_ids) < sample_size:
                # x = np.array(x).reshape(1, 1)
                if GPU:
                    x = cupy.array(x).reshape(1, 1)
                else:
                    x = np.array(x).reshape(1, 1)
                
                score = self.predict(x) # (N,T,V);这里是(1,1,10000)
                p = softmax(score.flatten()) # score.flatten()展平成一维的;softmax函数中设置了一维的计算方式
                if GPU:
                    sampled = cupy.random.choice(len(p), size=1, p=p)
                else:
                    sampled = np.random.choice(len(p), size=1, p=p)
                if (skip_ids is None) or (sampled not in skip_ids):
                    x = sampled
                    word_ids.append(int(x[0]))
    
            return word_ids
    
  3. 以下是生成文本;因为没有训练,所以杂乱无序;

    you fired designing indianapolis counsel calgary readers reviewed wright shouting underlying
    existing agip frankfurt depress interstate steelmakers natural weeks begins gatt stiff delivering 
    telesis grounds boards stream louisiana breed sample indexing acquiring commentary hired al 
    philip blast helping dictaphone attention confusion auditors beaten arbitrage ii scholars 
    forecasting monopolies burke fit spacecraft takeover-stock engineering aftershocks arise shipbuilding 
    minivans along recalls bone recreational year may disappears sixth motivated monitors understanding 
    swing previously coupon expects difference plo remain attendants sullivan kansas peninsula patent 
    skeptical fields galileo blackstone battered steps anger fusion mandatory mca trains postal 
    forest-products scrapped faa censorship tea building tests milton
    

3使用改进后的LSTM语言模型尝试生成文本

  1. 这里使用之前训练好的权重;权重位于:BetterRnnlm.pkl · GY/basicNLP - 码云 - 开源中国 (gitee.com);

  2. 代码位于:RNN_generate/betterRNNLM_gen.py · GY/basicNLP - 码云 - 开源中国 (gitee.com);

  3. 还演示了给模型一句话或者一句话开头几个单词,然后让其续写的方法;

    1. 代码位于:RNN_generate/betterRNNLM_gen_better_text.py · GY/basicNLP - 码云 - 开源中国 (gitee.com);
  1. 这里的改进即前面说的LSTM多层化、embedding层和Affine层的权重共享,以及在纵向上加入dropout层;

  2. 继承了BetterRnnlm类,然后实现generate函数;这个generate函数与2使用改进前的LSTM语言模型尝试生成文本小节的generate函数一样;

  3. 以下是生成的结果:

    1. 可以看到,训练好的模型生成的文本流畅多了;
    you said.
    in the event of falling environmental prices and the rapid growth of revenues rate for the third quarter abc has up from almost every time says frozen president of fox 's pro conn.
    i obtained a courthouse for other new york series on its job virginia to do with mr. spielvogel and the task and the merged bank business.
    according to the usx spokesman bernard and other major investors have declined to support this profit from personal management.
    delmed.
    the matter was held by berry 's family in five years.
    mr. nadeau
    
  4. 目前为止我们只是给模型第一个单词,然后让模型预测之后的单词;那么如果我们希望给模型一句话或者一句话开头几个单词,然后让其续写呢?

  5. 方法是:先将前几个单词依次输入到模型中;这样在LSTM层进行计算时会将隐藏状态保存在类的成员变量self.h中;但是要记得设置stateful=True,这样才能继承前面计算的隐藏状态;

  6. 之后,再将最后一个单词输入到模型中,依次获取模型输出即可;

  7. 核心代码如下:

    if __name__ == '__main__':
        start_words = 'the meaning of life is'
        start_ids = [word_to_id[w] for w in start_words.split(' ')]
        for x in start_ids[:-1]:
            if GPU:
                x = cupy.array(x).reshape(1, 1)
            else:
                x = np.array(x).reshape(1, 1)
            model.predict(x)
    
        # 文本生成
        word_ids = model.generate(start_ids[-1], skip_ids)
        txt = ' '.join([id_to_word[i] for i in word_ids])
        txt = txt.replace(' <eos>', '.\n')
        print(txt)
    
  8. 以下是一次输出的文本:

    the meaning of life is not a nightmare in many of the newspapers.
    the solution will be shipped although washington 's future is n't likely to adopt the first changes in the world.
    our state bailout is very large payments he says.
    on the in the corporate market the analyst said the arrest by the new york borough president had arranged less than one million shares in the event.
    and by selling their stake in rico the public home short-term market system is a one-time candidate for an investment bank.
    it 's time to worry that customers will need
    

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

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

相关文章

⌈ 传知代码 ⌋ 深度学习革新音乐转录

&#x1f49b;前情提要&#x1f49b; 本文是传知代码平台中的相关前沿知识与技术的分享~ 接下来我们即将进入一个全新的空间&#xff0c;对技术有一个全新的视角~ 本文所涉及所有资源均在传知代码平台可获取 以下的内容一定会让你对AI 赋能时代有一个颠覆性的认识哦&#x…

SpringBoot上传文件大小超出范围捕获异常

文件上传中&#xff0c;可以限定文件大小&#xff0c;防止用户上传过大的文件&#xff0c;但是出现异常会报错&#xff0c;不够优雅 这里做异常捕获&#xff0c;然后自定义提示文字&#xff0c;可以更加优雅的解决文件上传超出限制报异常 /*** 上传文件超出大小限制异常 适用于…

微信公众号获取用户openid(PHP版,snsapi_base模式)

微信公众号获取用户openid的接口有2个&#xff1a;snsapi_base、snsapi_userinfo 详情见微信公众号开发文档&#xff1a;https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_webpage_authorization.html 本文介绍用PHP方式调用snsapi_base接口获取微信用户…

Godot入门 02玩家1.0版

添加Node2D节点&#xff0c;重命名Game 创建玩家场景&#xff0c;添加CharacterBody2D节点 添加AnimatedSprite2D节点 从精灵表中添加帧 选择文件 设置成8*8 图片边缘模糊改为清晰 设置加载后自动播放&#xff0c;动画循环 。动画速度10FPS&#xff0c;修改动画名称idle。 拖动…

Spark实时(六):Output Sinks案例演示

文章目录 Output Sinks案例演示 一、​​​​​​​File sink 二、​​​​​​​​​​​​​​Memory Sink 三、​​​​​​​​​​​​​​Foreach Sink 1、​​​​​​​foreachBatch 2、​​​​​​​​​​​​​​foreach Output Sinks案例演示 当我们对流式…

HarmonyOS NEXT星河版零基础入门到实战

文章目录 一、HarmonyOS NEXT介绍学习内容1、鸿蒙APP开发2、能力套件开发3、全场景开发适合人群 持续更新中✒️总结 一、HarmonyOS NEXT介绍 放弃安卓框架之后&#xff0c;HarmonyOS NEXT成为真正独立于安卓、iOS的操作系统&#xff0c;堪称是一场史无前例的脱胎换骨。在其众多…

模拟依赖关系和 AI 是Vue.js测试的下一个前沿领域

Vue.js 是一个流行的 JavaScript 框架&#xff0c;因此&#xff0c;确保其组件按预期工作至关重要&#xff1a;有效&#xff0c;更重要的是&#xff0c;可靠。模拟依赖项是最有效的测试方法之一&#xff0c;我们将在本文中发现。 模拟依赖项的必要性 模拟依赖项是一种对测试施加…

大数据-49 Redis 缓存问题中 穿透、雪崩、击穿、数据不一致、HotKey、BigKey

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…

亚信安慧AntDB-M负载均衡

负载均衡是分布式系统中常用的技术&#xff0c;主要是将工作任务均衡分布到系统的各个资源点上&#xff0c;可以充分利用系统资源。 AntDB-M分布式内存数据库节点角色可以分为管理节点(MN)、计算节点(CN)和数据节点(DN)三种。管理节点收到客户端连接请求后&#xff0c;会经由负…

【学习记录】锚框

主要解释程序代码&#xff0c;具体解析在代码中进行标注 锚框&#xff0c;具体看见网址https://zh-v2.d2l.ai/chapter_computer-vision/anchor.html#iou 对应程序解析&#xff1a;https://fkjkkll.github.io/2021/11/23/%E7%9B%AE%E6%A0%87%E6%A3%80%E6%B5%8BSSD/#more 目录…

数据结构:(1)线性表

一、基本概念 概念&#xff1a;零个或多个数据元素的有限序列 元素之间是有顺序了。如果存在多个元素&#xff0c;第一个元素无前驱&#xff0c;最后一个没有后继&#xff0c;其他的元素只有一个前驱和一个后继。 当线性表元素的个数n&#xff08;n>0&am…

UE4 UnrealPak加密功能(配置AES encrypt key)

本文的重点在于如何使用UnrealPak的加密功能&#xff0c;以及相关的UE4源代码学习。本文参考了&#xff1a;https://www.cnblogs.com/shiroe/p/14803859.html 。 设置密钥 在编辑、项目设置中找到下面栏目&#xff0c;并点击“生成新的加密密钥”&#xff0c;就可以为Unreal P…

K210视觉识别模块学习笔记7:多线程多模型编程识别

今日开始学习K210视觉识别模块: 图形化操作函数 亚博智能 K210视觉识别模块...... 固件库: canmv_yahboom_v2.1.1.bin 训练网站: 嘉楠开发者社区 今日学习使用多线程、多模型来识别各种物体 这里先提前说一下本文这次测试实验的结果吧&#xff1a;结果是不太成…

ERROR: Cannot find command ‘git’- do you have ‘git’ installed and in your PATH?

ERROR: Cannot find command ‘git’- do you have ‘git’ installed and in your PATH? 目录 ERROR: Cannot find command ‘git’- do you have ‘git’ installed and in your PATH? 【常见模块错误】 【解决方案】 欢迎来到英杰社区https://bbs.csdn.net/topics/61780…

详解程序的预处理与编译与连接

文章目录 1.程序的翻译环境和执行环境2.详解编译链接2.1 翻译环境2.2 编译本身也分为几个阶段2.3 运行环境 3.预处理详解3.1 预处理符号3.2 \#define3.2.1 \#define 定义标识符3.2.2 \#define定义宏3.2.3 \#define 替换规则 3.2.4 \#和\#\#3.2.5 带副作用的宏参数3.2.6 宏和函数…

数据结构之判断二叉树是否为搜索树(C/C++实现)

文章目录 判断二叉树是否为搜索树方法一&#xff1a;递归法方法二&#xff1a;中序遍历法总结 二叉树是一种非常常见的数据结构&#xff0c;它在计算机科学中有着广泛的应用。二叉搜索树&#xff08;Binary Search Tree&#xff0c;简称BST&#xff09;是二叉树的一种特殊形式&…

【VUE】封装一个追随鼠标的漂浮组件框架

红色箭头代表鼠标位置&#xff0c;蓝色区域跟随鼠标出现&#xff0c;鼠标进行其他操作的时候&#xff0c;蓝色区域隐藏。 vue全码 <template><divmousemove"updatePosition"mouseleave"hideDiv"class"container":style"{ positi…

AXI总线

目录 一、AXI接口特点二、AXI接口的握手机制2.1 握手原理2.2 握手机制的三种情形 三、AXI接口的通道3.1 AXI4-Stream3.1.1 通道信号3.1.2 数据字节类型3.1.3 流格式 3.2 AXI4-Lite和AXI4-Full3.1.1 读地址通道3.1.2 读数据通道3.1.3 写地址通道3.1.4 写数据通道3.1.5 写响应通道…

MybatisPlus分页插件

分页查询是一个很常见的需求&#xff0c;故Mybatis-Plus提供了一个分页插件&#xff0c;使用它可以十分方便的完成分页查询。下面介绍Mybatis-Plus分页插件的用法&#xff0c;详细信息可参考官方链接。 配置分页插件 创建com.atguigu.hellomp.config.MPConfiguration配置类&a…

奇异值分解(SVD)时间复杂度分析与优化

奇异值分解是一种矩阵分解的方法&#xff0c;大学线性代数里面也讲过奇异值分解的方法&#xff0c;因此这是一个为大家所熟知的算法。 1 SVD 时间复杂度分析 给定一个 m n m \times n mn 的矩阵 a \boldsymbol{a} a&#xff0c;按照下面公式做分解&#xff0c;其中 Σ \S…