Deep Learning Part Seven基于RNN生成文本--24.5.2

news2024/11/24 1:05:32

不存在什么完美的文章,就好像没有完美的绝望。

——村上春树《且听风吟》

本章所学的内容

0.引子

本章主要利用LSTM实现几个有趣的应用:

先剧透一下:是AI聊天软件(现在做的ChatGPT(聊天神器,水论文高手等))和图像识别(可以应用于帮助盲人领域)

1.基于 RNN 的语言模型可以生成新的文本

文本生成叙述:

RnnlmGen 类的实现如下所示:

import sys
sys.path.append('..')
import numpy as np
from common.functions import softmax
from ch06.rnnlm import Rnnlm
from ch06.better_rnnlm import BetterRnnlm


class RnnlmGen(Rnnlm):
    def generate(self, start_id, skip_ids=None, sample_size=100):
        word_ids = [start_id]

        x = start_id
        while len(word_ids) < sample_size:
            x = np.array(x).reshape(1, 1)
            score = self.predict(x)
            p = softmax(score.flatten())

            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))

        return word_ids

介绍了代码中的参数含义:

现在,使用这个 RnnlmGen 类进行文本生成。这里先在完全没有学习的状态(即权重参数是随机初始值的状态)下生成文本,代码如下所示:

import sys
sys.path.append('..')
from rnnlm_gen import RnnlmGen
from dataset import ptb


corpus, word_to_id, id_to_word = ptb.load_data('train')
vocab_size = len(word_to_id)
corpus_size = len(corpus)

model = RnnlmGen()
# model.load_params('../ch06/Rnnlm.pkl')
# 设定start单词和skip单词
start_word = 'you'
start_id = word_to_id[start_word]
skip_words = ['N', '<unk>', '$']
skip_ids = [word_to_id[w] for w in skip_words]

# 生成文本
word_ids = model.generate(start_id, skip_ids)
txt = ' '.join([id_to_word[i] for i in word_ids])
txt = txt.replace(' <eos>', '.\n')
print(txt)

初次文本的生成:一句话就是:“真的烂!”

读入学习好的文本后,第二次进行文本生成:就是“勉强是个句子啦!”

第二次学习总结:(抽象为:机器逐步开始理解句子啦!)

改进后的文本生成结果:一句话就是:(行啊,学习的蛮好的,已经会使用语法啦!)

接着,我们使用更大的语料库,让机器加大学习的力度的结果:一句话是“虽然予以仍有些许问题,但是已经是一位合格的语言大师啦,这就是机器语言学习的魅力所在吧,像人类一样慢慢进步,但是就是这货学习不知道疲倦,而且学习速度极快,记忆力极好等”人工智能终究会比人类更加优秀;but 他不过是人类的工具而已,人类创造了他就是让他服务于人类,让人类过得更好!这才是人工智能的发明初衷吧!

不懂:

为何要让人和机器比较呢?二者根本没有任何可比性的,机器本身仅仅是一个工具罢了的,他可以永生不死,可以有好多优点,人类永远也无法超越,但是他必须始终为人类服务,人类最终应该与机器(人工智能)合作共赢,而不是互相残杀!这才是中国智慧的点点星光吧!

2.在进行文本生成时,重复“输入一个单词(字符),基于模型的输出(概率分布)进行采样”这一过程

语言模型的概率方案选择问题:

1.始终如一的选取概率最高的单词

2.概率性获得法,就是概率小的单词也有可能被选中的,(类比买彩票,概率再小也有机会中奖)

最终选取结果:

选择了后者

原因:我们想让每次生成的文本变得不一样的,这样更加有趣,更加灵活多变的。

确定性和概率性的理解:

确定性:就是只选取概率最高的那个,其他的一律不给机会(一成不变)

概率性:就是给概率高的那货的选取概率提高的,其他的也都有机会的(相对灵活多变)

啥是重复概率的输出和采样:

生成语句文本时,就是按照上述概率方法重复计算下一个单词的概率,最后生成一个优秀的句子。

3.通过组合两个 RNN,可以将一个时序数据转换为另一个时序数据(seq2seq)

seq2seq:简单来说,就相当于机器的翻译,让AI翻译软件帮你翻译英语阅读理解(核心:把一种语言通过两个RNN转化成另一种语言)(这里的语言就可以理解为时序数据的)

作者唠叨一下seq2seq的听着就困得原理概念

有意思的来啦,作者用翻译实例实战帮助读者理解seq2seq的核心(将一种事物转化为另一种事物)

seq2seq的内部核心:两个RNN层

