从爱尔兰歌曲到莎士比亚:LSTM文本生成模型的优化之旅

上一篇:《再用RNN神经网络架构设计生成式语言模型》

序言:本文探讨了如何通过多种方法改进模型的输出,包括扩展数据集、调整模型架构、优化训练数据的窗口设置,以及采用字符级编码。这些方法旨在提高生成文本的准确性和合理性,同时强调实验和调整对模型设计与优化的重要性。

扩展数据集

你可以很简单地将硬编码数据集的模式扩展为使用文本文件。我已经托管了一个包含大约1700行文本的文件,这些文本从许多歌曲中收集而来,供你进行实验。稍作修改,你就可以使用这个文本文件,而不是单个硬编码的歌曲。

在 Colab 中下载数据,可以使用以下代码:

!wget --no-check-certificate \

https://storage.googleapis.com/laurencemoroney-blog.appspot.com/ \

irish-lyrics-eof.txt -O /tmp/irish-lyrics-eof.txt

然后,你可以像这样将文本加载到你的语料库中:

data = open('/tmp/irish-lyrics-eof.txt').read()

corpus = data.lower().split("\n")

接下来的代码无需修改即可运行!将这个数据集训练1000个epoch后,准确率大约可以达到60%,但增长曲线趋于平缓(图8-7)。

图8-7. 在更大的数据集上进行训练

再次尝试短语“in the town of athy”时,预测结果是“one”,但这次的概率只有40%。

对于“sweet jeremy saw dublin”,预测的下一个词是“drawn”,概率为59%。预测接下来的10个词的结果为:

sweet jeremy saw dublin drawn and fondly i am dead and the parting graceful

结果看起来稍微好了一些!但我们还能进一步改进吗?

调整模型架构

改进模型的一种方法是更改其架构,使用多个堆叠的LSTM层。这非常简单,只需要确保在第一层LSTM中将return_sequences设置为True。以下是代码:

python

Copy code

model = Sequential()

model.add(Embedding(total_words, 8))

model.add(Bidirectional(LSTM(max_sequence_len-1, return_sequences='True')))

model.add(Bidirectional(LSTM(max_sequence_len-1)))

model.add(Dense(total_words, activation='softmax'))

model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])

history = model.fit(xs, ys, epochs=1000, verbose=1)

你可以在图8-8中看到这种更改对1000个epoch训练的影响。其结果与之前的曲线没有显著差异。

图8-8. 添加第二层LSTM后的结果

在用之前相同的短语测试时,这次我得到了“in the town of athy”之后的下一个词是“more”,概率为51%;而对于“sweet jeremy saw dublin”,预测下一个词是“cailín”(盖尔语中表示“女孩”的词),概率为61%。不过,再次预测更多单词时,输出很快陷入无意义的混乱。

以下是一些例子:

sweet jeremy saw dublin cailín loo ra fountain plundering that fulfill

you mccarthy you mccarthy down

you know nothing jon snow johnny cease and she danced that put to smother well

i must the wind flowers

dreams it love to laid ned the mossy and night i weirs

如果你得到不同的结果,不用担心,这并不是你的错。随机初始化神经元会影响最终的分数。

用不同的数据窗口

有一个小技巧可以在不添加新歌曲的情况下扩展数据集的大小,这叫做数据的滑动窗口处理。目前,每首歌中的每一行都被视为单独的一行,然后转化为输入序列,如图8-2所示。虽然人类按行阅读歌曲以感受押韵和节奏,但模型并不需要这么做,尤其是在使用双向LSTM时。

因此,与其逐行处理,比如处理“in the town of Athy, one Jeremy Lanigan”后转到下一行“Battered away till he hadn’t a pound”,我们可以将所有行视为一段连续的文本。然后,我们可以在这段文本中创建一个包含n个单词的“窗口”,处理该窗口的内容,再向前移动一个单词来获取下一个输入序列(图8-9)。

图8-9. 移动单词窗口

通过这种方式,可以通过增加输入序列的数量大幅增加训练数据。将窗口滑过整个文本语料库会生成((单词总数 - 窗口大小) × 窗口大小)个输入序列。

代码非常简单——在加载数据时,我们不再将每一行歌曲分割成“句子”,而是动态地从语料库中的单词创建句子:

window_size = 10

sentences = []

data = open('/tmp/irish-lyrics-eof.txt').read()

