语言模型技术演讲综述:从N-gram到BERT
语言模型
语言模型是一种通过学习大量文本数据来理解、生成或预测自然语言的模型。核心目标是学习语言的结构和模式,并根据上下文预测下一个单词或生成合理的文本内容。通俗来讲,就是计算词序列(短语、句子、段落)概率分布的一种模型,这个概率表明了这句话的合理程度,即符合人类语言规则的程度。
用数学语言描述:给定一
语言模型的发展历程可以清晰地划分为三个主要阶段:早期的统计语言模型、随后出现的神经网络语言模型,以及今年来基于Tansformer架构的预训练语言模型。
统计语言模型
利用大型计算机和大规模的文本语料库进行统计建模,分析词语之间的搭配和出现频率,从而推导出词语的概率分布。
基本思想就是计算条件概率,利用条件概率乘法公式的推广,将句子的分布概率
N-gram
引入马尔可夫假设,一阶的马尔可夫模型认为任意一个词
平滑技术
数据稀疏问题:统计语言模型中,训练数据中某些词或短语可能从未出现,或其上下文信息不足,导致模型在估计这些词序列概率时可能出现零概率问题。根据乘法原理,一个词的分布概率为0时,整个句子概率也为0。
平滑技术就时为那些在训练数据中未出现或出现次数极少的单词或短语提供一个非零的概率估计,从而使模型预测更为合理。
加K平滑策略,加1平滑的泛化形式,相当于给每个统计单元与预设一个初始值K
古德-图灵平滑
将出现次数为r的事件的频率,用出现次数为r+1的事件的频率来估计,合理的调整低频事件概率分布
回退平滑
当高阶N-gram数据不足时,回退到低阶来估计概率。下面为K回退的计算公式,结合回退机制和古德-图灵估计,对高低频采取不同的处理方式。
神经网络语言模型
虽然使用平滑技术能够使得统计语言模型正常工作,但仍存在一些问题
只考虑短距离的上下文大幅度简化了计算,但也无法捕捉长距离的语义和语法依赖
随着词汇量和阶数的增加,模型参数规模呈指数级增长。一个词汇量为
的 元语言模型需要 个参数 基于词的表面共现统计,难以捕捉词与词之间的深层语义关系
鉴于上面的问题,人们开始尝试使用神经网络建立语言模型,通过词向量的距离衡量单词之间的相似度,进而避免出现数据稀疏问题。根据神经网络的种类,又可以被分为前馈神经网络语言模型(FFNNLM)和循环神经网络语言模型(RNNLM)
前馈神经网络语言模型
A Neural Probabilistic Language Model该论文提出了一个非常经典的神经网络语言模型,模型的架构图如下

模型拆解
实际上,这个2003年提出的模型非常简单。和N-gram一样,NNLM也假设当前词仅依赖于前N-1个词。总体上看,将
损失函数
模型训练时,需要最大化下列式子。第一部分是最大化给定序列
意义
实验结果表明,这个结构在现在看来非常简单的NNLM模型比平滑处理的三元语言模型表现更好。模型虽然简单,但作为神经网络语言模型的开山之作,让人们意识到了神经网络语言模型的威力,逐渐进入了学界主流。
此外,该模型同时产生了副产品——词向量。
在表示输入层时,用到的映射函数
word2vec Vs FFNNLM
- FFNNLM是完整的语言模型,它的目标是最大化下一个词的预测概率,只是顺带学习了词向量。
- 是剥离出来的词向量学习模块,目标就是学习词向量,利用上下文预测中心词或者中心词预测上下文的形式,不建模完整的概率分布,通过大量的优化使得词向量训练变得高效、可扩展、泛用性强。
word2vec的两个具体模型和优化方法详见文本数据处理方法这篇文章。
循环神经网络
从方法创新的角度上看,从FFNNLM到RNNLM,只是网络结构上的过渡:用RNN/LSTM替换了FFNN。所以,在这里有必要先介绍一下循环神经网络。
RNN
在传统的前馈神经网路中,每个输入与输出之间的关系是独立的,即网络的输入和输出之间没有时间上的依赖关系。然而,在许多现实世界的任务中,数据往往是序列化的,即数据之间存在时间上的顺序关系。比如,NLP中的文本数据、语音识别中的音频数据、股票价格的时间序列数据等,都具有明显的时序性。
为了解决这一问题,循环神经网络RNN出场了。下图是RNN的循环示意图,同时接受当前时刻的输入和上一时刻隐藏状态,再由此计算出当前时刻的隐藏状态,供下一时刻使用

