1. 什么是语言模型

介绍语言模型的定义、基本原理及概率分布

语言模型的定义

  • 语言模型(LM)是一种对令牌序列(token)的概率分布

  • 假设有一个令牌集的词汇表 $V$ ,语言模型 $p$ 为每个令牌序列 $x_{1},…,x_{L}$ ∈ $V$ 分配一个概率(介于 0 和 1 之间的数字):

    p(x1,,xL)p(x_1, \dots, x_L)
  • 这个概率直观地告诉我们一个标记序列有多“好(good)”

  • 例如,如果词汇表为{ate, ball, cheese, mouse, the},语言模型可能会分配以下概率:

    p(the, mouse, ate, the, cheese)=0.02,p(the, cheese ate, the, mouse)=0.01,p(mouse, the, the, cheese, ate)=0.0001p(\text{the, mouse, ate, the, cheese}) = 0.02,\\ p(\text{the, cheese ate, the, mouse}) = 0.01,\\ p(\text{mouse, the, the, cheese, ate}) = 0.0001
  • 在这个例子中,语言模型应该隐含地赋予"𝗆𝗈𝗎𝗌𝖾 𝗍𝗁𝖾 𝗍𝗁𝖾 𝖼𝗁𝖾𝖾𝗌𝖾 𝖺𝗍𝖾"一个非常低的概率,因为它在语法上是不正确的

  • 同时应该隐含地赋予"𝗍𝗁𝖾 𝗆𝗈𝗎𝗌𝖾 𝖺𝗍𝖾 𝗍𝗁𝖾 𝖼𝗁𝖾𝖾𝗌𝖾"比"𝗍𝗁𝖾 𝖼𝗁𝖾𝖾𝗌𝖾 𝖺𝗍𝖾 𝗍𝗁𝖾 𝗆𝗈𝗎𝗌𝖾"更高的概率,这是因为两个句子在句法上是相同的,但在语义上却存在差异

  • 综上,语言模型需要具备的能力

    • 判断语法 → 需要语法知识

    • 要判断语义 → 需要世界知识

    • 预测下一词 → 需要语言模式

    • 生成句子 → 需要组合语言表达

  • 所以 LM 的能力不是显式写出来的,而是通过数据学习出的隐式知识

  • 语言模型也可以用于生成任务,最纯粹的方法是从语言模型 $p$ 中以概率 $p(x_{1:L})$ 进行采样,表示为:

    x1:Lp.x_{1:L}∼p.
  • 语言模型的生成不是一次性输出整句,而是:逐 token 生成,每一步根据前面的 token 决定下一个 token 概率