corpus = data.lower()

words = corpus.split(" ")

range_size = len(words) - window_size

for i in range(0, range_size):

thissentence = ""

for word in range(0, window_size-1):

word = words[i+word]

thissentence = thissentence + word + " "

sentences.append(thissentence)

在这种情况下,由于不再使用完整的句子,而是创建与滑动窗口大小相同的序列,因此max_sequence_len就是窗口的大小。整个文件会被读取,转换为小写,并通过字符串分割生成一个单词数组。代码然后遍历这些单词,从当前索引到当前索引加上窗口大小的范围内生成句子,并将这些新构造的句子添加到句子数组中。

在训练时,你会注意到,由于数据量的增加,每个epoch的训练速度会变慢,但结果会有显著改进,并且生成的文本陷入混乱的速度会明显减缓。

这是一个引起我注意的例子——特别是最后一行!

you know nothing, jon snow is gone

and the young and the rose and wide

to where my love i will play

the heart of the kerry

the wall i watched a neat little town

有很多超参数可以尝试调整。改变窗口大小会影响训练数据的数量——窗口越小,可以生成更多的数据,但用于标签的单词会变少,所以如果设置得太小,最终会得到毫无意义的诗句。你还可以调整嵌入的维度、LSTM的层数或用于训练的词汇表大小。考虑到准确率百分比并不是最好的衡量标准——你可能更需要主观地评估诗句的“合理性”——因此,没有固定规则可以判断你的模型是否“好”。

例如,当我尝试使用窗口大小为6,增加嵌入维度到16,将LSTM的数量从窗口大小(即6)增加到32,并提高Adam优化器的学习率时,我得到了一个平滑的学习曲线(图8-10),而且生成的诗句开始变得更有意义。

图8-10. 调整超参数后的学习曲线

当使用“sweet jeremy saw dublin”作为种子短语(记住,种子中的所有单词都在语料库中)时,我得到了这首诗:

sweet jeremy saw dublin

whack fol

all the watch came

and if ever you love get up from the stool

longs to go as i was passing my aged father

if you can visit new ross

gallant words i shall make

such power of her goods

and her gear

and her calico blouse

she began the one night

rain from the morning so early

oer railroad ties and crossings

i made my weary way

through swamps and elevations

my tired feet

was the good heavens

虽然短语“whack fol”对许多读者来说可能没有意义,但在一些爱尔兰歌曲中它是常见的,类似于“la la la”或“doobie-doobie-doo”。让我特别喜欢的是一些后面的短语似乎有一定的意义,比如“such power of her goods and her gear, and her calico blouse”——但这可能是因为过拟合到语料库中的现有短语。例如,从“oer railroad ties...”到“my tired feet”的部分,直接取自语料库中一首叫《The Lakes of Pontchartrain》的歌曲。如果你遇到类似的问题,最好降低学习率,或减少LSTM的数量。但最重要的是,进行实验并享受其中的乐趣!

字符级编码

在过去的几章中,我们探讨了基于单词的编码进行自然语言处理。我发现它更容易入门,但在生成文本时,你可能也想考虑使用字符级编码,因为语料库中唯一字符的数量通常远少于唯一单词的数量。因此,你的输出层所需的神经元会更少,输出预测的概率也分布得更均匀。

例如,在研究莎士比亚全集的数据集时,你会发现整个数据集中只有65个唯一字符。所以,与在爱尔兰歌曲数据集中需要处理2700个单词的下一个词的概率相比,这里只需要处理65个字符的概率。这使得你的模型更简单!字符编码的另一个好处是标点符号也被包括在内,因此可以预测换行符等。

作为例子,当我使用一个训练在莎士比亚语料上的RNN来预测接在我最喜欢的《权力的游戏》台词之后的文本时,我得到了以下内容:

YGRITTE:

You know nothing, Jon Snow.

Good night, we’ll prove those body’s servants to

The traitor be these mine:

So diswarl his body in hope in this resceins,

I cannot judg appeal’t.

MENENIUS:

Why, ’tis pompetsion.

KING RICHARD II:

I think he make her thought on mine;

She will not: suffer up thy bonds:

How doched it, I pray the gott,

We’ll no fame to this your love, and you were ends

有趣的是,她把他认定为叛徒并想绑住他(“diswarl his body”),但我完全不知道“resceins”是什么意思!如果你看过这部剧,这确实是情节的一部分,所以也许莎士比亚在无意间预见了什么!

