3. 自然语言处理基础:词向量、RNN/LSTM、注意力机制、Transformer架构的演进与原理
自然语言处理(NLP)是让机器理解、生成和处理人类语言的技术体系。从早期的规则系统到如今的预训练大模型,NLP 的每一次飞跃都源于文本表示方法和序列建模架构的革新。本章将沿着技术演进的脉络,系统讲解词向量(Word Embedding)、循环神经网络(RNN/LSTM)、注意力机制(Attention)以及 Transformer 架构的核心原理与工程实践。理解这条演进线,是掌握大模型算法的基础,也是后续章节中预训练、微调和推理优化的理论基石。
3.1 词向量:从离散符号到分布式表示
核心原理
自然语言处理的第一步是将文本转换为机器可计算的数值形式。早期方法使用 One-Hot 编码,将每个词表示为一个高维稀疏向量,向量维度等于词表大小,只有当前词对应位置为 1,其余为 0。这种表示存在两个致命缺陷:维度灾难(词表通常有数十万词)和语义鸿沟(任意两个词的向量内积为 0,无法体现语义相关性)。
分布式表示(Distributed Representation)的提出彻底改变了这一局面。其核心思想是:用一个低维稠密向量(通常 50~300 维)来表示词的语义,使得语义相近的词在向量空间中距离更近。Word2Vec 是其中最经典的实现,包含两种训练模式:
- CBOW(Continuous Bag-of-Words):用上下文词预测中心词,适合小数据集。
- Skip-gram:用中心词预测上下文词,对低频词更友好。
Word2Vec 的训练本质是学习一个浅层神经网络,其隐藏层权重即为词向量。训练完成后,词向量具有有趣的线性性质,例如 vec("国王") - vec("男人") + vec("女人") ≈ vec("女王"),这证明向量空间确实捕捉到了语义关系。
判断方法与操作流程
在实际项目中,选择词向量方案需要根据任务特点判断:
- 数据规模:小规模领域语料(如医疗、法律)建议使用领域内预训练词向量或从零训练;大规模通用语料可直接使用公开的通用词向量。
- 任务类型:词级任务(如命名实体识别)适合静态词向量;句子级任务(如情感分类)可考虑动态词向量(如 ELMo)。
- 资源约束:Word2Vec 训练速度快、资源消耗低;BERT 等动态表示效果好但需要 GPU 资源。
标准训练流程如下:
# 使用 gensim 训练 Word2Vec
from gensim.models import Word2Vec
sentences = [["我", "喜欢", "自然", "语言", "处理"], ...]
model = Word2Vec(sentences, vector_size=100, window=5, min_count=2, sg=1)
word_vec = model.wv["自然"] # 获取词向量
案例拆解:电商评论情感分类
假设我们要构建一个电商评论情感分类器。初始阶段使用 One-Hot 编码时,模型准确率仅为 62%,且训练时间长达 2 小时。改用 Word2Vec 预训练词向量(100 维)后,准确率提升至 78%,训练时间缩短至 40 分钟。进一步使用领域内语料(10 万条评论)微调词向量后,准确率达到 83%。关键经验是:领域适配比模型复杂度更重要,通用词向量在专业领域往往表现不佳。
3.2 RNN 与 LSTM:序列建模的突破与局限
核心原理
词向量解决了词的表示问题,但自然语言是序列数据,词与词之间存在顺序依赖。循环神经网络(RNN)通过循环连接和隐状态传递来建模序列。在每一步 t,RNN 接收当前输入 xt 和上一步隐状态 ht-1,计算当前隐状态 ht = tanh(W·[ht-1, xt] + b)。这种结构使得 RNN 理论上可以处理任意长度序列。
然而,标准 RNN 存在严重的梯度消失/梯度爆炸问题。当序列长度超过 10~20 时,反向传播的梯度会指数级衰减,导致模型无法学习长距离依赖。长短期记忆网络(LSTM)通过引入门控机制解决了这一问题:
- 遗忘门:决定丢弃哪些历史信息。
- 输入门:决定哪些新信息写入细胞状态。
- 输出门:决定从细胞状态输出哪些信息。
LSTM 的细胞状态 Ct 像一条"传送带",信息可以在长序列中稳定流动,有效缓解了梯度消失问题。GRU(门控循环单元)是 LSTM 的简化版本,将三个门合并为两个门,参数更少、训练更快,在多数任务上性能与 LSTM 相当。
判断方法与操作流程
选择 RNN 变体时,可参考以下判断路径:
| 场景特征 | 推荐模型 | 理由 |
|---|---|---|
| 序列长度 < 20,简单任务 | 标准 RNN | 参数少,训练快 |
| 序列长度中等,需长依赖 | LSTM | 门控机制,长依赖能力强 |
| 资源受限,需快速迭代 | GRU | 参数少,性能接近 LSTM |
| 需要双向上下文 | Bi-LSTM | 同时利用前后文信息 |
工程实现要点:
# PyTorch 实现 Bi-LSTM
import torch.nn as nn
lstm = nn.LSTM(input_size=100, hidden_size=128, num_layers=2,
bidirectional=True, dropout=0.3)
output, (h_n, c_n) = lstm(embedded_sequence)
案例拆解:命名实体识别(NER)
在中文医疗文本 NER 任务中,我们对比了 Bi-LSTM-CRF 与规则方法的性能。规则方法在 500 条测试样本上 F1 值为 0.71,而 Bi-LSTM-CRF 达到 0.89。关键改进点包括:使用预训练词向量(100 维)、堆叠 2 层 Bi-LSTM(隐藏层 128 维)、CRF 层约束标签转移。训练过程中发现,梯度裁剪(clip=5.0)是稳定训练的关键,否则 loss 会在第 3 个 epoch 后出现 NaN。
3.3 注意力机制:让模型学会"关注"
核心原理
注意力机制(Attention)的灵感来源于人类视觉:当观察一幅图像时,我们会自动聚焦于关键区域,而非均匀扫描所有像素。在 NLP 中,注意力机制让模型在生成每个输出时,动态地分配不同的权重给输入序列的不同位置。
以机器翻译为例,传统 Seq2Seq 模型将整个源句编码为一个固定向量,信息瓶颈明显。引入注意力后,解码器在生成每个目标词时,会计算当前隐状态与所有源词隐状态的相似度,得到注意力权重,然后加权求和得到上下文向量。数学表达为:
score(q, k) = q^T · k # 点积注意力
score(q, k) = q^T · W · k # 加性注意力
attention_weights = softmax(score(q, k))
context = Σ attention_weights · v
Self-Attention(自注意力)是注意力机制的变体,其中 Query、Key、Value 都来自同一序列。它允许序列中的每个位置直接关注所有其他位置,实现全局依赖建模,且计算可完全并行化。
判断方法与操作流程
注意力机制的选择需要根据任务特性:
- 序列到序列任务(翻译、摘要):使用 Encoder-Decoder Attention,Query 来自解码器,Key/Value 来自编码器。
- 序列内部建模(文本分类、情感分析):使用 Self-Attention,所有向量来自同一序列。
- 多模态任务(图文匹配):使用 Cross-Attention,Query 来自一个模态,Key/Value 来自另一个模态。
实现注意力时需注意:缩放因子 1/√dk 是必要的,否则点积结果过大导致 softmax 梯度消失;Mask 机制用于处理变长序列的 padding 部分,避免无效位置参与计算。
案例拆解:文本摘要生成
在新闻摘要任务中,我们对比了 LSTM 基线模型与 LSTM+Attention 模型。基线模型 ROUGE-L 分数为 0.32,加入注意力后提升至 0.41。进一步可视化注意力权重发现,模型在生成摘要时确实聚焦于新闻的关键句子和关键词。例如,生成"公司宣布季度亏损"时,注意力权重集中在"亏损"、"季度"、"宣布"等词上。这一案例验证了注意力机制的有效性和可解释性。
3.4 Transformer:大模型的基石架构
核心原理
Transformer 架构在 2017 年由 Vaswani 等人提出,彻底摒弃了循环结构,完全基于注意力机制。其核心创新包括:
- 多头自注意力(Multi-Head Self-Attention):将注意力计算拆分为多个"头",每个头在不同子空间学习不同的关注模式,最后拼接融合。这增强了模型的表达能力。
- 位置编码(Positional Encoding):由于没有循环结构,Transformer 需要显式注入位置信息。使用正弦/余弦函数生成位置编码,或使用可学习的位置嵌入。
- 前馈网络(FFN):每个注意力层后接一个两层全连接网络,增加非线性表达能力。
- 残差连接与层归一化:解决深层网络训练不稳定问题,加速收敛。
Transformer 的 Encoder 由 N 个相同层堆叠,每层包含多头注意力和 FFN;Decoder 额外包含 Masked Self-Attention(防止看到未来信息)和 Cross-Attention(关注编码器输出)。这种架构实现了完全并行化,训练速度远超 RNN,且能建模任意长度的依赖关系。
判断方法与操作流程
在实际工程中,选择 Transformer 变体需考虑:
| 模型 | 参数量 | 适用场景 | 资源需求 |
|---|---|---|---|
| BERT-base | 110M | 理解任务(分类、NER、QA) | 单卡 16GB 可训练 |
| 1.5B | 生成任务(文本续写、对话) | 多卡或分布式 | |
| T5 | 220M~11B | 统一文本到文本框架 | 视规模而定 |
| LLaMA | 7B~65B | 通用大模型,指令微调 | 需要模型并行 |
Transformer 训练的关键超参数包括:学习率(建议 1e-4~5e-5 配合 warmup)、批次大小(影响稳定性)、注意力头数(通常 8~16)、层数(6~24 层)。
案例拆解:从零训练一个小型 Transformer
为了深入理解 Transformer 的工作原理,我们设计了一个小型实验:在 10 万条中文新闻标题上训练一个 4 层、4 头、隐藏维度 256 的 Transformer 分类器。训练过程显示:
- 初始阶段(0~1000 步):loss 快速下降,准确率从 50% 升至 70%。
- 中期阶段(1000~5000 步):准确率缓慢提升至 82%,出现轻微过拟合迹象。
- 后期阶段:加入 dropout=0.3 和权重衰减后,验证集准确率稳定在 85%。
通过可视化注意力头,我们发现不同的头确实关注不同的模式:有的头关注句法依赖(如"的"字结构),有的头关注语义关联(如"经济"与"增长")。这验证了多头机制的有效性。
总结复盘
从词向量到 Transformer 的演进,本质上是表示能力和建模能力的双重提升。词向量解决了语义表示问题,RNN/LSTM 解决了序列建模问题但受限于顺序计算,注意力机制突破了并行瓶颈,而 Transformer 则统一了表示与建模,成为大模型的标准架构。理解这一演进逻辑,有助于在实际项目中做出合理的技术选型:简单任务不必使用大模型,复杂任务则需要考虑 Transformer 及其变体。下一阶段的学习将围绕预训练、微调和高效推理展开,这些内容都建立在本章的基础之上。