问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

大模型的模型融合方法

创作时间:
作者:
@小白创作中心

大模型的模型融合方法

引用
CSDN
1.
https://blog.csdn.net/qq_27590277/article/details/136668093

大模型的模型融合方法是提升模型性能的重要手段。本文详细介绍了五种基本的集成方法,包括模型整合、概率集成、嫁接学习、众包投票和混合专家模型(MoE)。每种方法都有其独特的应用场景和实现细节,可以帮助读者全面了解大模型融合的相关技术。

模型融合在机器学习领域应用广泛,特别是在判别模型中,是一种能够稳定提升性能的方法。然而,对于生成语言模型而言,由于解码过程的存在,模型融合并不像判别模型那样直观。随着大模型参数量的增加,传统的集成学习方法(如stacking、boosting)在参数规模更大的场景下受到限制。因此,针对大模型的集成学习需要更加谨慎的设计。

一、模型整合

模型整合是最简单的一种融合方式,主要在大模型输出的文字层次进行融合。例如,可以将3个不同LLama模型的输出结果作为prompt输入到第四个模型中进行参考。这种信息通过文字传递的方式可以作为一种通信方法。

代表性方法是EoT(Exchange-of-Thought),来自论文《Exchange-of-Thought: Enhancing Large Language Model Capabilities through Cross-Model Communication》。EoT提出了一种新的思想交流框架,即“交换思想”,旨在促进模型之间的交叉通信,以提升问题解决过程中的集体理解。通过这一框架,模型可以吸收其他模型的推理,从而更好地协调和改进自身的解决方案。

二、概率集成

概率集成与传统的机器学习融合相似,比如将模型预测的logit结果进行平均。在大模型中,概率集成可以在transformer的词表输出概率层次进行融合。需要注意的是,这样的操作需要其融合的多个原始模型的词表保持一致。

下面是一个简单的伪代码实现:

kv_cache = None
While True:
    input_ids = torch.tensor([[new_token]], dtype=torch.long, device='cuda')
    kv_cache1, kv_cache2 = kv_cache 
    output1 = models[0](input_ids=input_ids, past_key_values=kv_cache1, use_cache=True)
    output2 = models[1](input_ids=input_ids, past_key_values=kv_cache2, use_cache=True)
    kv_cache = [output1.past_key_values, output2.past_key_values]
    prob = (output1.logits + output2.logits) / 2
    new_token = torch.argmax(prob, 0).item()  

三、嫁接学习

嫁接学习的概念最早源自于数据挖掘竞赛,本质上是一种迁移学习。在大模型中,嫁接学习的应用体现在SOLAR模型中,论文来源于《SOLAR 10.7B: Scaling Large Language Models with Simple yet Effective Depth Up-Scaling》。

具体操作为:复制包含n层的基础模型,以便后续修改。然后,从原始模型中移除最后的m层,并从其副本中移除最初的m层,从而形成两个不同的n-m层模型。最后将这两个模型连接起来,形成一个具有2*(n-m)层的缩放模型。

在继续预训练之后,还需要进行对齐操作,包含两个过程,分别是指令微调和DPO。指令微调采用开源instruct数据并改造出一个数学专用instruct数据,以增强模型的数学能力。DPO是传统的RLHF的替代,最终形成了SOLAR-chat版本。

四、众包投票

众包投票在今年的WSDM CUP第一名方案里有所应用。其核心思想是:如果一个模型生成的句子,与所有模型的结果最像,那这个句子可以认为是所有模型的平均。这样就把概率意义上的平均,变成了生成token结果的上的平均。

假设给定一个测试样本,我们有N个候选回答需要聚合,对于每一个候选,我们计算和所有其他模型结果的相关性分数并将它们加在一起作为该候选的质量分数。相关性量化来源可以是嵌入层余弦相似度、词级ROUGE-L和字符级ROUGE-L等。

代码地址:https://github.com/zhangzhao219/WSDM-Cup-2024/tree/main

五、MoE

混合专家模型(Mixture of Experts,简称MoE)是一种结合多个子模型(即“专家”)的模型架构方法,旨在通过多个专家的协同工作来提升整体的预测效果。MoE结构能够显著增强模型的处理能力和运行效率。

MoE的核心组件包括门控机制和一系列专家网络。门控机制负责依据输入数据动态调配各个专家的权重,以此来决定每个专家对最终输出的贡献程度;专家选择机制则根据门控信号的指示,挑选出一部分专家来参与实际的预测计算。

在大模型时代,如何在transformer架构上应用MoE并解决训练稳定性和推理效率的问题成为关键。谷歌提出的Gshard方法成功将Transformer模型的参数量增加至超过六千亿。

在GShard框架下,编码器和解码器中的每个前馈网络(FFN)层被一种采用Top-2门控机制的混合专家模型(MoE)层所替代。为了确保训练过程中的负载均衡和效率,GShard提出了三种关键技术:

  • 损失函数:考量某个专家的buffer中已经存下的token数量,乘上某个专家的buffer中已经存下的token在该专家上的平均权重,构建这样的损失函数能让专家负载保持均衡。
  • 随机路由机制:在Top-2的机制中,我们总是选择排名第一的专家,但是排名第二的专家则是通过其权重的比例来随机选择的。
  • 专家容量限制:设置一个阈值来限定一个专家能够处理的token数量。如果两个专家的容量都已经达到了上限,那么令牌就会发生溢出,这时token会通过残差连接传递到下一层,或者在某些情况下被直接丢弃。

整个MoeLayer的原理可以用如下伪代码表示:

M = input.shape[-1] # input维度为(seq_len, batch_size, M),M是注意力输出embedding的维度
reshaped_input = input.reshape(-1, M)
gates = softmax(einsum("SM, ME -> SE", reshaped_input, Wg)) #输入input,Wg是门控训练参数,维度为(M, E),E是MoE层中专家的数量,输出每个token被分配给每个专家的概率,维度为(S, E)
combine_weights, dispatch_mask = Top2Gating(gates) #确定每个token最终分配给的前两位专家,返回相应的权重和掩码
dispatched_expert_input = einsum("SEC, SM -> ECM", dispatch_mask, reshaped_input) # 对输入数据进行排序,按照专家的顺序排列,为分发到专家计算做矩阵形状整合
h = enisum("ECM, EMH -> ECH", dispatched_expert_input, Wi) #各个专家计算分发过来的input,本质上是几个独立的全链接层
h = relu(h)
expert_outputs = enisum("ECH, EHM -> ECM", h, Wo) #各个专家的输出
outputs = enisum("SEC, ECM -> SM", combine_weights, expert_outputs) #最后,进行加权计算,得到最终MoE-layer层的输出
outputs_reshape = outputs.reshape(input.shape) # 从(S, M)变成(seq_len, batch_size, M)  

在MoE的架构改进上,Switch Transformers设计了一种特殊的Switch Transformer层,该层能够处理两个独立的输入(即两个不同的token),并配备了四个专家进行处理。与最初的top2专家的想法相反,Switch Transformers采用了简化的top1专家策略。

国内知名大模型DeepSeek MoE的架构设计了一个共享专家,每次都参与激活。这种设计基于这样一个前提:某个特定的专家能够精通特定的知识领域。通过将专家的知识领域进行细粒度的分割,可以防止单一专家需要掌握过多的知识面,从而避免知识的混杂。同时,设置共享专家能够确保一些普遍适用的知识在每次计算时都能被利用。


© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号