绪论

基本概念

假设词汇表 \(\Bbb{V}\) 上的语言模型,由函数 \(P(w_1, w_2…w_m)\) 表示,可以构建为词序列\(w_1,w_2…w_m\) 的概率分布,表示词序列做作为一个句子出现的可能性大小,即\(P(w_1,w_2…w_m)=P(w_1)P(w_2|w_1)…P(w_m|w_1w_2…w_m-1) =\prod^m_{i=1}P(w_1|w_1w_2w_i-1)\)。

上面的公式我们可以得知,第 \(i\) 个单词出现的概率与前面 \(i-1\) 个单词相关;如果按照《现代汉语辞掉 (第七版)》包含 7 万个单词,句子长度 20 个词 (\(m=20\)) 计算,模型参数量达到 \(7.9792 \times 10^{96}\) 的天文数字。

为了简化简化模型,提出了 n 元语法 或 n 元文法 (n-gram):在上述建模的基础上,进一步假设任一单词 \(w_i\) 出现的概率只与过去 \(n-1\) 个词相关。即:

P(wiw1w2 wi1 )=P(wi wi(n1) wi(n2) wi1 )=P(wi win+1i1 ) P(w_i|w_1w_2…w_{i-1}) = P(w_i|w_{i-(n-1)}w_{i-(n-2)}…w_{i-1})=P(w_i|w^{i-1}_{i-n+1})

n-gram 将第 \(i\) 个单词的相关性从 \(i-1\) 个单词减少到了 \(n-1\) 个单词,同时也能缓解句子概率为 0 的问题但无法解决。为了从根本上解决出现零概率的问题,提出了平滑技术 (Smoothing),对所有可能出现的字符串都分配一个非零的概率值。平滑处理最终会提高低概率、降低高概率,以此使整体的概率分布趋于均匀。这种使用 n-gram+smoothing 的方法被称为统计语言模型 (Statistical Language models,SLM)。

除了统计语言模型 SLM 这种方式外,基于 分布式表示和神经网络的语言模型 逐渐成为了主流。

首先会将一段文本通过 独热编码 (one-hot) 映射为一个低维稠密的实数想来那个,称为词向量 (Word Embedding)。基于词向量,再集合循环神经网络、卷积神经网络、端到端记忆网络等神经网络方法构建语言模型,这类方法通常称为神经语言模型 (Neural Language Models,NLM)。

直到以 ELMo 为代表的动态词向量模型的出现,才开启了语言模型预训练的大门。将预训练模型应用于下游任务时,不需要太多的任务细节,不需要设定特定的神经网络结构,只需要”微调”预训练模型,使用具体的标注数据在预训练模型上进行监督训练即可显著提升性能。这种方法被称为预训练语言模型 (Pre-trained Language Models,PLM)。

在预训练语言模型的基础上,又提出了提示词 (Prompt)、模型即服务范式 (Maas)、指令微调 (Instruction Tuning) 等方法。

关于模型的定量分析,Kaplan 等人在文献中提出了缩放法则(Scaling Laws),指出模型的性能依赖于模型的规模,包括:参数数量、数据集大小 和 计算量,模型的效果会随着三者的指数增加而线性提高。

发展历程

对大模型的发展历程大体可以分为三个阶段:

  1. 基础模型阶段 (2018-2021):主要集中在语言模型本身,包括仅编码器 (Encoder Only)、编码器 - 解码器 (Encoder-Decoder)、仅解码器 (Decoder Onlu) 等具体的模型结构。通常采用预训练微调范式,针对不同下游任务进行微调。

  2. 能力探索阶段 (2019-2022):2019 年 GPT-2 模型研究了大规模语言模型在零样本情况下的任务处理能力。GPT-3 模型上研究了利用语境学习 (In-Context Learning) 从而减少样本学习的方法。之后有研究员又提出了指令微调 (Instruction Tuning) 方案,将各类任务统一为生成式自然语言理解框架,并构造训练预料进行微调。2022 年提出了使用有监督微调再结合强化学习方法。

  3. 突破发展阶段 (2022- 至今):从 2022 年 11 月 ChatGPT 为起点,一个大模型语言模型就可以实现回答问题、文稿撰写、生成代码等不同种类的任务。2023 年 3 月 GPT-4 发布后,具备了多模态的理解能力。

模型构建流程

大规模语言模型的构造分为预训练、有监督微调、奖励建模和强化学习 4 个流程

  • 预训练 (Pretraining):利用 海量训练数据,构建包含数千亿甚至数万亿单词的具有多样性的内容。

  • 有监督微调 (Supervised Finetuning):也称为指令微调 (Instruction Tuning)。利用 少量高质量数据集合,包含提示词 (Prompt) 和对应的理想输出结果,使用与预训练阶段相同的语言模型训练算法,在基础语言模型基础上再训练,得到有监督微调模型 (SFT 模型)。

  • 奖励建模 (Reward Modeling):构建一个文本质量对比模型,对于同一个提示词 Prompt,SFT 模型会给出多个不同输出,对输出结果的质量进行排序。奖励模型 (RM) 通过二分类模型,对输入的两个结果进行判断。RM 的准确率通常需要大规模的训练数据,且需要消耗大量的标注人员和非常详细的标注规范。

  • 强化学习 (Reinforcement Learning):根据用户给出的提示词,利用 RM 模型,给出 SFT 模型对用户提示词不全结果的质量评估,并于语言模型建模目标综合得到更好的效果。