当然,当使用像莎士比亚这样的文本作为训练数据时,我们往往会更加宽容,因为这些语言本身就有些陌生。与爱尔兰歌曲模型一样,输出很快会退化为无意义的文本,但这仍然很有趣。

总结

在最近的这三篇中,我们探讨了如何使用基于RNN神经网络的LSTM的模型进行基本的文本生成。你了解了如何将文本拆分为训练特征和标签(以单词为标签),并再次创建了一个生成式模型,当给定种子文本时,可以预测下一个可能的单词。你通过迭代改进模型以获得更好的结果,并探索了传统爱尔兰歌曲的数据集(dataset)。你还了解了一些关于如何通过基于字符的文本生成改进模型的方法,并使用莎士比亚文本进行了示例。希望这对大家理解人工智能模型(这里讲的是机器学习/Machine Learning细分领域模型)如何生成文本是一些有意义的介绍!

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

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

相关文章

51c大模型~合集86

我自己的原文哦~ https://blog.51cto.com/whaosoft/12772867 #MILP-StuDio 拆解高复杂运筹问题的砖石,打破数据稀缺的瓶颈,中科大提出高质量运筹数据生成方法 论文作者刘昊洋是中国科学技术大学 2023 级硕士生,师从王杰教授,…

从零用java实现 小红书 springboot vue uniapp (1)

前言 偶尔会用小红书发一些笔记 闲来无事 想自己实现一个小红书 正好可以学习一下 帖子 留言 im 好友 推送 等功能 下面我们就从零 开发一个小红书 后台依旧用我们的会员系统的脚手架 演示 http://120.26.95.195:8889/ 客户端我们使用uniapp 我们首先对主页进行一个分解 顶部我…

pyside6学习专栏(一)常用控件的使用(非QML方式)

前段业余时间在用pythonpyqt5边学边作一些小程序,总算作到了一个相对复杂的基本VTK三维显示地形图并计算挖填方工程量,作完后,又发现pyqt又是要收费的,就又看了下对应的替代库pyside6,对用此库的一些基本技能分享到此专栏中&#…

活动|华院计算董事长宣晓华应邀出席2024科创大会并作圆桌嘉宾

2024科创大会在上海举行,由中央广播电视总台和上海市人民政府共同主办。本次大会以“创新驱动 新质未来”为主题,来自知名院校、科研机构的专家学者以及科技企业、金融机构的相关负责人共聚一堂,探讨人工智能、生物医药等产业应用前景&#x…

计算机网络-IPSec VPN工作原理

一、IPSec VPN工作原理 昨天我们大致了解了IPSec是什么,今天来学习下它的工作原理。 IPsec的基本工作流程如下: 通过IKE协商第一阶段协商出IKE SA。 使用IKE SA加密IKE协商第二阶段的报文,即IPsec SA。 使用IPsec SA加密数据。 IPsec基本工作…

leetcode 3001. 捕获黑皇后需要的最少移动次数 中等

现有一个下标从 1 开始的 8 x 8 棋盘,上面有 3 枚棋子。 给你 6 个整数 a 、b 、c 、d 、e 和 f ,其中: (a, b) 表示白色车的位置。(c, d) 表示白色象的位置。(e, f) 表示黑皇后的位置。 假定你只能移动白色棋子,返回捕获黑皇后…

linux 系统常用指令

1、查看内核版本 uname -r 2、列出占用空间最大的 10 个文件或目录 du -ah / | sort -rh | head -n 10 终于找到我虚拟机硬盘空间越来越少的原因了,类目......

【OpenDRIVE_Python】使用python脚本更新OpenDRIVE数据中路口Junction名称

示例代码说明: 遍历OpenDRIVE数据中每个路口JunctionID,读取需要变更的路口ID和路口名称的TXT文件,若JunctionID与TXT文件中的ID一致,则将TXT对应的点位名称更新到OpenDRIVE数据中Junction name字段。补充:需要保持TXT和OpenDRIVE数据文件编…

PySpark3.4.4_基于StreamingContext实现网络字节流统计分析

网络字节流与嵌套字节流的区别 概念解释 网络嵌套字节流: 在网络编程的情境下,网络嵌套字节流通常是指将字节流(字节序列)以一种分层或者包含的方式进行组织,用于在网络传输过程中更好地处理数据。例如,在一…

