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

2024-05-03 09:52

本文主要是介绍Deep Learning Part Seven基于RNN生成文本--24.5.2,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

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

本章所学的内容

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 BetterRnnlmclass RnnlmGen(Rnnlm):def generate(self, start_id, skip_ids=None, sample_size=100):word_ids = [start_id]x = start_idwhile 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 = sampledword_ids.append(int(x))return word_ids

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

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

import sys
sys.path.append('..')
from rnnlm_gen import RnnlmGen
from dataset import ptbcorpus, 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 = 0for i in range(len(x_test)):question, correct = x_test[[i]], t_test[[i]]verbose = i < 10correct_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_sizern = np.random.randnembed_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.paramsself.grads += layer.gradsself.cache = Nonedef forward(self, xs, h):N, T = xs.shapeN, H = h.shapeself.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 = Hreturn score

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

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

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

现代前景:

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

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

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

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

这篇关于Deep Learning Part Seven基于RNN生成文本--24.5.2的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/956460

相关文章

AI一键生成 PPT

AI一键生成 PPT 操作步骤 作为一名打工人,是不是经常需要制作各种PPT来分享我的生活和想法。但是,你们知道,有时候灵感来了,时间却不够用了!😩直到我发现了Kimi AI——一个能够自动生成PPT的神奇助手!🌟 什么是Kimi? 一款月之暗面科技有限公司开发的AI办公工具,帮助用户快速生成高质量的演示文稿。 无论你是职场人士、学生还是教师,Kimi都能够为你的办公文

pdfmake生成pdf的使用

实际项目中有时会有根据填写的表单数据或者其他格式的数据,将数据自动填充到pdf文件中根据固定模板生成pdf文件的需求 文章目录 利用pdfmake生成pdf文件1.下载安装pdfmake第三方包2.封装生成pdf文件的共用配置3.生成pdf文件的文件模板内容4.调用方法生成pdf 利用pdfmake生成pdf文件 1.下载安装pdfmake第三方包 npm i pdfma

poj 1258 Agri-Net(最小生成树模板代码)

感觉用这题来当模板更适合。 题意就是给你邻接矩阵求最小生成树啦。~ prim代码:效率很高。172k...0ms。 #include<stdio.h>#include<algorithm>using namespace std;const int MaxN = 101;const int INF = 0x3f3f3f3f;int g[MaxN][MaxN];int n

poj 1287 Networking(prim or kruscal最小生成树)

题意给你点与点间距离,求最小生成树。 注意点是,两点之间可能有不同的路,输入的时候选择最小的,和之前有道最短路WA的题目类似。 prim代码: #include<stdio.h>const int MaxN = 51;const int INF = 0x3f3f3f3f;int g[MaxN][MaxN];int P;int prim(){bool vis[MaxN];

poj 2349 Arctic Network uva 10369(prim or kruscal最小生成树)

题目很麻烦,因为不熟悉最小生成树的算法调试了好久。 感觉网上的题目解释都没说得很清楚,不适合新手。自己写一个。 题意:给你点的坐标,然后两点间可以有两种方式来通信:第一种是卫星通信,第二种是无线电通信。 卫星通信:任何两个有卫星频道的点间都可以直接建立连接,与点间的距离无关; 无线电通信:两个点之间的距离不能超过D,无线电收发器的功率越大,D越大,越昂贵。 计算无线电收发器D

hdu 1102 uva 10397(最小生成树prim)

hdu 1102: 题意: 给一个邻接矩阵,给一些村庄间已经修的路,问最小生成树。 解析: 把已经修的路的权值改为0,套个prim()。 注意prim 最外层循坏为n-1。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstri

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言

poj 3723 kruscal,反边取最大生成树。

题意: 需要征募女兵N人,男兵M人。 每征募一个人需要花费10000美元,但是如果已经招募的人中有一些关系亲密的人,那么可以少花一些钱。 给出若干的男女之间的1~9999之间的亲密关系度,征募某个人的费用是10000 - (已经征募的人中和自己的亲密度的最大值)。 要求通过适当的招募顺序使得征募所有人的费用最小。 解析: 先设想无向图,在征募某个人a时,如果使用了a和b之间的关系

Thymeleaf:生成静态文件及异常处理java.lang.NoClassDefFoundError: ognl/PropertyAccessor

我们需要引入包: <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency><dependency><groupId>org.springframework</groupId><artifactId>sp

Level3 — PART 3 — 自然语言处理与文本分析

目录 自然语言处理概要 分词与词性标注 N-Gram 分词 分词及词性标注的难点 法则式分词法 全切分 FMM和BMM Bi-direction MM 优缺点 统计式分词法 N-Gram概率模型 HMM概率模型 词性标注(Part-of-Speech Tagging) HMM 文本挖掘概要 信息检索(Information Retrieval) 全文扫描 关键词