的讲解:

一个RNN的任务:编码

另一个RNN的任务:解码

简单理解:类似于:就是一个RNN将中文变成0和1的形式,然后呢,另一个RNN将这些0和1用英文的方式重新生成一个英文版

4.在 seq2seq 中,编码器对输入语句进行编码,解码器接收并解码这个编码信息,获得目标输出语句

好玩的来啦,这部分讲的是机器学习根据字符串计算公式的答案:

通过大量的学习,俗称记答案,来算题的,只能说牛皮!

但你别说,真的可以的!

利用填充法将位数补齐,避免报错。

5.反转输入语句(Reverse)和将编码信息分配给解码器的多个层(Peeky)可以有效提高seq2seq 的精度

seq2seq 的学习代码如下所示:

import sys
sys.path.append('..')
import numpy as np
import matplotlib.pyplot as plt
from dataset import sequence
from common.optimizer import Adam
from common.trainer import Trainer
from common.util import eval_seq2seq
from seq2seq import Seq2seq
from peeky_seq2seq import PeekySeq2seq


# 读入数据集
(x_train, t_train), (x_test, t_test) = sequence.load_data('addition.txt')
char_to_id, id_to_char = sequence.get_vocab()

# 设定超参数
vocab_size = len(char_to_id)
wordvec_size = 16
hidden_size = 128
batch_size = 128
max_epoch = 25
max_grad = 5.0

# 生成模型/优化器/训练器
model = Seq2seq(vocab_size, wordvec_size, hidden_size)
optimizer = Adam()
trainer = Trainer(model, optimizer)

acc_list = []
for epoch in range(max_epoch):
    trainer.fit(x_train, t_train, max_epoch=1,
                batch_size=batch_size, max_grad=max_grad)

    correct_num = 0
    for i in range(len(x_test)):
        question, correct = x_test[[i]], t_test[[i]]
        verbose = i < 10
        correct_num += eval_seq2seq(model, question, correct,
                                    id_to_char, verbose)
    acc = float(correct_num) / len(x_test)
    acc_list.append(acc)
    print('val acc %.3f%%' % (acc * 100))

这里描述了:机器学习后,凭借记答案的本领看他能做对几道题,正确率如何。
初次记答案的正确率:惨不忍睹,但值得一提的是有做对的。

通过大牛改进,用反转输入法,记答案的本领再次提高。

 从这里可以看出,记答案的正确率到了50%~60%,正确率显著提高。

# 读入数据集
(x_train, t_train), (x_test, t_test) = sequence.load_data('addition.txt')
...
x_train, x_test = x_train[:, ::-1], x_test[:, ::-1]
...

借助用偷窥大法来提高信息连锁反应,让信息共享,提高正确率。 

PeekyDecoder 类的实现:

class PeekyDecoder:
    def __init__(self, vocab_size, wordvec_size, hidden_size):
        V, D, H = vocab_size, wordvec_size, hidden_size
        rn = np.random.randn

        embed_W = (rn(V, D) / 100).astype('f')
        lstm_Wx = (rn( H + D , 4 * H) / np.sqrt(H + D)).astype('f')
        lstm_Wh = (rn(H, 4 * H) / np.sqrt(H)).astype('f')
        lstm_b = np.zeros(4 * H).astype('f')
        affine_W = (rn( H + H , V) / np.sqrt(H + H)).astype('f')
        affine_b = np.zeros(V).astype('f')

        self.embed = TimeEmbedding(embed_W)
        self.lstm = TimeLSTM(lstm_Wx, lstm_Wh, lstm_b, stateful=True)
        self.affine = TimeAffine(affine_W, affine_b)

        self.params, self.grads = [], []
        for layer in (self.embed, self.lstm, self.affine):
            self.params += layer.params
            self.grads += layer.grads
        self.cache = None

    def forward(self, xs, h):
        N, T = xs.shape
        N, H = h.shape

        self.lstm.set_state(h)

        out = self.embed.forward(xs)
        hs = np.repeat(h, T, axis=0).reshape(N, T, H)
        out = np.concatenate((hs, out), axis=2)

        out = self.lstm.forward(out)
        out = np.concatenate((hs, out), axis=2)

        score = self.affine.forward(out)
        self.cache = H
        return score

 咕哒,这里可以看到正确率达到了近100%,背答案也不是没有前途嘛。

感谢了偷窥大法和反转输入大法两位哥哥啦!

6.seq2seq 可以用在机器翻译、聊天机器人和自动图像描述等各种各样的应用中

现代前景:

聊天机器人:类似于现代婴儿版本的Chat GPT,牛!

相当于现代版的人脸识别等图像识别技术:六得嘞!

本章我们探讨了基于 RNN 的文本生成。实际上,我们只是稍微改动了一下上一章的基于 RNN 的语言模型,增加了文本生成的功能。在本章后半部分,我们研究了 seq2seq,并使之成功学习了简单的加法。seq2seq 模型拼接了编码器和解码器,是组合了两个 RNN 的简单结构。但是,尽管 seq2seq 简单,却具有巨大的潜力,可以用于各种各样的应用。

另外,本章还介绍了改进 seq2seq 的两个方案—— Reverse 和 Peeky。我们对这两个方案进行了实现和评价,并确认了它们的效果。下一章我们将继续改进 seq2seq,届时深度学习中最重要的技巧之一 Attention 将会出现。我们将说明 Attention 的机制,然后基于它实现更强大的 seq2seq。

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

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

相关文章

Latex小技巧:将图索引、表索引加到目录;调整公式段前段后间距

LaTex将图索引、表索引加到目录中 LaTex中通过\listoffigures命令生成图索引&#xff1b;通过listoftables命令生成表索引。但是图索引和表索引默认不出现在目录中。 为了将图索引、表索引加到目录中&#xff0c;使用\addcontentsline{}{}{}命令&#xff1a; \tableofconten…

【STM32+HAL】SDIO+DMA模式读写SD卡

一、准备工作 有关CUBEMX的初始化配置&#xff0c;参见我的另一篇blog&#xff1a;【STM32HAL】CUBEMX初始化配置 二、所用工具 1、芯片&#xff1a; STM32F407ZGT6 2、IDE&#xff1a; MDK-Keil软件 3、库文件&#xff1a;STM32F4xxHAL库 三、实现功能 实现用SDIODMA读写S…

实现优先队列——C++

目录 1.优先队列的类模板 2.仿函数的讲解 3.成员变量 4.构造函数 5。判空&#xff0c;返回size&#xff0c;返回队头 6.插入 7.删除 1.优先队列的类模板 我们先通过模板来进行初步了解 由上图可知&#xff0c;我们的模板里有三个参数&#xff0c;第一个参数自然就是你要存储的数…

WPF之可翻转面板

1&#xff0c;创建翻转面板的资源字典&#xff1a;FlippPanel.xaml。 无外观控件同样必须给样式指定类型&#xff08; <ControlTemplate TargetType"ss:FlipPanel">&#xff09;&#xff0c;相关详情参考&#xff1a;WPF之创建无外观控件-CSDN博客&#xff09…

Codeforces Round 943 (Div. 3) (A-G1) C++题解

