LLM(二)| LIMA:在1k高质量数据上微调LLaMA1-65B,性能超越ChatGPT

       本文将介绍在Lit-GPT上使用LoRA微调LLaMA模型,并介绍如何自定义数据集进行微调其他开源LLM

监督指令微调(Supervised Instruction Finetuning)

什么是监督指令微调?为什么关注它?

       目前大部分LLM都是decoder-only,通常是续写任务,有时候未必符合用户的需求,SFT是通过构造指令输入和期待的输出数据微调LLM,让LLM根据输入的指令输出期待的内容,这样微调好的LLM会输出更符合用户需求或者特点任务,

图片

SFT数据格式一般如下所示:

  1. Instruction text

  2. Input text (optional)

  3. Output text

Input是可选的,下面是SFT数据格式的示例:

图片

       SFT的微调和Pre-training是一样的,也是根据上文预测下一个token,如下图所示:

图片

SFT数据集如何生成?

       SFT数据集构建通常有两种方法:人工标注使用LLM(比如GPT-4)来生成的,人工标注对于构建垂直领域比较合适,可以减少有偏数据,但是成本略高;使用LLM生成,可以在短时间内生成大量数据。

        SFT数据集构建以及SFT微调Pipeline如下图所示:

图片

LLM生成SFT数据方法总结

Self-Instruct

       Self-Instruct(https://arxiv.org/abs/2212.10560):一个通过预训练语言模型自己引导自己来提高的指令遵循能力的框架。

Self-Instruct有如下四个阶段:

  • 步骤1:作者从 175个种子任务中随机抽取 8 条自然语言指令作为示例,并提示InstructGPT生成更多的任务指令。

  • 步骤2:作者确定步骤1中生成的指令是否是一个分类任务。如果是,他们要求 InstructGPT 根据给定的指令为输出生成所有可能的选项,并随机选择特定的输出类别,提示 InstructGPT 生成相应的“输入”内容。对于不属于分类任务的指令,应该有无数的“输出”选项。作者提出了“输入优先”策略,首先提示 InstructGPT根据给定的“指令”生成“输入”,然后根据“指令”和生成的“输入”生成“输出”。

  • 步骤3:基于第 2 步的结果,作者使用 InstructGPT 生成相应指令任务的“输入”和“输出”,采用“输出优先”或“输入优先”的策略。

  • 步骤4:作者对生成的指令任务进行了后处理(例如,过滤类似指令,去除输入输出的重复数据),最终得到52K条英文指令

完整的Self-Instruct流程如下图所示:

图片

       Alpaca dataset(https://github.com/gururise/AlpacaDataCleaned)的52K数据就是采用该方法生成的。

Backtranslation

       回译在传统的机器学习中是一种数据增强方法,比如从中文翻译成英文,再从英文翻译会中文,这样生成的中文与原来的中文在语义上是一致的,但是文本不同;然而SFT数据生成的回译(https://arxiv.org/abs/2308.06259)则是通过输出来生成指令,具体步骤如下图所示:

图片

LIMA

        LIMA来自论文《The LIMA: Less Is More for Alignment》,LIMA是在LLaMA V1 65B模型上使用1k高质量数据进行微调获得的,性能如下:

图片

在Lit-GPT库上微调LLM

Lit-GPT支持的模型如下表所示:

Model and usageReference
Meta AI Llama 2Touvron et al. 2023
Stability AI FreeWilly2Stability AI 2023
Stability AI StableCodeStability AI 2023
TII UAE FalconTII 2023
OpenLM Research OpenLLaMAGeng & Liu 2023
LMSYS VicunaLi et al. 2023
LMSYS LongChatLongChat Team 2023
Together RedPajama-INCITETogether 2023
EleutherAI PythiaBiderman et al. 2023
StabilityAI StableLMStability AI 2023
PlatypusLee, Hunter, and Ruiz 2023
NousResearch Nous-HermesOrg page
Meta AI Code LlamaRozière et al. 2023

下面以LLaMA2-7B为例说明在 上进行微调的步骤,首先需要clone 

Lit-GPT仓库,微调步骤如下:

1)下载、准备模型

export HF_TOKEN=your_tokenpython scripts/download.py \  --repo_id meta-llama/Llama-2-7b-hf​​​​​
python scripts/convert_hf_checkpoint.py \  --checkpoint_dir meta-llama/Llama-2-7b-hf

2)准备微调数据​​​​​​​

python scripts/prepare_lima.py \  --checkpoint_dir checkpoints/meta-llama/Llama-2-7b-hf

3)使用LoRA进行微调​​​​​​​

