自然语言处理(Natural Language Processing,NLP)是人工智能和计算机科学的一个分支领域,致力于让计算机理解、解释和生成人类语言。作为深度学习最重要的应用领域之一,NLP涵盖了从文本分类、机器翻译到问答系统、文本生成等广泛任务。
人类语言具有高度复杂性和歧义性,同一个词语在不同语境中可能有完全不同的含义,句子结构灵活多变,还蕴含着丰富的文化背景和隐含知识。这些特性使得自然语言处理成为人工智能领域最具挑战性的问题之一。
深度学习革命性地改变了NLP领域。在深度学习方法出现之前,NLP系统主要依赖手工设计的规则和特征工程,不仅开发成本高昂,而且难以处理语言的多样性和复杂性。深度学习方法通过端到端的学习方式,自动从大量文本数据中学习语言表示和模式,大幅提升了NLP系统的性能。
自然语言处理任务可以从粒度上分为不同层次:
词汇级任务关注单个词语的处理,包括分词、词性标注、命名实体识别等。分词是将连续文本切分成有意义的词语单元,对于中文等没有明显词边界的语言尤为重要。词性标注为每个词语标注其语法类别(名词、动词、形容词等)。命名实体识别则识别文本中的专有名词,如人名、地名、组织机构名等。
句法级任务分析句子的结构关系,包括句法分析、依存关系分析等。句法分析构建句子的短语结构树,展示词语如何组合成短语,短语如何组合成句子。依存关系分析则揭示词语之间的语法依赖关系,如主谓关系、动宾关系等。
语义级任务关注语言的意义理解,包括语义角色标注、语义依存分析、词义消歧等。语义角色标注识别谓词的参与者(施事、受事等)及其在句子中的语义功能。
篇章级任务处理超出单个句子的文本,包括指代消解、篇章关系分析、文本摘要等。指代消解确定代词或名词短语所指代的实体。文本摘要则生成文档的简洁概述。
应用级任务面向具体的应用场景,包括机器翻译、问答系统、情感分析、文本分类、信息抽取等。这些任务通常需要整合多个层次的语言处理能力。
自然语言处理的发展经历了几个重要阶段:
规则时代(1950s-1990s):早期NLP系统基于人工编写的语法规则和词典。虽然这种方法在特定领域取得了一些成功,但规则难以覆盖语言的全部复杂性,系统维护成本极高。
统计时代(1990s-2010s):统计机器学习方法开始在NLP中占据主导地位。隐马尔可夫模型(HMM)、条件随机场(CRF)等统计模型被广泛应用于序列标注任务。统计机器翻译(SMT)通过从平行语料中学习翻译规则,显著提升了翻译质量。
神经时代(2013-2017):神经网络开始应用于NLP任务。词嵌入技术(如Word2Vec、GloVe)将词语表示为稠密向量,捕捉词语之间的语义关系。循环神经网络(RNN)和卷积神经网络(CNN)被用于建模序列数据。
预训练时代(2018至今):基于Transformer架构的预训练语言模型(如BERT、GPT系列)引发了NLP领域的范式转变。这些模型在大规模无标注文本上进行预训练,学习通用的语言表示,然后在特定任务上进行微调,在几乎所有NLP任务上都取得了突破性进展。
分布式语义假说是词嵌入技术的理论基础,其核心思想是“词语的含义由其在上下文中的使用方式决定”。这一思想最早由语言学家Firth在1957年提出:“You shall know a word by the company it keeps”(观其伴而知其意)。
基于这一假说,语义相似的词语往往出现在相似的上下文环境中。例如,“国王”和“女王”经常出现在类似的语境中(如“…统治着国家”、“…住在宫殿里”),因此它们应该具有相似的向量表示。
与传统的独热编码(one-hot encoding)相比,分布式表示具有以下优势:
Word2Vec是2013年由Google研究团队提出的词嵌入学习模型,包含两种架构:CBOW(Continuous Bag of Words)和Skip-gram。
CBOW模型通过上下文词语预测目标词语。给定一个词语序列$w_{i-c}, ..., w_{i-1}, w_{i+1}, ..., w_{i+c}$,模型预测中心词$w_i$。输入层将上下文词语的词向量取平均,然后通过投影层和输出层预测目标词。
Skip-gram模型则相反,通过目标词语预测上下文词语。给定中心词$w_i$,模型预测其周围的上下文词语$w_{i-c}, ..., w_{i-1}, w_{i+1}, ..., w_{i+c}$。Skip-gram在大型语料库上通常表现更好,特别是对于低频词。
Word2Vec的训练采用负采样(Negative Sampling)技术来提高效率。对于每个正样本(真实的词对),随机采样若干个负样本(不相关的词对),训练目标是将正样本的得分最大化,负样本的得分最小化。
GloVe(Global Vectors for Word Representation)是斯坦福大学提出的另一种词嵌入方法。与Word2Vec主要关注局部上下文窗口不同,GloVe结合了全局统计信息。
GloVe的核心思想是:词语共现矩阵中的比率可以编码词语之间的语义关系。设$X_{ij}$表示词语$j$出现在词语$i$上下文中的次数,GloVe的目标是学习词向量,使得:
$$w_i^T \tilde{w}_j + b_i + \tilde{b}_j = \log(X_{ij})$$
其中$w_i$和$\tilde{w}_j$分别是词语$i$和$j$的词向量,$b_i$和$\tilde{b}_j$是偏置项。
GloVe的损失函数为:
$$J = \sum_{i,j} f(X_{ij})(w_i^T \tilde{w}_j + b_i + \tilde{b}_j - \log X_{ij})^2$$
其中$f(X_{ij})$是权重函数,用于控制高频共现的影响。
传统的词嵌入方法面临一个根本问题:无法处理词汇表外的词语(Out-of-Vocabulary,OOV)。对于未在训练语料中出现的词语,模型无法获得其向量表示。
FastText通过引入子词(subword)信息解决了这一问题。FastText将每个词语表示为其包含的所有字符n-gram的向量和。例如,词语“apple”在n=3时包含的子词包括:“<ap”, “app”, “ppl”, “ple”, “le>“。
这种表示方式的优势在于:
传统的词嵌入方法(如Word2Vec、GloVe)为每个词语学习一个固定的向量表示,不考虑上下文。然而,语言中的词语往往具有多义性,同一个词在不同语境中可能有完全不同的含义。
例如,”bank”可以指“银行”,也可以指“河岸”。静态词嵌入只能给出一个折中的表示,无法区分不同语境下的语义。
上下文嵌入(Contextualized Embedding)解决了这一问题。上下文嵌入模型根据词语的上下文动态生成其表示,同一词语在不同语境下会有不同的向量。
ELMo(Embeddings from Language Models)是早期上下文嵌入的代表。ELMo使用双向LSTM语言模型,将前向和后向语言模型的隐藏状态组合起来,为每个词语生成上下文相关的表示。
BERT(Bidirectional Encoder Representations from Transformers)是2018年Google提出的预训练语言模型,在NLP领域产生了深远影响。
架构特点:
预训练任务:
1. 掩码语言模型(Masked Language Model,MLM):随机遮蔽输入序列中15%的词语,模型需要根据上下文预测被遮蔽的词语。这迫使模型学习深度的双向表示。
2. 下一句预测(Next Sentence Prediction,NSP):给定两个句子A和B,预测B是否是A的下一句。这一任务帮助模型学习句子间的关系,对于问答、自然语言推理等任务很重要。
输入表示: BERT的输入由三部分组成:
GPT(Generative Pre-trained Transformer)系列采用与BERT不同的架构和训练目标。
架构特点:
GPT训练范式:
1. 无监督预训练:在大规模无标注文本上训练语言模型,预测下一个词
2. 有监督微调:在具体任务上进行微调
GPT演进:
RoBERTa:对BERT的训练过程进行了优化,包括:
RoBERTa在多个基准测试上超过了原始BERT的性能。
ALBERT:通过参数共享和因式分解嵌入层,大幅减少模型参数。ALBERT还引入了句子顺序预测(SOP)任务替代NSP。
XLNet:结合了自回归语言建模和双向上下文的优势。XLNet通过排列语言建模,在保持自回归性质的同时捕捉双向信息。
T5(Text-to-Text Transfer Transformer):将所有NLP任务统一为文本到文本的格式。无论是分类、翻译还是问答,都视为输入文本到输出文本的转换。
预训练模型需要在下游任务上进行微调。常见的微调策略包括:
全量微调:更新模型的所有参数。适用于数据充足的场景,通常能获得最佳性能。
逐层解冻:先微调顶层,然后逐层向下解冻。这种渐进式微调可以防止灾难性遗忘。
特征提取:冻结预训练模型的参数,仅训练顶层的分类器。适用于数据稀缺或小样本场景。
适配器微调(Adapter Tuning):在Transformer层中插入小型的适配器模块,只训练这些适配器参数。这种方法参数效率高,适合多任务场景。
提示学习(Prompt-based Learning):通过设计提示模板,将下游任务转化为语言模型能够直接处理的形式,减少微调所需的参数更新。
序列到序列(Sequence-to-Sequence,Seq2Seq)模型是处理机器翻译、文本摘要等任务的通用框架。该架构包含两个主要组件:
编码器(Encoder):将输入序列编码为固定长度的上下文向量(或向量序列)。编码器通常使用RNN、CNN或Transformer。
解码器(Decoder):基于编码器的输出生成目标序列。解码器在每个时间步生成一个输出词,直到生成结束标记。
训练过程:给定输入序列$X = (x_1, x_2, ..., x_n)$和目标序列$Y = (y_1, y_2, ..., y_m)$,训练目标是最大化条件概率:
$$P(Y|X) = \prod_{t=1}^{m} P(y_t|y_1, ..., y_{t-1}, X)$$
传统的Seq2Seq模型使用单一的上下文向量来编码整个输入序列,这对于长序列来说是一个瓶颈。注意力机制的引入解决了这一问题。
在机器翻译中,注意力机制允许解码器在生成每个目标词时,动态地关注输入序列的不同部分。具体来说:
1. 计算解码器当前状态与所有编码器状态的相似度(注意力分数)
2. 将注意力分数归一化为注意力权重
3. 用注意力权重对编码器状态进行加权求和,得到上下文向量
4. 将上下文向量与解码器状态结合,预测下一个词
这种机制使得模型能够建立源语言词语和目标语言词语之间的软对齐关系。
Transformer架构彻底改变了机器翻译领域。基于Transformer的神经机器翻译(NMT)系统现在已成为工业标准。
架构特点:
训练技巧:
传统的自回归解码器逐个生成目标词,无法并行化,推理速度较慢。非自回归翻译(Non-Autoregressive Translation,NAT)尝试一次性生成所有目标词,大幅提高推理速度。
NAT的挑战在于处理目标词之间的依赖关系。主要方法包括:
文本生成可以建模为条件语言模型问题:给定条件$c$(如对话历史、主题、风格等),生成文本序列$y$:
$$P(y|c) = \prod_{t=1}^{T} P(y_t|y_{<t}, c)$$
条件$c$可以通过多种方式融入模型:
训练好的语言模型需要配合适当的解码策略才能生成高质量的文本:
贪婪解码:每一步选择概率最高的词。简单高效,但容易陷入局部最优,生成重复、乏味的文本。
束搜索(Beam Search):维护$k$个最优候选序列(束宽为$k$),在每一步扩展所有候选并保留得分最高的$k$个。束搜索能平衡质量和多样性,但仍有重复问题。
采样方法:
对话系统可以分为以下几类:
检索式对话:从预定义的回复候选集中选择最合适的回复。这种方法安全可控,但回复缺乏多样性。
生成式对话:使用Seq2Seq模型直接生成回复。生成式系统灵活多样,但可能产生不相关或不安全的内容。
混合式对话:结合检索和生成,先用检索缩小候选范围,再用生成模型进行改写或选择。
任务导向对话:面向特定任务(如预订酒店、查询天气),通常包含自然语言理解、对话状态跟踪、对话策略学习和自然语言生成等模块。
可控文本生成旨在控制生成文本的属性,如情感、风格、主题等。主要方法包括:
控制码(Control Codes):在输入中加入特殊标记指示期望的属性。例如,在GPT-2中添加“[Positive]“前缀生成积极情感的文本。
条件训练:将控制属性作为条件输入模型。
PPLM(Plug and Play Language Model):在生成过程中通过梯度更新调整隐状态,使生成的文本具有期望的属性,而不需要重新训练模型。
RLHF(Reinforcement Learning from Human Feedback):使用人类反馈训练奖励模型,然后用强化学习优化语言模型。这是ChatGPT等对话系统的核心技术。
命名实体识别(Named Entity Recognition,NER)是从文本中识别出命名实体(如人名、地名、组织名等)并分类的任务。
传统方法:将NER视为序列标注问题,使用BIO(Begin-Inside-Outside)标注方案:
深度学习方法:
关系抽取识别文本中实体之间的语义关系。例如,从”乔布斯创立了苹果公司”中抽取出(乔布斯,创立,苹果公司)。
主要方法:
事件抽取识别文本中描述的事件及其参与者。一个事件通常包含触发词(表示事件发生的词语)和论元(事件的参与者)。
例如,在“苹果公司在2007年发布了iPhone”中:
知识图谱是以图结构表示的知识库,由实体(节点)和关系(边)组成。
知识图谱构建流程:
1. 知识抽取:从非结构化文本中抽取实体、关系和事件
2. 知识融合:将来自不同来源的知识进行整合,解决实体歧义和共指问题
3. 知识推理:基于已有知识推断新知识
4. 知识存储与查询:使用图数据库(如Neo4j)存储和查询知识
例题1:词嵌入的性质
已知词嵌入中“国王”、“女王”、“男人”、“女人”的向量分别为$v_{king}$、$v_{queen}$、$v_{man}$、$v_{woman}$。假设词嵌入完美捕捉了语义关系,证明:$v_{king} - v_{man} + v_{woman} \approx v_{queen}$
分析:
这个例子展示了词嵌入的语义组合性质。我们可以这样理解:
$v_{king} - v_{man}$表示“国王”去掉“男性”的语义特征,剩下的是“君主”的语义。
然后加上$v_{woman}$(女性的语义),得到“女性君主”,即“女王”。
从向量空间的角度看,这意味着词嵌入空间中存在一个“性别”方向,沿着这个方向,“国王”可以变换到“女王”,“男人”可以变换到“女人”。
更一般地,词嵌入可以捕捉各种语义关系:
这种向量运算的能力是词嵌入的重要特性,也是评估词嵌入质量的标准之一。
例题2:Transformer注意力计算
假设有一个Transformer模型,词嵌入维度$d_{model}=512$,注意力头数$h=8$。计算:
(1) 每个头的维度$d_k$是多少?
(2) 如果输入序列长度为$n=100$,单个注意力头的计算复杂度是多少?
分析:
(1) 在多头注意力中,模型维度被平均分配到各个头:
$$d_k = \frac{d_{model}}{h} = \frac{512}{8} = 64$$
每个头的查询、键、值向量的维度都是64。
(2) 单个注意力头的计算包括:
总复杂度为$O(n^2 \cdot d_k) = O(n^2 \cdot d_{model}/h)$。
对于$h=8$,$d_k=64$,$n=100$:
相比RNN的$O(n \cdot d^2)$复杂度,Transformer在序列较长时优势更明显(假设$d \approx d_{model}$)。但注意力机制的$O(n^2)$复杂度也是其处理超长序列时的瓶颈。
例题3:BERT掩码语言模型
在BERT的MLM预训练中,输入句子“深度学习改变自然语言处理”经过tokenize后为:[CLS] 深度 学习 改变 自然 语言 处理 [SEP]。如果随机选择15%的token进行掩码,假设“学习”和“语言”被选中了,请描述:
(1) 实际的掩码策略是什么?
(2) 模型的训练目标是什么?
分析:
(1) BERT的掩码策略并不是简单地将选中token替换为[MASK],而是:
假设“学习”和“语言”被选中:
这种策略的原因是:在微调阶段没有[MASK]标记,预训练和微调存在不匹配。通过混合策略,模型学会基于上下文预测词,即使该词没有被掩码。
(2) 训练目标是预测被掩码的原始token。具体来说:
其中$\mathcal{M}$是被掩码位置的集合,$\tilde{X}$是掩码后的输入。
除了MLM,BERT还有一个辅助任务NSP(下一句预测),判断句子B是否是句子A的下一句。不过在后续研究中,NSP的效果被质疑,RoBERTa等模型移除了这个任务。
例题4:机器翻译BLEU评分
假设机器翻译系统生成的翻译为“the cat sat on the mat”,有两个参考翻译:
计算该翻译的BLEU-2分数(考虑1-gram和2-gram)。
分析:
BLEU(Bilingual Evaluation Understudy)是一种常用的机器翻译自动评估指标。
1-gram精度:
2-gram精度:
简洁性惩罚(Brevity Penalty):
候选长度$c=6$,最接近的参考长度$r=6$(参考1)
由于$c = r$,BP = 1
BLEU分数:
$$\text{BLEU} = \text{BP} \times \exp(\frac{1}{2}\log p_1 + \frac{1}{2}\log p_2)$$
$$= 1 \times \exp(0.5 \times \log 1.0 + 0.5 \times \log 0.6)$$
$$= \exp(0 + 0.5 \times (-0.511))$$
$$= \exp(-0.255) \approx 0.775$$
这个例子展示了BLEU的计算方法。需要注意的是,BLEU只是参考指标,不能完全反映翻译质量。流畅性、准确性和语义保真度往往需要人工评估。
1. Word2Vec的Skip-gram模型的训练目标是:
A. 通过上下文词预测中心词 B. 通过中心词预测上下文词 C. 预测下一个句子 D. 预测词语的词性
2. 以下哪项不是BERT预训练任务的一部分?
A. 掩码语言模型 B. 下一句预测 C. 词性标注 D. 以上都不是
3. 在Transformer的自注意力机制中,注意力分数计算使用:
A. 点积 B. 余弦相似度 C. 欧氏距离 D. 曼哈顿距离
4. 命名实体识别通常采用的标注方案是:
A. IOB B. BIO C. BOI D. ABC
5. 机器翻译中,束搜索(Beam Search)的束宽(Beam Size)为1时,等价于:
A. 随机采样 B. 贪婪解码 C. 所有路径搜索 D. 动态规划
6. 词嵌入Word2Vec包含两种架构:$\_\_\_\_$和Skip-gram。
7. BERT的全称是$\_\_\_\_$。
8. Transformer架构由Google在论文$\_\_\_\_$中提出。
9. 在Seq2Seq模型中,编码器将输入序列编码为$\_\_\_\_$表示。
10. BLEU评分中的BP表示$\_\_\_\_$。
11. 假设一个Transformer模型,输入序列长度$n=50$,模型维度$d_{model}=768$,前馈网络维度$d_{ff}=3072$。计算:
(1) 自注意力层的参数量(忽略偏置) (2) 前馈网络的参数量(忽略偏置) (3) 该层的总参数量
12. 给定词向量:$v_{国王} = [2, 1, 0]$,$v_{男人} = [1, 0, 0]$,$v_{女人} = [0, 1, 0]$,计算$v_{国王} - v_{男人} + v_{女人}$,并判断结果向量与$v_{女王} = [1, 1, 0]$的关系。
1. 答案:B
解析:Skip-gram通过中心词预测周围的上下文词,而CBOW是通过上下文词预测中心词。
2. 答案:C
解析:BERT的预训练任务包括掩码语言模型(MLM)和下一句预测(NSP),词性标注是下游任务,不是预训练任务。
3. 答案:A
解析:Transformer使用缩放点积注意力:$\text{Attention}(Q, K, V) = \text{softmax}(\frac{QK^T}{\sqrt{d_k}})V$。
4. 答案:B
解析:BIO标注方案包括B(Begin,实体开始)、I(Inside,实体内部)、O(Outside,非实体)。
5. 答案:B
解析:束宽为1时,束搜索退化为贪婪解码,每步只保留得分最高的一个候选。
6. 答案:CBOW(Continuous Bag of Words)
解析:CBOW通过上下文词预测中心词,Skip-gram通过中心词预测上下文词。
7. 答案:Bidirectional Encoder Representations from Transformers
解析:BERT是基于Transformer的双向编码器表示。
8. 答案:《Attention Is All You Need》
解析:Transformer架构于2017年在这篇论文中提出。
9. 答案:上下文(或:语义/向量)
解析:编码器将变长输入序列编码为固定长度的上下文表示。
10. 答案:简洁性惩罚(Brevity Penalty)
解析:BP用于惩罚过短的翻译,防止模型生成过短的输出来获得高分。
11. 解答:
(1) 自注意力层参数:
(2) 前馈网络参数:
(3) 总参数量:$2,359,296 + 4,718,592 = 7,077,888 \approx 7.08M$
12. 解答:
$v_{国王} - v_{男人} + v_{女人} = [2, 1, 0] - [1, 0, 0] + [0, 1, 0]$
$= [2-1+0, 1-0+1, 0-0+0]$
$= [1, 2, 0]$
与$v_{女王} = [1, 1, 0]$对比:
欧氏距离:$\sqrt{(1-1)^2 + (2-1)^2 + (0-0)^2} = 1$
结果表明:通过词向量运算得到了一个与“女王”相似的向量,但由于示例向量的简化性,不完全相等。在实际的高维词嵌入空间中,这种关系通常更加明显。