热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

lstm生成文本_CharLSTM模型的文本生成

lstm生成文本在笑话语料库上训练角色级语言模型。我决定尝试解决此问题的方法,我在OpenAI的RequestforResearch博客中找到了该方法。您可以在这里查

lstm 生成文本

在笑话语料库上训练角色级语言模型。

我决定尝试解决此问题的方法,我在OpenAI的Request for Research博客中找到了该方法。 您可以在这里查看代码。 这是用Pytorch编写的,并且受到Fast.ai关于从头实现RNN的精彩课程的启发。

我开始使用OpenAI提供的数据集进行 数据准备 。 数据被转换为小写字母,并且在初次运行时,我选择了评分最高的笑话,其单词长度小于200。这是遇到的所有令牌的示例:

*前面有明确的单词!*这个特定的数据集具有明确的单词/内容,因此这些都出现在模型的输出预测中。 另一个需要解决的有趣问题是从模型的输出中过滤掉不适当的单词-通过检查生成的输出中一组已知的显式单词的出现,或者更好的方法-通过构建干净/不干净的情感分类器! 我还使用在github上找到的更干净的数据集运行了结果。

我为LSTM尝试了几种模型,这些模型主要改变了批次大小,隐藏层。 随着反向传播char令牌数量( bptt )的增加,训练char级模型变得越来越困难。 现在让我们主要关注文本生成部分。 该模型一次输出一个字符,我们的目标是生成一堆(看似可理解且可能很有趣)的文本。 可以采用许多方法:

贪婪的做法:

这是最简单的方法,在该方法中我们递归选择最可能的下一个序列字符。 为了猜测接下来的n个字符,我们需要对模型进行n次推断,这非常快。 然而,在这种情况下,输出的分集较少,并且容易陷入循环。 似乎有一组很可能的char序列,并且预测通常会收敛到这些序列之一。

前K或多项式方法:

这种方法模拟了n个类别中每个结果具有定义的出现概率的结果的发生。 为了向输出中注入更多的多样性,我们没有选择最可能的角色,而是将神经网络建模为概率事件,并观察在一次游戏中输出的令牌。 然而,观察结果,这种方法在产生完整单词方面不是很好。 单词中固有的结构更容易被破坏。 一种替代方法是与贪婪的最佳拟合方法结合使用少量使用跨国发行

组合

我们看到,使用贪婪方法总是会导致循环或重复模式,而top-k方法的多项式会在char级别上产生更多难以理解的单词。 我尝试通过使用贪婪的方法来生成字符来获得两个世界的平衡,直到遇到空格(单词间的空白)。 在这一点上,我使用了多项式生成器,因此单词选择的多样性更大。 这导致文本更加多样化,但整体上具有更多可理解的词。

光束搜索

光束搜索是一种尝试获得更多“最佳结果”的方法,我们着眼于在迭代中预测比一个字符长的序列。 给定一个输入序列,我们要预测接下来的k个字符,而不是预测下一个字符。 这有助于我们在一组输出序列上找到更全局的解决方案。 从某种意义上讲,我们需要考虑所有可能的长度为k的输出字符的波束。 并且需要一些比较指标。

在计算概率时,有几件事可以帮助我们:首先,使用贝叶斯规则,我们可以将获得特定输出序列的概率建模为各个条件概率序列的乘积。 例如:预测“和”给定输入序列“太阳”的得分将为得分= P('a'|输入='太阳')* P('n'|输入='他太阳a')* P ('d'| input ='e sun an')。 其次,soft-max模型的输出通常为对数格式,这使实现更容易,我们可以添加对数值而不是将它们相乘。

下面显示的是实现波束搜索滤波器所需的大多数代码。 我们定义一个数据结构字母来存储给定长度(例如3)和其分数的占位符的所有可能序列。 charscore函数计算为给定输入序列预测给定输出的概率。 beam_search函数迭代可能的序列,并计算每个序列的分数。 beam_text是迭代应用beam_search函数以生成给定长度序列的函数。

波束搜索的这种天真的实现方式花费了相当长的时间(例如,需要8分钟才能产生15个样本)。 下面是另一个示例,我们正在生成15个波束或45个char令牌。

我相信可以通过在CPU上完全运行推理并更好地优化beam_search来大大降低此速度。

未来的实验

这是我一直在尝试的其他几种变体,但是都没有成功。 这些主要是由于波束搜索的运行时间较慢。