自回归语言模型

  • 为了让 LM 能真正生成句子,我们把“整个句子的概率”拆成“逐步预测的条件概率”

  • 通过概率的链式法则,得出序列 $x_{1:L}$ 的联合分布 $p(x_{1:L})$

    p(x1:L)=p(x1)p(x2x1)p(x3x1,x2)p(xLx1:L1)=i=1Lp(xix1:i1)p(x_{1:L}) = p(x_1) p(x_2 \mid x_1) p(x_3 \mid x_1, x_2) \cdots p(x_L \mid x_{1:L-1}) = \prod_{i=1}^L p(x_i \mid x_{1:i-1})
  • 例如:

    p(the,mouse,ate,the,cheese)=p(the)p(mousethe)p(atethe,mouse)p(thethe,mouse,ate)p(cheesethe,mouse,ate,the).\begin{align*} p({the}, {mouse}, {ate}, {the}, {cheese}) = \, & p({the}) \\ & p({mouse} \mid {the}) \\ & p({ate} \mid {the}, {mouse}) \\ & p({the} \mid {the}, {mouse}, {ate}) \\ & p({cheese} \mid {the}, {mouse}, {ate}, {the}). \end{align*}
  • 由此可得,自回归语言模型的特点是只负责一步步预测下一个 token 的概率,$p(x_{i}∣x_{1:i−1})$ 给出了给定前面的记号 $x_{1:i−1}$ 后,下一个记号 $x_{i}$ 的条件概率分布,也即:

    xip(xix1:i1)1T, for i=1,,L\begin{align} x_i \sim p\left(x_i \mid x_{1: i-1}\right)^{\frac{1}{T}},\quad \text { for } i =1, \ldots, L \end{align}
    • 其中 $T≥0$ 是一个控制希望从语言模型中得到多少随机性的温度参数

    • $T=0$:选最高概率的 token(完全确定)

    • $T=1$:按模型原概率采样(正常)

    • $T=\infty$:完全随机

  • 在上述操作中,还需要重新进行标准化分布,即退火条件概率分布

    pT(xix1:i1)p(xix1:i1)1TpT(x)p(x)1T\begin{align} p_{T}(x_{i}∣x_{1:i−1})&\propto p(x_{i}∣x_{1:i−1})^{\frac{1}{T}}\\ \longrightarrow\quad p_T(x)&\propto p(x)^{\frac{1}{T}} \end{align}
  • 示例如下:

    p( cheese )=0.4,p( mouse )=0.6pT=0.5( cheese )=0.31,pT=0.5 (mouse )=0.69pT=0.2 (cheese )=0.12,pT=0.2 (mouse) =0.88pT=0 (cheese )=0,pT=0 (mouse )=1\begin{array}{cl} p(\text { cheese })=0.4, & p(\text { mouse })=0.6 \\ p_{T=0.5}(\text { cheese })=0.31, & \left.p_{T=0.5} \text { (mouse }\right)=0.69 \\ \left.p_{T=0.2} \text { (cheese }\right)=0.12, & p_{T=0.2} \text { (mouse) }=0.88 \\ \left.p_{T=0} \text { (cheese }\right)=0, & \left.p_{T=0} \text { (mouse }\right)=1 \end{array}
  • 具体来说,这个温度参数会应用于每一步的条件概率分布 $p(x_{i}∣x_{1:i−1})$ ,将其幂变为 $\frac{1}{T}$

  • 这意味着当$T$值较高时,我们会获得更平均的概率分布,生成的结果更具随机性;反之,当 $T$ 值较低时,模型会更倾向于生成概率较高的令牌

  • “逐步退火采样” 和 “对整个序列退火” 不一样

    • 对于每一步的条件概率分布应用温度参数 $T$ ,并进行迭代采样,这种方法并不等同于(除非 $T=1$ )从整个长度为 L 的序列的"退火"分布中一次性采样

    • "退火"这个术语来源于冶金学,其中热的金属会逐渐冷却以改变其物理性质;在这里,它类比的是对概率分布进行调整的过程

    • "退火"分布是通过将原始概率分布的每个元素都取幂 $1/T$ ,然后重新标准化得到的新分布

    • 当 $T ≠ 1$​ 时,这个过程会改变原始概率分布,因此从"退火"分布中采样得到的结果可能与对每一步的条件分布应用 T 并进行迭代采样的结果不同

    • 简单些,可以这样理解:逐步退火 = 每次投骰子时换骰子硬度;整体退火 = 不管怎么骰,最后根据整条路径的概率再加热/冷却

  • 非自回归的条件生成:可以通过指定某个前缀序列 $x_{1:i}$ (称为 Prompt )并采样其余的 $x_{i+1:L}$ (称为 Completion )来进行条件生成

    • 例如,当 $T=0$ 时产生:

      the,mouse,atepromptT=0the,cheesecompletion\underbrace{{the}, {mouse}, {ate}}_\text{prompt} \stackrel{T=0}{\leadsto} \underbrace{{the}, {cheese}}_\text{completion}
    • 如果将温度改为 $T=1$ ,可以得到更多的多样性,例如,"its house" 和 "my homework"

    • 由此,条件生成解锁了语言模型通过简单地更改提示就能解决各种任务的能力

  • 香农提出了用于度量概率分布的熵(Entropy) 的概念:

    H(p)=xp(x)log1p(x)H(p) = \sum_x p(x) \log \frac{1}{p(x)}
  • 熵的定义

    • 熵实际上是一个衡量将样本 $x∼p$ 编码(即压缩)成比特串所需要的预期比特数的度量

    • 举例来说,"the mouse ate the cheese" 可能会被编码成 "0001110101"

    • 为了使用尽可能小的比特数来编码样本,那么常见的事件($p$ 大)需要更少比特来编码,而罕见的事件($p$ 小)需要更多比特来编码

    • 因此,直观地理解,$\log \frac{1}{p(x)}$ 可以视为用于表示出现概率为 $p(x)$ 的元素 $x$ 的编码的长度

    • 例如,“the” 很常见 → p(“the”) 大 → log(1/p) 小,而奇怪的词 → p 小 → 编码长

  • 熵代表了结构化程度

    • 显然,熵越小 → 分布越结构化 → 越容易压缩

    • 例如,全是“aaaaaa” → 极其结构化 → 熵非常低,而全随机字符串 → 结构性弱 → 熵非常高

    • 语言显然不是随机的,因此语言的熵远低于随机字符序列

    • 实际上达到香农极限(Shannon limit)是非常具有挑战性的(例如,低密度奇偶校验码),这也是编码理论研究的主题之一

  • 香农还定义了交叉熵:

    H(p,q)=xp(x)logq(x)H(p, q)=-\sum_x p(x) \log q(x)
  • 交叉熵的定义

    • 交叉熵定义了用模型 $q$ 给出的概率(即编码方案)来编码来自真实分布 $p$ 的样本,需要多少比特?

    • 通常而言,$p$ 是真实世界的分布(英语、大量文本),而 $q$ 是我们训练出的语言模型

    • 判断模型好坏的指标就是交叉熵:$q$ 越接近 $p$ → 交叉熵越小,而如果 $q$ 很差 → 交叉熵很大,这是训练语言模型最核心的损失函数

  • 交叉熵与熵的关系

    • 交叉熵 ≥ 熵(永远成立),即:

      H(p,q)H(p)H(p,q) \ge H(p)
    • 这意味着,用模型 $q$ 去近似真实分布 $p$,永远无法比真正的 $p$ 本身编码更省比特;$q$ 越差,浪费的比特越多;$q$ 越接近 $p$,$H(p,q)$ 越逼近真实熵 $H(p)$,所以交叉熵 $H(p,q)$ 是熵 $H(p)$ 的可计算上界

    • 这里,$p$ 是“自然语言分布”,这是一个无法精确写出的分布。我们只有大量文本,但不知道真实概率 $p(x)$

    • 所以只能通过构建更好的模型 $q$ 来得到熵 $H(p)$ 的更好的估计,这个好坏程度由 $H(p,q)$ 衡量