采用
梯度消失
出于减少训练时间或者简化模型的目的,层级之间的权重参数通常是相同的。在从后往前进行反向传播时,随着权重参数以指数形式进行积累,梯度传递到靠前的时间步时可能会变得非常小或者非常大,难以维持有效的学习过程。正是因为梯度消失的问题,RNN难以保持长期依赖性,因为在传播过程中,远期信息相关梯度会在传播过程中消失。
用数学语言描述,损失函数$$ 其中
观察最右边的乘积项,由于这是矩阵和标量导数的乘积,如果:
,则梯度会随着时间步数增长而指数级减小,导致梯度消失; ,则梯度会指数级增长,导致梯度爆炸。
为了解决RNN由于梯度消失造成的难以捕捉长期依赖的问题,长短期记忆网络LSTM出现了。
LSTM
全称为Long Short-Term Memory 长短期记忆网络,引入门控机制控制信息流动,更好的捕捉长期依赖关系。
为了方便理解,我们可以将传统 RNN 中的隐藏状态序列看作一条短期记忆链,它在时间上传递并更新当前的上下文信息。而 LSTM 在此基础上引入了另一条名为“细胞状态”的信息链条,可类比为长期记忆链。
在每个时间步,LSTM 通过门控机制(包括输入门、遗忘门和输出门)对长期记忆链上的信息进行选择性更新,从而实现对长期依赖信息的保留与调整。这两条信息链(隐藏状态与细胞状态)在每个时间步协同作用,实现了对短期与长期信息的有效建模。

其中
如何缓解梯度问题
观察记忆状态更新公式:
GRU
是对传统RNN的改进,旨在缓解长序列训练中常见的梯度消失问题,同时比LSTM结构更简单、计算成本更低。
在GRU中,没有像LSTM新增的长期记忆链,而是直接将细胞状态和隐藏状态合并。此外,将遗忘门和输入门合并为更新门,并且同时充当输入门的作用,同时新增一个”重置门”,控制当前输入与过去隐藏状态的输入融合程度。这种结构设计使GRU在保持信息处理能力的同时,简化了模型,提高计算效率。
分析
GRU 适用于各种需要处理序列数据或时间依赖的任务,尤其在数据量较小或对训练效率要求较高的场景中表现良好。
实际上,LSTM 复杂的原因,除了在结构上天然地克服了梯度消失的问题,更重要的是具有更多的参数来控制模型;通过四倍于RNN的参数量,可以更加精细地预测时间序列变量。
循环神经网络语言模型
论文地址 Recurrent neural network based language model
模型拆解
给定上下文
损失函数
RNNLM的目标是使预测的概率分布
交叉熵损失函数衡量预测分布和真实分布之间的差异。对于单个样本和整个训练数据集,损失函数定义为:
序列到序列模型
序列到序列模型(Seq2Seq)是神经网络语言模型的一种,广泛应用于机器翻译、文本摘要、对话生成等任务。它的核心思想是将一个输入序列编码成一个语义表示,然后再由解码器将这个表示转换为目标序列。这个过程体现了语言模型的本质:根据已有的信息预测合理的语言输出。
用数学语言描述,给定一个源语言序列
Encoder-Decoder
下图为编码器-解码器模型的结构,先对句子

