自然语言处理
绪论
任务
在模型处理时,任务通常被转化为以下三种数学/策略结构 :
分类 (Classification):输入文本序列,输出单标签或多标签 。例如:文本分类、情感分类、文本匹配、文本蕴涵(Entailment) 。
序列标注 (Sequence Labeling):输入文本序列,输出等长的标签序列 。通常使用 BIO 标注法(B: Beginning, I: Inside, O: Outside) 。例如:中文分词、词性标注、命名实体识别 。
生成 (Generation):输入文本序列,输出目标文本序列(Seq2seq) 。例如:机器翻译、文本摘要、自动问答、对话系统 。
NLP 的主要挑战/难点
考试中如果让你论述“为什么自然语言处理被称为人工智能皇冠上的明珠/主要困难是什么?”,请从歧义现象和未知语言现象两方面切入:
1. 困难一:普遍存在的歧义 (Ambiguity) 现象
语言在各个层面上都充斥着不确定性 :
词法切分歧义:同样的字串有多种切分方式 。课件典型例子:“庸医治病害死人” 。若切分成“庸医/治/病害/死人”则完全曲解语意,正确应为“庸医/治/病/害/死/人” 。
词性标注歧义:一词多词性兼类 。例如:“把这篇报道(名词)编辑(动词)一下” vs “他报道(动词)了那位编辑(名词)” 。
结构/句法歧义的爆炸性:句子中歧义的组合能产生大量的可能解释 。 Catalan 数(加泰罗尼亚数)定律:一个含有 n 个介词短语修饰的句子,其句法可能解释数量超过 2n 种 。例如句短语组合:“I saw the man on the hill in Texas with the telescope at noon on Monday” 解析多达 132 种 。
语义歧义:强烈依赖常识、背景与特定生活场景 。例如幽默段子中的语义双关(配钥匙师傅问“你配吗?”,垃圾分拣阿姨问“你是什么垃圾?”,滴滴司机问“你搞清楚你自己的定位了吗?”) 。
篇章/语用歧义(指代消解):上下文中的共指消解(Coreference Resolution)非常困难 。例如:“张三看到了李四,当时他在公共汽车上。”(“他”到底是张三还是李四?机器很难单纯从句法分辨) 。
2. 困难二:大量未知语言现象 (Out-of-Vocabulary, OOV)
开放世界的语言是实时动态演变的 :
新词汇与专有名词:不断涌现的新人名、地名、新术语 。
旧词新义:旧词汇被赋予了全新的政治或社会含义(如“川普”) 。
非规范的语句结构:在网络语言或口语中广泛存在的非规范网络语法(如:“给到”、“被平均”、“很XX”) 。
总结:自然语言理解 (NLU) 的四大核心挑战
普遍存在的不确定性:词法、句法、语义、语用和语音等各层面皆有歧义 。
未知语言现象的不可预测性:新词、新义、新语法无处不在 。
始终面临的数据不充分性:有限的训练语料永远无法涵盖开放、无限的语言现象 。
语言知识表达的复杂性:人类的语义知识具有模糊性和错综复杂的关联性,难以用常规方法有效结构化描述 。
NLP 主要发展阶段、处理方法与两大主义
NLP 的演进历史是理性主义与经验主义交替并最终走向融合的过程:
| 发展阶段 | 处理方法分类 | 理论基础与核心模式 | 机器“理解”的哲学观 | 存在的主要问题 |
|---|---|---|---|---|
| 理性主义时代 (1990年以前) | 基于规则的方法 (规则驱动) | 理论基础:Chomsky文法理论 。 核心模式:语言学家人工开发规则库(如 N + N → NP)与词典,结合推导算法消解歧义。 形式:知识库 + 推理系统 → NLP系统 。 | 结构主义观: 机器的理解机制应该与人类的大脑理解步骤完全相同 。 | 语言具有极大的变化性,人工定义的规则面临无穷性与复杂性,无法覆盖真实语言现象 。 |
| 经验主义时代 (1990年~2012年) | 基于统计学习的方法 (数据驱动) | 理论基础:统计学、信息论、机器学习 。 核心模式:通过感官输入进行联想与泛化。从大量语言数据中设定学习模型并推导参数(最大似然、贝叶斯学习),给出量化指标 。 形式:语料库 + 统计模型 → NLP系统 。 典型模型:MEM、SVM、HMM、CRF(离散表示 + 线性模型) 。 | 功能主义观(图灵测试): 不关心机制是否相同,只要机器在自然语言问答的表现上与人相同,就承认其具有智能 。 | 严重依赖特征工程与有限的离散符号表示,始终面临数据不充分性的挑战 。 |
| 深度学习时代 (2006年/2012年~至今) | 基于深度学习的方法 (大模型/神经网络) | 理论基础:人工神经网络(模拟生物大脑结构与多层非线性映射) 。 核心模式:表示学习(算法自动学习分布式表示/低维稠密向量) + 浅层/深层非线性学习 。 技术演进:深度神经网络 → 预训练模型(BERT/ELMo) → 大语言模型(LLM) 。 | 经验主义的延伸: 通过海量数据与超级参数表现,全方位模拟人类日常对话行为 。 | 几乎能解决所有你能想到的NLP任务,目前学术界和工业界重点关注大语言模型 。 |
前馈神经网络
FNN基础
1. 结构特征
- 全连接层 (Fully Connected Layer / MLP):层与层之间每个神经元都有连接。
- 无反馈连接:信号只沿着从输入层到输出层的单一方向流动,内部无反馈回路(这是它与循环神经网络 RNN 的本质区别),在图论上表现为一个有向无环图 (DAG)。
2. 前向传播 (Forward Propagation)
前向传播是将输入通过一层层的线性组合与非线性变换,最终得到输出的过程。
对于第 l 层:
线性变换:
z(l) = W(l)a(l − 1) + b(l)
非线性激活:
a(l) = f(z(l))
(其中 W 为权重矩阵,b 为偏置向量,a(0) 为原始输入 x)
3. 激活函数 (Activation Functions) —— 必考问答题
为什么需要激活函数 (Why?):
如果没有非线性激活函数,无论网络叠加多少层,多层线性变换的组合仍然只是一个线性变换(即 W2(W1x + b1) + b2 = Wnewx + bnew)。非线性激活函数赋予了神经网络逼近任意非线性函数的能力(通用近似定理)。
常见激活函数 (Which?):
- Sigmoid:$f(z) = \frac{1}{1 + e^{-z}}$。将输出映射到 (0, 1)。缺点是易发生梯度消失,且输出非零中心化(Not zero-centered)。
- Tanh:$f(z) = \frac{e^z - e^{-z}}{e^z + e^{-z}}$。将输出映射到 (−1, 1),零中心化,但在大值/小值区间同样存在梯度消失。
- ReLU (Rectified Linear Unit):f(z) = max (0, z)。计算极其高效,在 z > 0 区域梯度恒为 1,极大缓解了梯度消失;缺点是 z < 0 时神经元会“坏死”(Dying ReLU)。
常见损失函数(以分类为例)
在分类任务中,最终输出层通常连接 Softmax 函数,将未归一化的得分(Logits)转化为概率分布:
$$\hat{y}_i = \frac{e^{z_i}}{\sum_{j=1}^C e^{z_j}}$$
与之配套的损失函数是 交叉熵损失 (Cross-Entropy Loss)。对于单样本多分类任务,其数学表达式为:
$$L = -\sum_{i=1}^C y_i \log \hat{y}_i$$
(其中 yi 为真实标签的 One-hot 编码,ŷi 为模型预测的概率,C 为类别总数。因为 y 是 One-hot 的,最终形式常简化为 L = −log ŷgold)
反向传播与梯度计算 (Backpropagation)
反向传播的本质是高效计算损失函数对所有参数的梯度。
- 核心数学工具:链式法则 (Chain Rule)。
- 核心算法思想:动态规划 (Dynamic
Programming)。
- 为什么要用动态规划? 如果直接对每个参数独立用链式法则求导,很多公共路径的导数会被重复计算(导致指数级复杂度)。反向传播通过从输出层向输入层反向逐层计算,将中间层计算出的误差项(如 $\delta^{(l)} = \frac{\partial L}{\partial \mathbf{z}^{(l)}}$)记忆化存储(Cache)起来,供前一层直接调用,从而将复杂度降为线性级别。
前馈网络用于文本表示与分类
利用 FNN 处理文本的经典流程通常是:
- 文本特征离散化映射:通过词表将文本中的词转化为 Word Embedding(词向量)。
- 文本表示聚合 (Aggregation):将句子中所有词的向量进行均值池化(Average Pooling)或求和(Sum),组合成一个固定长度的整句密集向量(Dense Vector)。
- 前馈分类:将该整句向量输入到 FNN(MLP)中,经过几层映射,最后通过 Softmax 预测文本的标签(例如:情感分类中的正评/负评)。
依存句法分析任务 (Dependency Parsing)
这是本章乃至整个 NLP 考试中最容易出大题的重点!
1. 依存树 (Dependency Tree)
- 定义:用有向弧来表示词与词之间的修饰与被修饰关系(Head
→
Dependent)。通常会在句首或句末加一个虚拟根节点
ROOT。 - 标准三大约束:单父节点(每个词有且仅有一个父亲)、无环性、连通性。
2. 基于转移的方法 (Transition-based Method / Arc-standard系统)
该方法将句法分析看作是一个序列决策问题,从左到右扫描句子。
三大核心数据结构:
- Stack
(栈):用于存放当前正在处理的词。初始状态仅包含
[ROOT]。 - Buffer (缓存):用于存放句子中尚未处理的词。初始状态包含句子中所有的词。
- Dependency Set (依存边集合):存放已经识别出来的依存关系对。初始为空。
- Stack
(栈):用于存放当前正在处理的词。初始状态仅包含
三大核心动作 (Transitions):
假设栈顶前两个元素分别为 S1(最顶端)和 S2(次顶端),Buffer 的第一个元素为 B1:
- SHIFT (移进):将 Buffer 的首元素 B1 弹出,压入 Stack。
- LEFT-ARC (左弧):建立 S1 → S2 的依存关系(S1 是头,S2 是依赖项),并将 S2 从栈中弹出。
- RIGHT-ARC (右弧):建立 S2 → S1 的依存关系(S2 是头,S1 是依赖项),并将 S1 从栈中弹出。
3. 基于神经网络的解决过程(如经典的 Chen & Manning 模型)
传统的 Transition-based 方法需要人工设计大量的组合特征。而神经网络可以通过学习自动化解决:
- 特征抽取:在每一个状态下,提取 Stack 顶端和 Buffer 顶端的若干个词、对应的词性标签(POS tags)以及已有的依存边标签(Labels)。
- 向量化拼接:查找对应的 Embedding(词向量、词性向量、标签向量),将它们拼接 (Concatenate) 成一个高维长向量 x。
- 网络预测:将 x 输入一个前馈神经网络(FNN),通过激活函数后,输出层使用 Softmax 预测当前步骤最应该执行哪一个动作(SHIFT、LEFT-ARC 还是 RIGHT-ARC)。
- 状态更新:根据预测出的动作更新 Stack 和
Buffer,重复此过程直到 Buffer 为空且 Stack 中仅剩
[ROOT]。