目录 比赛链接 : A. Maximize? B. Prefiquence C. Assembly via Remainders D. Permutation Game E. Cells Arrangement F. Equal XOR Segments G1. Division LCP (easy version) G2. Division LCP (hard version) 比赛链接 : Dashboard - Codeforces Round 943 (…

【Spring】Spring中AOP的简介和基本使用,SpringBoot使用AOP

&#x1f4dd;个人主页&#xff1a;哈__ 期待您的关注 目录 一、AOP简介 二、AOP个人浅谈 三、AOP中几个核心的方法注解 四、AOP中几个核心的属性 1.切入点&#xff08;PointCut&#xff09; 五、代码演示 1.SpringBoot引入依赖 2.定义一个AOP&#xff0c;也就是切面…

【数据库主从架构】

【数据库主从架构】 1. 什么是数据库的主从架构1.1 主从复制1.1.1 MySQL的主从主从复制技术三级目录 1. 什么是数据库的主从架构 随着公司业务线的增多&#xff0c;各种数据都在迅速增加&#xff0c;并且数据的读取流量也大大增加&#xff0c;就面临着数据安全问题&#xff0c;…

ICode国际青少年编程竞赛- Python-1级训练场-基础训练1

ICode国际青少年编程竞赛- Python-1级训练场-基础训练1 1、 Dev.step(4)2、 Dev.step(-4) Dev.step(8)3、 Dev.turnLeft() Dev.step(4)4、 Dev.step(3) Dev.turnLeft() Dev.step(-1) Dev.step(4)5、 Dev.step(-1) Dev.step(3) Dev.step(-2) Dev.turnLeft() Dev.step(…

Servlet(一些实战小示例)

文章目录 一、实操注意点1.1 代码修改重启问题1.2 Smart Tomcat的日志1.3 如何处理错误 一. 抓自己的包二、构造一个重定向的响应&#xff0c;让页面重定向到百度主页三、让服务器返回一个html数据四、表白墙4.1 约定前后端数据4.2 前端代码4.3 后端代码4.4 保存在数据库的版本…

超强动画制作软件blender

blender中文手册&#xff1a;Blender 4.1 Manual Blender 是一款集3D建模、渲染、动画、视频编辑、音频处理、游戏设计等多功能于一体的软件。由于其开源性质&#xff0c;它拥有庞大的用户群体和活跃的开发者社区&#xff0c;这使得Blender的功能和性能得到了不断的提升和优化…

Linux CentOS7部署ASP.NET Core应用程序,并配置Nginx反向代理服务器和Supervisor守护服务

前言&#xff1a; 本篇文章主要讲解的是如何在Linux CentOS7操作系统搭建.NET Core运行环境并发布ASP.NET Core应用程序&#xff0c;以及配置Nginx反向代理服务器。因为公司的项目一直都是托管在Window服务器IIS上&#xff0c;对于Linux服务器上托管.NET Core项目十分好奇。因为…

hot100 -- 二叉树(上)

目录 &#x1f382;二叉树的中序遍历 AC 递归 AC 迭代 &#x1f33c;二叉树的最大深度 AC DFS递归 AC BFS &#x1f6a9;翻转二叉树 AC 后序&#xff08;递归&#xff09; AC 中序 &#x1f6a9;对称二叉树 AC 递归 AC 迭代 &#x1f33c;二叉树的直径 A…

C语言之位操作符:<<、>>、、|、^、~,以及原码反码补码和例题详解

目录 前言 一、原码、反码、补码 二、移位操作符 三、位操作符&#xff1a;&、|、^、~ 四、经典例题分析&#xff1a; 总结 前言 本文将详细介绍C语言中左移操作符<<&#xff0c;右移操作符>>&#xff0c;按位与&&#xff0c;按位或|&#xff0c;按位异或^…

VS(Visual Studio)中查找项目里的中文字符

目录 正则表达式查找中文字符 正则表达式查找中文字符 在Visual Studio (VS) 中查找所有的中文字符&#xff0c;你可以使用其强大的查找和替换功能。不过&#xff0c;由于中文字符的范围非常广泛&#xff08;包括简体中文、繁体中文、日本汉字、韩国汉字等&#xff09;&#xf…

C语言——小知识和小细节17

一、未能给指针成功赋值 #include <stdio.h> #include <stdlib.h> #include <string.h>void GetMemory(char* p) {p (char*)malloc(20 * sizeof(char)); }void Test() {char* str NULL;GetMemory(str);strcpy(str, "Hello World!");printf(&quo…

计算机网络chapter2——应用层

文章目录 第2章 应用层章节引出—— 2.1应用层协议原理2.1.1 网络应用程序体系结构&#xff08;1&#xff09;客户-服务器体系结构&#xff08;2&#xff09;对等(P2P)体系结构2.1.2 进程通信1.客户和服务器进程2.进程与计算机网络之间的接口3. 进程寻址 2.1.3 可供应用程序使用…

Linux shell编程学习笔记48:touch命令

0 前言 touch是csdn技能树Linux基础练习题中最常见的一条命令&#xff0c;这次我们就来研究它的功能和用法。 1. touch命令的功能、格式和选项说明 我们可以使用命令 touch --help 来查看touch命令的帮助信息。 purpleEndurer bash ~ $ touch --help Usage: touch [OPTION]…

双指针(C++)

文章目录 1、移动零2、复写零3、快乐数4、盛最多水的容器5、有效三角形的个数6、和为s的两个数7、三数之和8、四数之和 需要理解的是&#xff0c;双指针并非只有指针&#xff0c;双指针的意思是两个位置。比如对于数组来说&#xff0c;两个下标也是双指针。当然&#xff0c;也可…

基础IO认识

回顾文件 我们之前认识文件只是在语言程度上理解&#xff0c;但是我们理解的不够彻底&#xff0c;要想真正理解文件要在os上理解。 简单代码认识 1 #include<stdio.h>2 int main(){3 FILE* fpfopen("log.txt","w");4 if(fpNULL){5 p…

【小浩算法 BST与其验证】

BST与其验证 前言我的思路思路一 中序遍历判断数组无重复递增思路二 递归边界最大值最小值的传递 我的代码测试用例1测试用例2 前言 BST是二叉树一个经典应用&#xff0c;我们常常将其用于数据的查找以及构建平衡二叉树等。今天我所做的题目是验证一颗二叉树是否为二叉搜索树&…