请选择 进入手机版 | 继续访问电脑版
 找回密码
 立即注册
搜索

AI框架运用:用PyTorch构建自然言语生成(NLG)系统

在过去的几年中,自然言语处理(NLP)有了分明的增长,这要归功于深度学习算法的提高和足够的计算才能。但是,前馈神经网络不被以为是对言语或文本建模的最佳选择。这是由于前馈网络未思索文本中的单词顺序。

因此,为了捕获文本中存在的顺序信息,在NLP中运用了递归神经网络。在本文中,我们将了解如何运用PyTorch生成自然言语,运用递归神经网络(LSTM)。



自然言语生成的简要概述

自然言语生成(NLG)是自然言语处理(NLP)的子字段,它与计算机自动生成人类可读文本有关。NLG可用于各种NLP义务,例如机器翻译,语音转文本,聊天机器人,文本自动更正或文本自动完成。
我们可以借助言语建模为NLG建模。让我解释一下言语模型的概念–言语模型学会预测单词序列的概率。例如,思索以下句子:



我们可以看到,第一句话比第二句话更有能够,由于我们知道第二句话中的单词顺序是不正确的。这是言语建模背后的基本概念。言语模型应该可以区分较高能够性的单词(或标记)序列。
言语模型的类型

以下是两种类型的言语模型:
    统计言语模型: 这些模型运用传统的统计技术,例如N-gram,隐马尔可夫模型(HMM)和某些言语规则来学习单词的概率分布。 神经言语模型: 这些模型的有效性曾经超过统计言语模型。他们运用不同种类的神经网络对言语停止建模。


运用统计言语模型生成文本

首先,让我们看看如何在统计模型(如N-Gram模型)的协助下生成文本。

假设我们必须为下面的句子生成下一个单词:



假设我们的N-Gram模型思索3个前一个词的上下文只是为了预测下一个词。因此,模型将尝试使概率P(w |“它建立了a”)最大化,其中“ w”代表文本数据集中的每个单词。将使该概率最大化的单词将作为句子“她在那里建…”的下一个单词生成。
但是,运用这样的统计模型存在某些缺陷,该统计模型运用直接的前一个单词作为上下文来预测下一个单词。让我给您一些额外的背景信息。



如今,我们获得了有关正在发生的事情的更多信息。“沙堡”一词很能够是下一个词,由于它对“海滩”一词有很强的依赖性,由于人们在大多数正确的海滩上建造沙堡。因此,重点是,“沙堡”并不取决于当前环境(“她建造了”),而是取决于“海滩”。
运用神经言语模型生成文本

为了捕获序列标记之间的这种有限制的依赖性,我们可以运用基于RNN / LSTM的言语模型。以下是我们将用于NLG的言语模型的简约表示:



    x1,x2和x3分别是工夫步1,工夫步2和工夫步3的输入单词嵌入 ŷ1,ŷ2和ŷ3是训练数据集中一切不同标记的概率分布 y1,y2和y3是基本真值 U,V和W是权重矩阵 H0,H1,H2和H3是隐藏形状
了解神经言语模型的功能

我们将尝试从三个阶段来了解神经言语模型的功能:
    材料预备 模型训练 文字产生
1.数据预备

