LLaMA-Adapter: Efficient Fine-tuning of Language Models with Zero-init Attention

2023-05-16

Paper name

LLaMA-Adapter: Efficient Fine-tuning of Language Models with Zero-init Attention

Paper Reading Note

Paper URL: https://arxiv.org/pdf/2303.16199.pdf
Code URL: https://github.com/ZrrSkywalker/LLaMA-Adapter

TL;DR

  • 2023 上海人工智能实验室和 CUHK MMLab 出的文章。提出 LLaMA-Adapter,一种高效的微调方法,将 LLaMA 调整为指令跟随模型。对于 llama7b 模型来说,可训练参数缩小到 1.2M,只需要 1 小时即可完成 52K 数据微调 (基于 8xA100 训练),比 Alpaca 快 3 倍

Introduction

背景

  • 最近,大语言模型 (LLM) 在之类跟随 (instruction-following) 模型方面取得了重大进展,比如 ChatGPT 和 GPT-3.5 (text-davinci-003)。遵循自然语言的指令或命令,这些 LLM 可以以对话的方式产生专业和基于上下文的回复
  • 然而 instruction-following 的方式需要 finetune 模型带来高昂的开发成本。Alpaca 在 LLaMA 模型基础上进行了微调得到一个 instruction-following 模型,基于 175 对人工编写的指令-输出对,Alpaca 利用 GPT-3.5 来基于 self-instruct 的方式将训练数据扩充到 52K。然而 Alpaca 需要对 LLaMA 整个模型进行微调

本文方案

在这里插入图片描述

  • 本文提出 LLaMA-Adapter,一种高效的微调方法,将 LLaMA 调整为指令跟随模型。对于 llama7b 模型来说,可训练参数缩小到 1.2M,只需要 1 小时即可完成 52K 数据微调 (基于 8xA100 训练),比 Alpaca 快 3 倍
    • 具体来说,在 LLaMA 的更深层的 transformer 层中,将一组可学习的自适应提示作为前缀附加到输入指令 token 中。这些提示学习将新指令(条件)自适应地注入 LLaMA
    • 为了避免在早期训练阶段适应提示中的噪声,将插入层的 attention 机制修改为零初始 attention,并使用可学习的门控因子。通过零向量初始化,门控可以首先保留 LLaMA 中的原始知识,并在训练过程中逐步引入指令信号
    • 这样做的一个好处和 LoRA 类似,即对于不同的场景可以在基础的 llama 模型 (7B) 上插入不同的插件小模型(1.2 M),用于处理不同场景任务,而不用对每个场景任务都准备一个 7B 的大模型
    • 支持多模态输入:支持方式就是简单将图片的 tokens 加到 adaption prompts 中,在 ScienceQA 基准测试中表现出色

Dataset/Algorithm/Model/Experiment Detail

实现方式

在这里插入图片描述

Learnable Adaption Prompts

  • 给定 52K instruction-to-output 数据和一个预先训练好的 LLaMA 模型(一个N层 transformer 模型),采用了一套可学习的适应提示(adaption prompts)来指导后续的微调
    • 将 L 层 transformer 的提示符记为 { P l } l = 1 L \{P_{l}\}^{L}_{l=1} {Pl}l=1L ,其中 P l ∈ R K × C P_{l} \in \mathbb{R}^{K \times C} PlRK×C , K 表示每一层的提示长度,C 等于 LLaMA transformer 层的特征维数
    • 只对于深层的 L 层插入 adapter,这可以更好地调整具有高级语义的语言表示
    • 以第 l 个插入层为例,将长度为 M 的词 token 表示为 T l ∈ R M × C T_{l} \in \mathbb{R}^{M \times C} TlRM×C 。然后,将自适应提示符按照 token 维度作为前缀与 T l T_{l} Tl 连接,表达式为: 在这里插入图片描述
      这样 P l P_{l} Pl 内部学习到的指令知识可以有效地引导 T l T_{l} Tl 生成上下文响应

