多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

覆盖机制(Coverage Mechanism)在 Seq2Seq 中解决的是什么问题(如重复生成)?

覆盖机制(Coverage Mechanism)在 Seq2Seq 中解决的是什么问题(如重复生成)? Coverage Mechanism解决 Seq2Seq 中的重复生成问题一、要解决的问题重复生成Repetition在 Seq2Seq 模型尤其是注意力机制 自回归解码中存在一个典型问题输入The cat sat on the mat because it was tired. 期望输出猫坐在垫子上因为它累了。 实际输出猫坐在垫子上猫坐在垫子上猫坐在垫子上... ↑ 不断重复已生成的内容重复生成的根因解码过程带注意力 t1: 注意力 → 源句 猫 → 生成 猫 t2: 注意力 → 源句 坐 → 生成 坐 t3: 注意力 → 源句 垫子 → 生成 垫子 t4: 注意力 → 源句 猫 → 生成 猫 ← 又关注回已翻译过的词 t5: 注意力 → 源句 坐 → 生成 坐 ← 循环重复 ... 问题本质注意力机制没有记忆不知道哪些源词已经被翻译过 → 同一个源词被反复关注 → 输出反复重复核心矛盾标准注意力在每一步独立计算注意力分布缺乏对历史注意力的追踪导致模型反复关注相同的源位置。二、Coverage Mechanism 的核心思想引入一个覆盖向量Coverage Vector记录源句中每个位置已被关注的累积程度并在后续注意力计算中利用该信息惩罚对已关注位置的重复关注。机制示意┌─────────────────────────────────────────────────────────┐ │ Coverage Mechanism 工作流程 │ │ │ │ 源句: w₁ w₂ w₃ w₄ w₅ │ │ │ │ 覆盖向量: c₁ c₂ c₃ c₄ c₅ │ │ ↑ ↑ ↑ ↑ ↑ │ │ 累积 累积 累积 累积 累积 │ │ 注意力 注意力 注意力 注意力 注意力 │ │ │ │ 每一步解码时 │ │ 1. 累积历史注意力 → 更新覆盖向量 │ │ 2. 将覆盖向量纳入注意力计算 → 已关注位置获得更低权重 │ │ 3. 额外引入覆盖损失 → 惩罚重复关注 │ └─────────────────────────────────────────────────────────┘三、具体实现以 Coverage Attention 为例1. 覆盖向量定义coverage vector c_t Σ_{i1}^{t-1} α_i 其中 α_i 是第 i 步的注意力权重分布 c_t[j] 源句位置 j 在前 t-1 步中被关注的累积权重c_t[j]值越大 → 位置 j 已被充分关注 → 不应再关注c_t[j]值越小 → 位置 j 尚未被关注 → 应优先关注2. 注意力计算改进标准注意力无 Coveragee_t v^T · tanh(W_h · h_t W_s · s_t) α_t softmax(e_t)Coverage 注意力e_t v^T · tanh(W_h · h_t W_s · s_t W_c · c_t) ↑↑↑↑↑↑ 新增覆盖向量项 α_t softmax(e_t)W_c是可学习的参数让模型学会如何利用覆盖信息调整注意力分布。3. 覆盖损失Coverage Loss在训练目标中额外加入覆盖损失显式惩罚重复关注CovLoss_t Σ_j min(α_t[j], c_t[j]) ↑ ↑ 当前注意力 历史累积注意力 取 min 的含义 • 若 α_t[j] c_t[j]惩罚 c_t[j]历史已关注的部分仍在被关注 • 若 α_t[j] ≤ c_t[j]惩罚 α_t[j]当前关注不超过历史部分合理 总损失 NLL Loss λ · CovLoss直觉如果某个位置已经被关注了很多c_t[j]大当前又分配了很高的注意力α_t[j]大那么min值就大损失就大 → 鼓励模型向前看关注尚未翻译的源词。四、效果对比无 Coverage 源句: A B C D E t1: 注意力→A 输出: 翻译A t2: 注意力→B 输出: 翻译B t3: 注意力→A 输出: 翻译A ← 重复 t4: 注意力→B 输出: 翻译B ← 循环 有 Coverage 源句: A B C D E 覆盖向量: [0.9, 0.8, 0.1, 0.0, 0.0] ← A、B 已被充分关注 t3: 注意力计算时A、B 因覆盖向量大而被抑制 → 注意力→C 输出: 翻译C ✓ 正常推进 t4: → 注意力→D 输出: 翻译D ✓ t5: → 注意力→E 输出: 翻译E ✓五、Coverage 的不同实现变体变体来源特点Coverage AttentionSee et al. 2017将覆盖向量直接加入注意力打分函数Coverage PenaltyGoogle NMT, 2016在 beam search 推理时对已覆盖词施加惩罚Fertility / Copy 机制Pointer-Generator Network预测每个源词应被翻译的次数显式控制覆盖Transformer 中的 Coverage后续改进在 self-attention 或 cross-attention 中加入覆盖 maskPointer-Generator Network 中的 CoverageSee et al. (2017) 在文本摘要任务中将 Coverage 与 Copy 机制结合最终分布 p_gen × P_vocab (1 - p_gen) × P_copy Coverage 在这里同时解决两个问题 1. 重复生成 → 覆盖向量抑制已关注位置 2. OOV 问题 → Copy 机制直接复制源句中的词六、与相关技术的关系解决重复生成的不同思路 ├── Coverage Mechanism → 从注意力层面追踪历史抑制重复关注 ├── Repetition Penalty → 从解码层面降低已生成 token 的概率 │ (HuggingFace repetition_penalty) ├── No Repeat N-gram Blocking → 从解码层面禁止重复 N-gram │ (HuggingFace no_repeat_ngram_size) ├── Beam Search 多样性惩罚 → 从搜索层面鼓励多样化候选 └── Contrastive Search → 从表示层面惩罚与历史相似的输出方法作用阶段是否需要训练解决重复的方式Coverage训练 推理是需训练覆盖参数追踪源端注意力防止源词被重复翻译Repetition Penalty仅推理否降低已生成 token 的 logitsNo Repeat N-gram仅推理否硬性禁止重复 N-gramBeam Search 多样性仅推理否搜索时惩罚相似候选Coverage 的独特性它是唯一从源端注意力角度解决重复的方法而非仅从目标端输出角度。因此对源句中某些词被反复翻译这类重复特别有效。七、总结问题Seq2Seq 注意力机制无记忆 → 同一源词被反复关注 → 输出重复生成 方案Coverage Mechanism ① 覆盖向量记录源句每个位置的历史累积注意力 ② 将覆盖向量纳入注意力计算抑制已关注位置 ③ 覆盖损失显式惩罚重复关注 本质给注意力机制加上已读标记让模型知道哪些源词已处理过 适用机器翻译、文本摘要等 Seq2Seq 任务中由注意力重复导致的生成重复一句话概括Coverage Mechanism 通过累积历史注意力分布形成覆盖向量在后续注意力计算中抑制已被充分关注的源位置从源端注意力层面根治重复生成问题。
返回列表