香农游戏

  • 香农在 1951 年提出了一个惊人的方法:用人类充当语言模型 $q$

  • 例如对于以下句子:

    the mouse ate my ho_\text{the mouse ate my ho\_}
  • 任务:让人类猜下一字母是什么,但人类不会给概率分布 $q(x)$(人类不会说“下一字符是 e 的概率是 0.65”)

  • 所以香农设计了一个技巧:用“猜测次数”估计概率。规则是:人类不断猜字母,直到猜中为止,记下猜了几次。例如,下一字符是 “u”,如果人类猜测顺序,猜了 3 次:

    eoue → 错\\ o → 错\\ u → 对
  • 香农认为:“需要猜 3 次” 等价于 “这个字母的概率大概是 1/3”,因此可以数学近似:

    q(x)1guess countq(x) \approx \frac{1}{\text{guess count}}
  • 从而可以计算得到交叉熵:

    H(p,q)=xp(x)logq(x)H(p,q)=-\sum_x p(x) \log q(x)
  • 在香农游戏中,香农没有语言模型、没有 GPU、没有深度学习,但他通过这种方法估计了英文熵

  • 当时他得到英文熵大约:1.0–1.5 bits/character(字符级);~8–10 bits/word(词级),而这一估计今天仍被认为非常准确

N-Gram 模型

  • 语言模型最早不是为了聊天、写文章、生成文本,而是为了纠错和消除歧义,用于:

    • 1970 年代的语音识别(输入:声音信号,输出:文本)

    • 1990 年代的机器翻译(输入:源语言的文本,输出:目标语言的文本)

  • 噪声信道模型

    • 当时解决这些任务的主要模型是噪声信道模型,这个模型是统计 NLP 的核心思想:真实文本 → 受到某种噪声影响 → 我们观察到的内容

    • 以语音识别为例:文本是“隐藏的真实变量”,语音是带噪声的观察值,而我们希望从语音推断文本,贝叶斯公式如下:

      p(textspeech)p(text)language modelp(speechtext)acoustic modelp(\text{text} \mid \text{speech}) \propto \underbrace{p(\text{text})}_\text{language model} \underbrace{p(\text{speech} \mid \text{text})}_\text{acoustic model}
    • 其含义是,声学模型产生候选文本 → 语言模型从中挑选最像英语的那个

  • N-Gram 模型

    • 香农引入基于词的 n-gram 语言模型,在一个 n-gram 模型中,只用最近的 n-1 个词预测下一个词(马尔可夫假设):

      p(xix1:i1)=p(xixi(n1):i1)p(x_i \mid x_{1:i-1}) = p(x_i \mid x_{i-(n-1):i-1})
    • 例如,一个 tri-gram(n=3)模型会定义:

      p(cheesethe,mouse,ate,the)=p(cheeseate,the)p(\text{cheese}\vert\text{the},\text{mouse},\text{ate},\text{the})=p(\text{cheese}\vert\text{ate},\text{the})
    • 然而,它完全忽略了更开头的 “the mouse”(任何更长距离的语义关系)

    • 这些概率完全基于统计计数,用频率计算概率,再用各种平滑方法(如 Kneser-Ney)避免 0 概率,因为非常简单,可以在超大规模语料上训练

    • 例如,Brants 等人(2007)arrow-up-right在 2 万亿个 tokens 上训练了一个 5-gram 模型用于机器翻译

    • 相比之下,GPT-3 只在 3000 亿个 tokens 上进行了训练

  • 可见,n-gram 模型有其根本的限制

    • 想象以下的前缀:

      Stanford has a new course on large language models. It will be taught by _\text{Stanford has a new course on large language models. It will be taught by \_}
    • 如果 n 太小,那么模型将无法捕获长距离的依赖关系,下一个词将无法依赖于 𝖲𝗍𝖺𝗇𝖿𝗈𝗋𝖽

    • 如果 n 太大,那么数据过于稀疏(即使在“大”语料库中,几乎所有合理的长序列都出现 0 次):

