6 Generating text
既然我们能够训练模型,那么接下来我们需要的就是从模型中生成文本的能力。请回想一下,语言模型会接收一个(可能是批量的)长度为 sequence_length 的整数序列,并生成一个大小为 (sequence_length, vocab_size) 的矩阵,其中序列中的每个元素都是预测该位置之后下一个标记的概率分布。现在我们将编写几个函数,将此转换为新的序列的采样方案。
Softmax
按照常规惯例,语言模型的输出就是最后的线性层的输出(即“预测值”),因此我们需要通过 softmax 操作将其转换为标准化的概率,这一过程我们在前面的 公式 10 中已经介绍过。
Decoding
要通过我们的模型生成文本(进行解码),我们将向模型提供一系列前缀 token(即 prompt),并要求它根据词汇表生成一个概率分布,以预测序列中的下一个标记。然后,我们将从这个词汇表项的概率分布中进行抽样,以确定下一个输出 token。 具体来说,解码过程的每一步应接收一个序列 并通过以下公式返回一个 token :
其中,TransformerLM 是我们的模型,它接收长度为 sequence_length 的序列作为输入,并生成一个大小为 (sequence_length, vocab_size) 的矩阵,然后我们取这个矩阵的最后一个元素,因为我们正在寻找第 个位置的下一个预测 token。 这为我们提供了一个基本的解码器,通过反复从这些 one-step 条件中采样(将我们之前生成的输出 token 附加到下一个解码时间步的输入中)来实现,直到我们生成结束序列的 token <|endoftext|>(或者生成用户指定的最大 token 数)。
Decoder tricks
我们将对小型模型进行试验,而小型模型有时可能会生成质量极低的文本。有两种简单的解码技巧能够解决这些问题。首先,在 temperature scaling 过程中,我们通过一个温度参数 来修改我们的 softmax 函数,新的 softmax 函数为
请注意,当 时,会使向量 中的最大元素占据主导地位,而 softmax 的输出则会变成一个集中于这个最大元素的独热向量。
其次,另一种技巧是 nucleus 或 top-p 采样,在这种方法中,我们通过截断低概率的 token 来修改采样分布。设 为通过大小为 vocab_size 的(温度缩放后的)softmax 操作得到的概率分布。具有超参数 的 nucleus 采样会根据以下公式确定下一个 token:
其中 是满足 的最小索引集合。您可以通过先按概率大小对概率分布 进行排序,然后选择最大的词汇元素,直到达到目标水平 来轻松计算出这个量。
Problem (decoding): Decoding
实现一个函数来对您的语言模型进行解码。我们建议您支持以下功能:
- 根据用户提供的 prompt 生成完成内容(即,接收一些 并持续生成内容直到遇到一个 <|endoftext|>)。
- 允许用户控制生成的 token 数量上限。
- 给定一个期望的温度值,对预测的下一个 token 分布应用 softmax 温度缩放操作,然后再进行采样。
- Top-p 采样,给定用户指定的阈值。
