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

  • 文字产生
  • 1.数据准备
    假设我们将下面的句子用作训练数据 。
    [“好吧 , 完美” ,“听起来不错” ,“差价是多少”]
    第一句话有4个记号 , 第二句话有3个记号 , 第三个句子有5个记号 。 因此 , 所有这些句子在记号方面都有不同的长度 。 LSTM模型只接受长度相同的序列作为输入 。 因此 , 我们必须使训练数据中的序列具有相同的长度 。
    有多种技术可以使序列长度相等 。
    一种技术是填充 。 我们可以在需要时使用填充令牌填充序列 。 但是 , 如果使用此技术 , 则在损失计算和文本生成期间将不得不处理填充令牌 。
    因此 , 我们将使用另一种技术 , 该技术涉及在不使用任何填充令牌的情况下将一个序列分成多个等长的序列 。 该技术还增加了训练数据的大小 。 让我将其应用于我们的训练数据 。
    假设我们希望序列具有三个标记 。 然后 , 第一个序列将分为以下序列:
    ['好吧 , 就是'完美']
    第二个序列的长度仅为三 , 因此不会被拆分 。 但是 , 训练数据的第三个序列具有五个令牌 , 它将被分解为多个令牌序列:
    ['什么是' , '价格是' , '价格差']
    现在 , 新数据集将如下所示:
    ['好吧就是' , '就是完美' , '听起来很棒' , '什么是' , '就是价格' , '价格差']
    2.模型训练
    由于我们要解决下一个单词生成问题 , 因此目标应该是输入单词的下一个单词 。 例如 , 考虑第一个文本序列“正确” 。
    |AI框架应用:用PyTorch构建自然语言生成(NLG)系统
    本文插图

    对于我们训练数据的第一个序列 , 模型的输入为“正确”和“那个” , 相应的目标标记为“那个”和“是” 。 因此 , 在开始训练过程之前 , 我们将必须将数据集中的所有序列拆分为输入和目标 , 如下所示:
    |AI框架应用:用PyTorch构建自然语言生成(NLG)系统
    本文插图

    因此 , “输入”和“目标”下的这些序列对是将传递给模型的训练示例 , 训练示例的损失将是每个时间步的损失平均值 。
    |AI框架应用:用PyTorch构建自然语言生成(NLG)系统
    本文插图

    让我们看看如何将此模型用于文本生成 。
    3.文字生成
    一旦我们的语言模型得到训练 , 我们便可以将其用于NLG 。 想法是传递一个文本字符串作为输入 , 以及模型要在输入文本字符串之后生成的许多标记 。 例如 , 如果用户传递“ what is”作为输入文本 , 并指定该模型应生成2个令牌 , 则该模型可能会生成“ what’s going”或“ what is your name”或任何其他序列 。
    让我借助一些插图展示它是如何发生的:
    输入文字=“什么是”n = 2
    步骤1 –输入文本的第一个标记(“ what”)传递给训练后的LSTM模型 。 它产生一个输出?1 , 我们将忽略它 , 因为我们已经知道第二个标记(“ is”) 。 该模型还生成隐藏状态H1 , 该状态将传递到下一个时间步 。
    |AI框架应用:用PyTorch构建自然语言生成(NLG)系统
    本文插图


    步骤2 –然后将第二个令牌(“ is”)与H1一起在时间步骤2传递到模型 。 在此时间步长处的输出是概率分布 , 其中令牌“ going”具有最大值 。 因此 , 我们将其视为模型首次生成或预测的令牌 。 现在我们还有一个令牌可以生成 。
    |AI框架应用:用PyTorch构建自然语言生成(NLG)系统
    本文插图


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


    推荐阅读