AdapterBias

AdapterBias 的具体实现方式。

AdapterBias 的核心思想

AdapterBias 的目标是用最小的参数改动,让预训练语言模型(比如 BERT)适配下游任务。它不像传统的适配器那样插入复杂的模块,而是通过简单地在变换器层(transformer layers)的隐藏输出上加一个偏移(shift),来实现调整。这个偏移是“token-dependent”(依赖于标记的),也就是说,每个输入标记(token,比如句子中的每个词)都会有自己的调整值。这种设计既轻量又灵活。

具体来说,AdapterBias 的实现可以分解为以下几个关键部分:

  1. 基础模型:预训练的 BERT,保持冻结(不更新权重)。
  2. 偏移机制:在变换器层的隐藏输出上加一个调整向量。
  3. 参数组成:仅用一个向量和一个线性层生成这个偏移。
  4. 训练:只训练这些新增参数,下游任务的损失通过它们反向传播。

实现步骤

1. 预训练模型的隐藏输出

假设你在用 BERT,它由多个变换器层组成。每个层处理输入序列后,会生成一个隐藏状态(hidden state)。对于一个输入序列 ( X = [x_1, x_2, …, x_n] )(n 是序列长度,比如句子的词数),第 ( l ) 层的隐藏输出可以表示为 ( H^l = [h_1^l, h_2^l, …, h_n^l] ),其中:

  • ( h_i^l ) 是第 ( i ) 个 token 在第 ( l ) 层的隐藏表示。
  • ( h_i^l ) 是个维度为 ( d ) 的向量(比如 BERT-base 中 ( d = 768 ))。

通常,下一层会直接拿 ( H^l ) 作为输入继续计算。但 AdapterBias 在这里插手,稍微调整一下 ( H^l )。

2. 引入 Token-Dependent Shift

AdapterBias 的核心是给每个 ( h_i^l ) 加一个偏移 ( \delta_i^l ),这个偏移是针对每个 token 单独计算的。所以调整后的隐藏输出变成:
[
\tilde{h}_i^l = h_i^l + \delta_i^l
]
这里的 ( \delta_i^l ) 就是 token-dependent shift,它的大小和方向取决于具体的 token ( x_i ) 和任务需求。

3. 生成偏移 ( \delta_i^l ) 的方法

为了保持参数高效,AdapterBias 不会为每个 token 和每层都存一个独立的偏移向量(那样参数量会爆炸)。文本提到它“只用一个向量和一个线性层”,我们可以推测实现方式如下:

  • 向量:定义一个可训练的向量 ( b^l ),维度为 ( d )(和隐藏状态一样,比如 768)。这个向量是层的共享参数。
  • 线性层:用一个小型线性变换 ( W^l )(矩阵维度可能是 ( d \times k ) 或 ( k \times d )),从 ( h_i^l ) 生成一个调整值。( k ) 是个小的中间维度,可能比 ( d ) 小得多(比如 ( k = 64 )),以减少参数。
  • 计算过程
    1. 拿 ( h_i^l ) 作为输入,通过线性层 ( W^l ) 投影到一个低维空间:
      [
      z_i^l = W^l \cdot h_i^l
      ]
      这里 ( z_i^l ) 的维度是 ( k )。
    2. 再用一个向量 ( b^l )(或者另一个小的线性层)把 ( z_i^l ) 映射回 ( d ) 维,得到偏移:
      [
      \delta_i^l = b^l + V^l \cdot z_i^l
      ]
      (( V^l ) 是另一个可选的线性层,维度 ( k \times d );如果简化,可能直接用 ( b^l ) 作为偏移基线。)

最终,( \delta_i^l ) 是 token-specific 的,因为它依赖于 ( h_i^l )(每个 token 的隐藏状态都不一样)。

4. 参数量分析
  • 一个向量 ( b^l ):( d ) 个参数(比如 768)。
  • 一个线性层 ( W^l ):假设 ( d = 768 ),( k = 64 ),参数量是 ( 768 \times 64 = 49,152 )。
  • 如果有 ( V^l ):再加 ( 64 \times 768 = 49,152 )。

假设每层都加这么一个结构,对于 BERT 的 12 层,总参数量大概是 ( 12 \times (768 + 49,152) \approx 600,000 ) 个参数。相比 BERT 总共 1.1 亿参数,这确实少得多。而文本说比 Bottleneck Adapter 少 40 倍,说明 Bottleneck 的参数量可能在 2400 万左右(每个适配器有更多参数,比如上下投影层)。

