循环神经网络与长短期记忆
RNNs and LSTMs
词的表示与学习,历史状态的递推,门控记忆的更新,以及机器翻译中的序列生成、搜索和注意力。
序列数据为什么需要新的表示
从图片分类到按顺序处理信息
前馈网络可以把一张图片映射到类别,例如判断图片是否为猫。这个任务把固定形状的输入交给网络,得到一次分类输出。
再看一段输入:one minus two plus three。依次读入数字和运算后,中间结果从 1 变为 −1,最后变为 2。模型需要保留前面计算的结果,并按顺序更新它。改变顺序或运算符,结果也会改变。
序列任务的输入可以有不同长度,当前计算还会依赖已经出现的内容。循环神经网络通过反复更新内部状态,把历史信息带到下一步。
本讲的四个环节
- 词表示:离散词语怎样成为网络输入,向量怎样从文本中学习。
- RNN:怎样根据前缀预测下一词,怎样沿时间传递状态和训练共享参数。
- LSTM 与 GRU:怎样受控保留、写入和读出信息。
- Seq2Seq:怎样生成另一个序列,怎样搜索译文,以及怎样用注意力访问源句。
从独热向量到词嵌入
先把词变成可计算的数值
神经网络的输入需要数值形式,因此先为每个词分配向量。仅仅分配几个数字还不足以表达语义;向量之间应该具有什么关系,要由表示方法和学习任务决定。
用余弦相似度比较方向
对两个非零向量,余弦相似度定义为:
\operatorname{cos}(u,v)=\frac{u^\top v}{\|u\|_2\|v\|_2}向量同向时为 1,正交时为 0,反向时为 −1。它比较方向,消除了向量长度的影响;能否把这种接近解释为词义接近,取决于向量是否经过合适训练。
词表编号没有编码词义关系
hotel、motel、conference 都可以出现在旅行相关文本中,但 hotel 和 motel 通常具有更相近的用法。希望词的表示能表达这些关系。
独热表示给每个词一个词表位置,只在对应位置取 1,其余为 0。例子中 hotel、motel、conference 分别位于第 8、11、2 个位置。
不同词的独热向量内积始终为 0,即使词义相近也是如此。大词表还会带来高维稀疏输入,词表可以超过 50 万项。
用低维稠密向量替代独热坐标
词嵌入为每个词分配一个可学习的低维稠密向量。训练使词的使用关系反映到向量的几何结构中;二维投影只是观察手段,实际维度通常更高。
嵌入矩阵 E 的每一行对应一个词。五个词、三个特征的示意表为:
- motel:
[0.234, -0.567, 0.891] - hotel:
[-0.123, 0.456, -0.789] - conference:
[0.678, -0.234, 0.345] - 第四行:
[-0.456, 0.789, -0.123] - 第五行:
[0.567, -0.891, 0.234]
这些示意数值用来说明表的结构,不能据此断言 hotel 与 motel 接近。查表等价于用独热向量选择矩阵中的一行:
E\in\mathbb{R}^{|V|\times d},\quad x_w\in\mathbb{R}^{|V|},\quad e_w=E^\top x_w\in\mathbb{R}^{d}一个词由多个坐标共同刻画
可用动物、年龄、物体等手工特征帮助理解分布式表示:多个坐标共同描述一个词,不同词可以共享部分特征。实际学习的各维通常没有可直接命名的语义。
词嵌入只解决输入编码,还可以作为编码器—解码器等序列网络的输入。接下来先解决这些向量怎样训练的问题。
三维示意向量的余弦值
这些坐标用于说明嵌入表结构,相似度不代表训练后的语义关系。
分布式语义:意义来自上下文
从使用语境获得训练信号
为每个词设置向量之后,怎样学到有用的坐标?分布式语义的直觉是:一个词的意义可以由它经常出现的上下文刻画。具有相似用法的词,往往出现在相似环境中。
例如 banking 在不同句子中与 debt、crises、regulation、system 等词共同出现:
一次出现只提供局部线索,大量句子的邻近关系共同形成训练信号。Word2Vec 把这个直觉转为可以优化的预测任务。
Word2Vec 的两种预测任务
同一窗口,两种预测方向
- CBOW:根据周围的上下文词预测中心词。
- Skip-gram:根据中心词预测周围的上下文词。
训练先随机初始化词向量,再扫描文本窗口、计算预测概率和损失、更新向量,重复处理大量样本。
移动中心词,形成新的词对
取文本片段 problems turning into banking crises as,窗口半径 m=2:
- 中心为 into:预测 problems、turning、banking、crises。
- 中心右移到 banking:预测 turning、into、crises、as。
一个完整窗口产生四个中心—上下文词对;中心本身不作为自己的上下文。句子边界附近的有效上下文可能更少。
Skip-gram 的概率目标
提高真实邻词的条件概率
语料有 T 个词,中心词为 w_t,窗口半径为 m。在模型的条件独立假设下,目标似然为:
L(\theta)=\prod_{t=1}^{T}\prod_{\substack{-m\le j\le m\\j\ne0}}P(w_{t+j}\mid w_t;\theta)只包含实际存在的上下文位置。提高这个乘积,意味着提高观察到的邻接关系的概率。
取对数将乘积变为和,再取负号转成最小化问题:
J(\theta)=-\frac1T\sum_{t=1}^{T}\sum_{\substack{-m\le j\le m\\j\ne0}}\log P(w_{t+j}\mid w_t;\theta)用两套向量表示词的两个角色
每个词有中心向量 v 和上下文向量 u。中心 c 与上下文候选 o 的兼容度由点积 u_oᵀv_c 给出。
用 Softmax 在完整词表上归一化:
P(o\mid c)=\frac{\exp(u_o^\top v_c)}{\sum_{w\in V}\exp(u_w^\top v_c)}分母需要所有上下文候选参与。两套各有 |V| 个 d 维向量,全部参数组成 θ:
\theta\in\mathbb{R}^{2d|V|},\qquad\theta\leftarrow\theta-\eta\nabla_\theta JSGD 用一个样本或小批量估计梯度,沿梯度反方向更新。学习率 η 控制本次移动幅度。
负采样与稀疏更新
为什么完整 Softmax 昂贵
每个词对都需要对整个词表打分并计算归一化分母。即使只有一个真实上下文词,全部输出向量仍可能参与梯度。
负采样把任务改成二分类:区分真实中心—上下文词对与从噪声分布抽出的词对。一个真实词对配 k 个负样本,计算范围由词表规模变成抽样数量。
这改变了训练目标,不能把结果直接当作完整 Softmax 下已归一化的下一词概率。
正样本拉近,负样本压低兼容度
Sigmoid 将实数分数映射到 0 与 1 之间:
\sigma(z)=\frac1{1+\exp(-z)}单个真实词对 (c,o) 的负采样损失为:
J_{c,o}=-\log\sigma(u_o^\top v_c)-\sum_{r=1}^{k}\log\sigma(-u_{n_r}^\top v_c)第一项希望真实点积更大。负项中点积前的负号使损失希望噪声点积更小;负样本也是训练数据的一部分,不能只计算正项。
噪声词怎样抽样
按词频的 3/4 次幂重新归一化:
P_n(w)=\frac{f(w)^{3/4}}{\sum_{v\in V}f(v)^{3/4}}以频率 0.9 和 0.01 为例,取 3/4 次幂后分别约为 0.924 和 0.0316,再在整个词表上归一化。两词的抽样概率比从 90 缩小到约 29.2:高频词仍更容易抽到,低频词获得相对更多机会。
只触及少量参数
一个完整窗口包含一个中心向量、2m 个真实上下文向量,每个真实词对再抽 k 个噪声上下文。因此最多触达:
1+2m+2km
重复抽到同一词时,实际触达更少。其余向量在本次负采样更新中的梯度为 0。
静态词向量的一词多义
多种含义混在一个向量里
pike 可用于鱼、尖状武器、道路、跳水姿势等不同语境。标准静态词嵌入给同一个词表项一个固定向量,因此不同用法的训练信号会混合。
一种改进思路是把同一个词周围的上下文窗口聚类,再将各簇作为不同词项重新训练,例如分别学习 bank1、bank2 的向量。这样能区分不同用法,但词义划分仍依赖聚类结果。
接下来从单个词转向整段序列:把词嵌入作为输入,再让网络状态根据已经出现的上下文变化。
从固定窗口到循环状态
先明确语言模型的任务
语言模型根据已经出现的前缀预测下一词,并给所有候选词一个概率分布。链式法则把整段序列的概率分解为:
P(x_1,\ldots,x_T)=\prod_{t=1}^{T}P(x_t\mid x_1,\ldots,x_{t-1})搜索自动补全和输入提示都体现了这个任务:输入前缀变化,下一词分布也随之变化。
固定窗口前馈网络怎样做
把最近几个词的嵌入拼接,例如 the students opened their,经过隐藏层和 Softmax 得到下一词分布。
- 窗口以外的历史完全不可见。
- 不同位置使用不同的输入连接,不能自然共享同一种时间更新规则。
- 扩大窗口会增加输入维度和参数,仍然有一个固定边界。
由此引出循环状态:用一个持续更新的向量概括已经读过的内容。
RNN 的递推计算
展开的是时间,复用的是参数
循环网络接收当前输入 x_t 和上一步状态 h_{t-1},用同一组参数计算 h_t。展开图中的多个单元,是同一个网络在不同时间的使用。
完整前向流程
x_t=E^\top q_t,\quad h_t=\tanh(W_xx_t+W_hh_{t-1}+b_h)\hat y_t=\operatorname{softmax}(W_yh_t+b_y)q_t 是当前词的独热输入,x_t 是词嵌入,h_t 是隐藏状态,\hat y_t 预测下一词。读完 the 后预测 students;读完 students 后预测 opened,以此类推。
如果词嵌入为 d 维、隐藏状态为 n 维、词表大小为 |V|,则:
W_x\in\mathbb{R}^{n\times d},\quad W_h\in\mathbb{R}^{n\times n},\quad W_y\in\mathbb{R}^{|V|\times n}隐藏状态是学习得到的数值摘要,不是预先写好的自然语言解释。不同前缀通过递推产生不同状态。
能力与代价
RNN 支持变长输入,相同参数处理每个位置,参数量不随长度增加。但每步依赖上一步,限制了时间维度上的并行;远处信息也可能在反复更新中被削弱。
语言模型训练与 BPTT
用真实下一词监督每个位置
训练文本本身提供标签。当前位置输出的概率与真实下一词比较,得到交叉熵;整段损失取平均:
J=\frac1T\sum_{t=1}^{T}J_t,\qquad J_t=-\log\hat y_t[x_{t+1}]这里 \hat y_t[x_{t+1}] 表示取出真实下一词对应的概率,不是把词向量当作类别标签。
共享参数接收所有时间位置的梯度
把网络沿时间展开,按普通链式法则反向传播,就是 BPTT。晚期损失会通过隐藏状态连接影响更早的计算。
如果 W_h 在多个时间位置使用,最终梯度为这些使用位置的贡献之和:
\frac{\partial J}{\partial W_h}=\sum_t\left.\frac{\partial J}{\partial W_h}\right|_{\text{第 }t\text{ 次使用}}每一项包含通过计算图传来的相关路径。不能只给最后一次参数使用求梯度,也不能把展开后的参数当作互不相关的多组参数。
实际训练常采用截断 BPTT,例如每次只反传约 20 个时间步,以控制计算和存储成本。状态仍可向前传递更久,但梯度不会穿过截断位置。
梯度消失、爆炸与裁剪
多步反传的矩阵连乘
对 tanh RNN,单步状态雅可比为:
A_t=\frac{\partial h_t}{\partial h_{t-1}}=\operatorname{diag}(1-h_t^2)W_h从 t 传回 k 的状态影响为:
\frac{\partial h_t}{\partial h_k}=A_tA_{t-1}\cdots A_{k+1}矩阵乘法顺序不能交换。多个变换可能反复缩小某些方向的梯度,使远处监督难以改变早期状态。
梯度爆炸导致不稳定更新
反复放大则可能产生过大的梯度。SGD 更新 θ←θ−ηg 时,过大步长可能跨入高损失区域,甚至出现 Inf 或 NaN。
裁剪保持方向并限制幅度
设阈值为 τ,范数裁剪可写成:
g_{\mathrm{clip}}=g\min\left(1,\frac{\tau}{\|g\|_2}\right)g=0 时保持为零。超过阈值才按比例缩小;它控制爆炸,不会自动恢复已经消失的长期监督。
接下来要解决长期保留
普通 RNN 的整个状态不断经过非线性变换,历史信息容易被改写。可以增加一条能受控保留、擦除和写入的记忆通路,这正是进入 LSTM 的动机。
LSTM 的状态与门
时间递推不变,单元内部改变
LSTM 仍沿序列更新,但相较普通 RNN,内部增加细胞状态与门控运算。
每一步同时维护 c_t 与 h_t,二者都是 n 维向量:c_t 作为记忆通路,h_t 作为当前对外输出,并参与下一步计算。
门是动态的逐元素控制信号
遗忘门 f_t 控制旧记忆的保留,输入门 i_t 控制候选内容的写入,输出门 o_t 控制记忆对外暴露。每一道门都是向量,各分量由当前输入和上一步隐藏状态计算。
Sigmoid 输出介于 0 与 1 之间,可近似理解为关闭、打开或中间比例。同一时刻,不同分量可以采取不同策略。
完整更新:先定位记忆主通路
把 z_t=[h_{t-1};x_t] 作为拼接输入,四个变换为:
f_t=\sigma(W_fz_t+b_f),\quad i_t=\sigma(W_iz_t+b_i)
o_t=\sigma(W_oz_t+b_o),\quad\tilde c_t=\tanh(W_cz_t+b_c)
c_t=f_t\odot c_{t-1}+i_t\odot\tilde c_t,\quad h_t=o_t\odot\tanh(c_t)⊙ 是逐元素乘法,方括号中的分号表示拼接。写成 W_hh_{t-1}+W_xx_t 与写成 [W_h,W_x][h_{t-1};x_t] 等价;拼接改变输入组织,不改变更新主旨。
用一组数值看清计算关系
固定旧记忆 c=[0.8,−0.4],遗忘门 f=[0.75,0.25],输入门 i=[0.5,0.8],候选 c̃=[0.2,0.3],输出门 o=[0.5,0.8]:
保留项为 [0.6,−0.1],写入项为 [0.1,0.24],相加得到新记忆 [0.7,0.14],再得到 h≈[0.302,0.111]。这是用于说明运算的补充数值例子,实际门值由网络学习。
LSTM 的四步更新
第一步:决定丢弃哪些旧信息
当前输入和上一步隐藏状态共同产生遗忘门。每个分量越接近 1,对应旧记忆保留越多;越接近 0,保留越少。
f_t=\sigma(W_f[h_{t-1};x_t]+b_f),\qquad f_t\odot c_{t-1}第二步:准备新内容和写入量
i_t=\sigma(W_i[h_{t-1};x_t]+b_i),\qquad\tilde c_t=\tanh(W_c[h_{t-1};x_t]+b_c)输入门决定写入多少,候选状态给出写什么。候选经过输入门缩放后才进入细胞状态。
第三步:更新细胞状态
c_t=f_t\odot c_{t-1}+i_t\odot\tilde c_t保留项与写入项通过加法合并。沿细胞主通路可以更直接地保存信息;保留程度仍取决于门值,不能据此保证梯度永不消失。
第四步:产生当前隐藏状态
o_t=\sigma(W_o[h_{t-1};x_t]+b_o),\qquad h_t=o_t\odot\tanh(c_t)tanh 将数值压到 −1 与 1 之间,输出门再控制暴露量。较大或较小的绝对值并不直接代表语义重要性。c_t 继续沿记忆通路传递,h_t 服务当前输出和下一步控制。
GRU:更紧凑的门控单元
一个状态,两道门
GRU 合并细胞状态和隐藏状态。更新门 z_t 控制旧状态与候选的混合,重置门 r_t 控制生成候选时使用多少旧信息。
z_t=\sigma(W_z[h_{t-1};x_t]+b_z),\quad r_t=\sigma(W_r[h_{t-1};x_t]+b_r)\tilde h_t=\tanh(W_c[r_t\odot h_{t-1};x_t]+b_c)h_t=(1-z_t)\odot h_{t-1}+z_t\odot\tilde h_t在这里的约定下,z 越大,新候选的贡献越多。有些资料采用相反的 z 定义,比较时要检查状态混合公式。更简单的结构不意味着每个任务上都优于 LSTM。
机器翻译、对齐与搜索
先明确机器翻译任务
机器翻译把源语言句子转成目标语言句子,要求保留意思并生成自然表达。两侧的词数和词序都可能不同。
早期系统主要依赖双语词典和人工规则,例如俄译英。逐词替换遇到歧义和语序变化后,需要越来越多的人工处理。
统计翻译分开建模忠实和流畅
以法语 x 到英语 y 为例,贝叶斯分解得到:
\arg\max_yP(y\mid x)=\arg\max_yP(x\mid y)P(y)
P(x|y) 是翻译模型,从平行语料学习对应关系;P(y) 是语言模型,从目标语言文本学习流畅性;搜索负责找到二者共同高分的译文。
平行语料提供表达同一内容的句子对,通常没有逐词对齐标签。
对齐是句子内部的对应关系
引入潜变量 a 表示源词和目标词的对应:
P(x\mid y)=\sum_aP(x,a\mid y)
有的词没有另一侧的直接对应,可以引入空对应。语言表达习惯不同,对齐关系不局限于一对一:
- 多对一:多个词共同对应一个词。
- 一对多:一个词对应多个词;fertility 表示对应词的数量。
法语 entarté 对应英语 hit … with a pie 所表达的动作。il m’a entarté → he hit me with a pie 将贯穿后面的序列生成与搜索例子。
- 多对多:可以把整个短语作为对应单位。
学习对齐和模型参数
统计模型组合词翻译概率、位置关系、fertility 等因素。由于 a 没有直接标注,需要 EM 等学习含潜变量的算法,同时估计对应关系和参数。
有了概率模型,仍然需要解码
穷举所有译文过于昂贵。在满足特定独立性假设时,可以用动态规划复用子问题,例如 Viterbi。其最优性适用于相应模型假设,不能推广到任意翻译系统。
统计翻译因此形成许多单独设计的子系统、特征和短语资源,维护时还要为不同语言对重复投入。接下来用一个神经网络统一优化整个翻译过程。
编码器—解码器与条件语言模型
两个循环网络连接源句和目标句
编码器读取源句,产生源表示;解码器接收源表示,根据已经生成的目标前缀逐词输出。基础 Seq2Seq 用编码器最后的状态初始化解码器。
输入 il m’a entarté,输出 he hit me with a pie。解码从起始符开始,直到产生结束符;输入输出长度不必相同。
Seq2Seq 同样适用于摘要、对话、把句子解析为结构序列,以及从自然语言生成代码。
解码器是条件语言模型
P(y\mid x)=\prod_{t=1}^{T}P(y_t\mid y_{<t},x)它既依赖目标前缀,又依赖源句 x,这个分解给出整段译文的概率。
训练时使用真实前缀
平行语料提供真实目标序列。每步输入真实前一个词,计算真实下一词的负对数概率,损失沿编码器与解码器端到端反传。
推理时前缀由模型自己生成,因此还需要决定怎样在可能的译文之间搜索。
从贪心到束搜索
贪心:每步只有一个选择
贪心解码每步选概率最高的词,把它作为下一步输入。这种方法快,但无法撤回早期选择。
在例子中,如果生成 he hit a,已经选出的 a 会限制后续路径,无法改回所需的 he hit me with a pie。
完整序列最优不等于局部最优
理想情况下比较所有完整序列的概率,但固定长度 T 的候选数量为 |V|^T,穷举代价随长度指数增长。
束搜索保留多个前缀
束宽为 k 时,每轮扩展当前前缀,计算累计对数概率,再从全部扩展结果中保留 k 个最高分候选:
\operatorname{score}(y_{1:t})=\sum_{i=1}^{t}\log P(y_i\mid y_{<i},x)分数通常为负,−1.6 比 −1.7 更高。束搜索会剪掉一些路径,因此比穷举高效,但不保证全局最优。
束宽 2 的完整例子
从起始符出发,保留 he(−0.7)与 I(−0.9)。第二轮扩展后,I was(−1.6)和 he hit(−1.7)胜出。下一轮又由 he hit me(−2.5)与 he hit a(−2.8)进入束。
继续扩展和比较后,最终示例的最高分路径为 −4.3,回溯得到 he hit me with a pie。比较对象是完整前缀的累计分数,不能只按当前一步的概率保留。
完成列表与停止规则
不同假设可能在不同时间产生 <END>。完成假设放入单独列表,不再扩展;其他活动假设继续搜索。可以设置最大时间步或所需完成假设数量作为停止条件。
为什么要校正长度
条件概率不大于 1,每增加一个词就累加一项非正对数概率,因此原始累计分数偏向短序列。这里用平均对数概率比较完成假设:
\operatorname{score}_{\mathrm{norm}}(y_{1:t})=\frac1t\sum_{i=1}^{t}\log P(y_i\mid y_{<i},x)长度校正是一种搜索启发式,不能保证译文一定更好;生成质量还需要评价。
翻译评价与系统边界
NMT 的优势与限制
相较分立的统计系统,神经翻译能统一优化整体概率,更好利用连续表示、上下文和相似短语,减少人工模块、特征和外部资源的设计。
统一模型也更难解释和调试,不容易直接写入复杂翻译规则,显式控制与安全要求仍需要额外处理。
BLEU:短语重合的自动指标
BLEU 将机器译文与一个或多个参考译文比较,通常综合 1 至 4 元短语的裁剪精确率,并对过短译文施加惩罚。
它便于批量比较,但不能覆盖完整语义质量。一个忠实的同义译文也可能因短语重合低而得分较低。
历史进展与仍然存在的困难
2013—2016 年的对比图展示了神经翻译在当时实验中的提升。2014 年的 Seq2Seq 工作和 2016 年大型翻译系统向 NMT 的转变,是这段历史中的关键节点。
性能提高仍不等于任务已经解决:未知词、训练测试领域差异、长文本上下文、低资源语言对都可能造成困难。
错误例子分别揭示什么
习语与常识:pelo en la lengua 的字面翻译丢失了习语含义,译文流畅也可能意思错误。
语料偏差:原文没有指定性别,模型却在护士与程序员例子中补入不同性别,反映了训练数据中的关联。
难解释的异常行为:重复字符被翻译成看似完整的句子,说明需要检查异常输入与失败模式。
改进方向之一是注意力。先回到基础 Seq2Seq 的信息路径,找出结构上的瓶颈。
固定向量瓶颈与注意力
整段源句挤在最终状态里
基础编码器—解码器用编码器最后一个状态承载全部源信息,再让解码器逐词输出。源句越长,这个固定表示承担的信息越多。
每个解码步直接查看全部源状态
注意力保留编码器各位置的状态。解码器根据当前状态,为源位置分配不同关注量,再提取这一轮需要的信息。生成不同目标词时,关注也会改变。
先沿图走完过程
- 当前解码状态分别与每个源状态比较,得到一组兼容度分数。
- 通过 Softmax 变成非负、和为 1 的关注分布。
- 按这些权重汇总源状态,得到这一轮的上下文向量。
- 将上下文与当前解码状态一起用于预测下一词。
- 进入下一步,更新解码状态,重新计算分数、权重与上下文。
例子先生成 he,再生成 hit、me、with、a、pie。每一步都重新选择源信息,整个过程不再只依靠最后一个编码状态。
注意力的公式与打分变体
打分和归一化
设源状态为 h_1,…,h_N,当前解码状态为 s_t。先采用相同维度下的点积:
e_{t,i}=s_t^\top h_i,\qquad\alpha_{t,i}=\frac{\exp(e_{t,i})}{\sum_{j=1}^{N}\exp(e_{t,j})}分数向量与权重向量都包含 N 项;归一化沿源位置进行,权重非负且求和为 1。
加权汇总并预测
a_t=\sum_{i=1}^{N}\alpha_{t,i}h_i,\qquad[a_t;s_t]若源状态为 d_h 维,a_t 也是 d_h 维。与 d_s 维解码状态拼接后为 d_h+d_s 维,交给输出层预测。α 表示权重,a 表示汇总后的上下文,二者不能混用。
直接访问与软对齐
注意力通过聚焦相关源位置改善翻译表现,绕过固定向量瓶颈,使当前词有专属上下文,也为远处源位置提供更短的监督路径。这有助于长期依赖学习,但不意味着所有问题都会消失。
观察关注分布,还可以看到软对齐:即使没有显式对齐标签,entarté 仍能与多个目标词形成对应关系。
权重能辅助观察网络访问哪些位置,不能直接当作完整的因果解释。
三种兼容度打分
e_{t,i}=s_t^\top h_i点积要求两种状态维度相同。
e_{t,i}=s_t^\top Wh_i,\quad W\in\mathbb{R}^{d_s\times d_h}双线性打分用矩阵连接不同维度。
e_{t,i}=v^\top\tanh(W_hh_i+W_ss_t+b)W_h\in\mathbb{R}^{d_a\times d_h},\quad W_s\in\mathbb{R}^{d_a\times d_s},\quad v,b\in\mathbb{R}^{d_a}加性注意力先映射到 d_a 维共同空间,再得到标量分数。这些变体改变打分函数,后续的 Softmax 与加权汇总保持相同。