python finetune/lora.py \  --checkpoint_dir checkpoints/meta-llama/Llama-2-7b-hf \  --data_dir data/lima

Tips

       官方建议数据的tokens控制在2048之内,可以减少GPU显存消耗,对应的代码也需要增加参数--max_seq_length 2048​​​​​​​

python scripts/prepare_lima.py \    --checkpoint_dir checkpoints/meta-llama/Llama-2-7b-hf \    --max_seq_length 2048

      或者也可以修改 finetune/lora.py文件中的参数change override_max_seq_length = None调整为 override_max_seq_length = 2048 

对于LIMA模型的1k数据进行微调,需要调整max_iters=1000

图片

Lit-GPT上支持的数据集

图片

Lit-GPT定义客户化数据集

加载自定义数据集大致需要两步,首先需要准备三列CSV数据,示例如下:

图片

第一步,执行如下脚本:​​​​​​​

python scripts/prepare_csv.py \   --csv_dir MyDataset.csv \   --checkpoint_dir checkpoints/meta-llama/Llama-2-7b-hf

第二步,与上述LIMA类似,是执行scripts/prepare_dataset.py脚本

参考文献:

[1] https://lightning.ai/pages/community/tutorial/optimizing-llms-from-a-dataset-perspective/

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

springboot学习笔记

yaml文件优先级: config文件夹下的yaml优先级高于同级目录下的yaml文件。 #springboot的多环境配置,可以通过选择激活哪一个配置文件 spring.profiles.activetestyaml的端口选择 server:port: 8081 spring:profiles:active: dev --- server:port: 808…

一图读懂「五度易链」大数据智慧招商解决方案,一站式招商、选商!

“五度易链”以全体量产业大数据为依托,将为区域政府或产业园区构筑智慧招商解决方案,提供从“招商渠道”到“招商评估”再到“招商管理”一站式招商、选商服务。解决招商线索匮乏、招商管理碎片化等一系列问题,还将提供企业综合能力甄别及客…

使用 MyBatisPlus 的注解方式进行 SQL 查询,它结合了条件构造器(Wrapper)和自定义 SQL 片段来构建查询语句。

MyBatis-Plus 是一个基于 MyBatis 的增强工具,它提供了一套方便的注解方式来进行 SQL 查询。其中,它结合了条件构造器(Wrapper)和自定义 SQL 片段来构建查询语句。 官网:条件构造器 | MyBatis-Plus 1、使用 Wrapper …

一台电脑安装多个不同版本Python

1、前提 当前Windows电脑下已经安装了一个python3.11,现在需要安装一个python3.9。下载地址:Python Releases for Windows | Python.org 2、步骤 找到对应的版本,并下载安装包。下载后,打开安装包。按图片勾选,点击n…

leetcode做题笔记148. 排序链表