Seq2Seq 最早是基于循环神经网络构建的,即编码器和解码器的核心结构都是RNN,后来演变出使用LSTM、GRU等改进结构来解决长距离依赖的问题。后来,为了提高效果,还加入了注意力机制,并最终发展成Transformer架构,基于注意力机制的序列到序列模型成为主流。
无论使用哪种结构,其本质都是利用神经网络对语言进行建模,因此属于神经网络语言模型的范畴。它相比传统的语言模型更强大,能够处理输入输出长度不等的复杂语言任务。
为了讲清楚Transformer这一架构,我们先从Attention机制开始说起。
Attention
背景
观察上图中Encoder-Decoder结构,可以发现如下问题:
- 编码器将整个输入序列压缩为一个固定长度的上下文向量,可能导致信息丢失,尤其是在处理长序列时。
- 解码器只能依靠单一的上下文向量来生成整个输出序列,缺乏对输入序列中具体位置的关注能力。
Neural Machine Translation by Jointly Learning to Align and Translate Attention机制的开山之作,首次引入Attention机制,旨在解决传统编码器-解码器(Encoder-Decoder)模型在处理长句子时的性能下降问题。作者提出了一种新的神经机器翻译模型,该模型在解码每个词时,通过注意力机制自动对源句子的不同部分进行加权,从而实现对源句子的动态对齐和翻译。这种机制允许模型在生成每个目标词时,关注源句子中最相关的部分,从而提高翻译质量。

Additive Attention
加性注意力机制
输入经过双向RNN编码,得到隐藏状态序列
对每个目标词计算源词的对齐程度,并归一化注意力分数
为前一个时间步的解码器状态,其余为可学习的参数矩阵 计算上下文向量并生成目标词
模型不再压缩为一个固定向量,而是为每个目标词选择性地关注源句的不同部分。
Transformer
背景
尽管引入Attention机制显著提升了模型性能,但当时的架构仍依赖于复杂的递归神经网络。由于RNN在计算上存在时间步之间的依赖,导致模型难以实现并行计算,限制了训练效率。为了解决这一问题,研究者们提出了一种完全基于注意力机制的全新架构 —— Transformer,彻底摒弃了RNN结构,从而显著提升了并行处理能力与训练效率。
Attention Is All You Need Transformer的开山之作,在语言模型的发展史上具有划时代的意义。
在介绍transformer结构之前,我们先讲清楚几个关键技术。
位置编码
由于出于对并行计算效率的考虑,Transformer 模型完全摒弃了传统的循环神经网络(RNN)结构。然而,RNN 通过其递归结构天然地捕获了序列中各个词语的顺序信息,而这类顺序信息在自然语言理解中是至关重要的。如果完全忽略词语的位置信息,模型将无法区分语序不同但词汇相同的句子,从而导致语义理解偏差。
为了解决这一问题,引入了位置编码(Postion Encoding)机制,用以显式地为模型提供每个词在序列中的相对或绝对位置信息。这些位置信息被表示为向量,并与词嵌入(Word Embedding)具有相同的维度,从而可以通过简单的向量加法将两者融合。
思考:为什么可以直接简单相加?
词向量和位置向量记录的是两类本质上完全不同的信息:前者捕捉的是词语的语义信息,而后者则编码词语在序列中的位置信息。尽管我们将它们简单相加作为模型输入,但这一操作背后的合理性目前并没有严格的数学理论支撑。我们只是经验性地认为,在后续深层神经网络的训练过程中,模型可以“自动”从这些融合后的数值中学习出隐含的结构和规律,进而完成有效的语言理解。
这种“结果导向”的思维方式,正体现了近年来人工智能领域的一个重要趋势转变。实际上,从2012年AlexNet以压倒性优势赢得竞赛以来,深度学习模型的设计就逐渐从追求可解释性转向追求性能优先。在这一背景下,模型效果被置于首位,而对模型内部工作机制的可解释性探索则相对被弱化甚至忽略。 ##### 位置编码的计算
Transformer中的位置编码使用
重要性质
观察上述的计算公式,位置编码本身是一个绝对位置信息,但在语言模型中,相对位置也很重要。
总结
Transformer 使用 sin 和 cos 交替编码,是一种无需训练却具有丰富结构的表示方式,它既能保留词的绝对位置信息,又能通过数学结构间接捕捉相对位置关系,从而弥补模型自身结构中缺乏顺序感的缺陷。
Self-Attention
在上文的Attention部分,我们简单介绍了加性注意力进制的基本原理,
流程
对于输入序列
,首先构造 的输入矩阵 , 通过三个随机初始化的大小为
的矩阵 ,这些都是待学习参数。 Q,K,V的形状为 。 使用点积相似度计算注意力分数。
各矩阵的含义
- Q 代表着需要编码的词的信息
- K 代表着句子中其它词的信息,相乘后得到句子中其它词的权重值;
- V 代表着每个位置单词蕴含的语义信息,在被加权求和后作为待编码词的编码。
再与
Multi-head Attention
流程
Mutil-head Attention就是Self-Attention的进阶版,并不是直接利用
设有
至此,Transformer架构中注意力部分的计算的整个流程如下图所示。

