查看全课大纲(第 48 / 69 节)
- 1.NLP 的研究领域、应用与学习路径
- 2.自然语言的基本术语
- 3.信息论基础:信息熵与交叉熵
- 4.语言的进化与语义变迁
- 5.主观概率、客观概率与条件概率
- 6.贝叶斯原理与推理
- 7.随机变量:二项式、期望方差与联合概率
- 8.常见概率分布
- 9.辛普森悖论与贝叶斯解题实例
- 10.语言模型:语言概率与词袋模型
- 11.n-gram 语言模型(二元 / 三元 / N-Gram)
- 12.语言模型评价:交叉熵、困惑度与插值
- 13.朴素贝叶斯文本分类:垃圾邮件
- 14.拼写检查
- 15.中文分词:构词法、最大匹配、最优路径与 Jieba
- 16.词表示问题与语义相似度
- 17.TF-IDF 权重处理
- 18.One-Hot 表达与词表示的局限
- 19.Word2Vec 核心思想
- 20.Word2Vec 训练过程
- 21.Skip-gram 模型详解
- 22.词性标注任务与标注方法(规则 + N-Gram)
- 23.EM 算法与混合模型
- 24.高斯混合模型 GMM
- 25.从混合模型到隐马尔可夫模型
- 26.隐马尔可夫模型(HMM)推导与维特比解码
- 27.线性链条件随机场 CRF
- 28.贝叶斯网络与图模型
- 29.隐马尔可夫链与 HMM 推导
- 30.PLSA 主题模型
- 31.LSI 与 SVD 向量表达
- 32.LDA 与狄利克雷分布
- 33.主题模型实验复现(困惑度 / 分类 / 相似度 / 延展)
- 34.上下文无关文法(CFG)与句法分析
- 35.概率上下文无关文法 PCFG
- 36.统计机器翻译:词对齐与翻译模型
- 37.统计机器翻译中的对齐模型与参数估计
- 38.从统计机器翻译到神经机器翻译
- 39.神经元与反向传播速览(指向深度学习课)
- 40.CNN 原理及其在 NLP 中的应用
- 41.循环神经网络的基本原理与 Elman / Jordan 网络
- 42.LSTM:长短期记忆网络的核心思想与分步实现
- 43.Encoder-Decoder 框架
- 44.Seq2Seq 与早期注意力机制
- 45.注意力机制的背景与动机
- 46.注意力模型实现原理与匹配函数
- 47.记忆网络:组成与计算
- 48.注意力机制的应用与历史延展
- 49.Transformer 结构:Encoder-Decoder 栈与 Self-Attention
- 50.Multi-Head Attention、FFNN 与位置编码
- 51.层归一化、损失函数与 Universal Transformer 延展
- 52.预训练范式:从 ELMo 到 BERT
- 53.BERT 与掩码语言模型
- 54.BERT 下游任务微调与 GLUE 口径
- 55.GPT 与自回归语言建模
- 56.GPT-1 到 GPT-4 的演进
- 57.指令微调与 RLHF
- 58.分词器:BPE、WordPiece 与中文词表
- 59.上下文窗口与长文本处理
- 60.能力边界、成本与适用场景
- 61.文本分类实战:从朴素贝叶斯到逻辑回归
- 62.命名实体识别实战
- 63.文本生成与摘要实战
- 64.语义检索与向量库实战
- 65.RAG 知识库问答
- 66.NLP 评估指标:BLEU / ROUGE / BERTScore 与人工评估
- 67.幻觉与事实性问题
- 68.文本与知识结合(知识图谱压缩)
- 69.跨媒体信息检索与未来展望
注意力机制的应用与历史延展
小象实战讲义 · 自然语言处理
在上一节中,我们学习了注意力机制在神经机器翻译(NMT)中的核心应用,它通过动态对齐源语言与目标语言的词,显著提升了翻译质量。然而,注意力机制作为一种强大的信息聚焦与整合工具,其应用远不止于此。本节我们将探索注意力机制在语音识别、图像描述生成等领域的应用,并深入了解其在深度学习发展史上的重要延展——神经程序生成(Neural Programmer)与神经图灵机(Neural Turing Machine)。理解这些模型有助于我们把握注意力机制的思想精髓,并为后续学习更复杂的Transformer架构奠定基础。
💡 核心导读
- 注意力机制的普适性:注意力机制适用于任何需要从输入序列(或输入集合)中动态选择、加权信息以生成输出序列(或结构化输出)的任务。
- 跨模态应用:我们将看到注意力机制如何连接语音与文本(语音识别)、图像与文本(图像描述生成),实现不同模态信息间的对齐与融合。
- 神经程序生成:一种将程序生成视为序列决策过程,并利用注意力机制选择操作符(operator)的模型,展示了注意力在结构化输出生成中的潜力。
- 神经图灵机:一个结合了循环神经网络(RNN)与外部可读写记忆(Memory)的模型,其读写操作的核心机制就是注意力,是理解现代记忆增强网络的关键。
- 历史定位:这些模型是注意力机制发展史上的重要里程碑,虽然部分已被更先进的架构替代,但其核心思想仍在持续影响NLP与AI领域。
注意力机制的应用领域
注意力机制的核心思想是“动态加权求和”。只要有输入序列(或集合)和输出序列(或结构化输出),且输出依赖于输入的某些部分,就可以考虑引入注意力。
语音识别
在语音识别(Speech Recognition)任务中,输入是音频信号序列(如梅尔频谱图),输出是字符或词序列。传统的端到端模型(如基于LSTM的Seq2Seq)在处理长音频时,容易丢失信息或产生对齐错误。
引入注意力机制:在编码器-解码器框架中,编码器处理音频特征序列,解码器(通常为RNN/LSTM)在生成每一个字符时,通过注意力机制计算对编码器所有时间步隐藏状态的权重分布。模型可以学会在生成特定字符时,“聚焦”到音频信号中对应的音节或音素片段。
例如,在处理英文绕口令“How much wood would a woodchuck chuck”时,模型需要区分发音相似的词(如“wood”和“would”)。注意力机制可以学习到清晰的权重分布,使得生成每个词时,其对应的音频片段权重显著高于其他部分,从而提升识别准确率。这种在字符级别(character level)建立音频与文本对齐的能力,是注意力模型的一大优势。
图像描述生成
图像描述生成(Image Captioning)是一个典型的跨模态任务:输入是一张图像,输出是描述该图像的文本句子。
模型架构:
- 编码器:通常使用预训练的卷积神经网络(CNN,如VGG、ResNet)提取图像特征。CNN的最后一层卷积特征图(或经过全局平均池化后的特征向量)可以作为图像的“视觉编码”。
- 解码器:通常使用RNN(如LSTM)作为语言模型,逐词生成描述。
- 注意力机制:关键创新在于,解码器在生成每一个词时,并非使用整个图像的单一全局特征,而是通过注意力机制“看”向图像的不同区域。
- 编码器的输出不再是单一向量,而是CNN中间层输出的特征图(例如,
[H, W, C],代表高度、宽度和通道数)。这个特征图可以看作是一组空间位置的特征向量(H*W个向量)。 - 解码器在每一步生成词时,计算一个上下文向量(context vector),它是所有空间位置特征向量的加权和,权重由注意力分数决定。
- 注意力分数由解码器上一时刻的隐藏状态和每个空间位置的特征向量共同计算得出(例如,通过一个小的前馈网络)。
- 编码器的输出不再是单一向量,而是CNN中间层输出的特征图(例如,
注意力可视化:训练好的模型,其注意力权重可以被可视化。例如,当模型生成“a dog is standing on the hard wood floor”时,“dog”对应的注意力权重会集中在图像中狗的区域;生成“a stop sign is on the road”时,“stop sign”的注意力权重会集中在停止标志的区域。这种可视化不仅证明了模型工作的可解释性,还能辅助其他任务。
辅助任务应用:
- 物体识别与分割:当模型已经通过注意力知道“woman”大概对应图像中某个区域时,这个先验知识可以帮助物体检测或分割模型更准确地将该区域分类为“人”,而不是错误地分类为旁边的“小孩”,从而减少误识别。
- 视觉问答(VQA):给定一张图像和一个关于图像的自然语言问题(如“What color is the woman wearing?”),模型需要生成答案。注意力机制可以帮助模型在回答问题时,将问题中的关键词(如“woman”、“wear”)与图像中对应的区域(人的衣服区域)关联起来,从而提取关键信息(像素颜色)来生成答案(如“green”)。
这些应用表明,注意力机制能够建立文本(或语音)单元与视觉(或听觉)特征区域之间的软对齐,是实现跨模态理解的关键技术。
注意力模型的延展1:神经程序生成
中文里”神经程序生成”常被当成一件事,其实是两条不同的脉络,混在一起讲必然出错:
| Neural Programmer | Neural Programmer-Interpreter(NPI) | |
|---|---|---|
| 提出者与年份 | Neelakantan、Le、Sutskever 等(arXiv:1511.04834,ICLR 2016) | Reed 与 de Freitas(2015) |
| 要解决的任务 | 表格问答:给一张表和一个问题,输出答案 | 程序执行:给一段程序和一个程序状态,一步步算出结果 |
| 程序长什么样 | 隐式程序(latent program):SELECT/AGGREGATE 这类表格操作的序列 | 显式程序:ADD、MULTIPLY、IF-THEN 这类算术/控制流原语的序列 |
| 注意力用在哪 | 选择第几列、第几行(对表格结构做软选择) | 不涉及表格选择,注意力用于跟踪执行状态 |
本节讲的是前者(Neural Programmer,表格问答 + 隐式程序)。ADD/MULTIPLY/IF-THEN 是 NPI 的原语,不是它的。
基本思想
以表格问答为例,一个”程序”可以看作一系列表格操作的有序组合:先从表里选出若干列,再对选中的行做筛选,最后把符合条件的单元格聚合成一个答案。整段程序是隐式的——训练数据只给出”问题→答案”,没有人标注中间该选哪列哪行。
神经程序生成模型将这一过程建模为序列决策:
- 状态:模型维护一个内部状态(通常由RNN管理),该状态随着程序执行的步骤而演化。
- 操作符与列选择:在每一步
t,模型基于当前状态s_t,通过一个注意力机制(或分类层)分别对预定义操作符集合{OP1, OP2, ..., OPk}和表格列输出概率分布。训练时采用软选择(soft selection / attention):按概率加权执行各操作与列上的结果,保持整条路径可微;测试时再把软选择替换为硬选择,取概率最大的操作符与列。 - 状态更新与执行:执行选定的操作符
op_t(这可能涉及对输入数据的操作,如读取表格的某一行某一列),并根据执行结果更新内部状态到s_{t+1}。同时,op_t本身也会作为输入影响下一时刻的状态。 - 步数控制:控制器在固定的
T步内运行,每步选择操作符与列;需要时通过reset操作简化后续步骤,并不以生成 STOP/终止符作为目标。
训练与挑战
训练数据只有”表格 + 问题 + 答案”,中间的操作序列是隐变量,因此训练要走两步:先按当前参数推断最可能的程序路径,再对”答案是否正确”给奖励(论文用 REINFORCE 式的策略梯度,配合似然比项来更新)。没有对齐标注,是这类模型最难的地方——同一个答案可能对应完全不同的操作序列,梯度信号非常稀疏。
关键挑战在于操作的离散与精确:
- 离散不可微:选列、选行、选聚合算子都是硬选择,梯度过不去,只能靠连续松弛或策略梯度绕行。
- 一步错步步错:选错一列,后面所有的聚合都建立在错的数据上,最终答案全废。这类”误差累积”在程序类任务里比文本生成严重得多。
这两条挑战在 NPI 里同样存在(那里的硬选择是选哪个原语、以及调用哪个子程序)。可以说,注意力在这两条脉络里承担的是同一件事:把”输入里的哪一部分该被这一步用到”变成一个可学习的软选择。
神经程序生成展示了注意力机制在生成结构化、精确输出方面的潜力,但由于问题本身的难度,其影响力不及后续在纯文本或跨模态任务中取得巨大成功的注意力模型(如Transformer)。然而,它代表了将神经网络与符号推理结合的一次重要尝试。
注意力模型的延展2:神经图灵机
神经图灵机(Neural Turing Machine, NTM)是另一个深受注意力机制影响的经典模型,它明确地为神经网络配备了外部记忆(External Memory)和基于注意力的读写机制。
核心组件
NTM 主要由两部分组成:
- 控制器(Controller):通常是一个循环神经网络(RNN)。它接收外部输入,并产生用于操作记忆的指令。
- 外部记忆(Memory):一个可读写的矩阵
M,大小为N x M,即N个记忆槽(memory slots),每个槽是一个M维向量。记忆位于控制器之外,但属于整个 NTM 模型,可在任务内跨时间步保存、修改信息。
基于注意力的读写操作
NTM 的关键创新在于其使用软注意力机制进行记忆的读写,而不是对单个记忆槽进行硬性操作。
但要说清一点:NTM 的寻址不止内容寻址一种。论文(Graves 等,2014)给了两套机制,二者可以单独用、也可以混合:
- 内容寻址(content-based addressing):拿控制器产生的 key 与每个槽比相似度,softmax 得到权重。它回答”记忆里哪个内容跟我要找的像”。
- 位置寻址(location-based addressing):不比对内容,而是先由控制器给出一个插值门控
g_t,在”上一时刻的权重”和”内容权重”之间做插值;再用一个移位核s_t做卷积式移位(可以整体左移/右移若干个槽);最后做一次锐化(把权重取γ_t次幂再归一化)。它回答”记忆里哪个位置该被访问”,负责顺序读写、循环遍历这类操作。
只有内容寻址,模型就不会”记住上次读到哪”;只有位置寻址,模型就无法按语义取数。两者组合才是 NTM 的完整寻址器。
- 读操作(Read):
- 控制器在时刻
t产生一个查询向量(key vector)k_t。 - 计算
k_t与记忆矩阵M_t中每一个记忆槽向量M_t(i)的相似度(如余弦相似度或点积),得到一组相似度分数。 - 对这组分数应用 Softmax,先得到中间的内容权重
w^c_t;再按位置寻址链依次经过插值门控、移位核与锐化归一化,得到本次读操作的最终权重w_t,表示对每个记忆槽的“关注程度”。 - 读出的内容
r_t是所有记忆槽向量的加权和:r_t = Σ_i w_t(i) * M_t(i)。这是一个“软读”,融合了所有记忆槽的信息,但权重不同。
- 控制器在时刻
- 写操作(Write):
- 同样,控制器产生用于写的 key;内容 Softmax 先得内容权重,再经同一套位置寻址链(插值、移位、锐化)得到最终写权重
w_t(读写头可以共用一套寻址器,也可以各自独立)。 - 控制器还产生一个擦除向量
e_t和一个添加向量a_t。 - 记忆的更新规则为:
M_{t+1}(i) = M_t(i) * [1 - w_t(i) * e_t] + w_t(i) * a_t。 这意味着,记忆的更新也是“软”的:每个记忆槽i都会根据其权重w_t(i)被部分擦除和部分添加新内容。权重大的槽更新幅度大。
- 同样,控制器产生用于写的 key;内容 Softmax 先得内容权重,再经同一套位置寻址链(插值、移位、锐化)得到最终写权重
工作流程与示例
- 初始化:记忆
M被初始化为一组向量,可以随机初始化,也可以预加载一些知识(如事实三元组)。 - 迭代过程:
- 控制器接收输入
x_t和上一步读出的内容r_{t-1},更新其内部状态h_t。 - 基于
h_t,控制器产生读/写所需的键、权重、擦除/添加向量。 - 执行读操作,得到
r_t。 - 执行写操作,更新记忆至
M_{t+1}。 - 控制器的输出
y_t通常基于其状态h_t和读出的内容r_t计算得出。
- 控制器接收输入
- 示例理解:设想一个简单的词性标注任务。记忆
M中预先存储了各种单词及其常见词性的关联信息(例如,“country”->NOUN, “run”->VERB)。当控制器接收到输入单词“country”时,通过读注意力机制,它会在记忆中找到与“country”最相关的槽(存储了名词信息),从而高权重地读出该信息,并输出“NOUN”。同时,模型可能会根据当前句子的上下文,通过写操作微调记忆中对“country”用法的记录(例如,在某些语境下它可能作为动词,但概率极低)。
与记忆网络的关系
神经图灵机与之前介绍的记忆网络(Memory Networks, MemNN) 思想同源,都致力于为神经网络增加外部记忆和基于注意力的访问能力。主要区别在于:
- 时序性:NTM 的控制器是 RNN,具有强烈的时序状态,读写操作是序列化、迭代进行的。MemNN 的查询(query)通常是一个整体向量,通过多跳(multi-hop)注意力访问记忆,其控制器本身不一定具有 RNN 的时序结构。
- 读写方式:NTM 强调软性的、基于分布的读写(整个记忆矩阵都被轻微更新)。MemNN 的寻址(addressing)可以更“硬”,更直接地选取特定的记忆项进行操作。
神经图灵机展示了如何将注意力机制作为访问和操作结构化外部知识的基本原语。这一思想是后来许多工作的基础。需要纠正一句常见的过头话:Transformer 并没有”吸收或替代” NTM——它用自注意力在序列内部做全连接式交互,既没有外部可写记忆矩阵,也没有位置插值/移位/锐化那套寻址器。两者共享的只是”注意力=加权取数”这一层形式,机制与用途都不同。真正的结论是:NTM 这条”外部记忆+可微寻址”的脉络延续到了 DNC、记忆增强网络等后续工作,而不是被 Transformer 收编。
📝 动手练一练
- 概念辨析:神经图灵机(NTM)中的“读”操作与Seq2Seq注意力模型中的“上下文向量”计算有何异同?请从输入、输出和计算目的三个方面进行对比。
👉 点击查看参考答案
相同点:
- 计算形式:两者都计算一组注意力权重(通过相似度计算和Softmax),然后对一组向量进行加权求和,得到一个汇总向量。
- 核心机制:都依赖于注意力机制来动态聚焦于输入信息的不同部分。
不同点:
- 输入:
- NTM读操作:输入是控制器的查询向量
k_t和外部记忆矩阵M_t。M_t是模型的一部分,可被读写,存储长期或任务相关信息。 - Seq2Seq注意力:输入是解码器上一时刻的隐藏状态
s_{t-1}和编码器所有时间步的隐藏状态序列{h_1, h_2, ..., h_T}。这些状态是对当前输入序列的编码,通常是固定的(在推断阶段)。
- NTM读操作:输入是控制器的查询向量
- 输出:
- NTM读操作:输出是读出的内容向量
r_t,用于更新控制器状态和计算当前输出。r_t是来自外部记忆的知识。 - Seq2Seq注意力:输出是上下文向量
c_t,用于作为解码器当前时间步生成词时的额外输入。c_t是来自源语言序列的信息。
- NTM读操作:输出是读出的内容向量
- 计算目的:
- NTM读操作:目的是从外部知识库(记忆)中检索与当前状态相关的信息,以辅助决策。记忆是持久化的、可修改的。
- Seq2Seq注意力:目的是在生成目标语言词时,找到源语言序列中需要对齐或参考的部分。编码器状态在解码过程中是只读的。
简而言之,NTM的读操作是面向外部可读写知识库的检索,而Seq2Seq注意力是面向固定输入序列的内部对齐。前者更接近“记忆访问”,后者更接近“序列间翻译对齐”。
- 手算理解:假设一个简化的神经图灵机,其记忆矩阵
M有3个槽,初始值分别为:M = [[1, 0], [0, 1], [0.5, 0.5]]。 控制器在某个时刻产生的读查询向量为k = [0.9, 0.1]。 我们使用点积计算相似度,然后Softmax得到注意力权重。 请计算该时刻读出的内容向量r。
👉 点击查看参考答案
首先,计算查询向量 k 与每个记忆槽向量 M[i] 的点积(相似度):
sim1 = [0.9, 0.1] · [1, 0] = 0.9*1 + 0.1*0 = 0.9sim2 = [0.9, 0.1] · [0, 1] = 0.9*0 + 0.1*1 = 0.1sim3 = [0.9, 0.1] · [0.5, 0.5] = 0.9*0.5 + 0.1*0.5 = 0.45 + 0.05 = 0.5
相似度向量为 [0.9, 0.1, 0.5]。
接下来,计算Softmax权重。先计算指数:exp(0.9)≈2.4596, exp(0.1)≈1.1052, exp(0.5)≈1.6487。总和为 2.4596+1.1052+1.6487=5.2135。 权重为:
w1 = 2.4596 / 5.2135 ≈ 0.4719w2 = 1.1052 / 5.2135 ≈ 0.2120w3 = 1.6487 / 5.2135 ≈ 0.3161(验证:0.4719+0.2120+0.3161≈1.0000)
最后,计算读出的内容向量 r,它是记忆向量的加权和: r = w1*[1,0] + w2*[0,1] + w3*[0.5, 0.5] r = [0.4719*1 + 0.2120*0 + 0.3161*0.5, 0.4719*0 + 0.2120*1 + 0.3161*0.5] r = [0.4719 + 0 + 0.15805, 0 + 0.2120 + 0.15805] r = [0.62995, 0.37005]
因此,读出的内容向量 r 约为 [0.630, 0.370]。可以看到,由于查询 k 更接近第一个记忆槽 [1,0],所以读出的结果也更多地包含了第一个槽的信息。
本章小结
本节我们深入探讨了注意力机制超越机器翻译的广泛应用,并回顾了其在深度学习发展史上的两个重要延展模型。
- 注意力作为通用接口:无论是语音识别中的“声-文对齐”,还是图像描述生成中的“图-文对齐”,注意力机制都扮演了动态连接不同模态或序列的关键角色,实现了信息的选择性聚焦与融合。
- 结构化生成的尝试:Neural Programmer 把表格问答表述为”选列—选行—聚合”的隐式程序,整段决策靠注意力做软选择,展示了注意力在结构化、精确输出上的潜力;与之并列的 NPI 则把注意力用在执行显式原语程序(
ADD/MULTIPLY/IF-THEN)上——两条脉络常被混为一谈,区别见上文对照表。 - 记忆增强的范式:神经图灵机(NTM)给出了完整蓝图:RNN 控制器 + 可读写的外部记忆矩阵,寻址由内容寻址与位置寻址(插值、移位核、锐化)组合而成。
这些历史模型分属不同脉络,不能笼统说成被 Transformer 吸收或替代:NTM 这条“外部记忆+可微寻址”的脉络,直接延续到了 DNC(DeepMind, 2016,加入分配、使用度与时序链接机制)等记忆增强后续工作;Transformer(2017)则是另一条以多头自注意力做并行序列建模的路线,它借走的是“注意力=动态加权取数”这一层形式,既没有外部可写记忆矩阵,也没有 NTM 的位置插值/移位/锐化寻址器。Neural Programmer 的结构化选择则在程序学习方向上继续演化。学它们的价值在于看清注意力机制的本质——一种动态的、内容相关的信息检索与整合机制,这也正是理解即将登场的 Transformer 的起点。
📋 行动清单
- 理解注意力机制在语音识别和图像描述生成任务中是如何实现跨模态对齐的,并能各举一个例子说明。
- 能够阐述神经程序生成(Neural Programmer)的基本思想,并说明其训练面临的主要挑战。
- 掌握神经图灵机(NTM)的核心组件(控制器、记忆)和基于注意力的读写操作流程,并能解释其与记忆网络(MemNN)的主要区别。
- 完成本节的两个练习,确保对注意力机制的不同应用形式有清晰的认识。
—— 小象教研组