5. 融入模型
  • 在每个变换器层(或者部分层,比如只在某些层加),计算完原始 ( h_i^l ) 后,加上 ( \delta_i^l ) 得到 ( \tilde{h}_i^l )。
  • ( \tilde{h}_i^l ) 传给下一层,继续前向传播。
  • 预训练的 BERT 参数不动,只训练 ( b^l ) 和 ( W^l )(以及可能的 ( V^l ))。
6. 训练
  • 用下游任务的数据(比如文本分类的数据集)计算损失。
  • 损失通过反向传播只更新 AdapterBias 的参数(( b^l ) 和 ( W^l )),BERT 的权重保持冻结。
  • 由于参数少,训练快,内存占用也低。

和 BitFit 的关系

BitFit 只调整模型中已有的偏置项(bias terms),比如线性层里的 ( b )。AdapterBias 更进一步:

  • BitFit 的调整是静态的(每个偏置是个固定值),而 AdapterBias 的偏移是动态的(通过 ( h_i^l ) 计算,token-dependent)。
  • AdapterBias 加了少量新参数(线性层),比 BitFit 稍复杂,但比全适配器简单。

为什么高效?

  1. 参数少:只加一个向量和线性层,比传统适配器的瓶颈结构(两层投影)节省得多。
  2. 任务适配性:token-dependent shift 让模型能灵活捕捉每个词的细微差异,适合 NLP 任务。
  3. 兼容性:用在 BERT 上效果好,说明它能很好地利用预训练知识。

可能的代码示意(伪代码)

class AdapterBias(nn.Module):
    def __init__(self, hidden_dim=768, adapter_dim=64):
        super().__init__()
        self.W = nn.Linear(hidden_dim, adapter_dim)  # 线性层
        self.b = nn.Parameter(torch.zeros(hidden_dim))  # 可训练向量

    def forward(self, hidden_states):
        # hidden_states: [batch_size, seq_len, hidden_dim]
        z = self.W(hidden_states)  # 投影到低维
        delta = self.b + z @ self.W.weight.T  # 偏移(简化版)
        return hidden_states + delta

# 用在 BERT 的某层
bert_layer_output = bert_layer(input)
output_with_adapter = AdapterBias()(bert_layer_output)

总结

AdapterBias 通过在变换器层的隐藏输出上加一个 token-specific 的偏移(用向量和线性层生成),实现了高效微调。它结合了 BitFit 的轻量思想,又增加了灵活性,参数量比 Bottleneck Adapter 少 40 倍,却能保持竞争力。这是个聪明且实用的设计,尤其适合资源有限或快速适配的场景。

如果你想更深入,比如具体实验结果或代码实现,我可以再帮你找找相关资料!你觉得这个解释够清楚吗?有什么想补充的吗?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/976045.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MySQL数据库连接池泄露导致MySQL Server超时关闭连接

前言 最近做项目,发现老项目出现xxx,这个错误其实很简单,出现在MySQL数据库Server端对长时间没有使用的client连接执行清楚处理,因为是druid数据库,且在github也出现这样的issue:The last packet successf…

人工智能基础知识笔记一:核函数

1、简介 核函数有严格的数学要求,凡满足Mercer定理【参考本文第9章节】的都可以作为核函数。Mercer 定理确保高维:间任意两个向量的内积一定可以被低维空间中两个向量的某种计算表示(多数时候是内积的某换)。本节通过一个例子讲解核函数的使用。 2、核函数定义 设…

本地部署DeepSeek-R1(Ollama+Docker+OpenWebUI知识库)

安装Ollama 打开 Ollama官网 https://ollama.com/下载安装 Ollama服务默认只允许本机访问,修改允许其它主机访问 OLLAMA_HOST0.0.0.0 ollama serve也可以添加系统环境变量 都知道模型体积很大,顺便也通过环境变量修改模型存放位置,我这…

图论算法篇:BFS宽度优先遍历

那么bfs算法的大名想必大家都一定听闻过,那么也许有的人在认识我们bfs算法之前是先接触的我们的dfs算法,那么目前我们的算法世界中的两种搜索算法就是我们的dfs和我们的bfs,那么废话不多说,就让我们进入bfs算法的学习 BFS算法原理…

初识.git文件泄露

.git 文件泄露 当在一个空目录执行 git init 时,Git 会创建一个 .git 目录。 这个目录包含所有的 Git 存储和操作的对象。 如果想备份或复制一个版本库,只需把这个目录拷贝至另一处就可以了 这是一种常见的安全漏洞,指的是网站的 .git 目录…

【SpringBoot】【JWT】使用JWT的claims()方法存入Integer类型数据自动转为Double类型

生成令牌时使用Map存入Integer类型数据,将map使用claims方法放入JWT令牌后,取出时变成Double类型,强转报错: 解决: 将Integer转为String后存入JWT令牌,不会被自动转为其他类型,取出后转为Integ…

