自然语言处理——语言模型


Timeline of Language Models

语音识别系统的目的,是把语音转换成文字。具体来说,是输入一段语音信号,要找一个文字序列(由词或字组成),使得它与语音信号的匹配程度最高。这个匹配程度,一般是用概率表示的。用$X$表示语音信号,$W$表示文字序列,则要求解的是下面这个问题:

$W^∗=\arg\max_WP(W|X)$

一般认为,语音是由文字产生的(可以理解成人们先想好要说的词,再把它们的音发出来),所以上式中条件概率的顺序就比较别扭了。没关系,通过贝叶斯公式,可以把条件和结论拧过来:

$W^∗=\arg\max_W\frac{P(X|W)P(W)}{P(X)}=\arg\max_WP(X|W)P(W)$
第二步省略分母是因为我们要优化的是$W$,而$P(X)$不含$W$,是常数。

上面这个方程,就是语音识别里最核心的公式。可以这样形象地理解它:我们要找的$W$,需要使得$P(W)$和$P(X|W)$都大。$P(W)$表示一个文字序列本身的概率,也就是这一串词或字本身有多“像话”;$P(X|W)$表示给定文字后语音信号的概率,即这句话有多大的可能发成这串音。计算这两项的值,就是语言模型声学模型各自的任务。

对于语言序列 w1,w2,…,wn,语言模型就是计算该序列的概率,即 P(w1,w2,…,wn) 。从机器学习的角度来看:语言模型是对语句的概率分布的建模。通俗解释:判断一个语言序列是否是正常语句,即是否是人话,例如 P(I am Light)>P(Light I am) 。

统计语言模型

N-Gram模型

首先,由链式法则(chain rule)可以得到

$P(w_1,w_2,…,w_n)=P(w_1)P(w_2|w_1)⋅⋅⋅P(w_n|w_1,…,w_{n−1})$

在统计语言模型中,采用极大似然估计来计算每个词出现的条件概率,即

$P(w_i|w_1,…,w_{i−1})=\frac {C(w_1,w_2,…,w_i)}{∑_wC(w_1,w_2,..w_{i−1},w)}\approx\frac {C(w_1,w_2,…,w_i)}{C(w_1,w_2,..w_{i−1})}$

其中,$C(⋅)$ 表示子序列在训练集中出现的次数。

对于任意长的自然语言语句,根据极大似然估计直接计算 $P(w_i|w_1,…,w_{i−1}) $显然不现实。

为了解决这个问题,我们引入马尔可夫假设(Markov assumption),即假设当前词出现的概率只依赖于前n-1个词,可以得到

$P(w_i|w_1,w_2,…,w_{i−1})=P(w_i|w_{i−n+1},…,w_{i−1})$

基于上式,定义 n-gram 语言模型如下:

n=1 unigram:$P(w_1,w_2,…,w_n)=∏_{i=1}^nP(w_i)$

n=2 bigram: $P(w_1,w_2,…,w_n)=∏_{i=1}^nP(w_i|w_{i-1})$

n=3 trigram: $P(w_1,w_2,…,w_n)=∏_{i=1}^nP(w_i|w_{i-2},w_{i-1})$

其中, 当$n>1$时,为了使句首词的条件概率有意义,需要给原序列加上一个或多个起始符 “\ 。可以说起始符的作用就是为了表征句首词出现的条件概率。此外,句子还需要加一个结束符“\,当不加结束符时,n-gram 语言模型只能分别对所有固定长度的序列进行概率分布建模,而不是任意长度的序列。

总结下基于统计的 n-gram 语言模型的优缺点:

优点:(1) 采用极大似然估计,参数易训练;(2) 完全包含了前 n-1 个词的全部信息;(3) 可解释性强,直观易理解。

缺点:(1) 缺乏远程依赖,只能建模到前 n-1 个词;(2) 随着 n 的增大,参数空间呈指数增长;(3) 数据稀疏,难免会出现OOV的问题(可使用平滑技术解决);(4) 单纯的基于统计频次,非常受数据集影响,泛化能力差;(5)无法考虑两个词之间的相似度。

统计模型中的平滑技术

自然语言处理中的一大痛点就是出现未登录词(OOV)的问题,即测试集中出现了训练集中未出现过的词,导致语言模型计算出的概率为零。另一方面,可能某个子序列未在训练集中出现,也会导致概率为零。平滑的出现就是为了缓解这类问题。