意义
多个头用不同的参数训练,让模型在不同的注意力视角下捕捉不同的注意力的语义信息,增强最终表示的丰富性。
Masked
在上文中提到,
意义
防止模型看到未来信息。在序列生成任务时,不应该看到后面的词,否则模型在训练阶段可以利用未来消息进行预测。然而在测试阶段中,后面的词是不会对当前翻译结果产生贡献的。所以为了让训练和测试阶段的行为一致,避免过拟合
Add & Norm
从上图中的结构可以发现,Add & Norm是在每个子层(自注意力子层,前馈子层)之后的一个标准步骤
假设一个子层的输入为
意义
残差连接:帮助训练更深的网络,避免梯度消失;保留原始输入的信息。
最终输出是“原始输入+学习到的偏差”
通过加上原始输出,在反向传播的梯度计算时候留一个恒等项
,即使 很小,仍能保证梯度不完全为0。 层归一化:稳定训练,提高收敛速度;避免不同特征维度的分布不一致。
模型架构
有了上面知识的铺垫,我们再来看论文中Transformer整体框架图。

实际上,在序列到序列模型部分,我们提到Transformer模型也是Seq2Seq模型,从输入输出角度来讲,就是通过Encoder将输入读进去,然后用Decoder得到输出。所以模型可以简化表示成如下形式:

编码部分有若干个Encoder组成,每个Encoder主要由多头注意力进制和前馈神经网络组成;解码部分也由若干Decoder组成,每个Decoder组成和Encoder类似,但多了一层Encoder-Decoder Attention,该层会利用编码部分的输出。接下来,我们继续拆解编码器结构,得到如下图所示的结构,下面依次对Encoder、Decoder、模型输出展开介绍,并模拟整个模型从输入到输出的数据流动

Encoder
- 词向量加上位置向量作为编码器的输入
- 经过多头自注意力进制计算后,得到注意力分数
- 进行残差连接
和层归一化,得到输出 - 经过前馈神经网络层,包括两个线性变换和一个Relu激活函数,
- 再经过Add & Norm得到输出并作为下一个编码器的输入
Decoder
和Encoder过程非常相似,值得注意的是Encoder-Decoder Attention。
并不是一种新的注意力进制,指的是利用Decoder提供的
模型输出
解码器的输出是一个向量,经过liner+Softmax变为单词
liner:简单的全连接网络,把解码器输出投影为一个
softmax:进一步归一化,将分数转化为概率,再根据概率最大的索引查找关联词
模型训练
模型输出的是对每个token的预测向量,对于语言建模任务依然使用交叉熵误差:
基于Trm的预训练语言模型
预训练语言模型
预训练
在深度学习与自然语言处理的交汇点上,“预训练”这一概念彻底改变了我们构建语言模型的方式。预训练本质上是一种知识迁移的范式,其核心思想是让模型在海量未标注文本中自主学习语言的通用规律,而非直接针对特定任务进行训练。具体来说,先在大规模数据集上训练模型,让它学习通用的特征和知识,再将其应用到具体任务中进行进一步训练。这种先验知识的积累使模型摆脱了传统监督学习对标注数据的依赖,为后续任务适配提供了可迁移的知识基础。
预训练模型
预训练模型是预训练这一过程的具象化产物。更具体的说,是经过预训练阶段训练完成、已经掌握了通用语言能力的模型,从而可以用于下游任务。
在文本数据处理方法一文中我提到的词向量迁移学习,本质上也是一种预训练的雏形。因为训练好的词向量是捕获了词的语义和语法关系,这些知识是通用的,可用于文本分类、机器翻译等多种下游任务,无需重新训练。所以,word2vec、Glove可以看作是预训练词向量模型,通过浅层网络学习静态词嵌入,为后续任务提供基础语义单元。
预训练语言模型以自然语言文本数据为训练对象,是预训练技术在自然语言处理领域的具体实现。
使用模式
预训练模型下游使用的方法可以分为几种主要策略
预训练+微调(Fine-tuning)
最主流的方法,在具体下游任务的数据上进一步微调整个模型或部分参数,能最大限度地适应下游任务。
预训练+冻结(Feature Extraction)
模型预训练后参数不变,只把它当作一个“特征提取器”,在上层加一个简单分类器或回归头。特别适合数据量较小或算力有限的情况
参数高效微调(LoRA、Adapter)
不微调整个模型,而是在模型中插入一些轻量模块,只训练这些模块带来的少量新增参数
零样本/少样本学习(Zero-shot/Few-shot)
直接利用模型的泛化能力,无需额外微调。通过设计提示词(Prompt)进行任务引导,模型不更新参数
ELMo
全称Embeddings from Language Models,在论文Deep contextualized word representations中首次提出,该论文也是NAACL在2018年度的最佳论文。
ELMO是一种经典的预训练语言模型,具体地说,是一种基于双向LSTM的语言模型。标志着自然语言处理领域从静态词嵌入向上下文相关词表示的重要转折点。与传统的词向量不同,ELMO能根据上下文动态地为同一个词生成不同的向量表示。
结构

