第一章 NLP 四大核心任务
NLP 的任务可以归纳为四大类:文本分类、序列标注、信息抽取、文本生成 。 几乎所有实际应用(搜索引擎、客服机器人、翻译、写作助手)都是这四类的组合。
1.1 文本分类(Text Classification)
定义:给整段文本打一个类别标签。
- 输入:一段文本
- 输出:一个类别(有限集合中的一个)
典型应用:
| 应用 | 输入 | 类别 |
|---|---|---|
| 情感分析 | "这家餐厅的菜太好吃了!" | 正面 / 负面 / 中性 |
| 垃圾邮件识别 | 一封邮件正文 | 垃圾 / 正常 |
| 意图识别 | "帮我订一张明天去北京的机票" | 订机票 / 查天气 / 闲聊 |
| 新闻分类 | 一篇新闻稿 | 体育 / 财经 / 科技 ... |
例子:
输入: "这家餐厅的菜太好吃了!" → 输出: 正面
输入: "快递三天了还没到,差评" → 输出: 负面
评价指标:
- 准确率(Accuracy):预测对的占比(类别均衡时够用)
- 精确率 / 召回率 / F1:类别不平衡时更可靠(垃圾邮件只占 1%,全猜"正常"准确率也有 99%)
本质 :把"整段文本"压缩成一个标签 ------ 需要抓住全局语义。
1.2 序列标注(Sequence Labeling)
定义:对文本中**每一个 token(字/词)**打一个标签。
与文本分类的区别:
- 分类:整段文本 → 1 个标签
- 标注:N 个 token → N 个标签(逐词分类)
典型应用:
| 应用 | 标签示例 |
|---|---|
| 中文分词 | 每个字标 B/M/E/S(词开始/中间/结束/单独成词) |
| 词性标注 | 名词 / 动词 / 形容词 ... |
| 命名实体识别 NER | 人名 / 地名 / 机构名 / 时间 |
评价指标:与分类类似,但按"实体级"算(一个实体整体识别对才算对), 即精确率/召回率/F1 的实体版本。
本质:token 级分类 ------ 既要看每个词自身,又要看上下文。
1.3 信息抽取(Information Extraction)
定义 :从非结构化文本中抽取结构化信息,通常指三大子任务:
- 实体识别 :找出人名、地名、机构等(与序列标注重叠,通常用 NER 完成)
- 关系抽取:识别实体对之间的关系
- 事件抽取:识别"谁在何时何地做了什么"
例子(关系抽取 → 三元组):
原文: "张三在阿里巴巴工作,担任算法工程师。"
三元组: (张三, 就职于, 阿里巴巴)
(张三, 担任, 算法工程师)
三元组是构建知识图谱的基本单元。
与序列标注的关系:
- 实体识别 = 序列标注任务
- 关系抽取 = 通常建模为"实体对分类"或"生成式"(直接生成三元组文本)
本质:把非结构化文本变成结构化数据(表格 / 图谱 / 数据库),供下游检索、问答使用。
1.4 文本生成(Text Generation)
定义 :根据输入(或无输入)生成一段新的文本。
典型应用 :机器翻译、文本摘要、对话系统、写作辅助、代码生成。
核心原理:自回归(Autoregressive) 逐词预测下一个词,把上一步的输出作为下一步的输入:
输入 [<BOS>] → 预测 "I"
输入 [<BOS>, I] → 预测 "love"
输入 [<BOS>, I, love] → 预测 "you"
输入 [...I love you] → 预测 <EOS>,停止
生成策略:
- 贪心:每步取概率最高的词(快但可能平庸)
- 束搜索(Beam Search):每步保留 top-k 条路径,全局更优(翻译常用)
- 采样:按概率分布随机抽(有创造性,对话/写作常用),温度 T 控制随机程度
评价指标:BLEU(翻译)、ROUGE(摘要)------与参考文本的 n-gram 重合度。
本质:学习"给定前文,下一个词的概率分布",是四大任务里唯一真正"产出新内容"的。
1.5 四大任务对比总表
| 任务 | 输入 | 输出 | 本质 | 典型应用 | 代表模型 |
|---|---|---|---|---|---|
| 文本分类 | 一段文本 | 一个类别 | 全局语义 → 标签 | 情感分析、意图识别 | TextCNN、BERT |
| 序列标注 | 一段文本 | 每个 token 一个标签 | token 级分类 | 分词、NER、词性标注 | BiLSTM+CRF、BERT+CRF |
| 信息抽取 | 一段文本 | 结构化三元组 | 实体 + 关系识别 | 知识图谱构建 | 管道式 / 生成式大模型 |
| 文本生成 | 文本 / 指令 | 一段新文本 | 逐词预测下一个词 | 翻译、摘要、对话 | RNN、Transformer、GPT |
一条记忆线:分类是"整体打标",标注是"逐个打标",抽取是"挖出结构", 生成是"写出新文"。前三个是"理解类",最后一个是"生成类"。
第二章 技术演进史
核心问题始终是三个:
- 怎么表示文本(词表示)
- 怎么建模序列(模型结构)
- 怎么应用到任务(使用范式)
三代技术分别给出了不同的答案。
2.1 第一代:规则 + n-gram 统计时代(1950s ~ 1990s)
2.1.1 核心思想
不追求"理解",只做统计 :从大规模语料中统计词与词的共现频率, 用频率估计概率,用概率做预测。
2.1.2 语言模型(Language Model)概念
语言模型回答:一句话出现的概率是多少?
P(我今天很开心) = ?
按链式法则拆解:
P(w1) × P(w2|w1) × P(w3|w1,w2) × ... × P(wn|w1...w_{n-1})
即: P(我) × P(今天|我) × P(很|我今天) × P(开心|我今天很)
问题:条件太长,"我今天很"这种前缀在语料里可能一次都没出现过, 概率没法算。于是引入 n-gram。
2.1.3 n-gram 原理
马尔可夫假设 :一个词只依赖它前面的 n-1 个词,忽略更早的历史。
| 模型 | 假设 | 计算 |
|---|---|---|
| 一元 unigram | 词与词独立 | P(w_i) |
| 二元 bigram | 只依赖前 1 个词 | P(w_i | w_{i-1}) |
| 三元 trigram | 只依赖前 2 个词 | P(w_i | w_{i-2}, w_{i-1}) |
计算例子(二元):
P(学习 | 我爱) = count("我爱学习") / count("我爱")
假设语料中:
"我爱" 出现 100 次
"我爱学习" 出现 30 次
则 P(学习 | 我爱) = 30 / 100 = 0.3
整句概率(二元模型下):
P(我爱学习) = P(我) × P(爱|我) × P(学习|爱)
平滑处理(关键细节): 如果某个 n-gram 在语料中从未出现,概率为 0,会导致整句概率乘成 0。 解决办法是"平滑"------给未见过的组合留一点概率:
加一平滑: P = (count + 1) / (N + V) # V 为词表大小
2.1.4 当时的任务做法
- 文本分类:词袋模型(Bag of Words)------把文本变成"词出现次数"的向量, 再用 TF-IDF 加权(抑制"的、了"等高频无意义词),然后算相似度或直接做统计判断。
- 机器翻译:基于短语的统计机器翻译,查"短语翻译表" + 调序模型。
2.1.5 局限
- 数据稀疏:n 越大,组合越多,语料越不够用("n=5 基本没法用")
- 无长距离依赖:只看到前 n-1 个词,跨句、跨段信息完全丢失
- 无语义:只有表面统计,不知道"苹果"和"水果"相关
2.2 第二代:机器学习时代(浅层模型,1990s ~ 2010s)
2.2.1 核心变化
从"纯统计公式"升级为"人工特征 + 学习算法":
特征工程(人设计)→ 特征向量 → 学习算法(自动学特征到标签的映射)→ 预测
2.2.2 代表模型
| 模型 | 特点 | 擅长任务 |
|---|---|---|
| 朴素贝叶斯 | 假设特征条件独立,简单快 | 文本分类 |
| SVM 支持向量机 | 找最大间隔超平面,效果好 | 文本分类 |
| 最大熵 / 逻辑回归 | 可融合任意特征 | 分类 |
| HMM 隐马尔可夫 | 生成式序列模型,状态转移 | 序列标注 |
| CRF 条件随机场 | 判别式序列模型,全局最优标注 | 序列标注(当时 SOTA) |
为什么 CRF 比 HMM 强:
- HMM 假设"当前状态只由上一个状态决定"(太强),且是生成式(要建模词本身)
- CRF 是判别式,直接建模"给定句子,最优标签序列",可以自由使用 前后缀、大小写、词典等任意人工特征
2.2.3 各任务的做法
- 文本分类:TF-IDF 特征 + SVM / 朴素贝叶斯
- 序列标注:HMM / CRF,特征靠人工设计(词形、前缀、后缀、词典匹配)
- 信息抽取:管道式------先 NER(CRF),再关系分类(SVM),串成流水线
- 文本生成:统计机器翻译(短语表 + 语言模型重排)
2.2.4 局限
- 特征工程是瓶颈:效果好不好,全看人设计的特征好不好
- 模型浅 :无法捕捉深层语义("苹果"和"香蕉"在特征空间毫无关联)
- 任务隔离:每个任务单独设计特征和模型,几乎没有迁移能力
2.3 第三代:深度学习时代(2013 ~ 至今)
五个里程碑:词嵌入 → RNN/LSTM → Attention/Transformer → 预训练范式 → 大模型。
2.3.1 里程碑①:词嵌入革命(Word2Vec, 2013)
解决的问题:词怎么表示?
-
one-hot:维度=词表大小,词与词距离恒等,无语义
-
词嵌入(Word Embedding):稠密低维向量,语义相近的词向量相近
国王 - 男人 + 女人 ≈ 女王 ← 向量空间里的语义运算
苹果 ↔ 香蕉 距离近(都是水果)
词嵌入 Embedding , 它本质上是一张表: 词表大小 V × 嵌入维度 d_model(比如 V=30000, d_model=512)。
查表: "爱" → 第 1234 行 → 一个 512 维向量 0.3, -0.7, ...
要点:
这张表不是固定的,它是可训练参数!
训练时梯度会不断调整它,让语义相近的词向量靠拢。
推理时它只是查表,不再变化。
方法:Word2Vec 两种训练思路
- CBOW:用上下文词预测中心词
- Skip-gram:用中心词预测上下文词
2.3.2 里程碑②:RNN / LSTM 序列建模(2014 ~ 2015)
解决的问题:文本是变长序列,怎么按顺序建模?
- RNN:按顺序逐个读词,用隐藏状态 h_t 携带"到目前为止的信息"
- 问题 :梯度消失 → 长句子前面信息丢失 (下山的方向都已经不知道了)
- LSTM:引入门控机制(遗忘门 / 输入门 / 输出门), 用"细胞状态"这条高速公路把信息传远
序列标注经典组合:BiLSTM+CRF(双向 LSTM 编码 + CRF 保证标签序列全局最优)
局限:
- 串行计算,无法并行(GPU 优势用不上,训练慢)
- 长距离依赖仍是短板(LSTM 只是缓解,不是解决)
2.3.3 里程碑③:Attention + Transformer(2017, 划时代)
核心洞察 :建模序列不一定按顺序------可以让每个词直接"看"全序列的所有词, 一步建立任意两个词之间的关系。
**自注意力(Self-Attention)**四步:
① 每个词生成 Q(查询)、K(键)、V(值) 三个向量
② 分数(i,j) = Q_i · K_j / √d_k ← 词 i 对词 j 的关注度
③ softmax 归一化成概率
④ 输出 = Σ 概率 × V_j ← 按关注度混合所有词的信息
"猫 吃 鱼"中,"吃"会高权重关注"猫"(谁吃)和"鱼"(吃什么)------ 长距离依赖一步直达,不再受距离限制。
Transformer 的四大优势:
| 优势 | 说明 |
|---|---|
| 全序列并行 | 所有词的注意力同时算,GPU 友好 |
| 长距离依赖一步直达 | 任意两个词直接相连,无信息衰减 |
| 可堆叠深层 | 残差连接 + LayerNorm 解决梯度问题,能叠几十层 |
| 统一架构 | Encoder 管理解、Decoder 管生成,一套组件打天下 |
单层结构(详细推导见《Transformer 运行原理》笔记):
输入向量
→ 多头自注意力 → +残差 → LayerNorm
→ 前馈网络 FFN → +残差 → LayerNorm
→ 输出(形状不变,可继续堆下一层)
位置编码:注意力是"集合操作"不感知顺序,需给向量加上位置信息。
2.3.4 里程碑④:预训练大模型范式(2018 ~ )
核心转变:从"每个任务训练一个模型"到"一个模型,先预训练、再微调"。
两步走:
① 预训练: 在海量无标注文本上自监督学习(让模型学会"语言")
② 微调: 在小规模任务数据上继续训练(让模型学会"干某件事")
两条路线:
| 路线 | 结构 | 方向 | 擅长 | 代表 |
|---|---|---|---|---|
| Encoder 路线 | 双向 | 同时看左右上下文 | 理解类(分类/标注/抽取) | BERT |
| Decoder 路线 | 单向自回归 | 只看左边,逐词生成 | 生成类(翻译/对话/写作) | GPT |
为什么是革命:
- 之前的模型每个任务都要从头训练 + 大量标注数据
- 现在同一套预训练参数,微调一下就能做四大任务中的任何一个
- 词表示也从"静态词嵌入"升级为"上下文嵌入"(同一个词在不同句子里向量不同)
2.3.5 里程碑⑤:大模型时代(GPT-3 之后, 2020 ~ )
- 模型规模持续放大(千亿/万亿参数),出现涌现能力
- 使用方式从"微调"演变为"提示 / 指令":不用改参数,写清指令即可
- 对齐技术:指令微调(SFT)→ RLHF 人类反馈对齐,让模型听话、安全
2.3.6 四大参数及训练理解
【参数 Parameter】
模型里所有"可学习的旋钮"。训练的全过程,就是不断调整这些旋钮的值,
让模型输出越来越对。
举例:Transformer 里------
-
Embedding 词嵌入表(就是你正在学的)
-
注意力层的 W_Q、W_K、W_V
-
FFN 的 W1、W2、b1、b2
全都是参数。一个大模型有几十亿到上万亿个参数。
【权重 Weight】
参数里最常见的一类:线性变换的系数矩阵 W。
严格说:参数 = 权重 + 偏置(bias) + 其他可学习量(如 Embedding 表、位置编码)。
日常口语里"权重"和"参数"经常混用,因为神经网络里 90% 的参数都是权重。
记忆锚点:权重就是"输入乘以的那个数/矩阵"。
【梯度 Gradient】
损失函数对参数的"偏导数",回答一个问题:
"如果把某个参数调大一点点,损失会变大还是变小?变化多快?"
它是一个向量------每个参数都有一个对应的梯度分量。
关键性质:梯度的反方向 = 损失下降最快的方向。
【优化器 Optimizer】
负责"拿着梯度去更新参数"的算法。
梯度只告诉你方向,怎么走、走多快、要不要刹车,是优化器的事。
常见的有 SGD(最朴素)、Adam(现在的事实标准,自适应学习率+动量)。
把损失想象成地形海拔:
参数值 = 你所在的位置
前向传播 = 测量现在的高度
损失值 = 当前位置的海拔(越高越差)
梯度 = 脚下最陡的下坡方向
学习率 = 每步迈多大
优化器 = 你的下山策略
SGD = 老实人:每步都朝最陡方向走固定步长
Adam = 老手:带惯性(动量,冲过小坑)+ 自适应步长
(陡坡小步怕滑,平缓处大步提速)
训练 = 从山上随机位置出发,靠梯度指引一步步走下山谷(损失最低点)。
第三章 总结
3.1 三代技术对比总表
| 维度 | 第一代 n-gram | 第二代 机器学习 | 第三代 深度学习 |
|---|---|---|---|
| 时代 | 1950s~1990s | 1990s~2010s | 2013~至今 |
| 词表示 | one-hot / 计数 | 特征工程 | 词嵌入 → 上下文嵌入 |
| 核心方法 | 统计频率 + 概率 | 人工特征 + 浅层模型 | 端到端深层神经网络 |
| 代表模型 | n-gram、词袋+TF-IDF | NB、SVM、HMM、CRF | RNN/LSTM、Transformer、BERT/GPT |
| 长距离依赖 | 完全不行 | 不行 | 注意力一步直达 |
| 语义理解 | 无 | 无 | 有(词嵌入/上下文表示) |
| 任务适配 | 每任务定制 | 每任务定制特征 | 预训练 + 微调/提示,统一 |
| 主要瓶颈 | 数据稀疏 | 人工特征 | 算力 / 数据 / 可解释性 |
3.2 一条主线串讲
整个 NLP 演进史可以浓缩为三条线的同步升级:
词表示: one-hot → 统计计数 → 词嵌入 → 上下文嵌入(BERT/GPT)
模型: n-gram → SVM/CRF → RNN/LSTM → Transformer → 大模型
范式: 手工规则 → 特征+算法 → 端到端 → 预训练+微调 → 提示/指令
- 表示越来越"懂语义"
- 模型越来越"能并行、能看远"
- 范式越来越"少标注、少定制、通用化"