在上文中我们提到,如何规范模型输出是一个必要的步骤。对于自动化生成来说,一个标准的输出能帮助我们更好的处理生成的文本,并且也能够顺利的将它转成下一步的输出格式。
并且我们也在上文中提到了,我们想让模型生成小说,就需要使模型输出具有小说的风格。毕竟一个模型的上下文长度有限,我们不能保证它能够一直生成小说样式的文本。
所以,我们需要一些小小的操作来规范模型。

你有可能会说,对于每次生成,我直接使用一个具有严格规范的prompt不就好了?

但其实,prompt的任务是临时的,也是不可控的。并且如果模型的参数量比较小,对于理解你的规范与内容,对模型来说是一个不小的挑战
并且它还有一个致命的缺陷:它会被加入上下文中,成为上下文的一部分。
如果我们的prompt写的十分详细,那么它占用的token就会非常多,不仅会减缓模型输出速率,也会让模型更容易遗忘上文内容。
所以如果只是想临时测试模型效果,那么prompt是可行的。

预训练(pre-training)

预训练(pre-training)是机器学习和深度学习中一个非常关键的概念,尤其是在自然语言处理(NLP)和计算机视觉等领域。它的核心思想是在大规模无标签数据上提前训练一个模型,使其掌握一些通用的知识或特征。
如果我们直接要求模型理解小说内容中所涵盖的关系或依照上文生成对应的文本,如果不加任何prompt,那么生成的效果可能是很差的(对于参数量较小的模型)。
那么我们就需要用到一些方式,来让模型能够“理解”文中的不同的关系。
目前,如果我们下载了带有Bert/GPT字样的模型,那么它们其实已经完成过预训练,拿到的其实是一个经过训练的“底模”
这也是目前预训练的主要任务所对应生成的模型:
1.Masked Language Modeling,MLM,遮盖语言模型(Encoder-only Transformer)
它的目的是随机遮掉句子中的部分词,让模型预测被遮住的词。
例:“小明今天[MASK]很开心地去了学校。”
模型需要猜测出 [MASK] 是什么词(比如 “早上”)
模型输出就是所有 token 的上下文表示(embeddings)
很明显,模型利用将中间的关键词遮盖,从而同时看到前文与后文的信息,这种模型具有较强的理解能力
但是,由于句子中的成分被破坏,所以模型无法生成连贯的长文本
(Bert模型的主要任务)
2.CLM(Causal Language Modeling),自回归语言模型(Decoder-only Transformer)
例:“小明今天早上很开心地”
模型需要预测:下一个词是“去了”
模型输出就是只输出下一个 token 的预测值
这种模型只能看到前面的信息,所以它的生成能力非常强
由于缺少了对于后文的信息理解,所以模型的上下文理解并不好
(GPT模型的主要任务)

如果把两个任务结合起来呢?
这也是目前很多模型的训练趋势,也称为Encoder-Decoder 模型,是一种理解 + 生成一体的模型
但是代价就是显卡起飞,成本爆炸
并且训练的任务很难进行统一
不仅如此,有时,Decoder 端的生成会偏离原始输入(尤其是在摘要、翻译任务中),出现所谓的“事实幻觉”(hallucination)问题
所以目前的方案都不会将这两个任务结合,而是分别使用两个模型,再将它们的回答结合

微调(fine-tune)

注意:微调一定是要在预训练的基础上实现的!
为什么?因为微调需要模型的对比和泛化能力。
首先,微调需要模型本身具有语言理解能力,也就是预训练过程中所学习到的上下文关系或词的关系
所以才能在微调时,根据不同的问题情况,都能进行泛化的输出
微调首先需要准备数据集(越多越好)

{
  "prompt": "请写一段主角在云雾山悟剑的描写。",
  "response": "云雾山终年被薄雾笼罩,山巅松涛阵阵,剑意缥缈。林尘盘膝坐于一块寒玉石上,手中三尺青锋轻鸣不已。忽而,他睁眼望天,剑光如流星划破云霄,一道悟道之痕缓缓落下,天地间仿佛停顿了一瞬……"
}

微调之后可以实现

input:“请写一段主角在雷劫中突破元婴境的描写。”
output:"九霄之上,雷云翻滚,银蛇狂舞。林尘立于阵眼之中,身披雷霆,血染长衫。天劫已至第七道,紫雷如柱,轰然落下!他咬牙承受,灵台清明,识海中那颗婴火缓缓凝实……“今日若不成婴,便魂飞魄散!”他怒喝一声,剑气直冲云霄……"

目前,训练量实在是太大了,有没有更多优化的方法?有待找寻,但是拥有这些方法,解决目前的小说生成问题,已经完全足够了。