ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

语言模型进化史:从n-gram到Transformer与预训练模型

语言模型进化史:从n-gram到Transformer与预训练模型 先聊个有意思的事情。前几天有个刚入行 NLP 的朋友问我BERT 和 GPT 到底差在哪为什么现在大家开口闭口都是大语言模型却不怎么提 n-gram 了 我听完愣了一下发现很多新人确实是直接踩着大模型这班车进来的对语言模型是怎么一步步走到今天的并不清楚。这就像你直接用上了智能手机但不知道从大哥大到触屏之间经历了什么很多东西用起来就会知其然不知其所以然。这篇东西我就想把语言模型这条发展线好好捋一遍当作系列的第一篇重点讲从统计语言模型到神经语言模型、再到预训练模型萌芽这一段路。适合刚入门 NLP 的学生、想系统理解语言模型来龙去脉的工程师也适合那些整天调大模型 API 但想知道底座长什么样的朋友。看完你会明白今天大语言模型的种种能力其实都是几十年前那些笨办法一路演变出来的。1. 语言模型到底在解决什么问题1.1 一句话说清楚语言模型如果只能用一句话解释语言模型我会说语言模型就是计算一句话出现的概率的模型。比如给你两个句子我今天中午吃了牛肉面牛肉面今天中午我吃了正常人一眼就能看出来第一句通顺、第二句别扭但机器怎么知道答案就是概率——第一句话在真实语料里出现的概率远高于第二句。语言模型干的事就是把通顺程度量化成一个数值让机器能比较、能选择。这里面有个很自然的数学表达。给定一个词序列 (w_1, w_2, ..., w_n)它的概率可以拆解成条件概率的连乘[ P(w_1, w_2, ..., w_n) P(w_1) \times P(w_2|w_1) \times P(w_3|w_1,w_2) \times ... \times P(w_n|w_1,...,w_{n-1}) ]也就是说想算整句话的概率就一步步算给定前面已经出现的词下一个词出现的概率是多少。这本质上是一个猜词任务给你我今天中午吃了____你来猜横线处最可能是哪个词。这个框架从 1948 年香农提出信息论里关于语言熵的设想到今天的大语言模型生成文本底层逻辑没变过。变的只是怎么估算这些条件概率。1.2 为什么这个任务这么难理论上公式写出来很简洁但实际一算就傻眼。最大的问题是组合爆炸。假设词表大小是 10 万这在大模型时代已经算很小的词表了要精确估算 (P(w_n|w_1,...,w_{n-1}))当 (n) 稍微大一点可能的条件组合数量就是天文数字。举例来说如果你要基于前面 10 个词来预测第 11 个词参数的规模就是 (100000^{11})这个量级比宇宙中的原子总数还多。就算把全世界的语料都喂进去也覆盖不了这些组合的零头。这就是语言模型发展的核心矛盾理想情况是考虑尽可能长的上文但数据和算力不允许。一代代研究者做的事本质上都是在考虑多长的上文和可计算性之间做取舍。2. 统计语言模型被低估的老前辈2.1 n-gram 模型的聪明妥协既然精确算条件概率不现实那就做近似。n-gram 模型的做法很朴实假设当前词的出现概率只依赖前面 (n-1) 个词而不是依赖全部历史。这就是所谓的马尔可夫假设。有点像一个近视眼远处的东西看不清那就只看近处。虽然丢失了远距离信息但换来的是可计算性。最常见的几种设定unigram(n1)每个词独立出现概率就是词频。相当于完全失忆不考虑任何上下文。bigram(n2)当前词只依赖前一个词。我后面接今天的概率看语料里我今天这个组合出现得多不多。trigram(n3)当前词依赖前两个词。效果明显比 bigram 好因为很多语言现象确实只看前面两个词就够了。具体计算也很简单用极大似然估计就是在语料里数数然后算比例[ P(w_i|w_{i-1}) \frac{count(w_{i-1}, w_i)}{count(w_{i-1})} ]比如语料里今天出现了 1000 次其中后面跟着中午的有 80 次那么 (P(中午|今天) 0.08)。2.2 数据稀疏与平滑技术n-gram 看着简单一上手就发现问题语料里有大量没出现过的词组合。比如训练语料里昨天 晚上 吃了 火锅出现了很多次但昨天 晚上 吃了 日料一次都没出现过。按照直接数数的方法这个概率就是 0导致整个句子的概率变成 0。这显然不合理——日料和火锅在昨天晚上吃了后面都挺通顺的。为了解决这个问题统计语言模型引入了平滑技术。说白了就是给没出现过的事件也留一点概率同时从出现过的事件里抠出一点概率来补贴。常见的平滑方法有加一平滑Laplace Smoothing所有计数都加 1。简单但效果一般给未出现事件分配的概率太高。Kneser-Ney 平滑这是目前公认效果最好的平滑方法之一。核心思想是判断一个词能否接在后面不光看它出现过多少次还要看它出现在多少种不同的上下文里。一个词出现的上下文越多样它作为新搭配的潜力越大。我自己早期跑语言模型时用过最简单的加一平滑效果惨不忍睹后来换用 Kneser-Ney困惑度直接降了一个档次。这个经验告诉我统计模型虽然简单但里面全是细节每个部件都值得认真调。2.3 评价指标困惑度Perplexity有了模型怎么评价好坏n-gram 时代最重要的指标就是困惑度Perplexity简称 PPL。困惑度的定义是测试集上概率倒数的几何平均公式长这样[ PPL(W) P(w_1, w_2, ..., w_n)^{-\frac{1}{n}} ]直觉理解模型对下一个词的选择范围有多大。如果模型每次都能以接近 1 的概率猜中下一个词困惑度接近 1说明模型很自信、很准。如果模型有 100 个词都拿不准、平均分配概率困惑度就是 100。困惑度是语言模型最经典的评测指标从统计时代一直沿用到现在。不过它有个已知缺陷低困惑度不代表生成文本真的通顺合理。后来神经语言模型时代大家用 BLEU、ROUGE 等任务相关指标来补充但 PPL 作为模型训练时的监控指标一直没被抛弃。我现在的习惯是训练时盯 PPL上线前用下游任务指标做最终验收两者缺一不可。3. 神经网络的入场从词向量到序列建模3.1 NNLM第一个神经语言模型2003 年Bengio 等人发表了著名的论文A Neural Probabilistic Language ModelNNLM这是语言模型从数数走向学习的分水岭。NNLM 的想法是把每个词映射成一个低维稠密向量然后把这些向量拼起来喂给一个神经网络让网络学习前 (n-1) 个词到下一个词的映射关系。这有几个革命性的好处词向量捕获语义相似性如果两个词经常出现在类似的上下文里它们的向量就会比较接近。猫和狗的向量距离就比猫和汽车近。平滑泛化即使昨天晚上吃了日料没出现过只要日料和火锅的向量接近模型就能给出一个不算离谱的概率。这就是分布式表示的力量——用向量之间的相似度代替字面上的匹配。NNLM 虽然有很多局限比如只能看固定长度的前文但它打通了神经网络 语言模型这条路。后面的所有工作包括 Word2Vec、ELMo、GPT都算是顺着这条路走下来的。3.2 Word2Vec语言模型家的副产物提起 Word2Vec很多人首先想到的是词向量工具而不是语言模型。但有意思的是Word2Vec 恰恰是在训练语言模型的过程中得到的一套副产品。2013 年 Mikolov 等人发表的 Word2Vec 有两个架构CBOW连续词袋和 Skip-gram。CBOW 是根据上下文预测中心词Skip-gram 是根据中心词预测上下文。这两个任务都是典型的语言模型任务——只不过把给定前文猜下一个词改成了给定周围词猜中间词。Word2Vec 给 NLP 带来的冲击非常大。它训练出来的词向量有非常神奇的线性性质最著名的例子就是[ vec(国王) - vec(男人) vec(女人) \approx vec(女王) ]这个性质说明词向量在空间中的相对位置编码了词的语义和语法信息。当时很多人第一次感受到机器好像真的理解了一点语言结构。不过这里要泼一盆冷水Word2Vec 生成的词向量是静态的。每个词只有一个固定的向量不管上下文是什么苹果在苹果公司发布新品和我吃了一个苹果里是同一个向量。这在处理一词多义时非常吃亏。这个问题的解法要等到 ELMo 出现后面我会细说。3.3 RNN 与 LSTM开始考虑任意长度上文n-gram 只能看固定长度的上文NNLM 也只能看前 (n-1) 个词。而自然语言里的长距离依赖太多了比如小明昨天说今天要去公园结果到了中午他______要填对他指的是小明得跨很远的距离才能抓到信息。RNN循环神经网络的设计天然就是为了处理序列数据。它的核心是把一个隐藏状态 (h_t) 在时间轴上传递理论上 (h_t) 能携带前面所有时刻的信息[ h_t f(h_{t-1}, x_t) ]这样理论上模型可以处理任意长度的上文。但实际训练时发现一个问题梯度消失。当序列很长时早期的信息在反向传播过程中会被不断稀释模型学到后面就忘了前面长距离依赖还是学不到。LSTM 的发明就是为了解决这个问题。通过引入门控机制输入门、遗忘门、输出门和一个细胞状态LSTM 可以决定哪些信息要保留、哪些要丢弃让信息在长序列中流传更久。我记得做机器翻译那会儿从 RNN 换成 LSTM翻译质量提升非常明显特别是在处理长句子时效果差距肉眼可见。但 LSTM 有个致命弱点只能按顺序串行计算第 (t) 步必须等第 (t-1) 步算完这使得它在 GPU 上难以充分并行训练速度受限。这个问题后来成了 Transformer 能弯道超车的重要原因之一。4. 预训练时代的序幕ELMo 与 Transformer 的破局4.1 ELMo第一次让词向量随语境而变2018 年是 NLP 史上被写进教科书的一年。那一年ELMo 论文的标题特别直白Deep contextualized word representations。核心就一个词上下文相关的词向量contextualized。ELMo 的做法是用一个双向 LSTM 在大规模语料上做语言模型预训练然后取出每一层的隐状态作为上下文相关的词表示。这样一来苹果在苹果公司发布新品这句话里得到的向量和在我吃了一个苹果里的向量就完全不同了。这个突破意义重大。一个词的向量不再是一个固定的查表结果而是由它在句子里的语境动态生成。用行话讲就是模型从静态词嵌入时代进入了上下文表示时代。ELMo 的使用方式是特征拼接把预训练好的词表示作为额外特征拼接到下游任务的输入上。这种方式效果很好但结构上有些笨拙——它不是一个端到端的统一模型更像是一个外挂。与此同时另一条技术路线正在酝酿更大的爆发。4.2 Transformer让注意力取代循环2017 年发表的Attention is All You Need彻底改变了 NLP 的建模方式。Transformer 的核心创新就是自注意力机制Self-Attention。自注意力的直观理解对于序列里的每个词计算它与序列里所有其他词的相关程度然后根据这个相关程度加权聚合信息。这样一来一个词在编码时能看到整个句子的所有位置不管距离多远。我打个比方。读文章时看到一个他你会自动往回找他指的是谁。如果这个他在上文第 5 句话里出现过你需要跨越很长的距离去关联。LSTM 是一步一步顺着读、边走边记而 Transformer 是跳着读直接在所有位置之间建立连接通道。Transformer 带来的另一个巨大优势是可并行化。自注意力可以一次性对整句话的所有词同时计算不需要像 RNN/LSTM 那样按时间步串行。这让 Transformer 能充分利用 GPU 的大规模并行能力训练效率远超前代模型。不过 Transformer 也有代价自注意力的计算复杂度是 (O(n^2))(n) 是序列长度序列越长计算开销越大。这也是后来大模型在做长文本时要引入各种注意力优化方案的原因。4.3 GPT 与 BERT分叉的两条路2018 年基于 Transformer 的两个预训练模型几乎同时出现它们走出了两条截然不同的路GPTGenerative Pre-trained Transformer从左到右的单向语言模型任务就是给定前文预测下一个词。它天然适合生成任务。BERTBidirectional Encoder Representations from Transformers双向编码器两个预训练任务——掩码语言模型遮住 15% 的词去预测和下一句预测。它更专注于理解任务。一个很形象的比喻GPT 像是一个人在说话只能看到自己已经说过的词然后想下一句说啥BERT 像是一个人在做阅读理解可以把整篇文章上下都看完再填出被挖掉的词。这两条路的竞争后来改变了整个行业。GPT 一路沿着扩大模型规模 生成为主导的路线发展最终演化成今天的大语言模型BERT 主导了 2019 到 2022 年的预训练 微调范式在分类、问答、NER 等理解类任务上取得了大量 SOTA 成绩。很多新人会问那我该学 GPT 还是 BERT我的建议是两条路都要了解。虽然现在 ChatGPT 的热度让 GPT 路线看起来占据了绝对上风但 BERT 在信息抽取、语义匹配、文本分类等经典场景里依然有大量工业应用。理解了这两条分支的差异你才能看懂为什么后来的模型有的做生成、有的做理解、有的两者兼顾。5. 这段发展史留下的几个关键启示5.1 所有新技术都能在旧框架里找到影子从统计语言模型到神经语言模型再到预训练模型表面上技术形态翻天覆地但核心任务始终是那个公式算条件概率 (P(w_t|w_{t}))。n-gram 用数频次来算NNLM 用神经网络前向传播来算GPT 用 Transformer 堆叠来算——算的还是同一个东西。我经常跟团队里的人说不要把注意力只放在新模型上多回去看看统计方法的底层逻辑。比如很多大模型里的采样技巧temperature、top-k、top-p你能在古老的 log-linear 语言模型里找到雏形。理念是相通的变的是计算手段。5.2 瓶颈往往是推动技术革新的真正动力回头看每一次模型迭代导火索都是上一个方案碰到了瓶颈n-gram 碰上了数据稀疏 → 平滑和泛化研究兴起静态词向量碰上了一词多义 → ELMo 的上下文表示出现RNN/LSTM 碰上了串行计算太慢 → Transformer 的并行化设计胜出BERT 虽然理解任务很强但生成能力受限 → GPT 路线的模型后来占据了主导这个视角对做工程和做研究都很有用不要只看哪个模型效果好要问它解决了什么瓶颈。理解了瓶颈你就理解了技术演进的路线图。5.3 数据规模和算力的杠杆效应最后必须提一点语言模型的进步从来不只是算法层面的功劳。n-gram 时代大家用几百万词的语料Word2Vec 时代用几十亿词到了 GPT-3 时代直接用几千亿词的互联网语料。与此同时GPU 算力也经历了指数级增长。算法、数据、算力这三驾马车是互相成就的。NNLM 提出分布式表示时数据量不够大、算力不够强所以训练出来的模型规模很小效果也就一般。等到 2018 年预训练时代来临时数据储备和算力已经足够支撑亿级参数模型的训练才有了后面的大爆发。所以如果你问我现在入行 NLP 应该从哪开始我的回答是先从语言模型这个最小闭环入手——理解它是怎么定义、怎么训练、怎么评测的。把这个闭环吃透了再往上加数据、加参数、加结构你能看清楚每一步变化到底带来了什么。反过来如果一开始就只会调用现成的大模型 API你会发现一旦碰到模型效果不好连从哪里排查问题都无从下手。这个系列的第一篇就写到这里。下一篇我会接着讲 GPT 从 1 到 3 的演进细节、指令微调与 RLHF 是如何把预训练模型调教成会聊天的助手的以及大语言模型的涌现能力到底是什么、学术界是怎么争论的。如果你正在做大模型应用开发或者准备系统学习 NLP这几篇内容应该能帮你把底座打得更扎实。
返回列表