假设我们将下面的句子用作训练数据。
[“好吧,完美”,
“听起来不错”,
“差价是多少”]
第一句话有4个记号,第二句话有3个记号,第三个句子有5个记号。因此,一切这些句子在记号方面都有不同的长度。LSTM模型只接受长度相反的序列作为输入。因此,我们必须使训练数据中的序列具有相反的长度。
有多种技术可以使序列长度相等。
一种技术是填充。我们可以在需求时运用填充令牌填充序列。但是,假如运用此技术,则在损失计算和文本生成时期将不得不处理填充令牌。
因此,我们将运用另一种技术,该技术触及在不运用任何填充令牌的状况下将一个序列分成多个等长的序列。该技术还添加了训练数据的大小。让我将其运用于我们的训练数据。
假设我们希望序列具有三个标记。然后,第一个序列将分为以下序列:
['好吧,就是'
完美']

第二个序列的长度仅为三,因此不会被拆分。但是,训练数据的第三个序列具有五个令牌,它将被分解为多个令牌序列:
['什么是',
'价格是',
'价格差']

如今,新数据集将如下所示:
['好吧就是',
'就是完美',
'听起来很棒',
'什么是',
'就是价格',
'价格差']

2.模型训练

由于我们要处理下一个单词生成成绩,因此目的应该是输入单词的下一个单词。例如,思索第一个文本序列“正确”。



对于我们训练数据的第一个序列,模型的输入为“正确”和“那个”,相应的目的标记为“那个”和“是”。因此,在末尾训练过程之前,我们将必须将数据集中的一切序列拆分为输入和目的,如下所示:



因此,“输入”和“目的”下的这些序列对是将传递给模型的训练示例,训练示例的损失将是每个工夫步的损失平均值。



让我们看看如何将此模型用于文本生成。
3.文字生成

一旦我们的言语模型得到训练,我们便可以将其用于NLG。想法是传递一个文本字符串作为输入,以及模型要在输入文本字符串之后生成的许多标记。例如,假如用户传递“ what is”作为输入文本,并指定该模型应生成2个令牌,则该模型能够会生成“ what’s going”或“ what is your name”或任何其他序列。
让我借助一些插图展现它是如何发生的:
输入文字=“什么是”
n = 2
步骤1 –输入文本的第一个标记(“ what”)传递给训练后的LSTM模型。它产生一个输入ŷ1,我们将忽略它,由于我们曾经知道第二个标记(“ is”)。该模型还生成隐藏形状H1,该形状将传递到下一个工夫步。





步骤2 –然后将第二个令牌(“ is”)与H1一同在工夫步骤2传递到模型。在此工夫步长处的输入是概率分布,其中令牌“ going”具有最大值。因此,我们将其视为模型初次生成或预测的令牌。如今我们还有一个令牌可以生成。





步骤3 –为了生成下一个令牌,我们需求在工夫步骤3将输入令牌传递给模型。但是,我们用完了输入令牌,“ is”是生成“ going”的最后一个令牌。那么,接上去我们要传递什么作为输入呢?在这种状况下,我们将传递先前生成的令牌作为输入令牌。





该模型的最终输入将是“正在发生什么”。这就是我们将用于执行NLG的文本生成策略。接上去,我们将在电影情节摘要的数据集中训练本人的言语模型。
运用PyTorch生成自然言语

如今我们知道了神经言语模型是如何工作的以及需求什么样的数据预处理,让我们训练一个LSTM言语模型以运用PyTorch执行自然言语生成。

让我们疾速导入必要的库。




1.加载数据集

我们将运用CMU电影摘要语料库的样本。





你可以运用下面的代码打印五份摘要,这些摘要是随机抽样的。
#个样本随机摘要 random.sample(movie_plots,5)2.数据预备

首先,我们将稍微肃清文本。我们将仅保留字母和撇号标点符号,并从文本中删除其他的其他元素。
#干净的文字 movie_plots = [re.sub(“ [^ az']”,“”,i)for movie_plots中的i]不必执行此步骤。只是我希望我的模型仅关注字母,而不必担心标点符号或数字或其他符号。
接上去,我们将定义一个函数以从数据集中预备定长序列。我已指定序列的长度为五。它是一个超参数,您可以根据需求更改它。





因此,我们会将电影情节摘要传递给此函数,并且它将为每个输入前往固定长度序列的列表。





输入: 152644
一旦预备好相反长度的序列,就可以将它们进一步分为输入序列和目的序列。





如今我们必须将这些序列(x和y)转换为整数序列,但是在此之前,我们将必须将数据集中的每个不同的单词映射为一个整数值。因此,我们将为令牌字典创建一个令牌,并为令牌字典创建一个整数。




输入:(14271,'the')
#设置词汇量 vocab_size = len(int2token) vocab_size输入: 16592
词汇量为16,592,即我们的数据集中有超过16,000个不同的标记。
一旦我们有了令牌到整数的映射,就可以将文本序列转换为整数序列。





3.模型制造

我们将批次的输入序列和目的序列传递给模型,由于最好是按批次停止训练,而不是一次将整个数据传递给模型。以下功能将从输入数据创建批次。





如今,我们将定义言语模型的体系结构。









输入序列将首先经过嵌入层,然后经过LSTM层。LSTM层将提供一组与序列长度相等的输入,并且这些输入中的每一个都将传递到线性(密集)层,在该层上将运用softmax。




输入:
WordLSTM(
(emb_layer):嵌入(16592,200)
(lstm):LSTM(200,256,num_layers = 4,batch_first = True,dropout = 0.3)
(dropout ):Dropout(p = 0.3,inplace = False)
(fc ):线性(in_features = 256,out_features = 16592,bias = True)

如今让我们定义一个用于训练模型的函数。








#训练模型 火车(净额,batch_size = 32,历元= 20,print_every = 256)我已将批次大小指定为32,并将训练模型20个工夫段。训练能够需求一段工夫。
4.文字生成

训练模型后,我们可以将其用于文本生成。请留意,此模型可以一次生成一个单词,并带有隐藏形状。因此,要生成下一个单词,我们将必须运用此生成的单词和隐藏形状。









函数sample()从用户处输入一个输入文本字符串(“ prime”),并指定一个数字(“ size”),该数字指定要生成的令牌数量。在给定输入单词和隐藏形状的状况下,sample()运用predict()函数预测下一个单词。下面给出了由模型生成的一些文本序列。
样本(净值,15)
输入:
“如今由他们拥有新福音的圣殿担任,并关押他”
样本(净值15,素数=“其中之一”)
输入:
``其中一个团队正在等待他的回绝,并把他扔进对sannokai的回绝中''
样本(净值15,素数=“尽快”)
输入:
“一旦他被派去做不是他嘴上形成的普通战士”
样本(净值15,素数=“他们”)
输入:
“他们发现本人以被扔进船的方式被扔进了船上”
最后

自然言语生成是一个疾速成熟的范畴,并且是越来越活跃的研讨范畴。从N-Gram模型到RNN / LSTM模型,用于NLG的方法也已走了很长一段路,如今基于变压器的模型已成为该范畴的最新技术。
总而言之,在本文中,涵盖了许多与NLG相关的内容,例如数据集预备,如何训练神经言语模型以及最终在PyTorch中停止自然言语生成过程。我建议大家尝试在更大的数据集上构建言语模型,并查看它生成什么样的文本。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

大神点评4

啊优 2020-8-20 11:50:36 显示全部楼层
分享了
回复

使用道具 举报

霸气的_毛毛虫 2020-8-21 10:25:34 来自手机 显示全部楼层
边撸边过
回复

使用道具 举报

无语8了 2020-8-22 11:11:41 显示全部楼层
一点毛病没有,顶你
回复

使用道具 举报

麦客卡尔布鲁氏 2020-8-23 07:10:10 来自手机 显示全部楼层
顶起顶起顶起
回复

使用道具 举报

高级模式
B Color Image Link Quote Code Smilies