给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。 思路一:归并排序 c语言解法 struct ListNode* merge(struct ListNode* head1, struct ListNode* head2) {struct ListNode* dummyHead malloc(sizeof(struct ListNode));dummyHead…

分布式算法相关,使用Redis落地解决1-2亿条数据缓存

面试题:1~2亿数据需要缓存,请问如何设计个存储案例 回答:单机单台100%不可能,肯定是分布式存储,用redis如何落地? 一般业界有三种解决方案: 哈希取余分区 2亿条记录就是2亿个k,v&…

6.wifi开发【智能家居:下】,正式开发:智能开关灯,智能采集温湿度,智能调彩灯

一。WEB Server开发 1.需求分析 用户通过页面操作插座彩灯温湿度 【开发前端1】:智能插座网页设计 智能插座网页设计需求 1.通过浏览器访问ESP8266 webserver 2.显示“创客学院-WiFi-智能家居” 3.显示“智能插座” 4.显示当前插座工作状态 5.按键触发插座动作 2.…

Vue3+element-plus切换标签页时数据保留问题

记录一次切换标签页缓存失效问题,注册路由时name不一致可能会导致缓存失效

【前端面试题】2023年 国庆 前端面试真题之JS篇

人的一生,总是难免有浮沉。不会永远如旭日东升,也不会永远痛苦潦倒。反复地一浮一沉,对于一个人来说,正是磨练。因此,浮在上面的,不必骄傲;沉在底下的,更用不着悲观。必须以率直、谦…

公司架构师说不写代码,我直接怼他了!

1 不是不写代码 相反,一些核心组建核心代码都会参与,这些代码会在各种项目中去使用,对于健壮性,性能等各方面要求非常高,需要有一定水平的人才能写好。 阮一峰博客有一句话:“警惕那些很长时间没有编写任何…

若依注解学习(二)@DataScope

DataScope 作用: 一般写在service层的一些需要权限控制的业务方法上,针对部门和用户的权限,生成sql条件 dao层注入,实现数据权限的控制 位置: common下…

21.redo日志(下)

title: “redo日志(下)” createTime: 2022-03-06T15:52:4108:00 updateTime: 2022-03-06T15:52:4108:00 draft: false author: “ggball” tags: [“mysql”] categories: [“db”] description: “” redo log的刷盘时机 log buffer 空间不足时&…

m3u8视频播放HTML

m3u8视频播放HTML&#xff08;1&#xff09; <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><title>前端播放m3u8格式视频</title><!--https://www.bootcdn.cn/video.js/--><link href&q…

selenium-webdriver 阿里云ARMS 自动化巡检

很久没更新了&#xff0c;今天分享一篇关于做项目巡检的内容&#xff0c;这部分&#xff0c;前两天刚在公司做了部门分享&#xff0c;趁着劲还没过&#xff0c;发出来跟大家分享下。 一、本地巡检实现 1. Selenium Webdriver(SW) 简介 Selenium Webdriver&#xff08;以下简称…

单中的部分字段失去焦点后,将数据还原为进入弹窗时的接口数据(深拷贝)

要实现在表单中的部分字段失去焦点后&#xff0c;将数据还原为进入弹窗时的接口数据&#xff0c;可以在进入弹窗时将接口数据保存为一个备份&#xff0c;然后在失去焦点的事件处理函数中将字段值设置为备份数据中相应字段的值。 如果 this.form.originalData 的值被同步修改&a…

多线程的死锁问题

可重入和不可重入&#x1f60a;&#x1f60a;&#x1f60a; 一个线程针对同一个对象,连续加锁两次,是否会有问题 ~~ 如果没问题,就叫可重入的.如果有问题,就叫不可重入的. 代码示例&#x1f349;&#x1f349;&#x1f349;: synchronized public void add(){synchronized (…

Android AMS——创建APP进程(五)

接上一篇,在 ActivityTaskSupervisor 中会判断进程是否存在,如果进程不存在,则会创建进程,执行 startProcessAsync() 方法。如果进程存在,则执行 realStartActivityLocked() 方法。在APP 的启动时,进程是不存在的。所以我们先来分析一下进程不存在的情况。 一、创建进程…

clickhouse分组排序,行号,取特定数量数据

文章目录 1、源数据2、生成数组2.1 groupArray 分组合并为数组2.2 arrayEnumerate 标记数据 3、rank()、row_number()3.1 说明3.2 使用 目前应用很多需求设计对数据分组并去特定数量的数据&#xff1b; clickhouse 新版本增加了row_number()&#xff0c;rank() 函数&#xff0c…

vue wangEditor富文本编辑器 默认显示与自定义工具栏配置

1.vue 显示wangEditor富文本编辑器 <template><div style"border: 1px solid #ccc;"><Toolbar style"border-bottom: 1px solid #ccc" :editor"editor" :defaultConfig"toolbarConfig" :mode"mode"/><…

在线商城项目EShop【ListView、adapter】

要求如下&#xff1a; 1、创建在线商城项目EShop&#xff1b; 2、修改布局文件activity_main.xml&#xff0c;使用LineaLayout和ListView创建商品列表UI&#xff1b; 3、创建列表项布局list_item.xml&#xff0c;设计UI用于显示商品图标、名称和价格信息&#xff1b; 4、创…