其次,常见的平滑技术有:

  1. Laplace Smoothing
  2. Interpolation
  3. Kneser-Ney

神经网络语言模型

Neural Networks Language Model

为了缓解n元模型估算概率时遇到的数据稀疏问题,研究者们提出了神经网络语言模型。代表性工作是Bengio等人在2003年提出的神经网络语言模型,该语言模型使用了一个三层前馈神经网络来进行建模。其中有趣的发现了第一层参数,用做词表示不仅低维紧密,而且能够蕴涵语义,也为后来的很多词向量模型(例如word2vec)打下了基础。

前馈网络语言模型的架构图如下图所示,分为四层:

前馈网络语言模型

这样得到的语言模型自带平滑,无需传统 n-gram 模型中那些复杂的平滑算法。

有了上面的基础,我们可以稍微总结下语言模型到底在建模什么,私以为可以看作是在给定一个序列的前提下,预测下一个词出现的概率,即

$P(w_i|w_1,…,w_{i−1})$

不论 n-gram 中的 n 怎么选取,实际上都是对上式的近似。理解了这点,就不难理解神经网络语言模型的本质。

神经网络语言模型(NNLM)通过构建神经网络的方式来探索和建模自然语言内在的依赖关系。尽管与统计语言模型的直观性相比,神经网络的黑盒子特性决定了NNLM的可解释性较差,但这并不妨碍其成为一种非常好的概率分布建模方式。

优点:(1) 长距离依赖,具有更强的约束性;(2) 避免了数据稀疏所带来的OOV问题;(3) 好的词表征能够提高模型泛化能力。

缺点:(1) 模型训练时间长;(2) 神经网络黑盒子,可解释性较差。

RNN Language Model

RNNLM结构如下:

截屏2023-02-21 14.19.04

优点:(1)解决了ngram模型中不能捕获长期依赖的问题。

缺点:(1)捕获长距离依赖能力仍然有限;(2)无法并行运算。

Word2vec

Word2Vec是2013年被Tomas Mikolov提出来的词向量训练算法,在论文中作者提到了两种Word2Vec的具体实现方式:连续词袋模型CBOW(Continuous Bag-of-Words Model)Skip-gram

Word2vec

Word2Vec 是一种计算非常高效的,可以从原始语料中学习字词空间向量的预测模型。CBOW 模式用一个词语的上下文作为输入,预测词语本身。即一句话中扣掉一个词,让模型猜这个词是什么。Skip-gram 模式用一个词语作为输入,来预测它周围的上下文(一个或多个词语)。即给模型一个词,猜前面和后面可能出现什么词。

cbow是 1个老师 VS K个学生,K个学生(周围词)都会从老师(中心词)那里学习知识,但是老师(中心词)是一视同仁的,教给大家的一样的知识。至于你学到了多少,还要看下一轮(假如还在窗口内),或者以后的某一轮,你还有机会加入老师的课堂当中(再次出现作为周围词),跟着大家一起学习,然后进步一点。因此相对skip-gram,你的业务能力肯定没有人家强,但是对于整个训练营(训练过程)来说,这样肯定效率高,速度更快。

在skip-gram里面,每个词在作为中心词的时候,实际上是 1个学生 VS K个老师,K个老师(周围词)都会对学生(中心词)进行“专业”的训练,这样学生(中心词)的“能力”(向量结果)相对就会扎实(准确)一些,但是这样肯定会使用更长的时间。

其中,训练方法有负采样和层次softmax两种。

优点:(1)解决词语相似度问题。

缺点:(2)本质上是静态模型,无法解决一词多义的问题。

Glove

GloVe的全称叫Global Vectors for Word Representation,它是一个基于全局词频统计(count-based & overall statistics)的词表征(word representation)工具。

Glove与LSA的区别

LSA(Latent Semantic Analysis)是一种比较早的count-based的词向量表征工具,它也是基于co-occurance matrix的,只不过采用了基于奇异值分解(SVD)的矩阵分解技术对大矩阵进行降维,而我们知道SVD的复杂度是很高的,所以它的计算代价比较大。还有一点是它对所有单词的统计权重都是一致的。而这些缺点在GloVe中被一一克服了。