下面按流程依次简单介绍各个模块的作用

首先进入的是 嵌入表示层,对于输入的文本序列,嵌入层 (Input Embedding) 将每个单词转换为其相对应的向量表示。Transformer 模型会在词嵌入中加入位置编码 (Positional Encoding),用于表示模型单词之间的位置关系。为了得到不同位置的编码,Transformer 模型使用不同频率的正余弦函数,其中 \(pos\) 表示单词所在的位置,\(2i\) 和 \(2i+1\) 表示位置编码向量中的对应维度,\(d\) 表示对应位置编码的总维度:

PE(pos,2i)=sin( pos10002i/d )      PE(pos,2i+1)=cos( pos10002i/d ) PE(pos, 2i) = sin(\frac{pos}{1000^{2i/d}}) \space\space\space\space\space\space PE(pos,2i+1)=cos(\frac{pos}{1000^{2i/d}})

得到了词嵌入和位置编码后,我们会进入 ** 自注意力 (Self Attention)** 模块。他是 Transformer 模型中的基本操作,在源语言的编码和目标语言的生成中频繁地被使用以建模源语言、目标语言中任意两个单词之间的依赖关系。例如:定义一个由 单词语义嵌入和位置编码叠加 得到的输入表示 \({x_i \in \R^d}^t_{i=1}\),通过三个三个线性变换 \(W^Q \in \R^{d\times d_q}\)、\(W^K \in \R^{d\times d_k}\)、\(W^V \in \R^{d\times d_v}\),可以得到多注意力机制中需要的三个元素:查询 \(q_i\) (Query)、键 \(k_i\) (Key)、值 \(v_i\) (Value),这三个权重反映了在编码当前单词的表示时,针对上下文不通部分所需要的关注程度。序列中不同单词的 \(q、k、v\) 向量又可以拼接成对应矩阵 \(Q \in \R^{L\times d_q}、K \in \R^{L^D_K}、V \in \R^{d\times d_v}\),L 表示序列程度。通过这三个矩阵我们最终可以得到 \(Z \in \R^{L*d_v}\),它就是自注意力操作的输出。具体的公式如下,其中 \(\sqrt{d}\) 是缩放因子:

Z=Attention(Q,K,V)=Softmax( QKTd )V Z = Attention(Q,K,V)=Softmax(\frac{QK^T}{\sqrt{d}})V

为了进一步增强自注意力机制聚合上下文信息的能力,提出了 多头注意力(Multi-head Attention) 机制,换言之,上下文中的每一个单词表示,经过多组线性\({W^Q_jW^K_jW^V_j}^N_{j=1}\) 映射到不同的表示子空间,并在不同的子空间中分别计算并得到不同的上下文相关的单词序列表示\({Z_j}^N_{j=1}\),最终可以综合得到不同子空间中的上下文表示。

再之后我们会来到残差连接 (Add) 和层归一化 (Norm),这一步主要是为了提升训练的稳定性、缓解不稳定和收敛速度慢等问题。具体来说,残差连接主要是使用一条直连通道将对应子层的输入连接到输出上去,从而避免由于网络过深导致的梯度消失问题;层归一化用于将数据平移缩放到均值为 0、方差为 1 的标准分布。

前馈层 (Position-wise FFN)接受了来自自注意力子层的输出,并通过一个带有 \(Relu\) 激活函数的两层全连接网络对输入进行更加复杂的非线性变换。公式如下,其中 \(W_1、b_1、W_2、b_2\) 均是表示前馈子层的参数。前馈子层隐状态的维度一般比自主力层要大。

FFN(x)=Relu(xW1+b1)W2+b2 FFN(x) = Relu(xW_1+b_1)W_2 + b_2

编码器主要是由上面这几部分构成的,解码器端会更复杂一些。解码器的每个 Transformer 快的第一个自注意力子层额外增加了掩码多头注意力 (Masked Multi-Head Attention) 部分。主要原因是,编码器的源语言序列信息是已知的,可以处理上下文语义,但是目的语言序列信息是未知的,对于每一个单词的生成,仅能当前单词之前的语言序列是已知的,即只有上文没有下文。所以额外增加的掩码是用来掩盖后续的文本信息,以防模型在训练阶段看到后续文本序列。

和编码器多头注意力不同的是,解码器的多头注意力 (Multi-Head Attention) 模块使用的是交叉注意力 (Cross-attention) 方法:同时接受编码器的输出和掩码注意力层的输出,即在每个时间 \(t\),根据编码器端输出的源语言文本表示,以及前 \(t-1\) 个时刻生成的目标语言文本,以 自回归 的方式生成当前时刻的目标语言单词。

生成式预训练语言模型 GPT

OpenAI 在 2018 年提出了生成式的预训练语言模型 (Generative Pre-Training, GPT) 是典型的生成式预训练语言模型之一。模型结构是由多层 Transformer 组成的单向语言模型,主要分为输入层、编码层和输出层三部分。

预训练语言模型利用丰富的训练语料、自监督的预训练任务和 Transformer 等深度神经网络结构,使模型具备了通用且强大的自然语言表示能力;应用于下游任务时,只需要微调预训练模型,用具体任务的标注数据进行监督训练,就可以取得显著的性能提升

无监督预训练