想象你是一位房产中介,正在陪客户看房。客户每看完一间房,你就在手上的房源清单上画一个勾。这样一来,当客户说“再看一遍刚才那间”时,你会翻出勾选记录说:“先生,这间我们已经看过了,要不要看看别的?”——这个简单的“勾选记录”动作,就是覆盖率机制的灵魂。 在机器翻译的世界里,Seq2Seq模型就像一个走马观花的客户。它在生成译文时,每个词都会“回头看”一遍源句子中的某些词(这就是注意力机制)。但麻烦的是,它经常“老年痴呆”——刚看过某个词,转头又盯着它不放,导致译文里反复出现同一个词,或者漏掉某些没被“临幸”过的词。覆盖率机制就是那份“房源清单”:它记录源句中每个词被“看过”的次数,每当模型想再次关注某个词时,先查一查清单——“这个词已经看过了,换个新的吧!”

岗位关联

覆盖率机制是解决序列生成中“重复”与“遗漏”两大顽疾的关键武器。掌握它,你就能让机器翻译、文本摘要等系统从“复读机”进化为“顺畅表达者”,这是AI从业者优化生成模型质量的核心技能之一。

目录
  1. 可视化演示
  2. 翻译困境
  3. 覆盖率向量
  4. 覆盖损失
  5. 模型训练
  6. 生成效果
  7. 应用边界
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

通过重复问题、覆盖率向量、质量提升三个模式,展示覆盖率机制如何记录注意力历史并惩罚重复关注,解决Seq2Seq翻译中的重复生成和遗漏问题。

本节配有交互动效(进入视口后自动加载,约 3KB)。

重复生成问题 无覆盖率时注意力反复聚焦同一源位置导致重复输出 解码器每步独立计算注意力,无法感知历史分配 attn_t = softmax(score(h_t, hs)) 重复生成是Seq2Seq的顽固缺陷

翻译困境

想象你是一位翻译公司的老板,手下有个实习生叫“小注”。小注的工作是交接一份中文文件翻译成英文,但他有个烦人的毛病:每翻完一个词,眼睛就死死盯着源文中某个词不放,导致译文中“爱爱爱爱爱”这种复读机式输出。更头疼的是,有些源文词他从头到尾没看一眼,直接漏翻了。

这个“小注”就是没有覆盖率机制的 Seq2Seq 模型。具体来说,解码器在生成每个目标词时,会通过注意力机制计算一个权重分布,表示“此刻应该看源句的哪个位置”。问题在于,这些权重分布是独立计算的——上一步盯着第2个词看,不代表这一步就会放过它。没有“历史记录”的注意力,就像没有勾选清单的中介,客户永远分不清哪些房看过、哪些没看。

这种困境最直白的表现有两种:重复翻译(over-translation)和漏翻译(under-translation)。前者是同一个源词被反复高强度关注,导致译文中同一个词出现多次;后者是某些源词从未获得足够注意力权重,信息直接丢失。两者都会让译文质量断崖式下跌。

回到中介的比喻:小注每次决定“看哪个词”都是当场拍脑袋,从不知道自己之前看过谁。要治好他,必须给他发一份“累计看房记录”——这就是覆盖率机制登场的理由。

problem:αt,j 是独立计算的,不感知历史分配\displaystyle \text{problem}:\quad \alpha_{t,j} \text{ 是独立计算的,不感知历史分配}
注意力权重各自为政,互不知晓对方已经分配了多少“关注度”,是重复与漏翻的根源。
  1. 符号定义$\alpha_{t,j}$ 表示解码第 $t$ 个目标词时,对源句第 $j$ 个词的注意力权重。
    αt,j∈[0,1],∑j=1nαt,j=1\alpha_{t,j} \in [0,1],\quad \sum_{j=1}^{n} \alpha_{t,j} = 1
  2. 问题本质这里的 $\alpha_{t,j}$ 每一时间步独立计算,不依赖过去步的注意力分配历史,因此模型可能反复聚焦同一位置。
    αt,j⊥αt′,j(t≠t′)\alpha_{t,j} \perp \alpha_{t',j} \quad (t \neq t')