GloVe与word2vec,两个模型都可以根据词汇的“共现co-occurrence”信息,将词汇编码成一个向量(所谓共现,即语料中词汇一块出现的频率)。两者最直观的区别在于,word2vec是“predictive”的模型,而GloVe是“count-based”的模型。

  • Predictive的模型,如Word2vec,根据context预测中间的词汇,要么根据中间的词汇预测context,分别对应了word2vec的两种训练方式cbow和skip-gram。对于word2vec,采用三层神经网络就能训练,最后一层的输出要用一个Huffuman树进行词的预测。
  • Count-based模型,如GloVe,本质上是对共现矩阵进行降维。首先,构建一个词汇的共现矩阵,每一行是一个word,每一列是context。共现矩阵就是计算每个word在每个context出现的频率。由于context是多种词汇的组合,其维度非常大,我们希望像network embedding一样,在context的维度上降维,学习word的低维表示。这一过程可以视为共现矩阵的重构问题,即reconstruction loss。

相比Word2Vec,GloVe更容易并行化,所以对于较大的训练数据,GloVe更快。

优点:解决了w2v模型只用局部信息的缺点,使用了全局信息。

Elmo

Elmo

解决了词语在不同语境词嵌入相同的问题

优点:(1)利用上下文预测当前词,动态embedding。

缺点:(1)两个方向的lstm属于弱双向,不能同时获得上下文信息;(2)不能完全解长距离依赖问题;(3)不能并行。

Transfomer家族

Attention is all you need

整个结构完全由feed-forward network和attention组成。

标准的 Transformer 模型主要由两个模块构成:

  • Encoder(左边):负责理解输入文本,为每个输入构造对应的语义表示(语义特征),;
  • Decoder(右边):负责生成输出,使用 Encoder 输出的语义表示结合其他输入来生成目标序列。

Transformer结构

随着时间的推移,新的 Transformer 模型层出不穷,但是它们依然可以被归类到三种主要架构下:

Transformer家族

Encoder 分支

纯 Encoder 模型只使用 Transformer 模型中的 Encoder 模块,也被称为自编码 (auto-encoding) 模型。在每个阶段,注意力层都可以访问到原始输入句子中的所有词语,即具有“双向 (Bi-directional)”注意力。纯 Encoder 模型通常通过破坏给定的句子(例如随机遮盖其中的单词),然后让模型进行重构来进行预训练,最适合处理那些需要理解整个句子语义的任务,例如句子分类、命名实体识别(词语分类)和抽取式问答。

BERT 是第一个基于 Transformer 结构的纯 Encoder 模型,它在提出时横扫了整个 NLP 界,在流行的 GLUE 基准(通过多个任务度量模型的自然语言理解能力)上超过了当时所有的最强模型。随后的一系列工作对 BERT 的预训练目标和架构进行调整以进一步提高性能。时至今日,纯 Encoder 模型依然在 NLP 行业中占据主导地位。