【JS】简单CSS简单JS写的上传进度条

纯JS写的&#xff0c;简单的上传进度条&#xff0c;当上传的文件较大&#xff0c;加一个动态画面&#xff0c;就不会让人觉得出错了或网络卡了 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"v…

47 基于单片机的书库环境监测

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于51单片机&#xff0c;采用DHT11湿度传感器检测湿度&#xff0c;DS18B20温度传感器检测温度&#xff0c; 采用滑动变阻器连接数模转换器模拟二氧化碳和氧气浓度检测&#xff0c;各项数值通过lc…

解决:IDEA中@Autowired自动注入MyBatis Mapper报红警告的几种解决方法

文章目录 解决&#xff1a;IDEA中Autowired自动注入MyBatis Mapper报红警告的几种解决方法问题描述&#xff1a;解决办法&#xff1a;1.将Autowired注解改成Resource2.给Autowired(required false)设置属性3.给Mapper层加注解Mapper/Repository4.改变写法,用RequiredArgsConst…

Spring Boot中实现JPA多数据源配置指南

本文还有配套的精品资源&#xff0c;点击获取 简介&#xff1a;本文详细介绍了在Spring Boot项目中配置和使用JPA进行多数据源管理的步骤。从引入依赖开始&#xff0c;到配置数据源、创建DataSource bean、定义实体和Repository&#xff0c;最后到配置事务管理器和使用多数据…

Ubuntu 安装 web 服务器

安装 apach sudo apt install apache2 -y 查看 apach2 版本号 apache2 -v 检查是否启动服务器 sudo service apache2 status 检查可用的 ufw 防火墙应用程序配置 sudo ufw app list 关闭防火墙 sudo ufw disable 更改允许通过端口流量 sudo ufw allow Apache Full 开启…

go语言的成神之路-标准库篇-fmt标准库

目录 一、三种类型的输出 print&#xff1a; println&#xff1a; printf&#xff1a; 总结&#xff1a; 代码展示&#xff1a; 二、格式化占位符 %s&#xff1a;用于格式化字符串。 %d&#xff1a;用于格式化整数。 %f&#xff1a;用于格式化浮点数。 %v&#xff1…

【Linux操作系统】Linux常用一键脚本

Linux网络加速脚本 Linux网络加速脚本可以替换Linux内核和更改TCP拥塞算法的一键脚本&#xff0c;包括安装BBR内核、XANMOD官方内核&#xff0c;开启BBR加速等功能&#xff0c;总之非常强大。 不卸载内核脚本&#xff08;一般用这个&#xff09; wget -O tcpx.sh "http…

【全攻略】React Native与环信UIKit:Expo项目从创建到云打包完整指南

前言 在当今快速发展的移动应用领域&#xff0c;React Native 因其跨平台开发能力和高效的开发周期而受到开发者的青睐。而 Expo&#xff0c;作为一个基于 React Native 的框架&#xff0c;进一步简化了开发流程&#xff0c;提供了一套完整的工具链&#xff0c;使得开发者能够…

乌龟咬人,小意外中的大警示

近日&#xff0c;听闻有朋友被自家乌龟咬了手指&#xff0c;这看似滑稽的小意外&#xff0c;实则蕴含着不少值得我们深思的安全与责任问题。 乌龟&#xff0c;在大众的认知里&#xff0c;向来是行动迟缓、性情温和的宠物代表。它们慢悠悠地爬行&#xff0c;憨态可掬的模样常常…

java+springboot+mysql论文分享平台

项目介绍&#xff1a; 使用javaspringbootmysql开发的论文分享平台&#xff0c;系统包含超级管理员、管理员、用户角色&#xff0c;功能如下&#xff1a; 用户&#xff1a;系统前台首页&#xff1b;论文分类&#xff1b;论文共享&#xff08;用户可以上传、下载、评论论文文档…

《探索形象克隆:科技与未来的奇妙融合》

目录 一、什么是形象克隆 二、形象克隆的技术原理 三、形象克隆的发展现状 四、形象克隆的未来趋势 五、形象克隆的应用场景 六、形象克隆简单代码案例 Python 实现数字人形象克隆 Scratch 实现角色克隆效果&#xff08;以猫为例&#xff09; JavaScript 实现 Scratc…