贪婪的波束搜索:这类似于波束搜索,但不是搜索所有序列,而是搜索“最可能”的序列。 例如,对于3的光束宽度,我们可以查看3个阶段中每个阶段的前10个最可能的选择。 因此,我们将在每次迭代中搜索10 * 10 * 10个光束。 当然,这可以大大减少延迟问题,但是结果很快就会陷入一个循环,重复不断。 例如,两个光束图案“ ..”和“…”不断重复。

为了增加多样性,我在计算波束得分时将各个概率相乘而不是相加。 结果更加多样化,但不一定更好。

[i, j, k], i_score * j_score * k_score]

参考文献:

fast.ai·使神经网络不再酷
fastai是第一个为所有最常用的深度学习提供单一一致接口的深度学习库。www.fast.ai
如何实现用于自然语言处理的波束搜索解码器
自然语言处理任务(例如字幕生成和机器翻译)涉及到生成以下序列的信息: machinelearningmastery.com

https://github.com/coderbee/jokes/

短笑话数据集

翻译自: https://hackernoon.com/text-generation-for-char-lstm-models-685dc186e319

lstm 生成文本



推荐阅读
  • 深度学习中的Vision Transformer (ViT)详解
    本文详细介绍了深度学习中的Vision Transformer (ViT)方法。首先介绍了相关工作和ViT的基本原理,包括图像块嵌入、可学习的嵌入、位置嵌入和Transformer编码器等。接着讨论了ViT的张量维度变化、归纳偏置与混合架构、微调及更高分辨率等方面。最后给出了实验结果和相关代码的链接。本文的研究表明,对于CV任务,直接应用纯Transformer架构于图像块序列是可行的,无需依赖于卷积网络。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • 实现一个通讯录系统,可添加、删除、修改、查找、显示、清空、排序通讯录信息
    本文介绍了如何实现一个通讯录系统,该系统可以实现添加、删除、修改、查找、显示、清空、排序通讯录信息的功能。通过定义结构体LINK和PEOPLE来存储通讯录信息,使用相关函数来实现各项功能。详细介绍了每个功能的实现方法。 ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
  • Ihavethefollowingonhtml我在html上有以下内容<html><head><scriptsrc..3003_Tes ... [详细]
  • 本文介绍了在处理不规则数据时如何使用Python自动提取文本中的时间日期,包括使用dateutil.parser模块统一日期字符串格式和使用datefinder模块提取日期。同时,还介绍了一段使用正则表达式的代码,可以支持中文日期和一些特殊的时间识别,例如'2012年12月12日'、'3小时前'、'在2012/12/13哈哈'等。 ... [详细]
  • 本文介绍了绕过WAF的XSS检测机制的方法,包括确定payload结构、测试和混淆。同时提出了一种构建XSS payload的方法,该payload与安全机制使用的正则表达式不匹配。通过清理用户输入、转义输出、使用文档对象模型(DOM)接收器和源、实施适当的跨域资源共享(CORS)策略和其他安全策略,可以有效阻止XSS漏洞。但是,WAF或自定义过滤器仍然被广泛使用来增加安全性。本文的方法可以绕过这种安全机制,构建与正则表达式不匹配的XSS payload。 ... [详细]
  • 本文介绍了在go语言中利用(*interface{})(nil)传递参数类型的原理及应用。通过分析Martini框架中的injector类型的声明,解释了values映射表的作用以及parent Injector的含义。同时,讨论了该技术在实际开发中的应用场景。 ... [详细]
  • 【论文】ICLR 2020 九篇满分论文!!!
    点击上方,选择星标或置顶,每天给你送干货!阅读大概需要11分钟跟随小博主,每天进步一丢丢来自:深度学习技术前沿 ... [详细]
  • 关于如何快速定义自己的数据集,可以参考我的前一篇文章PyTorch中快速加载自定义数据(入门)_晨曦473的博客-CSDN博客刚开始学习P ... [详细]
  • 详解 Python 的二元算术运算,为什么说减法只是语法糖?[Python常见问题]
    原题|UnravellingbinaryarithmeticoperationsinPython作者|BrettCannon译者|豌豆花下猫(“Python猫 ... [详细]
  • 上一章讲了如何制作数据集,接下来我们使用mmcls来实现多标签分类。 ... [详细]
author-avatar
一个怪瓜的自白
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有