下面我们简略地介绍一下 BERT 模型以及各种变体:

  • BERT:通过预测文本中被掩码的词语和判断一个文本是否跟随着另一个来进行预训练,前一个任务被称为遮盖语言建模 (Masked Language Modeling, MLM),后一个任务被称为下一句预测 (Next Sentence Prediction, NSP);
  • DistilBERT:尽管 BERT 模型性能优异,但它的模型大小使其难以部署在低延迟需求的环境中。 通过在预训练期间使用知识蒸馏 (knowledge distillation) 技术,DistilBERT 在内存占用减少 40%、计算速度提高 60% 的情况下,依然可以保持 BERT 模型 97% 的性能;
  • RoBERTa:BERT 之后的一项研究表明,通过修改预训练方案可以进一步提高性能。 RoBERTa 在更多的训练数据上,以更大的批次训练了更长的时间,并且放弃了 NSP 任务。与 BERT 模型相比,这些改变显著地提高了模型的性能;
  • XLM:跨语言语言模型 (XLM) 探索了构建多语言模型的数个预训练目标,包括来自 GPT 模型的自回归语言建模和来自 BERT 的 MLM。此外,研究者还通过将 MLM 任务拓展到多语言输入,提出了翻译语言建模 (Translation Language Modeling, TLM)。XLM 模型基于这些任务进行预训练后,在数个多语言 NLU 基准和翻译任务上取得了最好的性能;
  • XLM-RoBERTa:跟随 XLM 和 RoBERTa 的工作,XLM-RoBERTa (XLM-R) 模型通过升级训练数据使得多语言预训练更进一步。具体地,首先基于 Common Crawl 语料库创建了一个包含 2.5 TB 文本数据的语料,然后在该数据集上运用 MLM 训练了一个编码器。由于数据集没有包含平行对照文本,因此移除了 XLM 的 TLM 目标。最终,该模型大幅超越了 XLM 和多语言 BERT 变体;
  • ALBERT:ALBERT 模型通过三处变化使得 Encoder 架构更高效:首先,它将词嵌入维度与隐藏维度解耦,使得嵌入维度很小以减少模型参数;其次,所有模型层共享参数,这进一步减少了模型的实际参数量;最后,将 NSP 任务替换为句子排序预测,即预测两个连续句子的顺序是否被交换。这些变化使得可以用更少的参数训练更大的模型,并在 NLU 任务上取得了优异的性能;
  • ELECTRA:标准 MLM 预训练的一个缺陷是,在每个训练步骤中,只有被遮盖掉词语的表示会得到更新。ELECTRA 使用了一种双模型方法来解决这个问题:第一个模型(通常很小)继续按标准的遮盖语言模型一样工作,预测被遮盖的词语;第二个模型(称为鉴别器)则预测第一个模型的输出中哪些词语是被遮盖的,因此判别器需要对每个词语进行二分类,这使得训练效率提高了 30 倍。对于下游任务,鉴别器也像标准 BERT 模型一样进行微调;
  • DeBERTa:DeBERTa 模型引入了两处架构变化。首先,每个词语都被表示为两个向量,一个用于记录内容,另一个用于记录相对位置。通过将词语的内容与相对位置分离,自注意力层 (Self-Attention) 层就可以更好地建模邻近词语对的依赖关系。另一方面,词语的绝对位置也很重要(尤其对于解码),因此 DeBERTa 在词语解码头的 softmax 层之前添加了一个绝对位置嵌入。DeBERTa 是第一个在 SuperGLUE 基准(更困难的 GLUE 版本)上击败人类基准的模型。

Decoder 分支

纯 Decoder 模型只使用 Transformer 模型中的 Decoder 模块。在每个阶段,对于某个给定的词语,注意力层只能访问句子中位于它之前的词语,即只能迭代地基于已经生成的词语来逐个预测后面的词语,因此也被称为自回归 (auto-regressive) 模型。纯 Decoder 模型的预训练通常围绕着预测句子中下一个单词展开。纯 Decoder 模型最适合处理那些只涉及文本生成的任务。

对 Transformer Decoder 模型的探索在在很大程度上是由 OpenAI 带头进行的,通过使用更大的数据集进行预训练,以及将模型的规模扩大,纯 Decoder 模型的性能也在不断提高。

下面我们就来简要介绍一下一些生成模型的演变:

  • GPT:GPT 结合了新颖高效的 Transformer Decoder 架构和迁移学习,通过根据前面单词预测下一个单词的预训练任务,在 BookCorpus 数据集上进行了训练。GPT 模型在分类等下游任务上取得了很好的效果。
  • GPT-2:受简单且可扩展的预训练方法的启发,OpenAI 通过扩大原始模型和训练集创造了 GPT-2,它能够生成篇幅较长且语义连贯的文本。由于担心被误用,该模型分阶段进行发布,首先公布了较小的模型,然后发布了完整的模型。
  • CTRL:像 GPT-2 这样的模型虽然可以续写文本(也称为 prompt),但是用户几乎无法控制生成序列的风格。因此,条件 Transformer 语言模型 (Conditional Transformer Language, CTRL) 通过在序列开头添加特殊的“控制符”使得用户可以控制生成文本的风格,并且只需要调整控制符就可以生成多样化的文本。
  • GPT-3:在成功将 GPT 扩展到 GPT-2 之后,通过对不同规模语言模型行为的分析表明,存在幂律来约束计算、数据集大小、模型大小和语言模型性能之间的关系。因此,GPT-2 被进一步放大 100 倍,产生了具有 1750 亿个参数的 GPT-3。除了能够生成令人印象深刻的真实篇章之外,该模型还展示了小样本学习 (few-shot learning) 的能力:只需要给出很少新任务的样本(例如将文本转换为代码),GPT-3 就能够在未见过的新样本上完成任务。但是 OpenAI 并没有开源这个模型,而是通过 OpenAI API 提供了调用接口;
  • GPT-Neo / GPT-J-6B:由于 GPT-3 没有开源,因此一些旨在重新创建和发布 GPT-3 规模模型的研究人员组成了 EleutherAI,GPT-Neo 和 GPT-J-6B 就是由 EleutherAI 训练的类似 GPT 的模型。当前公布的模型具有 1.3、2.7 和 60 亿个参数,在性能上可以媲美 OpenAI 提供的较小版本的 GPT-3 模型。

