平滑:对所有可能出现的字符串都分配⼀个不为0的值,防⽌出现概率为0。
预训练⼤语⾔模型PLM参数巨⼤,在不同任务上都进⾏微调代价巨⼤。可以通过过语境学习(In context Learning,ICL)等⽅法,直接使⽤⼤规模语⾔模型就可以在很多任务的少样本场景 下取得很好的效果。
Scaling Law指出模型的性能依赖于模型的规模,包括:参数数量、数据集⼤⼩和计算量,模 型的效果会随着三者的指数增加⽽线性提⾼。
⼤模型的发展:
LLM的构建流程:
![](https://i-blog.csdnimg.cn/direct/3fdbf3dae3b44510946a40e21e1afbb7.png)
**预训练:**需要利⽤海量的训练数据,包括互联⽹⽹⻚、维基百科、书籍、GitHub、论⽂、问答⽹站 等,构建包含数千亿甚⾄数万亿单词的具有多样性的内容。利⽤由数千块⾼性能 GPU 和⾼速⽹络 组成超级计算机,花费数⼗天完成深度神经⽹络参数训练,构建基础语⾔模型 (Base Model)。 基础⼤模型构建了⻓⽂本的建模能⼒,使得模型具有语⾔⽣成能⼒,根据输⼊的提示词 (Prompt),模型可以⽣成⽂本补全句⼦。
**有监督微调:**有监督微调(Supervised Finetuning),也称为指令微调(Instruction Tuning), 利⽤少量⾼质量数据集合,包含⽤户输⼊的提示词(Prompt)和对应的理想输出结果。⽤户输⼊ 包括问题、闲聊对话、任务指令等多种形式和任务。
**奖励建模(Reward Modeling)**阶段⽬标是构建⼀个质量对⽐模型,对于同⼀个提示词,SFT模型给出 的多个不同输出结果的质量进⾏排序。奖励模型(RM模型)可以通过⼆分类模型,对输⼊的两个结果之 间的优劣进⾏判断。RM模型与基础语⾔模型和SFT模型不同,RM模型本身并不能单独提供给⽤户使 ⽤。奖励模型的训练通常和SFT模型⼀样,使⽤数⼗块GPU,通过⼏天时间完成训练。由于RM模型的准 确率对于强化学习阶段的效果有着⾄关重要的影响,因此对于该模型的训练通常需要⼤规模的训练数据。
**强化学习(ReinforcementLearning)**阶段根据数⼗万⽤户给出的提示词,利⽤在前⼀阶段训练的RM模 型,给出SFT模型对⽤户提示词补全结果的质量评估,并与语⾔模型建模⽬标综合得到更好的效果。该阶 段所使⽤的提示词数量与有监督微调阶段类似,数量在⼗万量级,并且不需要⼈⼯提前给出该提示词所 对应的理想回复。使⽤强化学习,在SFT模型基础上调整参数,使得最终⽣成的⽂本可以获得更⾼的奖励 (Reward)。该阶段所需要的计算量相较预训练阶段也少很多,通常也仅需要数⼗块GPU,经过数天时 间的即可完成训练。强化学习也并不是没有问题的,它会使得基础模型的熵降低,从⽽减少了模型输出 的多样性。在经过强化学习⽅法训练完成后的RL模型,就是最终提供给⽤户使⽤具有理解⽤户指令和上 下⽂的类ChatGPT系统。
1.2. ⼤语⾔模型基础
1.2.1. Transformer 1. Transformer结构完全通过注意⼒机制完成对源语⾔序列和⽬标语⾔序列全局依赖的建模。当前⼏乎 全部⼤语⾔模型都是基于Transformer结构。
⼤语⾔模型基础
Transformer
- Transformer结构完全通过注意⼒机制完成对源语⾔序列和⽬标语⾔序列全局依赖的建模。当前⼏乎 全部⼤语⾔模型都是基于Transformer结构。
2. 主要包括(1)注意⼒层:使⽤多头注意⼒(Multi-Head Attention)机制整合上下⽂语义,它使得 序列中任意两个单词之间的依赖关系可以直接被建模⽽不基于传统的循环结构,从⽽更好地解决⽂ 本的⻓程依赖。(2)位置感知前馈层(Position-wise FFN):通过全连接层对输⼊⽂本序列中的 每个单词表示进⾏更复杂的变换。(3)残差连接部分。它是⼀条分别作⽤在上述两个⼦层当中的直 连通路,被⽤于连接它们的输⼊与输出。从⽽使得信息流动更加⾼效,有利于模型的优化。(4)层归⼀化:对应图中的Norm部分。作⽤于上述两个⼦层的输出表示序列中,对表示序列进⾏层归⼀化 操作,同样起到稳定优化的作⽤。
-
由于Transfomer模型不再使⽤基于循环的⽅式建模⽂本输⼊,序列中不再有任何信息能够提示模型单词之间的相对位置关系。 在送⼊编码器端建模其上下⽂语义之前,⼀个⾮常重要的操作是在词嵌 ⼊中加⼊位置编码(Positional Encoding)这⼀特征。具体来说,序列中每⼀个单词所在的位置都对应⼀个向量。这⼀向量会与单词表示对应相加并送⼊到后续模块中做进⼀步处理。在训练的过程 当中,模型会⾃动地学习到如何利⽤这部分位置信息。
-
位置编码的具体实现
这样编码的好处:⾸先,正余弦函数的范围是在[-1,+1],导出的位置编码与原词嵌⼊相加不会使得结果 偏离过远⽽破坏原有单词的语义信息。其次,依据三⻆函数的基本性质,可以得知第pos+k个位置的编码 是第pos个位置的编码的线性组合,这就意味着位置编码中蕴含着单词之间的距离信息。
注:
- 位置编码层的输出送⼊⾃注意⼒层:查询Q,键K,值V。对矩阵X: max_seq_len * d_model,⾸先 利⽤三个W分别将X变换得到QKV,然后:
为了进⼀步增强⾃注意⼒机制聚合上下⽂信息的能⼒,提出了多头⾃注意⼒(Multi-headAttention)的 机制,以关注上下⽂的不同侧⾯。最后拼接再变换到拼接前的维度。
- 前馈层接受⾃注意⼒⼦层的输出作为输⼊,并通过⼀个带有ReLU激活函数的两层全连接⽹络对输⼊ 进⾏更加复杂的⾮线性变换。实验证明,这⼀⾮线性变换会对模型最终的性能产⽣⼗分重要的影 响:
实验结果表明,增⼤前馈⼦层隐状态的维度有利于提升最终翻译结果的质量,因此,前馈⼦层隐状态的 维度⼀般⽐⾃注意⼒⼦层要⼤。
- 残差连接与归⼀化:编码器和解码器均由很多层基本的Transformer块组成,每⼀层当中都包含复杂 的⾮线性映射,这就导致模型的训练⽐较困难。因此,研究者们在Transformer块中进⼀步引⼊了残 差连接与层归⼀化技术以进⼀步提升训练的稳定性。残差连接主要是指使⽤⼀条直连通道直接将对应⼦层的输⼊连接到输出上去,从⽽避免由于⽹络过深在优化过程中潜在的梯度消失问题:
8. 编码器结构:输⼊x⾸先经过编码成嵌⼊,接着加上位置编码;然后送⼊多个编码块,最后经过⼀个 LayerNorm;⼀个编码layer⻓这样,循环N次:
![](https://i-blog.csdnimg.cn/direct/4b4435fc92b840abb48160f85673a833.png)
- 解码器结构:解码器的每个Transformer块的第⼀个⾃注意⼒⼦层额外增加了注意⼒掩码,对应图中 的掩码多头注意⼒(Masked Multi-Head Attention)部分。这主要是因为在翻译的过程中,编码器 端主要⽤于编码源语⾔序列的信息,⽽这个序列是完全已知的,因⽽编码器仅需要考虑如何融合上 下⽂语义信息即可。然⽽,在训练阶段,为了并⾏化,我们可以⼀次性输⼊5句话,然后采⽤类似于 前⾯mask的技巧,将第⼀句话的后四个位置mask掉,这样只能与⾃身计算注意⼒分数;依次 类推,最终mask矩阵为⼀个上三⻆矩阵,为1的地⽅表示需要mask的位置。解码器结构:
![](https://i-blog.csdnimg.cn/direct/239f4ddb70d545528dd7a9e1957e5fcb.png)
-
解码器中有两种注意⼒,⼀种是掩码多头注意⼒:和编码器⼀样,只不过多了掩码结构,其QKV都 是输⼊的X;另⼀种是多头注意⼒,其Q是下边掩码多头的输出,K和V是编码器输出的memory。查 询是通过解码器前⼀层的输出进⾏投影的,⽽键和值是使⽤编码器的输出进⾏投影的。它的作⽤是 在翻译的过程当中,为了⽣成合理的⽬标语⾔序列需要观测待翻译的源语⾔序列是什么。基于上述 的编码器和解码器结构,待翻译的源语⾔⽂本,⾸先经过编码器端的每个Transformer块对其上下⽂ 语义的层层抽象,最终输出每⼀个源语⾔单词上下⽂相关的表示。解码器端以⾃回归的⽅式⽣成⽬ 标语⾔⽂本,即在每个时间步t,根据编码器端输出的源语⾔⽂本表示,以及前t−1个时刻⽣成的⽬ 标语⾔⽂本,⽣成当前时刻的⽬标语⾔单词。注意训练时解码器输⼊的X其实就是翻译完整的句⼦, 也就是⽬标值,当然包括起始符等。测试时,解码器输⼊的⾸先是起始符,然后预测第⼀个值,接 着输⼊起始符和第⼀个预测值,接着预测第⼆个值,以此类推。
-
单个decoder_layer的代码:
然后是解码器:⾸先对target进⾏位置编码,然后循环送⼊多个解码层:
![](https://i-blog.csdnimg.cn/direct/3e7ca457efd94c4e90017918ade89c56.png)
完整的编码器解码器架构:
![](https://i-blog.csdnimg.cn/direct/7500a7ec0e48400e8bc2d2735e048a10.png)