覆盖率向量

要想让小注不再“指鹿为马”,中介公司给他配了一块小白板,上面写着每个源词旁边的小横杠数量:看过一次划一杠,看过两次划两杠。这块白板,就是覆盖率向量(coverage vector)。

技术上的定义非常朴素:覆盖率向量 $c_t$ 是一个长度等于源句词数 $n$ 的向量,它的第 $j$ 个分量 $c_t[j]$ 表示“截至解码第 $t$ 个目标词时,源句第 $j$ 个词累计获得了多少注意力权重”。它就像一个小计数器,每走一步就把当前的注意力权重累加进去。

这个向量最大的特点是与解码同步更新:每生成一个新目标词,覆盖率向量就“吃进”新的一轮注意力权重,实时反映当前的翻译进度。它没有复杂的数学,就是一个朴素的“历史总和”。

中介看白板就知道哪间房还没带客户看过,模型看覆盖率向量就知道哪些源词还没被翻译。但这只是“记录”,光记录不奖惩,小注照样可能无视白板。下一步,我们需要设计一个“惩罚机制”,让他不敢再看已看过的词。

ct[j]=∑t′=1tαt′,j\displaystyle c_t[j] = \sum_{t'=1}^{t} \alpha_{t',j}
覆盖率向量 = 历史注意力的累积总和,它告诉模型:源句每个词到目前为止已经被“看了”多少。
  1. 定义域$c_t[j]$ 中的 $t$ 是解码时间步,$j$ 是源句中的位置索引,所以 $c_t$ 是一个 $n$ 维向量。
    ct=[ct[1],ct[2],…,ct[n]]∈Rnc_t = [c_t[1], c_t[2], \dots, c_t[n]] \in \mathbb{R}^{n}
  2. 累加运算从第 1 步到第 $t$ 步,将所有注意力权重 $\alpha_{t',j}$ 加起来,就是该源词目前的“被关注总量”。
    c1[j]=α1,j,c2[j]=α1,j+α2,j,…c_1[j] = \alpha_{1,j}, \quad c_2[j] = \alpha_{1,j} + \alpha_{2,j}, \quad \dots
  3. 物理意义当 $c_t[j] \ge 1$ 时,说明源词 $j$ 已经被“充分关注”;当 $c_t[j]$ 接近 0 时,说明它还没被“翻牌子”。
    ct[j]→1:充分翻译;ct[j]→0:未被翻译c_t[j] \to 1: \text{充分翻译};\quad c_t[j] \to 0: \text{未被翻译}

覆盖损失

白板上已经标记了哪些词看过、哪些没看过,但光有记录还不够——小注偷懒时,你得扣他奖金。覆盖率损失(coverage loss)就是那个“扣奖金”的算法。

覆盖率损失的计算方式非常符合直觉:对于每个源词 $j$,我们希望它的累计覆盖率 $c_{T}[j]$(T 是解码总步数)恰好等于 1——被充分且不过度地翻译。如果某个词被看了 3 次($c_T[j]=3$),或者一次都没看($c_T[j]=0$),都要受到惩罚。最常用的形式是取“累计覆盖率与 1 的差的平方”:

最终训练的目标函数是原来的负对数似然损失加上覆盖率损失:

小注看到工资条上因为重复看同一个词被扣了钱,终于学乖了:每看一个新词前,先瞟一眼白板,确认这个词没被看过才敢出手。覆盖率损失通过梯度信号,把“少盯旧词、多看新词”的纪律写进了模型的“肌肉记忆”。

Lcov=∑j=1nmin⁡(cT[j],1)⋅(1−cT[j])\displaystyle \mathcal{L}_{cov} = \sum_{j=1}^{n} \min\left(c_{T}[j], 1\right) \cdot \left(1 - c_{T}[j]\right)
$\lambda$ 是超参数,控制覆盖率惩罚的强度——$\lambda$ 太小惩罚不足,$\lambda$ 太大则模型过于保守。
  1. 主干损失$-\log P(y|x)$ 是机器翻译标准的交叉熵损失,保证译文语义正确。
    −log⁡P(y∣x)=−∑tlog⁡P(yt∣y<t,x)-\log P(y|x) = -\sum_{t} \log P(y_t | y_{<t}, x)
  2. 惩罚项$\lambda$ 乘以覆盖率损失,相当于给“偷懒行为”算一笔总账。
    λ⋅Lcov\lambda \cdot \mathcal{L}_{cov}
  3. 联合优化两个损失相加,模型既要翻得准,又要翻得全,两者必须兼顾。
    min⁡θ[−log⁡P(y∣x)+λLcov]\min_{\theta} \left[ -\log P(y|x) + \lambda \mathcal{L}_{cov} \right]

模型训练

白板有了,扣钱规则也有了,接下来是“上岗培训”——让模型在实际数据中学会不看已看过的词。这个培训过程,其实就是带着覆盖率损失函数去训练 Seq2Seq 模型。

具体来说,我们不再只用交叉熵损失训练模型,而是把覆盖率损失作为辅助目标加进去。在每一个训练批次中,模型正常前向传播,生成预测的译文,然后同时计算交叉熵损失(衡量译文对不对)和覆盖率损失(衡量源词有没有被均衡关注),两者加权求和后用反向传播更新模型参数。

训练过程中有一个关键的超参数:$\lambda$。它像一个“杠杆”——$\lambda$ 越大,模型越不敢重复关注同一个源词,但过度增大 $\lambda$ 可能导致“矫枉过正”:模型为了不重复,甚至不敢充分翻译某些需要多轮关注才能翻好的词。实践上通常对 $\lambda$ 做候选实验,从 0.1 到 1.0 之间寻找甜蜜点。

引入覆盖率损失后,训练难度会有所增加。一方面要多算一个损失项,另一方面模型的“行为约束”更强,收敛可能变慢。但换来的是生成阶段的显著收益:模型学会在覆盖率和翻译质量之间找平衡,而不是盲目盯着一个词反复“薅羊毛”。

λ∈{0.1,0.3,0.5,1.0},在验证集上选 BLEU 最高者\displaystyle \lambda \in \{0.1, 0.3, 0.5, 1.0\}, \quad \text{在验证集上选 BLEU 最高者}
$\lambda$ 的选择在验证集上进行,用 BLEU 分数等翻译质量指标评估并确定最优值。
  1. 候选集设计$\lambda$ 从一组离散值中挑选,不同取值代表对覆盖率约束的不同强度。
    Λ={0.1,0.3,0.5,1.0}\Lambda = \{0.1, 0.3, 0.5, 1.0\}
  2. 评估指标BLEU 是机器翻译最常用的自动评估指标,分数越高代表译文越接近人工翻译。
    BLEU=exp⁡(1N∑n=1Nlog⁡pn)\text{BLEU} = \exp\left( \frac{1}{N} \sum_{n=1}^{N} \log p_n \right)
  3. 选择规则在所有候选 $\lambda$ 中,选在验证集上 BLEU 最高的那个——即实际效果最好的惩罚力度。

生成效果

培训合格的小注上岗后,效果立竿见影。原来翻译“I love you“时,他可能输出”I love love you“——因为”爱“这个词的注意力权重异常高。现在有了”看房记录“,他每翻一个词都盯着白板,发现”爱“已经标记过了,就把目光移向还没被翻牌子的”你”。

覆盖率机制对生成质量的提升主要体现在三个层面:消除重复词组是最直接的效果——同一个源词不会被反复高强度关注,译文中不再出现“love love love“式的复读;覆盖饱和是指当某个源词的覆盖率已经接近 1 时,模型会主动降低对它的注意力权重,这是一种动态自调节;注意分散则是模型把注意力”摊开“到更多源词上,每个词都被”雨露均沾”,漏翻的概率大大降低。

在解码阶段,我们在计算注意力时直接将覆盖率向量纳入打分函数。最简单的做法是:在注意力打分上减去一个与覆盖率成正比的惩罚项,覆盖率越高的词,被再次选中的概率越低。

小注从此成了模范员工:每间房源只看一次,看完打个勾,然后马不停蹄地推荐下一间。客户觉得他“专业又高效”,译文质量直线上升。覆盖率机制正是这样,让机器翻译从“抓着一个词薅羊毛”进化为“有条不紊地逐词翻译”。

scoret,j=scoret,jbase−β⋅ct−1[j]\displaystyle \text{score}_{t,j} = \text{score}^{\text{base}}_{t,j} - \beta \cdot c_{t-1}[j]
$\beta$ 控制覆盖率对注意力打分的惩罚强度:覆盖率越高,注意力得分被压低得越狠。
  1. 基础得分$\text{score}^{\text{base}}_{t,j}$ 是标准注意力机制计算的原始得分,代表模型“本能地”想关注源词 $j$ 的强度。
    scoret,jbase=vTtanh⁡(Whhj+Wsst)\text{score}^{\text{base}}_{t,j} = v^T \tanh(W_h h_j + W_s s_t)
  2. 覆盖率惩罚$\beta \cdot c_{t-1}[j]$ 从原始得分中减去,已看过很多次的词会被大幅压低分数。
    penalty=β⋅ct−1[j]\text{penalty} = \beta \cdot c_{t-1}[j]
  3. 最终得分相加后做 softmax 得到修正后的注意力权重,那些未被关注的词获得了更大的被选择概率。
    αt,j=exp⁡(scoret,j)∑kexp⁡(scoret,k)\alpha_{t,j} = \frac{\exp(\text{score}_{t,j})}{\sum_{k} \exp(\text{score}_{t,k})}

应用边界

不过,小注的新工作方式也不是没有副作用。有些客户是“细节控”,偏偏想反复确认同一间房的某些细节——在这种情况下,小注的“看房记录”反而成了麻烦:他死活不肯再看那间房,哪怕客户说“我就要那间再仔细看一遍”。

这就是覆盖率机制面临的过度惩罚问题:某些源词在翻译中确实需要被多次关注。比如翻译“把把把字句”这种中文句子时,同一个“把”字在不同的语法位置需要不同的译法,覆盖率惩罚太强会导致模型不敢再次关注它,反而损失翻译精度。

另一个边界是长句困境:源句越长,覆盖率向量就越稀疏,很多词在解码早期甚至完全没被注意到,等到后期发现了想回头补救,覆盖率惩罚又阻止了这种“回头关注”。这也是为什么在处理长句时,研究者倾向于使用更强的覆盖率约束或更复杂的变体——比如把覆盖率从标量升级为向量表征,记录“从哪个方向看过”。

中介公司最后总结:勾选清单是利器,但不是万能钥匙。配合不同客户的需求灵活调整规则——比如允许“重点房”反复看、对长清单放宽记录要求——才能让工具发挥最大价值。覆盖率机制亦是如此,理解它的边界,比只会套模板更重要。

limitation:长句⇒ct 稀疏⇒后期难以补救\displaystyle \text{limitation}: \quad \text{长句} \Rightarrow c_t \text{ 稀疏} \Rightarrow \text{后期难以补救}
长句中覆盖率向量稀疏,解码后期需要回头关注前文时,覆盖率惩罚反而成了阻碍。
  1. 稀疏性长句中词数 $n$ 很大,但解码早期步数 $t$ 较少,覆盖率向量中大部分分量仍然是 0。
    ct[j]=0for many j,when t≪nc_t[j] = 0 \quad \text{for many } j, \text{when } t \ll n
  2. 回头视角解码后期某个源词可能需要重新关注(如语法对齐),但此时覆盖率已经较高,惩罚会抑制这种需要。
    scoret,j=scoret,jbase−β⋅ct−1[j]≪scoret,jbase\text{score}_{t,j} = \text{score}^{\text{base}}_{t,j} - \beta \cdot c_{t-1}[j] \ll \text{score}^{\text{base}}_{t,j}
  3. 应对思路引入更丰富的覆盖率表征,如二维覆盖矩阵,记录注意力“从哪个时间步来”,而不仅是“来了多少次”。

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 演示

python59 行
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))
目的:用 NumPy 从零实现覆盖率向量更新与覆盖率损失计算,直观展示覆盖率机制如何在解码过程中压制重复翻译。
  1. self.coverage = np.zeros(src_len)初始化覆盖率向量,长度等于源句词数,初始全部为 0,代表“还什么都没看”。
  2. return base_scores - self.beta * self.coverage核心:基础注意力得分减去覆盖率惩罚,被看过的词得分被压低。
  3. self.coverage = self.coverage + alpha每一步将当前注意力权重累加到覆盖率向量,实现“历史记录”的动态更新。
  4. cap = np.minimum(self.coverage, 1.0)截断操作:超过 1 的覆盖率不再增加惩罚权重,防止过度惩罚。
  5. total_loss += lam * cov_attn.loss()覆盖率损失按 $\lambda$ 加权累加到总损失,联合优化。
  6. 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. 覆盖率向量的核心作用是什么?

