1.大模型基础

1.1 什么是语言模型

在自然语言处理领域,语言模型(LM)的经典定义是一种对词符(token)序列的概率分布。例如,假设我们有一个词符集的词汇表 V V V。语言模型 p p p 为每个词符序列 x 1 , x 2 , … , x L ∈ V x_1, x_2, \dots, x_L\in V x1,x2,,xLV 分配一个概率:

p ( x 1 , x 2 , … , x L ) p(x_1, x_2, \dots, x_L) p(x1,x2,,xL)

这个概率可以直观地告诉我们当前给定的词符序列有多“好(good)”,也就是当前这个词符序列基于以往的训练数据看有多契合。由于语言模型通常采用监督训练的方式进行数据驱动式的训练,因此,它所能回答我们的仅仅是当前给定的序列在以往训练数据中出现的可能性有多少。同时,由于训练数据其实是人类产生的,因此,这个可能性也标志着模型认为这个词符序列的自然程度。

从数学角度来看,语言模型是一种既简洁又精妙的构造。然而,这种看似简单的外表下隐藏着复杂的真相:为所有可能的序列分配一个合理的概率,这一过程实际上需要语言模型具备非同一般的、隐性的语言理解和广泛的世界知识。因为判断一个词符序列(或者说一个句子)是否自然或者合理,语言模型不仅要从语法角度进行判断,还要具备从语义上判断给定的词符序列(或者句子)所描述的内容是否符合常识或者符合人类的知识。基于我的理解,语义意义上的判断实际上是通过语言模型建立词符序列中词符与词符之间的语义关系实现的。从这个角度看,语言模型关注的就不仅是从词符序列到概率的映射,还需要关注词符序列内部的顺序及关联关系。这可能就是为何Transformer架构能够在自然语言问题上有如此非凡的表现。它通过建立多层堆叠的Attention Block,一方面从输入输出上建立了词符序列到概率(也包括概率序列)的映射,另一方面,用Attention处理输入的词符序列,建立了词符序列内部的顺序关系及关联关系。

语言模型不仅仅是评估句子的工具,也可以用于生成全新的文本。这其实也不是很难想象,其本质就是基于给入的词符序列,迭代预测下一个词符的分布,也就是

p ( x n + 1 ∣ x 1 , x 2 , … , x n ) p(x_{n+1}|x_1, x_2, \dots, x_n) p(xn+1x1,x2,,xn)

通过不断的迭代实现新文本的生成。当然,实际上这个概率分布是需要语言模型给出的,而这个模型则是需要通过对其参数进行训练才能给出较为合理的概率分布。

然而,这个训练过程并非总是那么直截了当。实际上,有时候,我们想要的是一个更符合特定标准或目的的“最佳”句子。比如,生成一条新闻标题或者一首诗。在这样的场景下,我们的需求可能会优先考虑更有意义、更吸引人。因此,在实际应用时,我们通常会引入各种技巧和方法,确保生成的文本不仅随机和多样,而且有意义、有目的,并且符合用户的特定需求。

自回归语言模型

根据上文内容预测下一个可能跟随的单词,就是常说的自左向右的语言模型任务,或者反过来根据下文预测前面的单词。这种类型的LMs(Language Models)被称为自回归语言模型(AutoRegressive Large Language Models, ARLLMs)。当下大火的GPT 就是典型的自回归语言模型。自回归语言模型的核心思想是利用已知的词符序列(单词序列)来预测接下来的词符(单词)。

自回归语言模型的原理主要是基于概率链式法则(Chain rule of probability),即

p ( x 1 : L ) = p ( x 1 ) p ( x 2 ∣ x 1 ) p ( x 3 ∣ x 1 , x 2 ) ⋯ p ( x L ∣ x 1 , x 2 , … , x L − 1 ) = p ( x 1 ) p ( x 2 ∣ x 1 ) p ( x 3 ∣ x 1 , x 2 ) ⋯ p ( x L ∣ x 1 : L − 1 ) = ∏ i = 1 L p ( x i ∣ x 1 : i ) \begin{align} p(x_{1:L}) & = p(x_1)p(x_2|x_1)p(x_3|x_1,x_2)\cdots p(x_L|x_1,x_2,\dots,x_{L-1}) \nonumber \\ & = p(x_1)p(x_2|x_1)p(x_3|x_1,x_2)\cdots p(x_L|x_{1:L-1}) \nonumber \\ & = \prod_{i=1}^{L} p(x_i|x_{1:i}) \nonumber \end{align} p(x1:L)=p(x1)p(x2x1)p(x3x1,x2)p(xLx1,x2,,xL1)=p(x1)p(x2x1)p(x3x1,x2)p(xLx1:L1)=i=1Lp(xix1:i)