Zero-init Attention

  • 如果适应提示是随机初始化的,可能会在训练开始时对词 token 带来干扰,不利于调优的稳定性和有效性。考虑到这一点,修改了最后 L 个 transformer 层的传统注意机制为零初始注意
    • 假设模型基于 [ P l ; T l ] [P_{l}; T_{l}] [Pl;Tl] 信息,在生成第 (M + 1)-th 个单词,将对应的 (M + 1)-th 个词表示为 t l ∈ R 1 × C t_{l} \in \mathbb{R}^{1 \times C} tlR1×C , attention 首先基于如下 linear 层对 qkv 进行计算
      在这里插入图片描述
      然后,计算softmax函数前的注意得分为
      在这里插入图片描述
      记录了 t l t_{l} tl 和所有 K+M+1 token 之间的特征相似性。同时, S l S_{l} Sl 可以由两个组分重新计算为
      在这里插入图片描述
      其中 S l K ∈ R K × 1 S_{l}^{K} \in \mathbb{R}^{K \times 1} SlKRK×1 S l K ∈ R K × 1 S_{l}^{K} \in \mathbb{R}^{K \times 1} SlKRK×1 分别为 K 个适应提示和 M + 1 个词 token 的注意得分。前者 S l K S^{K}_{l} SlK 表示可学习提示符对 t l t_{l} tl 的贡献,这可能会在训练早期造成干扰
    • 为此,采用一种可学习的门控因子 g l g_{l} gl ,自适应控制关注中 S l K S^{K}_{l} SlK 的重要性
      在这里插入图片描述
      单独的 softmax 函数确保第二项与添加的适应提示无关, g l g_{l} gl 训练开始会初始化为 0,然后再逐渐增大。注意力的每个头会采用不同的 g l g_{l} gl 进行独立学习。最后,计算带有线性投影层的注意层的输出为
      在这里插入图片描述

Multi-modal Reasoning

在这里插入图片描述

  • LLaMA-Adapter 不局限于文本指令,能够根据其他模态输入来回答问题,为语言模型增加了丰富的跨模态信息
    • 对于图片输入,使用 CLIP 提取多尺度的全局特征,然后将这些多尺度特征 concat 起来,经过一个投影层得到全局的信息表征
      在这里插入图片描述 I p ∈ R 1 × C I_{p} \in \mathbb{R}^{1 \times C} IpR1×C 是和 adapter prompt 维度一样的全局图片特征表示,然后将该特征 repeat 后与 adapter prompt 相加得到多模态特征
      在这里插入图片描述

实验结果

实施细节

  • Stanford Alphaca 的 52K instruction-following 数据作为训练集
    • {instruction}是任务的描述,{input}是任务的上下文,{output}是 GPT-3.5 生成的答案
    • 其中 40% 的数据有 {input} 信息
  • 8xA100 进行训练 5 个 epoch
  • 在 llama 7B 上做实验,transformer 层数 N=32,对于深层的 30 层都插入 adapter layer,提示符长度 K = 10

instruction follow 效果对比

  • 由于还缺乏严格的评估指标,简单地展示了一些响应示例进行比较。仅对 1.2M 参数进行微调,本文的方法产生了与完全微调的 Alpaca 和大规模 GPT-3 模型相当的合理响应


    在这里插入图片描述

训练效率对比

  • 可训练参数比 lora 还少,训练时间相比于原始 alpaca-llama 降低 3 倍
    在这里插入图片描述

多模态输入效果

  • 在 ScienceQA 上进行训练,测试结果是 SOTA。其中 L L a M A − A d a p t e r T LLaMA - Adapter_{T} LLaMAAdapterT 是纯文本输入,可以看到和带图片输入的差距很大
    在这里插入图片描述
    一些 ScienceQA 上的样例
    在这里插入图片描述

Ablation Study

  • 增加 adapter 的训练层数,可以看到增加更多训练层的精度会更好
    在这里插入图片描述

  • 零初始化的提升也很明显
    在这里插入图片描述
    在这里插入图片描述

  • 方法对过拟合问题较为鲁棒,训练 60 epoch 情况下 acc 是最高的
    在这里插入图片描述

Thoughts

  • 很直观的做 llm 微调的实现思路,加一些可学习的 prompt 思路和 Visual Prompt Tuning 很像
  • 与比 LoRA 的缺点看起来是增加了一定推理计算量,本文中和 LoRA 等方法的对比还不够详细
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

