冻结语言模型中的 自注意力层,使其参数不参与训练(梯度不会更新)。 对于跨注意力层,则解冻参数,使这些层可以进行梯度更新,从而参与训练。

python 复制代码
def freeze_LLM_only(model):
    """
    Freeze self-attention layers in the language_model. vision_model, multi_modal_projector, and cross-attention layers will be fine-tuned
    """
    for name, param in model.language_model.named_parameters():
                param.requires_grad = False
    for i, layer in enumerate(model.language_model.model.layers):
        if i in model.language_model.model.cross_attention_layers:
            for param in layer.parameters():
                param.requires_grad = True

这段代码的作用是:

  1. 冻结语言模型中的 自注意力层,使其参数不参与训练(梯度不会更新)。
  2. 对于跨注意力层,则解冻参数,使这些层可以进行梯度更新,从而参与训练。

逐步拆解

1. 函数签名
python 复制代码
def freeze_LLM_only(model):
  • 目的:在多模态模型中,仅冻结语言模型(LLM)的自注意力层(Self-Attention),而保留跨注意力层(Cross-Attention)和其他部分(如视觉模型、投影模块)的可训练性。

2. 冻结语言模型参数
python 复制代码
for name, param in model.language_model.named_parameters():
    param.requires_grad = False
  • 遍历语言模型 model.language_model 中的所有参数。
  • 操作 :将所有参数的 requires_grad 属性设置为 False,使它们在训练中不会被更新。

3. 解冻跨注意力层参数
python 复制代码
for i, layer in enumerate(model.language_model.model.layers):
    if i in model.language_model.model.cross_attention_layers:
        for param in layer.parameters():
            param.requires_grad = True
  • 遍历语言模型中的每一层(假设 model.language_model.model.layers 是存储所有 Transformer 层的列表)。
  • 判断当前层是否属于跨注意力层:
    • 如果当前层的索引 i 属于 cross_attention_layers(一个存储跨注意力层索引的列表),解冻该层的参数。
    • 操作 :设置 requires_grad=True,使这些层在训练中可以更新。

举例说明

假设模型结构:
  • 一个多模态模型 model 包含以下部分:
    1. language_model(语言模型)
    2. vision_model(视觉模型)
    3. multi_modal_projector(多模态投影模块)
  • 语言模型 language_model
    • 有 6 层 Transformer 层存储在 model.language_model.model.layers
    • 跨注意力层的索引存储在 model.language_model.model.cross_attention_layers = [2, 4]

使用示例
python 复制代码
# 模拟一个模型对象
class DummyModel:
    def __init__(self):
        self.language_model = self.LanguageModel()

    class LanguageModel:
        def __init__(self):
            self.model = self.Model()

        class Model:
            def __init__(self):
                # 假设有 6 层 Transformer
                self.layers = [nn.Linear(10, 10) for _ in range(6)]
                self.cross_attention_layers = [2, 4]

# 创建模型实例
model = DummyModel()

# 冻结自注意力层,解冻跨注意力层
freeze_LLM_only(model)

验证参数的状态
python 复制代码
for i, layer in enumerate(model.language_model.model.layers):
    print(f"Layer {i}: requires_grad = {any(param.requires_grad for param in layer.parameters())}")
输出:
复制代码
Layer 0: requires_grad = False
Layer 1: requires_grad = False
Layer 2: requires_grad = True
Layer 3: requires_grad = False
Layer 4: requires_grad = True
Layer 5: requires_grad = False

总结

  1. 目标:冻结语言模型中的自注意力层,仅训练跨注意力层。
  2. 适用场景
    • 在多模态任务中,只需要调整跨注意力层以实现语言与其他模态(如视觉)的交互,而保持语言模型自注意力层的知识不被破坏。
  3. 灵活性 :可以通过调整 cross_attention_layers 的索引选择要解冻的层。

这里是通过索引i判断出是不是 属于 cross_attention_layer,可以对这段代码进行优化。

相关推荐
Msshu1231 小时前
PD快充诱骗协议芯片XSP25支持PD+QC+FCP+SCP+AFC协议支持通过串口读取充电器功率信息
人工智能
一RTOS一3 小时前
东土科技连投三家核心企业 发力具身机器人领域
人工智能·科技·机器人·具身智能·鸿道实时操作系统·国产嵌入式操作系统选型
ACP广源盛139246256734 小时前
(ACP广源盛)GSV1175---- MIPI/LVDS 转 Type-C/DisplayPort 1.2 转换器产品说明及功能分享
人工智能·音视频
胡耀超4 小时前
隐私计算技术全景:从联邦学习到可信执行环境的实战指南—数据安全——隐私计算 联邦学习 多方安全计算 可信执行环境 差分隐私
人工智能·安全·数据安全·tee·联邦学习·差分隐私·隐私计算
停停的茶6 小时前
深度学习(目标检测)
人工智能·深度学习·目标检测
Y200309166 小时前
基于 CIFAR10 数据集的卷积神经网络(CNN)模型训练与集成学习
人工智能·cnn·集成学习
老兵发新帖6 小时前
主流神经网络快速应用指南
人工智能·深度学习·神经网络
AI量化投资实验室7 小时前
15年122倍,年化43.58%,回撤才20%,Optuna机器学习多目标调参backtrader,附python代码
人工智能·python·机器学习
java_logo7 小时前
vllm-openai Docker 部署手册
运维·人工智能·docker·ai·容器
倔强青铜三7 小时前
苦练Python第67天:光速读取任意行,linecache模块解锁文件处理新姿势
人工智能·python·面试