作者: admin

  • 打破瓶颈:一种层次化框架优化大规模语言模型的答案选择

    近年来,基于链式思维提示(Chain-of-Thought, CoT)的技术进步为大规模语言模型(LLMs)在复杂推理任务中带来了显著突破。然而,当模型生成多个推理链并基于答案频率进行集成时,正确答案在少数情况下的表现仍然较差。本文提出的层次化推理聚合框架AoR(Aggregation of Reasoning)通过评估推理链的方式来选择答案,并根据任务复杂度动态调整推理链的数量,显著提升了LLM的推理性能。

    背景与现状

    LLMs在各种自然语言处理任务中取得了显著进展,但在推理任务上与人类水平仍存在差距。传统方法通过增加模型的规模来提升性能,但效果有限。链式思维提示技术通过生成一系列中间步骤来简化每一步的复杂性,提供了一种新颖的视角来解决复杂推理任务。

    然而,目前的多数投票集成方法在错误答案多于正确答案时表现不佳。本文通过对多个推理任务的分析发现,超过80%的样本尽管LLMs能够生成正确答案,但多数投票仍然导致错误预测。例如,在AQuA数据集中,尽管模型生成了正确答案,但由于错误答案的数量优势,最终选择了错误答案。

    研究问题

    在LLMs能够生成正确答案的情况下,如何减小错误答案的干扰以准确选择正确答案?为了回答这一问题,本文提出了AoR框架,通过评估推理链来提升答案选择的准确性。

    AoR框架

    AoR框架分为两个阶段:局部评分和全局评价。在局部评分阶段,评估产生相同答案的推理链,重点关注推理过程的合理性和步骤的适当性。在全局评价阶段,联合评估不同答案组中最具逻辑一致性和方法有效性的推理链,确定最佳推理链并将其对应的答案作为最终输出。

    此外,AoR利用全局评价阶段的评分来估计模型对其最优推理过程和答案的信心水平,动态决定是否需要采样更多的推理链。这种动态采样机制在平衡性能和计算成本方面表现出色。

    实验结果

    实验结果表明,AoR在各种推理任务中的表现优于现有的集成方法。特别是在任务难度较大的情况下,AoR通过动态采样显著提升了LLMs的推理性能,减少了推理开销。

    主要贡献

    1. 识别出现有依赖答案频率的集成机制的不足,强调了推理过程的重要性,设计了层次化推理聚合框架AoR。
    2. 利用最优推理链的评分,AoR动态调整采样数量,在平衡性能和计算成本方面表现优异。

    结论

    本文提出的AoR框架通过评估推理链显著提升了LLMs在复杂推理任务中的性能,为未来的研究和应用提供了新的思路。未来的工作可以进一步优化AoR的评估机制和动态采样策略,以应对更复杂的推理任务。


    arxiv.org/pdf/2405.12939#pdfjs.action=download


    我们来深入了解一下 AoR 框架的各个组成部分,以及它是如何解决大型语言模型 (LLMs) 在复杂推理任务中所面临挑战的。

    现有问题:

    现有的 LLM 推理方法,特别是依赖答案频率进行集成的那些,在面对正确答案属于少数情况时往往表现不佳。这是因为:

    • 多数投票偏差: 当错误答案的数量超过正确答案时,即使 LLM 能够生成正确答案,基于多数投票的机制也可能倾向于选择错误的最终预测。
    • 缺乏推理质量评估: 许多方法仅仅依靠答案出现的频率,而没有对推理过程本身进行质量评估,导致难以区分逻辑合理但答案罕见的情况。

    AoR 框架如何解决这些问题:

    AoR (Aggregation of Reasoning) 框架通过以下几个关键组件来解决上述问题:

    1. 局部评分 (Local-Scoring):
    • 分组: AoR 首先使用 CoT (Chain-of-Thought) prompting 技术生成多个推理链,并将得出相同答案的推理链归为一组。
    • 评估: 在每个组内,AoR 会根据预定义的标准(例如逻辑一致性、步骤清晰度、知识运用等)对每个推理链进行评分。
    • 筛选: AoR 会选择每个组中得分最高的 k 个推理链作为代表,传递到下一阶段。 作用: 局部评分阶段的目标是筛选出每个答案组中推理质量最高的代表性推理链,避免仅仅依赖答案频率进行筛选。
    1. 全局评估 (Global-Evaluation):
    • 代表推理链比较: AoR 从每个答案组中选择一个得分最高的推理链,并将这些代表推理链进行比较。
    • 最终答案选择: AoR 会根据预定义的标准(与局部评分类似)对代表推理链进行评估,并选择得分最高的推理链所对应的答案作为最终答案。 作用: 全局评估阶段的目标是从不同答案中选择推理最充分、逻辑最合理的答案,避免多数投票偏差。
    1. 动态采样 (Dynamic Sampling):
      • 分数差距判断: AoR 会根据全局评估阶段中最高分和次高分推理链之间的分数差距来判断是否需要生成更多推理链。
      • 动态调整: 如果分数差距小于预设阈值,意味着模型对最终答案的选择不够确定,AoR 会自动生成更多推理链,并重复上述评分和评估过程,直到达到预设的置信度或推理链数量上限。
      作用: 动态采样机制能够根据任务的复杂性和模型的置信度自适应地调整推理链的数量,在保证准确性的同时提高效率。

    总结:

    AoR 框架通过结合局部评分、全局评估和动态采样机制,有效地解决了现有 LLM 推理方法的局限性。它不仅关注答案的频率,更注重对推理过程本身进行质量评估,从而提高了 LLM 在复杂推理任务中的准确性和可靠性。

    希望这个解释能够帮助你更好地理解 AoR 框架! 😊


    让我们通过一个例子来说明 AoR 框架如何应用于大型语言模型的复杂推理任务中。

    假设我们现在有一个常识推理任务:

    问题: 小明在公园里散步,突然下起了大雨。他没有带伞,结果全身都湿透了。请问小明应该怎么做才能避免淋湿?

    传统的基于答案频率的 LLM 推理方法可能会生成以下推理链和答案:

    • 推理链 1: 下雨了,小明没有带伞,所以他淋湿了。他应该回家。 (答案:回家)
    • 推理链 2: 下雨了,小明没有带伞,所以他淋湿了。他应该躲到树下。 (答案:躲到树下)
    • 推理链 3: 下雨了,小明没有带伞,所以他淋湿了。他应该跑到附近的商店里避雨。 (答案:跑到商店里)
    • 推理链 4: 下雨了,小明没有带伞,所以他淋湿了。他应该回家。 (答案:回家)

    如果仅仅根据答案频率,”回家” 出现了两次,会被认为是最佳答案。

    然而,”躲到树下” 或者 “跑到商店里” 才是更合理的答案。

    现在我们来看看 AoR 框架如何处理这个问题:

    1. 局部评分: AoR 会将产生相同答案的推理链分组,并对每个推理链进行评分。假设评分标准包括逻辑性、相关性和可行性。
    • “回家” 组的两个推理链得分可能较低,因为它们没有直接解决如何避免淋湿的问题。
    • “躲到树下” 和 “跑到商店里” 的推理链得分可能较高,因为它们提供了更直接、更可行的解决方案。
    1. 全局评估: AoR 会从每个答案组中选择得分最高的推理链进行比较。在这个例子中,”躲到树下” 和 “跑到商店里” 的推理链可能会被选中。AoR 会进一步评估这两个推理链,并根据常识判断 “跑到商店里” 可能比 “躲到树下” 更能有效地避免淋湿。
    2. 动态采样: 假设 AoR 在全局评估阶段对 “跑到商店里” 的推理链很有信心 (例如,分数差距远超预设阈值),它就不会生成更多推理链。否则,它会生成更多推理链,例如 “打电话叫出租车” 或者 “借一把伞”,并重复上述评分和评估过程,直到达到预设的置信度。

    最终,AoR 框架会选择 “跑到商店里” 作为最佳答案,因为它能够更准确地理解问题的语义,并生成更合理、更有效的解决方案。

    通过这个例子,我们可以看到 AoR 框架如何通过对推理过程进行更细致的评估和动态调整,克服了传统方法的局限性,从而在复杂推理任务中取得更好的表现。

  • DeepSeek-V2中的MLA详解

    DeepSeek-V2是DeepSeek团队最新发布的MoE(Mixture of Experts)架构的LLM(大型语言模型)底座。该模型拥有236B的总参数量和21B的每个token激活参数量,支持128K tokens的上下文长度。DeepSeek-V2的一个核心创新点就是Multi-head Latent Attention(MLA)。

    Multi-head Latent Attention(MLA)简介

    MLA对传统Transformer中的多头注意力机制(MHA)进行了改进,主要目标是:

    1. 降低推理时KV Cache的存储开销;
    2. 缓解GQA(Grouped-Query Attention)和MQA(Multi-Query Attention)等方法导致的模型性能损耗。

    标准的MHA结构

    在标准的MHA结构中,每个token的query、key和value通过参数矩阵映射得到,并分割成多个注意力头。每个头独立计算注意力权重并得到输出,这个过程虽然能捕捉丰富的上下文信息,但在推理时需要缓存大量的KV Cache。

    MLA如何改进?

    MLA通过对keys和values进行低秩联合压缩来降低KV Cache:

    1. 低秩Key-Value联合压缩
      [
      \mathbf{c}_t^{KV} = W^{DKV} \mathbf{h}_t
      ]
      [
      \mathbf{k}_t^C = W^{UK} \mathbf{c}_t^{KV}
      ]
      [
      \mathbf{v}_t^C = W^{UV} \mathbf{c}_t^{KV}
      ]
      其中,(\mathbf{c}_t^{KV})表示压缩后的隐向量,(W^{DKV})是降维映射矩阵,(W^{UK})和(W^{UV})是升维映射矩阵。在推理时,只需要缓存隐向量(\mathbf{c}_t^{KV}),显著减少了KV Cache的容量。
    2. Queries的低秩压缩
      [
      \mathbf{c}_t^Q = W^{DQ} \mathbf{h}_t
      ]
      [
      \mathbf{q}_t^C = W^{UQ} \mathbf{c}_t^Q
      ]
      这样即便不能减少KV Cache,但可以降低训练过程中的激活内存。

    代码实现

    以下是MLA在DeepSeek-V2中的Python代码实现片段:


    class DeepSeekV2Attention(nn.Module):
    def init(self, config: DeepSeekV2Config, layer_idx: Optional[int] = None):

    self.w_dq = nn.Linear(self.hidden_size, config.q_lora_rank, bias=config.attention_bias)
    self.w_uq = nn.Linear(config.q_lora_rank, self.num_heads * self.q_head_dim, bias=False)
    self.w_dkv = nn.Linear(self.hidden_size, self.dc, bias=config.attention_bias)
    self.w_uk = nn.Linear(self.dc, self.num_heads * self.q_head_dim, bias=False)
    self.w_uv = nn.Linear(self.dc, self.num_heads * self.q_head_dim, bias=False)

    def forward(self, hidden_states: torch.Tensor, attention_mask: Optional[torch.Tensor] = None, 
                position_ids: Optional[torch.LongTensor] = None, past_key_value: Optional[Cache] = None, 
                output_attentions: bool = False, use_cache: bool = False, **kwargs):
        bsz, q_len, _ = hidden_states.size()
    
        q = self.w_uq(self.q_a_layernorm(self.w_dq(hidden_states))).view(bsz, q_len, self.num_heads, self.q_head_dim).transpose(1, 2)
        kv_seq_len = q.size(-2)
        if past_key_value is not None:
            kv_seq_len += past_key_value.get_usable_length(kv_seq_len, self.layer_idx)
    
        compressed_kv = self.w_dkv(hidden_states)
        if past_key_value is not None:
            compressed_kv = past_key_value.update(compressed_kv)
    
        k = self.w_uk(compressed_kv).view(bsz, -1, self.num_heads, self.q_head_dim).transpose(1, 2)
            v = self.w_uv(compressed_kv).view(bsz, -1, self.num_heads, self.q_head_dim).transpose(1, 2)
    
            attn_weights = torch.matmul(q, k.transpose(2, 3)) * self.softmax_scale
            attn_weights = nn.functional.softmax(attn_weights, dim=-1)
    
            if output_attentions:
                outputs = (attn_weights,)
            else:
                outputs = ()
    
            attn_output = torch.matmul(attn_weights, v)
            attn_output = attn_output.transpose(1, 2).contiguous().view(bsz, q_len, self.hidden_size)
    
            attn_output = self.out_proj(attn_output)
            outputs = (attn_output,) + outputs
    
            if use_cache:
                outputs = outputs + (past_key_value,)
    
            return outputs
    ```
    
    

    结论
    DeepSeek-V2通过引入Multi-head Latent Attention(MLA)结构,成功优化了传统的多头注意力机制(MHA),在保证模型性能的同时,显著降低了推理时KV Cache的存储开销。这不仅提高了模型的效率,也为未来的大模型架构设计提供了新的思路。

    MLA的实现通过对queries、keys和values进行低秩压缩,减少了存储需求,缓解了因GQA和MQA方法导致的性能损耗。这种创新在深度学习模型的设计中具有重要的参考价值。

    如果你对于DeepSeek-V2的MLA结构有更多的兴趣,建议查看其开源代码和详细文档,以便深入理解其工作机制和实现细节。

人生梦想 - 关注前沿的计算机技术 acejoy.com 🐾 步子哥の博客 🐾 背多分论坛 🐾 借一步网 沪ICP备2024052574号-1