单选题 · easy

  • A.替代注意力机制计算权重
  • B.记录源词被关注的历史总和← 正确答案
  • C.计算目标词的语言模型概率
  • D.降低解码器的计算复杂度

答案:B。覆盖率向量的本质是“历史记录”——它累积了源句中每个词到当前时间步为止被分配的注意力权重总和。它不替代注意力,也不参与语言模型计算,更与计算复杂度无关。就像中介的白板记录每间房被看过几次,帮助模型避免重复关注同一源词。

Q2. 覆盖率损失中理想化的目标是让每个源词的累计覆盖率等于多少?

单选题 · easy

  • A.0
  • B.0.5
  • C.1← 正确答案
  • D.源句的长度

答案:C。覆盖率损失的设计理想是每个源词被充分且不过度地关注一次,即累计覆盖率 $c_{T}[j] = 1$。偏离 1 越远,惩罚越重。0 代表完全没被翻译,大于 1 代表重复翻译。就像房产中介希望每间房源正好带客户看一次,不是不看也不是反复看。

Q3. 覆盖率向量的维度取决于什么?

单选题 · easy

  • A.目标句的长度
  • B.源句的词数← 正确答案
  • C.词嵌入的维度
  • D.解码器的隐藏层维度

答案:B。覆盖率向量的长度等于源句的词数 $n$,因为它要为源句中的每个词单独记录“被关注了多少次”。它不取决于目标句长度、词嵌入维度或隐藏层维度。就像看房清单上的条目数是房源数决定的,而不是客户要看多少趟决定的。