核心思想是利用一个双向语言模型BiLM,分别从前向和后向理解文本内容,从而生成上下文相关词向量。
在传统的前向语言模型中,模型通过给定前文来预测当前词:
词向量生成
对于L层的双向语言模型,每个单词一共有
面对这么多向量,最简单的方法是直接利用顶层
局限性
首次证明上下文相关词嵌入能显著提升下游任务性能。预训练的ELMo模型可直接作为特征提取器,无需从头训练。但是依然一些局限性:
- 基于LSTM,无法实现并行计算。
- 无法同时利用上下文,只是将输入分别送给两个模型并最大化总和概率。
- 依赖任务特定模式,需为每个任务单独设计模型,在词向量生成公式也可以看出,各任务的权重参数不同。
发展
Transformer架构的引入为预训练语言模型提供了新路径。其自注意力机制打破了循环神经网络对序列的依赖,能够并行处理输入序列并动态建模长程依赖关系,大幅提升了模型的表达能力和训练效率。在此基础上,也衍生出了BERT和GPT两种典型模型,分别代表了两种不同的预训练范式。在本篇中主要介绍在自然处理任务上使用较为广泛的BETR模型,其余模型待续…
BERT 模型
介绍
全称Bidirectional Encoder Representations from Transformers,在论文BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding中首次提出。
可以作为自然语言处理领域里程碑式的工作,同时还是近年来优秀预训练语言模型的集大成者。BERT的意义在于,从大量无标记数据集中训练得到的深度模型,可以显著提高各项自然语言处理任务的准确率。
- 借鉴ELMO模型的双向编码
- 借鉴GPT用trm作为特征提取器的思路
- 借鉴word2vec中CBOW方法
结构
简单的说,模型的结构就是双向连接的多个Encoder组成。从形式上看,BERT之于Transformer就像Word2Vec之于FFNNLM,都是改变了后者的训练目标,剥离出了一部分得到一个专门的预训练模型。

模型训练
BERT的训练过程是主要分为两个阶段:预训练和微调。预训练是BERT的核心阶段,基于Trm的Encoder结构,采用自监督学习的方式,用语言掩码模型(MLM)方法训练词的语义理解能力;用下句预测(NSP)方法训练句子之间的理解能力,从而更好地支持下游任务。除了输出层之后,微调和预训练使用相同的架构,相同的预训练模型参数用于初始化不同下游任务的模型。在微调过程中,所有参数都会进行微调。