JVM之JVM的组成

Java 虚拟机(JVM)是 Java 程序的运行核心,它主要由类加载系统、运行时数据区、执行引擎和本地方法接口这几个关键部分组成。 类加载系统(Class Loading System) 类加载系统负责在程序运行时动态地将 Java 类加载到 J…

数据库面试题(基础常考!!!)

在数据库领域,无论是日常开发还是面试场景,都有一些高频且重要的问题需要我们深入理解和掌握。本文将对这些常见面试题进行详细阐述,帮助大家更好地应对面试和实际工作中的挑战。 面试题一:三范式详解 什么是三范式 三范式是关…

Linux网络 网络层

IP 协议 协议头格式 4 位版本号(version): 指定 IP 协议的版本, 对于 IPv4 来说, 就是 4. 4 位头部长度(header length): IP 头部的长度是多少个 32bit, 也就是 4 字节,4bit 表示最大的数字是 15, 因此 IP 头部最大长度是 60 字节. 8 位服务类型(Type Of Service):…

uniapp 微信小程序打包之后vendor.js 主包体积太大,解决办法,“subPackages“:true设置不生效

现在是打包的时候,vendor.js 的内容全部打到了主包里面, 说一下我的方法: 1. 通过发行 小程序打包 这样打包的体积是最小的,打包之后打开微信开发工具,然后再上传 2.manifest.json,在“mp-weixin”里添加代码 "…

python-leetcode-N 皇后

51. N 皇后 - 力扣(LeetCode) class Solution:def solveNQueens(self, n: int) -> List[List[str]]:res []board [[.] * n for _ in range(n)]def is_safe(row, col):for i in range(row):if board[i][col] Q:return Falseif col - (row - i) >…

【蓝桥杯单片机】客观题

一、第十三届省赛(一) 二、第十三届省赛(二)

如何进行ERP系统的定制开发?

在当今数字化时代,企业资源规划(ERP)系统已然成为企业提升管理效能、优化资源配置以及实现精细化管理的关键工具。然而,鉴于不同企业在行业特性、业务流程以及管理需求等方面存在显著差异,通用型的ERP系统往往难以契合…

基于SpringBoot的校园消费点评管理系统

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…

MySQL数据库——常见慢查询优化方式

大家好,这里是编程Cookbook。本文详细介绍MySQL的慢查询相关概念,分析步骤及其优化方案等。 文章目录 什么是慢查询日志?慢查询日志的相关参数如何启用慢查询日志?方式一:修改配置文件方式二:通过命令动态启…

【前端基础篇】Day 1

总结: 1. Web标准的构成 2. 基本标签 目录 1. Web标准的构成 2. 基本标签 2.1快捷键 2.2.1标题标签 2.2.2段落和换行标签 2.2.3文本格式化标签 2.2.4div和span标签 2.3.1 图像标签和路径 2.3.2路径 2.3.3超链接标签 2.4注释标签 2.5特殊字符 1. Web标准…

【复习】Redis

数据结构 Redis常见的数据结构 String&#xff1a;缓存对象Hash&#xff1a;缓存对象、购物车List&#xff1a;消息队列Set&#xff1a;点赞、共同关注ZSet&#xff1a;排序 Zset底层&#xff1f; Zset底层的数据结构是由压缩链表或跳表实现的 如果有序集合的元素 < 12…

我与Linux的爱恋:了解信号量+共享内存+消息队列的应用

​ ​ &#x1f525;个人主页&#xff1a;guoguoqiang. &#x1f525;专栏&#xff1a;Linux的学习 文章目录 信号量共享内存应用---Server&Client通信client.ccserver.ccnamepipe.hppShm.hpp 消息队列——实现Client&ServerCom.hppClient.ccServer.cc 信号量 信号量…

跟着李沐老师学习深度学习(十六)

继续学习深度学习&#xff08;十六&#xff09; 继续理解transformer 对于transformer的理解感觉还是云里雾里的&#xff0c;今天又找了一些视频进行一个梳理。 一个浅解 在B站学习发现评论区真的很不错&#xff0c;在沐神讲transformer论文的评论下&#xff0c;有一个评论…

DeepSeek-R1本地部署保姆级教程

一、DeepSeek-R1本地部署配置要求 &#xff08;一&#xff09;轻量级模型 ▌DeepSeek-R1-1.5B 内存容量&#xff1a;≥8GB 显卡需求&#xff1a;支持CPU推理&#xff08;无需独立GPU&#xff09; 适用场景&#xff1a;本地环境验证测试/Ollama集成调试 &#xff08;二&a…