上述这个结构实际上也就是自回归语言模型的核心了。在使用GPT时,我们通常会被限制输入的上下文长度(也就是Context的长度),这主要就是因为每次GPT生成一个新的词符(单词),都需要以前面所有的词符序列(单词序列)为先验,即 p ( x L ∣ x 1 : L − 1 ) p(x_L|x_{1:L-1}) p(xLx1:L1),也就是以前面全部的词符序列(单词序列)作为神经网络的输入。而由于神经网络的输入是固定的,或者说最大长度是有限的,因此,其所能作为上下文的词符序列(单词序列)长度也就是有限的了。

基于上述概率链式法则,在自回归语言模型中生成整个序列 x 1 : L x_{1:L} x1:L,我们需要一次生成一个词符,该词符基于之前生成的词符进行计算获得:

x i ∼ p ( x i ∣ x 1 : i ) 1 / T , ∀ i ∈ 1 , 2 , … , L x_i \sim p(x_i|x_{1:i})^{1/T}, \quad \forall i\in {1,2,\dots,L} xip(xix1:i)1/T,i1,2,,L

其中 T ≥ 0 T\geq 0 T0 是一个控制语言模型中随机性的温度参数:

  • T = 0 T=0 T=0:确定性地在每个位置 i i i 选择最可能的词符 x i x_{i} xi

  • T = 1 T=1 T=1:从纯语言模型“正常(normally)”采样

  • T = ∞ T=\infty T=:从整个词汇表上的均匀分布中采样。

在进行上述操作处理后,我们还需要通过重新标准化分布来使得概率的加和为1,即保证计算得到的值是有概率意义的。最终,我们将标准化版本

p T ( x i ∣ x 1 : i ) ∝ p ( x i ∣ x 1 : i ) 1 / T p_T(x_i|x_{1:i}) \propto p(x_i|x_{1:i})^{1/T} pT(xix1:i)p(xix1:i)1/T

称为退火条件概率分布( Annealed Conditional Probability Distribution)。注意:对于每一步的条件概率分布应用温度参数T,并进行迭代采样,这种方法并不等同于(除非 T=1 )从整个长度为 L 的序列的"退火"分布中一次性采样。 也就是说(迭代方法)在每次生成下一个词符的时候都使用温度参数和重新标准化来处理概率

p T ( x i ∣ x 1 : i ) = p ( x i ∣ x 1 : i ) 1 / T Z i p T ( x 1 : L ) = ∏ i = 1 L p T ( x i ∣ x 1 : i ) = ∏ i = 1 L p ( x i ∣ x 1 : i ) 1 / T Z i \begin{align} p_T(x_i|x_{1:i}) & = \frac{p(x_i|x_{1:i})^{1/T}}{Z_i} \nonumber \\ p_T(x_{1:L}) & = \prod_{i=1}^{L} p_T(x_i|x_{1:i}) \nonumber \\ & = \prod_{i=1}^{L} \frac{p(x_i|x_{1:i})^{1/T}}{Z_i} \nonumber \end{align} pT(xix1:i)pT(x1:L)=Zip(xix1:i)1/T=i=1LpT(xix1:i)=i=1LZip(xix1:i)1/T

是不同于(一次性采样方法)对整个词符序列进行采样

p T ( x 1 : L ) = p ( x 1 : L ) 1 / T Z = ( ∏ i = 1 L p ( x i ∣ x 1 : i ) ) 1 / T Z = ∏ i = 1 L p ( x i ∣ x 1 : i ) 1 / T Z \begin{align} p_T(x_{1:L}) & = \frac{p(x_{1:L})^{1/T}}{Z} \nonumber \\ & = \frac{\left(\prod_{i=1}^{L} p(x_i|x_{1:i})\right)^{1/T}}{Z} \nonumber \\ & = \frac{\prod_{i=1}^{L} p(x_i|x_{1:i})^{1/T}}{Z} \nonumber \end{align} pT(x1:L)=Zp(x1:L)1/T=Z(i=1Lp(xix1:i))1/T=Zi=1Lp(xix1:i)1/T

在GPT出现后,自回归语言模型呈现出了强大的文本处理能力,但从其基本原理出发,自回归语言模型的也有其优势与劣势,需要基于具体任务进行选择使用。

  • 优点:自回归语言模型擅长生成式NLP任务。自回归语言模型使用注意力机制,预测下一个词符,因此自然适用于文本生成。此外,自回归语言模型可以简单地将训练目标设置为预测语料库中的下一个词符,因此生成数据相对容易。
  • 缺点:自回归语言模型只能用于前向或者后向建模,不能同时使用双向的上下文信息,不能完全捕捉词符的内在联系。