语言掩码模型
借鉴完形填空任务和CBOW的思想,使用MLM方法训练模型。MLM方法简单来说就是随机去掉句子中的部分单词,再让模型来预测被去掉的单词。其中,被去掉的词称为掩码词。在CBOW中,每个词都会作为被预测的中心词,在MLM中则是随机选择15%的词进行掩码。
考虑到在模型微调训练阶段或模型推理阶段,输入的文本中将没有[MASK],进而导致产生由训练和预测数据偏差导致的性能损失的的问题,BERT并没有将所有的掩码词替换为[MASK],而是按照一定比例进行三类替换选项:
- 80% 替换为[MASK]
- 10% 替换为随机词
- 10% 保持不变
编码器不知道那些词是需要被预测的,哪些词是错误的,被迫需要学习每个token的表示向量。这样也得以让模型通过双向上下文学习词的深层语义表示,捕捉词与词之间的复杂关系。
下一句预测
在很多自然语言处理的下游任务中,如问答和自然语言推断,都基于两个句子做逻辑推理,而语言模型并不具备直接捕获句子之间的语义联系的能力,为了学会捕捉句子之间的语义联系,BERT 采用了下句预测作为无监督预训练的一部分。
NSP的训练任务可以描述为,给定两个子句A,B,模型需要判断B是否是A的子句。具体做法是,输入的句子将由两个语句组成,其中,50% 的概率将语义连贯的两个连续句子作为训练文本;另外 50% 的概率将完全随机抽取两个句子作为训练文本。
输入格式为[CLS]<句子A>[SEP]<句子B>[SEP],通过训练[CLS]编码后的输出标签,BERT
可以学会捕捉两个输入句对的文本语义。
输入表示
为了使BERT能够处理各种下游任务,我们的输入表示法能够在一个标记序列中明确表示一个句子和一对句子。在论文中,句子可以是任意跨度的连续文本,而不是实际的语言句子。序列指的是BERT的输入标记序列,可以是一个句子,也可以是两个句子。
首先将每个词转化为WordPiece分词,并且第一个标记总是特殊分类标记[CLS],然后再如下图所示从上到下依次添加词嵌入、片段分割嵌入和位置嵌入。
- Token embed:词嵌入,onre-hot词表映射编码
- Segement embed:分割嵌入,当输入为句子对时,将前一个句子赋值为0,后一个句子赋值为1;只有一个句子则全是0。
- Position embed:位置嵌入,不同与Trm用三角函数表示,是在与预训练过程中训练得到。

微调-下游任务改造

句对分类
给定两个句子,判断它们的关系,称为句对分类,例如判断句对是否相似、判断后者是否为前者的答案。
如上图a所示,句对用[SEP]分隔符拼接成文本序列,在句首加入标签[CLS],将句首标签所对应的输出值作为分类标签,计算预测分类标签与真实分类标签的交叉熵,将其作为优化目标,在任务数据上进行微调训练。
二分类任务:不需要对输入输出作任何改动,直接利用NSP的训练方法即可。
多分类任务:在[CLS]的输出特征向量的后面接上liner+Softmax,保证输出维数和类别数目一致,最后通过argmax操作得到类别结果。
单句分类
给定一个句子,判断该句子的类别,统称为单句分类,例如判断情感类别、判断是否为语义连贯的句子。
如上图b所示,单句分类在句首加入标签 [CLS],将句首标签所对应的输出值作为分类标签,计算预测分类标签与真实分类标签的交叉熵,将其作为优化目标,在任务数据上进行微调训练。
实际上,只有输入与句对分类拜托你,这里不再赘述。
文本问答
给定一个问句和蕴含答案的句子,找出答案在后句中的位置,称为文本问答。
为了标注答案的起始位置和终止位置,引入两个辅助变量
文本回答任务的微调训练使用了两个技巧:
- 用全连接层把 BERT 提取后的深层特征向量转化为用于判断答案位置的特征向量
- 引入辅助向量 s 和 e 作为答案其实位置和终止位置的基准向量,明确优化目标的方向和度量方法
单句标注
给定一个句子,标注每个次的标签,称为单句标注。
单句标注任务和 BERT 预训练任务具有较大差异,但与文本问答任务较为相似。如上图d所示,同时是在每个输入词得到的最终语义向量之后添加全连接层,将语义特征转化为序列标注任务所需的特征,单句标注任务需要对每个词都做标注,因此不需要引入辅助向量,直接对经过全连接层后的结果做Softmax操作,即可得到各类标签的概率分布。

