为了账号安全,请及时绑定邮箱和手机立即绑定

Transformer²:LoRA的终结者?

sakana.ai 最新的研究论文提出了一种新的 transformer 架构的通用框架,其理念是适应性。**** 就像你那个有毒的伴侣在有外部观察者时展示出不同的面貌,以适应各种任务,大语言模型也需要这样做,从而适应各种任务,以满足特定领域的需要。

这张照片是由 Cécile BrasseurUnsplash 上拍的。

不过,传统的大型语言模型的后期训练有一些缺点,

  • 微调过程非常耗资源 — 即使使用了现代技术,例如混合精度、量化和PEFT,微调这些模型仍然非常昂贵,需要大量的计算和存储。
  • 过拟合问题 — 微调后的模型往往会开始生成重复的内容,并且容易出现灾难性遗忘现象。
  • 任务干扰 — 梯度冲突通常会使模型在某个特定任务上的表现更好,同时在另一个任务上的表现会变差。
自适应的大规模语言模型

我们将自适应的LLMs定义为一类能够根据环境变化自动调整行为(无需外部干预)的模型。

我们怎么才能做到这样的智能模型呢?

  1. 改进现有的LLM模型 — 我们都非常熟悉LLM的扩展规律和涌现能力,因此,如果继续构建更大的模型,它们无疑会在多种任务和多个领域中表现更佳,这并不会让人感到意外。

但这不是一个很具扩展性的想法,需要大量的计算能力。

2. 采用专家混合(MoE)模型 — MoE 的理念是根据输入的内容动态地将其路由到特定领域的“专家”模块。作者认为 Transformer² 可以大致归类为 MoE 模型,但有重要的不同之处。

去年,麻省理工学院和乔治亚理工学院发布了一篇名为《Self-MoE:迈向具有自专业化专家的组合型大型语言模型》的论文,介绍了一种将单一的LLM转换为组合系统的这一方法。其思路是——与使用人工标注的数据(如MoE的情况)不同,这些模块是通过合成的训练数据从头开始创建的。这些模块由基础LLM共享,并根据特定的输入路由到相应的模块。

自适应的大规模语言模型的好处

  • 根据不同任务动态调整模型 无需频繁调参
  • 持续学习 — 随着时间的推移,模型可以积累信息,而不是使用静态信息进行训练。
  • 消除灾难性遗忘 — 这样在向模型添加新信息时不会引发任何形式的灾难性遗忘,即在学习新任务后不会忘记如何完成之前的任务。

作者们还指出,自适应的大规模语言模型模仿了神经科学中的一个原理,即根据任务的需要激活大脑中的特定区域。

虽然MoEs是创建组合系统的好方法,但为每个单独的任务训练一个独立的“专家”模块仍然是一种资源密集型方法。为了解决这个问题,该论文引入了一种新的微调技术,即奇异值微调(SVF)。

奇异值调优

在我们深入了解论文作者提出的技术之前,让我们先了解一下理解这种方法所需的基本概念。

使用奇异值分解(SVD)的精调

SVD的几何解释(作者供图)

在 SVD 中,UV 两个矩阵旋转了向量空间,这里。我们关注的重点是 Σ 矩阵,即奇异值矩阵。

注意,当Σ用其对应的奇异值来缩放向量时,基向量与与最大方差方向对齐的主轴对齐。因此,改变这些缩放值可以看作是在特定主轴上调整权重。

由于这些特征值可以近似表示不同“特征”的重要性,我们可以忽略_ V U _的变化。

因此,我们在对网络进行微调时,只更新权重矩阵的特征值,从而使需要训练的参数数量显著减少。

这种方法唯一的缺点是,如果我们只训练前k个最大的奇异值,可能会造成一些信息损失(这要看各个方向上的方差是否分布均匀)。

SVD基微调与LoRA比较

加载这个模型。

    首先,从transformers库导入AutoModelForCausalLM和AutoTokenizer  

    name = "Qwen/Qwen2.5-1.5B-Instruct"  # 模型名称
    model = AutoModelForCausalLM.from_pretrained(name)  
    tokenizer = AutoTokenizer.from_pretrained(name)

在使用LoRA时,查看可调参数的数量

    从peft导入LoraConfig 和 peft_model模块

    lora_config = LoraConfig(
        task_type="CAUSAL_LM",
        r=8,
        lora_alpha=32,
        lora_dropout=0.1,
        bias="none",
    )

    lora_model = peft_model.get_peft_model(model, lora_config)
    lora_model.print_trainable_parameters()

使用SVD时查看可训练的参数的数量(更新这3个矩阵——U、V和Σ)。

    # SVD
    from svd_training.svd_model import SVDForCausalLM

    svd_model = SVDForCausalLM.create_from_model(model, rank_fraction=0.1)
    print(f"可训练参数: {svd_model.num_parameters(only_trainable=True)},所有参数: {svd_model.num_parameters()},可训练参数百分比: ≈{svd_model.num_parameters(only_trainable=True) / svd_model.num_parameters()}")