1.2 大模型相关历史回顾

1.2.1 信息理论

语言模型的发展可以追溯到克劳德·香农,他在1948年的具有里程碑意义的论文《通信的数学理论》中奠定了信息理论的基础。在这篇论文中,他引入了用于度量概率分布的熵(Entropy)的概念:

H ( p ) = ∑ x p ( x ) l o g 1 p ( x ) H(p) = \sum_x p(x)log\frac{1}{p(x)} H(p)=xp(x)logp(x)1

熵实际上是一个衡量将样本 x ∼ p x∼p xp 编码成比特串所需要的预期比特数的度量。熵值越小,说明序列的结构性越强,编码的长度越短。直观地理解, l o g 1 p ( x ) log\frac{1}{p(x)} logp(x)1 可以理解为出现概率为 p ( x ) p(x) p(x)的元素 x x x的编码长度。这个长度是一个极限值,也就是香农极限(Shannon limit)。实际上,达到这个极限是非常具有挑战性的(例如,低密度奇偶校验码),这也是编码理论研究的主题之一。

1.2.2 N-gram模型

语言模型最早被用于需要生成文本的实践应用包括语音识别任务与机器翻译任务等。在这两个任务中,人们所设计的系统均使用了基于词的N-gram语言模型(最早由香农引入,但针对的是字符)。

N-Gram是一种基于统计语言模型的算法。它的基本思想是将文本里面的内容按照字节进行大小为N的滑动窗口操作,形成了长度是N的字节片段序列。每一个字节片段称为gram,对所有gram的出现频度进行统计,并且按照事先设定好的阈值进行过滤,形成关键gram列表,也就是这个文本的向量特征空间,列表中的每一种gram就是一个特征向量维度。

在该模型的假设中,第N个词的出现只与前面N-1个词相关,而与其它任何词都不相关,如

p ( x i ∣ x 1 : i ) = p ( x i ∣ x i − ( N − 1 ) : i − 1 ) p(x_i|x_{1:i}) = p(x_i|x_{i-(N-1):i-1}) p(xix1:i)=p(xixi(N1):i1)

整句的概率就是各个词出现概率的乘积。这些概率是基于各种N-gram在大量文本中出现的次数计算的,并且适当地平滑以避免过拟合。常用的是二元的Bi-Gram和三元的Tri-Gram。然而,n-gram模型有其根本的限制,如果N太小,那么模型将无法捕获长距离的依赖关系,下一个词将无法依赖于𝖲𝗍𝖺𝗇𝖿𝗈𝗋𝖽。然而,如果N太大,统计上将无法得到概率的好估计。因此,相比于局部依赖关系分析,长距离关联依赖的建立需求更为困难。

1.2.3 神经网络语言模型

为应对上述困难,Bengio等人在2003年首次提出了神经语言模型,将神经网络首次引入到语言模型,为语言模型的能力带来了大幅提升和更多可能性。

自2003年以来,神经语言建模的两个关键发展包括:

  • Recurrent Neural Networks(RNNs),包括长短期记忆(LSTMs),使得一个词符 x i x_{i} xi的条件分布可以依赖于整个上下文,但这些模型难以训练。
  • Transformers是一个较新的架构(于2017年为机器翻译开发),再次返回固定上下文长度n,但更易于训练,且更加高效(利用了GPU的并行性)。

事实上,基于神经网络的语言模型尽管在上下文长度上仍然受到限制,但采用更大的N值在理论上是可行的。

1.2.4 大语言模型

近年来,随着GPT-4等模型的不断涌现,上下文的长度也在持续扩展,达到数以万计的词符,逐渐成为语言模型的主流方法。伴随着上下文长度的扩展,模型规模也持续上升,模型的能力也呈现出非线性增长(即所谓”涌现“),甚至出现”the bigger the better“的“仅仅扩大规模”就能产生新的出现行为,从而带来定性上不同的能力和定性上不同的社会影响。因此,大语言模型,作为一种新的模式与范式,作为人工智能又一个里程碑,值得深入研究与探讨。

参考资料

【1】第一章:大模型基础 · datawhalechina/so-large-lm Wiki · GitHub

【2】一文读懂GPT家族和BERT的底层区别——自回归和自编码语言模型详解 - 知乎 (zhihu.com)

【3】NLP:自回归(Autoregressive LM)与自编码语言模型(Autoencoder LM)_nlp自回归语言模型-CSDN博客

【4】自然语言处理中N-Gram模型介绍 - 知乎 (zhihu.com)

【5】Introduction | CS324 (stanford-cs324.github.io)

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