Q4. 在注意力打分中引入覆盖率惩罚后,哪个操作是正确的?

单选题 · mid

  • A.在原始得分上加上覆盖率值
  • B.在原始得分上减去覆盖率值乘以系数← 正确答案
  • C.用覆盖率直接替换注意力得分
  • D.将覆盖率与得分做矩阵乘法

答案:B。标准做法是从基础注意力得分中减去 $\beta \cdot c_{t-1}[j]$,这样覆盖率高的词得分被压低,在 softmax 后获得更小的注意力权重。加上会适得其反,替换或矩阵乘法也没有理论依据。就像工作考核中看房次数过多的房源会被扣分,而不是加分。

Q5. 覆盖率损失中的 $\min(c_T[j], 1)$ 截断操作有什么作用?

单选题 · mid

  • A.让覆盖率永远不会超过 1
  • B.限制超过 1 部分的惩罚权重← 正确答案
  • C.加速模型收敛速度
  • D.替代 softmax 归一化

答案:B。截断操作将超过 1 的覆盖率分量压到 1 再参与惩罚计算,避免对“已经过度翻译”的词再进行过度惩罚。它并不真的把覆盖率限制在 1 以内(那会让惩罚失去意义),也与收敛速度、softmax 无关。就像中介对看了 5 次的房源,罚单上仍按“看了 1 次以上”来算,不会因为看了 10 次就罚 10 倍。