LLaMA-Adapter: Efficient Fine-tuning of Language Models with Zero-init Attention 的相关文章

  • Android ListView 的过滤器 - 空格字符

    我想过滤我的listView使用一个EditText盒并使用适配器getFilter 功能 它工作得很好 直到我在文本框中放置了一个空格字符 编辑 这是一个SimpleAdapter 不是 ArrayAdapter 如果我的列表包含这些词
  • 如何重用 ListView 的方法?

    我想重用 ListAC ListActivity 中的几个方法 并希望将其放入单独的类中 如果可能的话 我将有数十个 ListView 活动 ListActivities 即 ListAD ListTCDS listSFAR 等 它们将调用
  • 无法使用自定义适配器理解 NullPointerException

    我正在尝试创建一个列表视图 它作为可以显示 html 内容的 TextView WebView 和其他基本 TextView 我尝试扩展 SimpleAdapter 但我遇到了这个问题 如果有人能指出我正在做的错误 我会很高兴 在onCre
  • Android:notifyDataSetChanged();不工作

    我在服务器中有一个数据库 我从平板电脑上从数据库中的一个表中获取一些值 我将此信息正确加载到列表中 但我想知道为什么当发生更改时 即使我使用也没有任何反应notifyDataSetChanged 我必须说 为了加载加载数据 您使用 Asyn
  • 使用 TreeMap 数据膨胀 ListView(自定义适配器)

    Solved 我根据 JJV的建议创建了一个适配器 我知道还有很大的改进空间 但目前还有效 我已经使用工作代码更新了程序的简化版本 我希望它对其他人有用 做这样的事情 public class TreeMapAdapter extends
  • Llama 架构分析

    从代码角度进行Llama 架构分析 Llama 架构分析 前言 Llama 架构分析 分词 网络主干 DecoderLayer
  • 带有复选框的 Android 列表视图未按预期运行

    这是关于回收问题 我正在使用自定义适配器来填充列表视图 在自定义行中有一个图像视图 两个文本框和一个复选框 所有元素都已填充 但复选框未正确填充 在 的里面getView 我执行一个条件 如果条件为真 我将复选框设置为启用状态 这工作正常
  • FBAudience Network 作为框架集成

    我正在将 Facebook Audience Network 集成到插页式和奖励类型的广告中 我正在尝试将其集成为框架而不是项目中 当我尝试通过测试用例测试它时 它在这一行之后失败 self fbInterstitialAd FBInter
  • Android:在自定义适配器中调用 getView() 两次

    我正在将自定义 SimpleCursorAdapter 设置为 ListView 由于某种原因 FriendAdapter 的 getView 会针对数据库中的每个项目调用两次 经过一番调查 我的 contact list xml 中没有w
  • Android:具有自定义行视图的可扩展导航抽屉

    我正在尝试制作一个带有可扩展元素的导航抽屉菜单 如下所示 gt http goo gl SkMU8N http goo gl SkMU8N 我不知道 所以我开始做这样的事情 不是我的 https github com PrashamTriv
  • 通过notifyDataSetChanged() 没有更改/黑屏;

    我想做这样的事情 同时按下refresh按钮 它将刷新列表 活动代码如下 adapter new TweetAdapter Welcome this tweets users tweetsList setAdapter adapter pr
  • 在 Kotlin 中设置匿名接口[重复]

    这个问题在这里已经有答案了 我的界面中有一个界面Adapter class interface OnItemClickListener fun onItemClick view View 请注意我的interface是在科特林 我想通过这个
  • 如何获取适配器内的视图高度以创建大小的位图?

    我将自定义 CursorAdapter 与自定义项一起使用 我需要视图高度来调整资源文件夹中位图的大小 并将此调整大小的位图设置为列表项中的 ImegeView Override public void bindView View view
  • 自定义适配器 getView 方法在位置 0 处频繁调用

    我有一个 GridView 绑定到自定义 ArrayAdapter 派生
  • 如何创建像所附照片一样的用户界面

    谁能告诉我这个照片效果叫什么 我想知道如何为这个附加的图像效果创建一个适配器 编辑 这是Android市场的示例照片 我想创建一个这样的布局 我想这应该覆盖 GridView 适配器 肖像截图 风景截图 另一张截图 我非常抱歉我的问题对你们
  • ConstraintLayout 无法转换为 android.widget.TextView

    当我尝试启动活动时 不断收到运行时错误 发生错误的行 private OnItemClickListener mDeviceClickListener new OnItemClickListener public void onItemCl
  • 具有动态适配器的动态列表视图

    我想创建一个动态列表视图 它在滚动到初始列表末尾时添加动态元素 每次滚动位置到达上一个列表的末尾时 都应添加新项目 我怎样才能实现这个目标 谢谢 您需要添加一个滚动侦听器并覆盖onscroll
  • 适配包含 ref 参数的 C# 事件

    我所处的情况是 我必须使用包含很多事件的第三方库 而且恕我直言 写得不是很好 它触发了我必须在代码中处理的事件 但我试图将其抽象出来 以便能够对依赖于该库的其余代码进行单元测试 因此我需要一个适配器 问题是一些事件是委托类型的 需要ref参
  • 在 RecyclerView android 中拖放期间面临位置值问题

    如何在 RecyclerView 适配器中拖放时获取新的位置值 拖放工作正常 但是当我设置 setOnClickListener 打开我的详细活动时 它给了我旧的位置值 例如 如果我拖动第二个项目 INDEX 1 并放在第一个项目的位置 I
  • Android中线程加载的Web图像

    我在 ListActivity 中有一个扩展的 BaseAdapter private static class RequestAdapter extends BaseAdapter 以及其中定义的一些处理程序和可运行对象 Need han

随机推荐