显然,使用基于SVD的微调时,可训练的参数数量更多,但为什么? 原因在于我们不仅更新奇异值,还更新了分解矩阵中的所有元素

这是经过SVD分解后的模型的样子。

Qwen2ForCausalLM: 一个用于因果语言模型的模型结构。
(
  (model): Qwen2Model(  
    (embed_tokens): Embedding(151936, 1536)  # 嵌入层
    (layers): ModuleList(  
      (0-27): 28 x Qwen2DecoderLayer(  # 28个解码层
        (self_attn): Qwen2SdpaAttention(  # 自注意力机制
          (q_proj): SVDLinear()  # 查询投影
          (k_proj): SVDLinear()  # 键投影
          (v_proj): SVDLinear()  # 值投影
          (o_proj): SVDLinear()  # 输出投影
          (rotary_emb): Qwen2RotaryEmbedding()  # 旋转嵌入
        )  
        (mlp): Qwen2MLP(  # 多层感知机
          (gate_proj): SVDLinear()  # 网关投影
          (up_proj): SVDLinear()  # 上投影
          (down_proj): SVDLinear()  # 下投影
          (act_fn): SiLU()  # 激活函数
        )  
        (input_layernorm): Qwen2RMSNorm()  # 输入层归一化
        (post_attention_layernorm): Qwen2RMSNorm()  # 注意力后归一化
      )  
    )  
    (norm): Qwen2RMSNorm()  # 归一化
  )  
  (lm_head): SVDLinear()  # 语言模型头
)

让我们进行一些计算。总共有28个解码层,每个解码层都有7个SVD线性层。此外,模型的头部同样转换成了SVD线性层。因此,总数是。

28 * 7 + 1 = 197 197个SVD线性层

除了冻结 Σ 矩阵中的奇异值外,我们每个 SVD 线性层有 1536 个奇异值。因此,总的奇异值数量为:。

约 1536 * 197 = 302,592 个奇異值

这是将在奇异值精调中训练的有效参数数量,仅占LoRA参数总量的0.00129%

去年发表的LoRA-XS论文也做了类似的工作,不过,这项工作通过引入强化学习来提高学习效率,从而增强学习效果。

最重要的贡献来了:Transformer²

这个框架已经被拆分为两个关键步骤,

  • 使用SVF基于基础模型权重的SVD分解来学习用于RL的紧凑且可组合的专家向量。(图中左侧部分)
  • 3种结合专家向量的适应策略方法,在推理时结合。(图中右侧部分)

本文所使用方法的概述(文中提供的图片)

我们之前查看了大量的代码来了解SVF(本文前面提到过)。现在让我们看看这些专家向量是通过强化学习(即RL)怎样训练的。我们先前知道,只需要更新Σ矩阵。从数学的角度来说,我们可以说,这些专家向量是通过强化学习怎样训练的。

其中 z 代表 SVF 专家向量。

然后,论文中的作者使用带有单位奖励和KL惩罚以防止偏离原始模型的行为的REINFORCE算法。这种方法有助于生成更好的“专家”向量,并不再要求数据集必须详尽。

这些专家向量的一大优点是它们提供的高度组合性;这些向量不仅高度可解释且易于理解,还易于进行代数运算。

自适应部分的工作原理是什么?

框架定义了一个两步式的适应策略,结合了K组基础的专家级向量。

  • 第一次推理阶段 — 给定一个任务后,观察模型在任务中的表现,并创建一个总结这种行为的 z’ 向量。
  • 第二次推理阶段 — 使用这个适应的 z’ 向量生成实际的回复。

想法在于通过观察测试时的表现,模型可以根据这些观察来调整并包含任意可用的专家向量的线性组合,生成最终输出。

总结

虽然这篇论文确实讨论了一种构建自适应的大型语言模型的创新方法,但相比之下,创建SVF向量比使用像LoRA这样的单独模块要复杂得多。此外,PEFT技术有丰富的支持库,使用户使用起来更简单。然而,如果你对权重矩阵有深刻的理解,并知道如何操作它们,那么SVF确实值得一探究竟。

这篇论文展示了令人鼓舞的结果,不过请持保留态度,并基于您的具体情况来判断哪个更合适,因为我由于计算资源有限无法为您提供全面比较 :)

注释:作者制作的图片是使用 LaTeX 创建的。

参考文献

1 —, Transformer²模型 — https://arxiv.org/pdf/2501.06252

2 — 请参阅 https://sakana.ai/transformer-squared/

3 — 自调节MoE论文:https://arxiv.org/pdf/2406.12034

  1. — LoRA-XS论文:“关于LoRA-XS的论文”(如果提供了标题,应在此处插入标题)。https://arxiv.org/pdf/2405.17604

5 — :截断 SVD:奇异值分解(截断):https://en.wikipedia.org/wiki/Singular_value_decomposition#Truncated_SVD

6 — SVD训练:查看这里:https://huggingface.co/blog/fractalego/svd-training

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消