Q6. 训练时设置 $\lambda$ 过大可能导致什么后果?

单选题 · mid

  • A.模型完全消除重复,翻译质量显著提升
  • B.注意力分布过于均匀,译文散焦不准确← 正确答案
  • C.模型训练速度大幅提升
  • D.覆盖率向量自动归零

答案:B。$\lambda$ 过大意味着覆盖率惩罚过强,模型为了不触犯惩罚,倾向于把注意力平均分散到所有源词上,导致每个词都没被“看准”,译文出现散焦问题。这和中介逼得太紧、客户每间房只扫一眼最后什么也没记住类似。合理的 $\lambda$ 需要实验确定,而不是越大越好。

Q7. 覆盖率机制主要解决哪些翻译问题?

多选题 · mid

  • A.重复翻译同一源词← 正确答案
  • B.漏翻某些源词信息← 正确答案
  • C.词嵌入维度选择不合理
  • D.注意力分布不均衡← 正确答案

答案:ABD。覆盖率机制的精髓是记录历史注意力分配,对已高频关注的词施加惩罚,从而消除重复翻译(A);同时引导模型关注尚未被覆盖的词,减少漏翻(B);本质上让注意力分布更加均匀(D)。词嵌入维度(C)是架构设计问题,与覆盖率机制无关,它不负责处理表征维度。