count(Stanford, has, a, new, course, on, large, language, models) = 0\text{count(Stanford, has, a, new, course, on, large, language, models) = 0}
  • 因此,早期的语言模型只能解决局部依赖关系很强的任务

    • 如语音识别中的声音信号 → 通常包含丰富的上下文信息,n-gram 只要捕获本地结构就足够

    • 统计机器翻译中源语言本身限制了目标语言的结构 → 不需要理解长距离逻辑

神经网络语言模型

  • 语言模型的一个重要进步是引入神经网络

  • Bengio 等人arrow-up-right在 2003 年首次提出了神经语言模型,核心公式:

    p(xixi(n1):i1)=NN(xi(n1),,xi1)p(x_i | x_{i-(n-1):i-1}) = \text{NN}(x_{i-(n-1)},\cdots, x_{i-1})
  • 其与 n-gram 核心区别如下:

    部分
    n-gram
    Bengio 神经 LM

    上下文长度

    固定 n−1

    固定 n−1,但可以扩大(如 n=10)

    参数估计方式

    基于计数

    基于神经网络 → 分布“共享统计”

    语义表达能力

    仅基于局部频率

    学习词向量 + 连续空间结构

    统计泛化能力

    差(未见过的 n-gram 概率=0)

    强(embedding 让相似词共享统计)

  • 2003 年的神经网络语言模型

    • 该模型核心的突破在于词向量 + 神经网络让模型能对未见过的组合进行“泛化”,即使训练集中从未出现过 "ate delicious cheese",神经网络语言模型仍能通过 learned embeddings 推断出其概率

    • 然而,这个模型并没有马上取代 n-gram 模型,因为神经网络训练太慢。Bengio 仅在 1400 万 tokens 上训练了模型,因为当时硬件极其有限(无 GPU)且神经网络训练需要计算 softmax over vocabulary(巨大瓶颈)

    • 虽然在同数据规模下优于 n-gram,但 n-gram 能在海量数据上(几万亿 tokens)训练,形成了压倒性的性能优势

    • 因此直到十多年后,神经 LM 没能实际统治语言建模

  • 引入 RNN

    • 在 2003 年的神经网络语言模型中,上下文长度 n 固定,这仍然限制了语言中的长距离依赖

    • 例如:“The book that I bought yesterday … was great.”,而 n-gram 和 Bengio 模型都很难捕捉这种远距离关系

    • Recurrent Neural Networks(RNNs,尤其是 LSTM)改变了这一局面

      • 理论上能够传递整个历史信息($n = ∞$),通过隐藏状态 $h_i$ 往前流动:$h_i = RNN(h_{i-1}, x_i)$,即条件概率改为

        p(xix1:i1)p(xihi1)p(x_i | x_{1:i-1}) \approx p(x_i | h_{i-1})
      • 这种方法能建模长距离依赖,但非常难训练 → 梯度消失、梯度爆炸

  • 2017 年,为机器翻译开发的 Transformers 模型横空出世,Transformers 模型带来:

    • 完全并行化 —— 训练速度数量级提升:RNN 要逐 token 处理,Transformer 一次处理整段序列(矩阵运算,GPU 友好)

    • 固定但大的上下文窗口:GPT-3 的 n = 2048,GPT-4/5 甚至几十万。虽然仍然是固定窗口,但足够大到可以覆盖几乎所有自然语言中的依赖关系

    • 注意力机制(Attention):位于序列内的任何两个 token 都能直接交互(不再依靠“隐藏状态传递”,而是直接连线),这极大提升了长距离建模能力

    • 正因这三个优点,在数据规模和算力增长后,Transformer 模型迅速超越所有历史语言模型

Last updated

Was this helpful?