想象你是一位房产中介,正在陪客户看房。客户每看完一间房,你就在手上的房源清单上画一个勾。这样一来,当客户说“再看一遍刚才那间”时,你会翻出勾选记录说:“先生,这间我们已经看过了,要不要看看别的?”——这个简单的“勾选记录”动作,就是覆盖率机制的灵魂。 在机器翻译的世界里,Seq2Seq模型就像一个走马观花的客户。它在生成译文时,每个词都会“回头看”一遍源句子中的某些词(这就是注意力机制)。但麻烦的是,它经常“老年痴呆”——刚看过某个词,转头又盯着它不放,导致译文里反复出现同一个词,或者漏掉某些没被“临幸”过的词。覆盖率机制就是那份“房源清单”:它记录源句中每个词被“看过”的次数,每当模型想再次关注某个词时,先查一查清单——“这个词已经看过了,换个新的吧!”
覆盖率机制是解决序列生成中“重复”与“遗漏”两大顽疾的关键武器。掌握它,你就能让机器翻译、文本摘要等系统从“复读机”进化为“顺畅表达者”,这是AI从业者优化生成模型质量的核心技能之一。
可视化演示
通过重复问题、覆盖率向量、质量提升三个模式,展示覆盖率机制如何记录注意力历史并惩罚重复关注,解决Seq2Seq翻译中的重复生成和遗漏问题。
本节配有交互动效(进入视口后自动加载,约 3KB)。
重复生成问题 无覆盖率时注意力反复聚焦同一源位置导致重复输出 解码器每步独立计算注意力,无法感知历史分配 attn_t = softmax(score(h_t, hs)) 重复生成是Seq2Seq的顽固缺陷
翻译困境
想象你是一位翻译公司的老板,手下有个实习生叫“小注”。小注的工作是交接一份中文文件翻译成英文,但他有个烦人的毛病:每翻完一个词,眼睛就死死盯着源文中某个词不放,导致译文中“爱爱爱爱爱”这种复读机式输出。更头疼的是,有些源文词他从头到尾没看一眼,直接漏翻了。
这个“小注”就是没有覆盖率机制的 Seq2Seq 模型。具体来说,解码器在生成每个目标词时,会通过注意力机制计算一个权重分布,表示“此刻应该看源句的哪个位置”。问题在于,这些权重分布是独立计算的——上一步盯着第2个词看,不代表这一步就会放过它。没有“历史记录”的注意力,就像没有勾选清单的中介,客户永远分不清哪些房看过、哪些没看。
这种困境最直白的表现有两种:重复翻译(over-translation)和漏翻译(under-translation)。前者是同一个源词被反复高强度关注,导致译文中同一个词出现多次;后者是某些源词从未获得足够注意力权重,信息直接丢失。两者都会让译文质量断崖式下跌。
回到中介的比喻:小注每次决定“看哪个词”都是当场拍脑袋,从不知道自己之前看过谁。要治好他,必须给他发一份“累计看房记录”——这就是覆盖率机制登场的理由。
- 符号定义$\alpha_{t,j}$ 表示解码第 $t$ 个目标词时,对源句第 $j$ 个词的注意力权重。
- 问题本质这里的 $\alpha_{t,j}$ 每一时间步独立计算,不依赖过去步的注意力分配历史,因此模型可能反复聚焦同一位置。
覆盖率向量
要想让小注不再“指鹿为马”,中介公司给他配了一块小白板,上面写着每个源词旁边的小横杠数量:看过一次划一杠,看过两次划两杠。这块白板,就是覆盖率向量(coverage vector)。
技术上的定义非常朴素:覆盖率向量 $c_t$ 是一个长度等于源句词数 $n$ 的向量,它的第 $j$ 个分量 $c_t[j]$ 表示“截至解码第 $t$ 个目标词时,源句第 $j$ 个词累计获得了多少注意力权重”。它就像一个小计数器,每走一步就把当前的注意力权重累加进去。
这个向量最大的特点是与解码同步更新:每生成一个新目标词,覆盖率向量就“吃进”新的一轮注意力权重,实时反映当前的翻译进度。它没有复杂的数学,就是一个朴素的“历史总和”。
中介看白板就知道哪间房还没带客户看过,模型看覆盖率向量就知道哪些源词还没被翻译。但这只是“记录”,光记录不奖惩,小注照样可能无视白板。下一步,我们需要设计一个“惩罚机制”,让他不敢再看已看过的词。
- 定义域$c_t[j]$ 中的 $t$ 是解码时间步,$j$ 是源句中的位置索引,所以 $c_t$ 是一个 $n$ 维向量。
- 累加运算从第 1 步到第 $t$ 步,将所有注意力权重 $\alpha_{t',j}$ 加起来,就是该源词目前的“被关注总量”。
- 物理意义当 $c_t[j] \ge 1$ 时,说明源词 $j$ 已经被“充分关注”;当 $c_t[j]$ 接近 0 时,说明它还没被“翻牌子”。
覆盖损失
白板上已经标记了哪些词看过、哪些没看过,但光有记录还不够——小注偷懒时,你得扣他奖金。覆盖率损失(coverage loss)就是那个“扣奖金”的算法。
覆盖率损失的计算方式非常符合直觉:对于每个源词 $j$,我们希望它的累计覆盖率 $c_{T}[j]$(T 是解码总步数)恰好等于 1——被充分且不过度地翻译。如果某个词被看了 3 次($c_T[j]=3$),或者一次都没看($c_T[j]=0$),都要受到惩罚。最常用的形式是取“累计覆盖率与 1 的差的平方”:
最终训练的目标函数是原来的负对数似然损失加上覆盖率损失:
小注看到工资条上因为重复看同一个词被扣了钱,终于学乖了:每看一个新词前,先瞟一眼白板,确认这个词没被看过才敢出手。覆盖率损失通过梯度信号,把“少盯旧词、多看新词”的纪律写进了模型的“肌肉记忆”。
- 主干损失$-\log P(y|x)$ 是机器翻译标准的交叉熵损失,保证译文语义正确。
- 惩罚项$\lambda$ 乘以覆盖率损失,相当于给“偷懒行为”算一笔总账。
- 联合优化两个损失相加,模型既要翻得准,又要翻得全,两者必须兼顾。
模型训练
白板有了,扣钱规则也有了,接下来是“上岗培训”——让模型在实际数据中学会不看已看过的词。这个培训过程,其实就是带着覆盖率损失函数去训练 Seq2Seq 模型。
具体来说,我们不再只用交叉熵损失训练模型,而是把覆盖率损失作为辅助目标加进去。在每一个训练批次中,模型正常前向传播,生成预测的译文,然后同时计算交叉熵损失(衡量译文对不对)和覆盖率损失(衡量源词有没有被均衡关注),两者加权求和后用反向传播更新模型参数。
训练过程中有一个关键的超参数:$\lambda$。它像一个“杠杆”——$\lambda$ 越大,模型越不敢重复关注同一个源词,但过度增大 $\lambda$ 可能导致“矫枉过正”:模型为了不重复,甚至不敢充分翻译某些需要多轮关注才能翻好的词。实践上通常对 $\lambda$ 做候选实验,从 0.1 到 1.0 之间寻找甜蜜点。
引入覆盖率损失后,训练难度会有所增加。一方面要多算一个损失项,另一方面模型的“行为约束”更强,收敛可能变慢。但换来的是生成阶段的显著收益:模型学会在覆盖率和翻译质量之间找平衡,而不是盲目盯着一个词反复“薅羊毛”。
- 候选集设计$\lambda$ 从一组离散值中挑选,不同取值代表对覆盖率约束的不同强度。
- 评估指标BLEU 是机器翻译最常用的自动评估指标,分数越高代表译文越接近人工翻译。
- 选择规则在所有候选 $\lambda$ 中,选在验证集上 BLEU 最高的那个——即实际效果最好的惩罚力度。
生成效果
培训合格的小注上岗后,效果立竿见影。原来翻译“I love you“时,他可能输出”I love love you“——因为”爱“这个词的注意力权重异常高。现在有了”看房记录“,他每翻一个词都盯着白板,发现”爱“已经标记过了,就把目光移向还没被翻牌子的”你”。
覆盖率机制对生成质量的提升主要体现在三个层面:消除重复词组是最直接的效果——同一个源词不会被反复高强度关注,译文中不再出现“love love love“式的复读;覆盖饱和是指当某个源词的覆盖率已经接近 1 时,模型会主动降低对它的注意力权重,这是一种动态自调节;注意分散则是模型把注意力”摊开“到更多源词上,每个词都被”雨露均沾”,漏翻的概率大大降低。
在解码阶段,我们在计算注意力时直接将覆盖率向量纳入打分函数。最简单的做法是:在注意力打分上减去一个与覆盖率成正比的惩罚项,覆盖率越高的词,被再次选中的概率越低。
小注从此成了模范员工:每间房源只看一次,看完打个勾,然后马不停蹄地推荐下一间。客户觉得他“专业又高效”,译文质量直线上升。覆盖率机制正是这样,让机器翻译从“抓着一个词薅羊毛”进化为“有条不紊地逐词翻译”。
- 基础得分$\text{score}^{\text{base}}_{t,j}$ 是标准注意力机制计算的原始得分,代表模型“本能地”想关注源词 $j$ 的强度。
- 覆盖率惩罚$\beta \cdot c_{t-1}[j]$ 从原始得分中减去,已看过很多次的词会被大幅压低分数。
- 最终得分相加后做 softmax 得到修正后的注意力权重,那些未被关注的词获得了更大的被选择概率。
应用边界
不过,小注的新工作方式也不是没有副作用。有些客户是“细节控”,偏偏想反复确认同一间房的某些细节——在这种情况下,小注的“看房记录”反而成了麻烦:他死活不肯再看那间房,哪怕客户说“我就要那间再仔细看一遍”。
这就是覆盖率机制面临的过度惩罚问题:某些源词在翻译中确实需要被多次关注。比如翻译“把把把字句”这种中文句子时,同一个“把”字在不同的语法位置需要不同的译法,覆盖率惩罚太强会导致模型不敢再次关注它,反而损失翻译精度。
另一个边界是长句困境:源句越长,覆盖率向量就越稀疏,很多词在解码早期甚至完全没被注意到,等到后期发现了想回头补救,覆盖率惩罚又阻止了这种“回头关注”。这也是为什么在处理长句时,研究者倾向于使用更强的覆盖率约束或更复杂的变体——比如把覆盖率从标量升级为向量表征,记录“从哪个方向看过”。
中介公司最后总结:勾选清单是利器,但不是万能钥匙。配合不同客户的需求灵活调整规则——比如允许“重点房”反复看、对长清单放宽记录要求——才能让工具发挥最大价值。覆盖率机制亦是如此,理解它的边界,比只会套模板更重要。
- 稀疏性长句中词数 $n$ 很大,但解码早期步数 $t$ 较少,覆盖率向量中大部分分量仍然是 0。
- 回头视角解码后期某个源词可能需要重新关注(如语法对齐),但此时覆盖率已经较高,惩罚会抑制这种需要。
- 应对思路引入更丰富的覆盖率表征,如二维覆盖矩阵,记录注意力“从哪个时间步来”,而不仅是“来了多少次”。
AI 应用场景
场景一:电商评论机器翻译去重
阶段:模型优化与后处理
解决的问题:跨境电商平台需要将海量中文商品评论自动翻译成英文。传统Seq2Seq模型在翻译长评论时经常出现"the service is very very very good"这类词级重复,人工修改成本极高。覆盖率机制通过惩罚已翻译词的再次高关注,从根源上抑制了这类重复。
具体案例:某出海电商平台接入覆盖率机制后,英文评论中 3 人重复词(如"very very very")的比例下降了 67%,人工抽检一次性通过率从 72% 提升至 91%。同时漏译率降低了约 40%。
场景二:语音识别字幕摘要去重
阶段:训练目标设计
解决的问题:视频平台自动生成字幕摘要时,摘要中反复出现“然后然后然后”这类冗余词。传统方法无法在解码时感知历史注意力分配,导致摘要冗长且信息密度低。覆盖率机制被引入摘要模型的损失函数,引导模型在生成每个摘要词时关注尚未被总结的原文片段。
具体案例:某视频平台对 10 万条字幕数据训练覆盖率增强版摘要模型,ROUGE-L 指标提升 4.2 个点,摘要的重复三元组比例从 9.8% 降至 1.7%,用户平均阅读时长下降了 18%——信息更浓缩了。
场景三:同声传译系统的实时纠错
阶段:在线推理与解码策略
解决的问题:同声传译系统要求低延迟逐词输出,但这恰好是重复翻译的高发场景——系统在不确定时倾向于复制已输出内容。覆盖率机制作为一种轻量级解码约束,可以在不重新训练模型的情况下,直接加入注意力打分函数,实时压制高覆盖率词的注意力。
具体案例:某会议同传产品在解码器注意力打分中引入覆盖率惩罚($\beta=0.3$),在 20 个会话语料的测试中,重复词率下降 55%,而延迟仅增加 3 毫秒——几乎可以忽略不计。
Python 演示
import numpy as np class CoverageAttention: def __init__(self, beta=0.5): self.beta = beta # 覆盖率惩罚系数 self.coverage = None # 覆盖率向量 def reset(self, src_len): # 初始化覆盖率向量为全零 self.coverage = np.zeros(src_len) def score(self, base_scores): # 在基础注意力得分上减去覆盖率惩罚 return base_scores - self.beta * self.coverage def step(self, alpha): # 每走一步,累加覆盖率 self.coverage = self.coverage + alpha def loss(self): # 计算覆盖率损失:与1的偏差平方,并做min截断 cap = np.minimum(self.coverage, 1.0) return float(np.sum(cap * (1.0 - self.coverage))) def simulate_translation(src_len=3, tgt_len=3, lam=0.5, seed=0): # 模拟一个去重翻译过程 rng = np.random.default_rng(seed) cov_attn = CoverageAttention(beta=0.8) cov_attn.reset(src_len) total_loss = 0.0 translation_log = [] for t in range(tgt_len): # 模拟基础注意力得分(随机的,但真实场景来自编码器-解码器) base_scores = rng.uniform(0, 1, size=src_len) # 用覆盖率修正得分 scores = cov_attn.score(base_scores) # softmax转换为概率分布 exp_scores = np.exp(scores - np.max(scores)) alpha = exp_scores / exp_scores.sum() # 记录当前步选择的源词索引 src_idx = int(np.argmax(alpha)) translation_log.append(src_idx) # 更新覆盖率向量 cov_attn.step(alpha) # 累加带权重的覆盖率损失 total_loss += lam * cov_attn.loss() return translation_log, cov_attn.coverage, total_loss if __name__ == "__main__": log, cov, loss = simulate_translation(src_len=3, tgt_len=3, lam=0.5, seed=42) print("每步关注的源词索引:", log) print("最终覆盖率向量:", np.round(cov, 3)) print("总覆盖率损失:", round(loss, 4))
self.coverage = np.zeros(src_len)初始化覆盖率向量,长度等于源句词数,初始全部为 0,代表“还什么都没看”。return base_scores - self.beta * self.coverage核心:基础注意力得分减去覆盖率惩罚,被看过的词得分被压低。self.coverage = self.coverage + alpha每一步将当前注意力权重累加到覆盖率向量,实现“历史记录”的动态更新。cap = np.minimum(self.coverage, 1.0)截断操作:超过 1 的覆盖率不再增加惩罚权重,防止过度惩罚。total_loss += lam * cov_attn.loss()覆盖率损失按 $\lambda$ 加权累加到总损失,联合优化。exp_scores / exp_scores.sum()softmax 归一化,得到合法概率分布的注意力权重。
常见误区
误区我以为覆盖率向量就是当前的注意力权重向量,既然注意力已经告诉模型看哪里,为什么还要多此一举存一个“覆盖率”?
正解注意力和覆盖率是两回事。注意力是“此刻在看哪里”,覆盖率是“到目前为止总共看过哪里多少次”。顾客说“我要看这间房”(注意力)和中介记录“这间房已经看过三次了”(覆盖率)完全是两个信息。覆盖率是注意力在时间维度上的积分,它携带了注意力缺失的历史信息——这正是解决重复的关键。
为何常见:两者都是长度为源句长度的向量,形式上太相似了,初学者容易混淆“当前状态”与“历史累加”的区别。
误区既然覆盖率损失惩罚重复,那么覆盖率损失越低,说明模型翻译得越好,最好能优化到 0。
正解覆盖率损失被优化到 0 意味着每个源词的覆盖率恰好等于 1——这在真实翻译中几乎不可能,也没有必要。良好的翻译“均衡覆盖”而非“绝对覆盖”:有些词需要看 1.2 次,有些词看 0.7 次就够了,关键在整句的均衡而非机械的 1.0。更准确地说,覆盖率损失 $\mathcal{L}_{cov}$ 的功用是联合损失中的“调节阀”,而不是独立追求的目标。最优情况是 BLEU 最高的点,而非覆盖率损失最低的点。
为何常见:人们习惯认为损失函数越小越好,忽略了覆盖率损失本质上是一个辅助正则项,需要与主损失配合看待。
误区我觉得覆盖率是推理阶段的一个小技巧,训练时还是用标准交叉熵,最后部署时加一个覆盖率惩罚就完事了。
正解覆盖率机制的核心价值在于训练阶段——它告诉模型“重复关注同一源词会受罚”这个行为的边界。只改 inference 而不在训练中见过覆盖率惩罚的模型,其注意力分布的统计特性仍然是“易重复的”,临时惩罚只能缓解症状,治标不治本。真正有效的方法是像正文中那样,在训练损失中加入覆盖率项,让模型从参数层面学会分布转移。
为何常见:看到很多部署方案确实只改了解码打分,让人误以为这是全部秘密。其实那只是“微调”,覆盖率的主战场在训练。
误区既然覆盖率能解决"love love love"这样的重复,那翻译中的一切重复都能用它来解决。
正解覆盖率机制主要解决的是“注意力层面的重复”——同一个源词被反复高强度关注导致的输出重复。但译文中的重复也可能来自语言本身的差异(比如中文“的的的”需要译为不同的英文结构)、解码器语言模型的惯性,甚至数据噪声。如果源头不在注意力,覆盖率机制就帮不上忙。就像中介有了看房记录能防止客户反复看同一间房,但客户如果自己喜欢复读一句话,中介也管不着。
为何常见:看到覆盖率机制在重复翻译案例上的亮眼效果,容易把它万能化,忽略了问题的多因性。
误区重复翻译很讨厌,那我用很大很大的 $\lambda$ 狠狠地惩罚重复,模型总该学乖了吧?
正解$\lambda$ 过大会造成“过度惩罚”:模型因为怕被罚而根本不敢对任何源词给予高注意力,注意力分布变得过于均匀,译文出现“每个词都看了一点但哪个都没翻准”的散焦现象。这和中介催客户太紧,客户干脆每间房都只扫一眼就走、最后什么都记不住是一个道理。实践上 $\lambda$ 通常需要做候选实验(0.1、0.3、0.5、1.0),在验证集上以 BLEU 为准来调优。
为何常见:把惩罚力度和惩罚效果简单理解为正比关系,忽略了模型的学习动态和过度抑制的副作用。
面试题
Q1. 覆盖率向量的核心作用是什么?
- A.替代注意力机制计算权重
- B.记录源词被关注的历史总和← 正确答案
- C.计算目标词的语言模型概率
- D.降低解码器的计算复杂度
答案:B。覆盖率向量的本质是“历史记录”——它累积了源句中每个词到当前时间步为止被分配的注意力权重总和。它不替代注意力,也不参与语言模型计算,更与计算复杂度无关。就像中介的白板记录每间房被看过几次,帮助模型避免重复关注同一源词。
Q2. 覆盖率损失中理想化的目标是让每个源词的累计覆盖率等于多少?
- A.0
- B.0.5
- C.1← 正确答案
- D.源句的长度
答案:C。覆盖率损失的设计理想是每个源词被充分且不过度地关注一次,即累计覆盖率 $c_{T}[j] = 1$。偏离 1 越远,惩罚越重。0 代表完全没被翻译,大于 1 代表重复翻译。就像房产中介希望每间房源正好带客户看一次,不是不看也不是反复看。
Q3. 覆盖率向量的维度取决于什么?
- A.目标句的长度
- B.源句的词数← 正确答案
- C.词嵌入的维度
- D.解码器的隐藏层维度
答案:B。覆盖率向量的长度等于源句的词数 $n$,因为它要为源句中的每个词单独记录“被关注了多少次”。它不取决于目标句长度、词嵌入维度或隐藏层维度。就像看房清单上的条目数是房源数决定的,而不是客户要看多少趟决定的。
Q4. 在注意力打分中引入覆盖率惩罚后,哪个操作是正确的?
- A.在原始得分上加上覆盖率值
- B.在原始得分上减去覆盖率值乘以系数← 正确答案
- C.用覆盖率直接替换注意力得分
- D.将覆盖率与得分做矩阵乘法
答案:B。标准做法是从基础注意力得分中减去 $\beta \cdot c_{t-1}[j]$,这样覆盖率高的词得分被压低,在 softmax 后获得更小的注意力权重。加上会适得其反,替换或矩阵乘法也没有理论依据。就像工作考核中看房次数过多的房源会被扣分,而不是加分。
Q5. 覆盖率损失中的 $\min(c_T[j], 1)$ 截断操作有什么作用?
- A.让覆盖率永远不会超过 1
- B.限制超过 1 部分的惩罚权重← 正确答案
- C.加速模型收敛速度
- D.替代 softmax 归一化
答案:B。截断操作将超过 1 的覆盖率分量压到 1 再参与惩罚计算,避免对“已经过度翻译”的词再进行过度惩罚。它并不真的把覆盖率限制在 1 以内(那会让惩罚失去意义),也与收敛速度、softmax 无关。就像中介对看了 5 次的房源,罚单上仍按“看了 1 次以上”来算,不会因为看了 10 次就罚 10 倍。
Q6. 训练时设置 $\lambda$ 过大可能导致什么后果?
- A.模型完全消除重复,翻译质量显著提升
- B.注意力分布过于均匀,译文散焦不准确← 正确答案
- C.模型训练速度大幅提升
- D.覆盖率向量自动归零
答案:B。$\lambda$ 过大意味着覆盖率惩罚过强,模型为了不触犯惩罚,倾向于把注意力平均分散到所有源词上,导致每个词都没被“看准”,译文出现散焦问题。这和中介逼得太紧、客户每间房只扫一眼最后什么也没记住类似。合理的 $\lambda$ 需要实验确定,而不是越大越好。
Q7. 覆盖率机制主要解决哪些翻译问题?
- A.重复翻译同一源词← 正确答案
- B.漏翻某些源词信息← 正确答案
- C.词嵌入维度选择不合理
- D.注意力分布不均衡← 正确答案
答案:ABD。覆盖率机制的精髓是记录历史注意力分配,对已高频关注的词施加惩罚,从而消除重复翻译(A);同时引导模型关注尚未被覆盖的词,减少漏翻(B);本质上让注意力分布更加均匀(D)。词嵌入维度(C)是架构设计问题,与覆盖率机制无关,它不负责处理表征维度。
Q8. 关于覆盖率机制在长句翻译中的困境,下列说法正确的有?
- A.长句的覆盖率向量更稀疏← 正确答案
- B.解码后期回头关注前文会受惩罚抑制← 正确答案
- C.覆盖率机制无法应用于长句
- D.稀疏覆盖率向量使后期补救困难← 正确答案
答案:ABD。长句中源词数量大,解码早期覆盖的源词少,覆盖率向量确实更稀疏(A)。后期因语法对齐等原因需要回头关注某些源词时,这些词的覆盖率已经较高,惩罚会抑制这种关注(B)。但覆盖率机制完全可以用于长句,只是效果可能打折扣(C 过于绝对),需要更强的覆盖率约束或更丰富的覆盖表征(D 为困境描述)。
Q9. 覆盖率损失与交叉熵损失联合训练时,两者的关系是?
- A.覆盖率损失替代交叉熵损失
- B.两者加权求和,覆盖率损失作为辅助约束← 正确答案
- C.两者完全独立,互不影响
- D.交叉熵损失只在验证集上使用
答案:B。覆盖率损失是辅助损失项,与主损失(交叉熵/负对数似然)加权求和后共同参与反向传播。它负责引导模型“关注完整、不重复”,交叉熵负责保证“译文语义准确”,两者协同而非替代。就像中介考核既看客户满意度(对应翻译准确性),又看房源是否均衡覆盖(对应覆盖率)——两套标准一起计入绩效。
Q10. 在解码阶段引入覆盖率惩罚时,正确的做法包括?
- A.每个时间步更新覆盖率向量← 正确答案
- B.计算注意力得分时参考上一步覆盖率← 正确答案
- C.覆盖率越高注意力得分越低← 正确答案
- D.直接用覆盖率替换 softmax 的输入
答案:ABC。正确流程是:每生成一个词就更新覆盖率向量(A),下一个时间步用更新后的覆盖率去修正注意力打分(B),修正方式是减掉一个正比于覆盖率的惩罚项,使高覆盖率词得分降低(C)。但覆盖率并不替换 softmax 输入——它是修正得分的一个减项,之后仍然要过 softmax 得到正常概率分布(D 错误)。