Char LSTM模型的文本生成

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

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

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

Char LSTM模型的文本生成

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

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

贪婪的做法:

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

Char LSTM模型的文本生成

前K或多项式方法:

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

Char LSTM模型的文本生成

组合

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

Char LSTM模型的文本生成

光束搜索

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

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

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

Char LSTM模型的文本生成

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

Char LSTM模型的文本生成

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

未来的实验

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

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

Char LSTM模型的文本生成

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

[i, j, k], i_score * j_score * k_score]
Char LSTM模型的文本生成

参考文献:

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

短笑话数据集

From: https://hackernoon.com/text-generation-for-char-lstm-models-685dc186e319