Encoder-Decoder 分支

Encoder-Decoder 模型(又称 Seq2Seq 模型)同时使用 Transformer 架构的两个模块。在每个阶段,Encoder 的注意力层都可以访问初始输入句子中的所有单词,而 Decoder 的注意力层则只能访问输入中给定词语之前的词语(已经解码生成的词语)。这些模型可以使用编码器或解码器模型的目标来完成预训练,但通常会包含一些更复杂的任务。例如,T5 通过使用 mask 字符随机遮盖掉输入中的文本片段(包含多个词)进行预训练,训练目标则是预测出被遮盖掉的文本。Encoder-Decoder 模型最适合处理那些需要根据给定输入来生成新句子的任务,例如自动摘要、翻译或生成式问答。

下面我们简单介绍一些在自然语言理解 (NLU) 和自然语言生成 (NLG) 领域的 Encoder-Decoder 模型:

  • T5:T5 模型将所有 NLU 和 NLG 任务都转换为文本到文本任务来统一解决,这样就可以运用 Encoder-Decoder 框架来完成任务。例如,对于文本分类问题,将文本作为输入送入 Encoder,然后 Decoder 生成文本形式的标签。T5 采用原始的 Transformer 架构,在 C4 大型爬取数据集上,通过遮盖语言建模以及将所有 SuperGLUE 任务转换为文本到文本任务来进行预训练。最终,具有 110 亿个参数的最大版本 T5 模型在多个基准上取得了最优性能。
  • BART:BART 在 Encoder-Decoder 架构中结合了 BERT 和 GPT 的预训练过程。首先将输入句子通过遮盖词语、打乱句子顺序、删除词语、文档旋转等方式进行破坏,然后通过 Encoder 编码后传递给 Decoder,并且要求 Decoder 能够重构出原始的文本。这使得模型可以灵活地用于 NLU 或 NLG 任务,并且在两者上都实现了最优性能。
  • M2M-100:一般翻译模型是按照特定的语言对和翻译方向来构建的,因此无法用于处理多语言。事实上,语言对之间可能存在共享知识,这可以用来处理稀有语言之间的翻译。M2M-100 是第一个可以在 100 种语言之间进行翻译的模型,并且对小众的语言也能生成高质量的翻译。该模型使用特殊的前缀标记(类似于 BERT 的 [CLS])来指示源语言和目标语言。
  • BigBird:由于注意力机制 O(n2) 的内存要求,Transformer 模型只能处理一定长度范围内的文本。 BigBird 通过使用线性扩展的稀疏注意力形式解决了这个问题,从而将可处理的文本长度从大多数 BERT 模型的 512 大幅扩展到 4096,这对于处理文本摘要等需要保存长距离依赖关系的任务特别有用。

语言模型的评价指标

信息论中常采用相对熵(relative entropy)来衡量真实模型和训练模型两个分布之间的相近程度。

对于离散随机变量X,熵、交叉熵以及相对熵的定义分别如下

$H(p)=−∑_ip(x_i)logp(x_i) $

$H(p,q)=−∑_ip(x_i)logq(x_i) $

$D(p||q)=H(p,q)−H(p)=∑_ip(x_i)logp(x_i)/q(x_i) $

其中, p(x) 和 q(x) 都是对随机变量概率分布的建模。

假定p是样本的真实分布,q是对其的建模。因为真实分布的熵H(p) 值是确定的$H(p,q)≥H(p)$恒成立。

对于自然语言序列$W=w_1,w_2,…,w_N$,可以推导得到对每个词的平均交叉熵为:

$H(W)=−\frac1NlogP(w_1,w_2,…,w_N)$

显然,交叉熵越小,则建模的概率分布越接近真实分布。交叉熵描述的是样本的平均编码长度,虽然物理意义很明确,但是不够直观。因此,在此基础上,我们定义困惑度(perplexity)

$Preplexity(W)=2^{H(W)}=\sqrt[N]{\frac{1}{P(w_1,…,w_N)}}$

困惑度在语言模型中的物理意义可以描述为对于任意给定序列,下一个候选词的可选范围大小。同样的,困惑度越小,说明所建模的语言模型越精确。


文章作者: Passerby-W
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Passerby-W !
评论
  目录