Q8. 关于覆盖率机制在长句翻译中的困境,下列说法正确的有?

多选题 · hard

  • A.长句的覆盖率向量更稀疏← 正确答案
  • B.解码后期回头关注前文会受惩罚抑制← 正确答案
  • C.覆盖率机制无法应用于长句
  • D.稀疏覆盖率向量使后期补救困难← 正确答案

答案:ABD。长句中源词数量大,解码早期覆盖的源词少,覆盖率向量确实更稀疏(A)。后期因语法对齐等原因需要回头关注某些源词时,这些词的覆盖率已经较高,惩罚会抑制这种关注(B)。但覆盖率机制完全可以用于长句,只是效果可能打折扣(C 过于绝对),需要更强的覆盖率约束或更丰富的覆盖表征(D 为困境描述)。

Q9. 覆盖率损失与交叉熵损失联合训练时,两者的关系是?

单选题 · hard

  • A.覆盖率损失替代交叉熵损失
  • B.两者加权求和,覆盖率损失作为辅助约束← 正确答案
  • C.两者完全独立,互不影响
  • D.交叉熵损失只在验证集上使用

答案:B。覆盖率损失是辅助损失项,与主损失(交叉熵/负对数似然)加权求和后共同参与反向传播。它负责引导模型“关注完整、不重复”,交叉熵负责保证“译文语义准确”,两者协同而非替代。就像中介考核既看客户满意度(对应翻译准确性),又看房源是否均衡覆盖(对应覆盖率)——两套标准一起计入绩效。

Q10. 在解码阶段引入覆盖率惩罚时,正确的做法包括?

多选题 · hard

  • A.每个时间步更新覆盖率向量← 正确答案
  • B.计算注意力得分时参考上一步覆盖率← 正确答案
  • C.覆盖率越高注意力得分越低← 正确答案
  • D.直接用覆盖率替换 softmax 的输入

答案:ABC。正确流程是:每生成一个词就更新覆盖率向量(A),下一个时间步用更新后的覆盖率去修正注意力打分(B),修正方式是减掉一个正比于覆盖率的惩罚项,使高覆盖率词得分降低(C)。但覆盖率并不替换 softmax 输入——它是修正得分的一个减项,之后仍然要过 softmax 得到正常概率分布(D 错误)。