微调大型语言模型(一):为什么要微调(Why finetune)?

今天我们来学习Deeplearning.ai的在线课程 微调大型语言模型(一)的第一课:为什么要微调(Why finetune)。

我们知道像GPT-3.5这样的大型语言模型(LLM)它所学到的知识截止到2021年9月,那么如果我们向ChatGPT询问2022年以后发生的事情,它可能会产生“幻觉”从而给出错误的答案,再比如我们有一些关于企业的某些产品的业务数据,但是由于ChatGPT没有学习过这些数据,因此它也无法正确回答出关于这些产品的问题。为了扩大LLM的知识面,让LLM能够更好的学习并掌握新知识从而更好的为用户服务,因此我们需要对LLM进行微调(Finetuning)。

由于常见的开源LLM都有较大的体积,在微调LLM时它对机器的配置有较高的要求,通常要求机器有较大的内存和GPU显存,比如64 GB内存,32G GPU 显存等。因此一般的家用PC很难满足要求,所以我们一般会通过第三方的托管平台的API来实现对开源LLM进行访问和微调,由于本课程使用的是 lamini.ai 平台的API来实现对开源大模型Llama-2-7b模型的访问和微调,因此我们需要去lamini.ai 注册一个账号(可以通过gmail账号直接登录),然后获取免费赠送的Credits(用完后可购买)和 API Key

API Key 设置

我们首先需要在代码中设置 production.key,该key就是我们在注册账号时获取到的Activate API Tokens:

# pip install lamini
from llama import LLMEnginellm = LLMEngine(id="example_llm",config={"production.key": "xxxxxxxxx"})

比较微调与非微调模型

为了让大家更好的理解微调模型和非微调模型的差异,我们需要对两者产生的结果进行比较,也就是我们需要对两种模型提出相同的问题,然后比较它们各自产生的结果。

测试非微调模型

首先我们会对非微调模型Llama-2-7b-hf进行测试,我们会问它几个问题,然后观察它的回答,这里我们对Llama-2-7b-hf 提出这样一个问题:“告诉我如何训练我的狗学会坐下”,由于Llama-2模型目前并不支持中文,所以我们需要使用英语来进行提问:

from llama import BasicModelRunner#加载非微调模型
non_finetuned = BasicModelRunner("meta-llama/Llama-2-7b-hf")#问题:告诉我如何训练我的狗学会坐下
non_finetuned_output = non_finetuned("Tell me how to train my dog to sit")print(non_finetuned_output)

从上面的结果中我们看到Llama-2-7b-hf并没有正确回答问题,它似乎是根据用户的问题,然后用用户的口气又编造了很多重复的问题,这样的回复看上去完全是文不对题,完全不符合要求。下面我们把llm的回复翻译成中文,这样便于大家更好的理解:

#问题:你觉得火星怎么样?
print(non_finetuned("What do you think of Mars?"))

#问题:Twitter的老板是谁?
print(non_finetuned("Who is the boss of Twitter?"))

 下面我们来模拟一个代理和客户之间的问题流程,首先代理问候客户->客户提问->代理回答->客户提问->(需要llm回答)

print(non_finetuned("""Agent: I'm here to help you with your Amazon deliver order.
Customer: I didn't get my item
Agent: I'm sorry to hear that. Which item was it?
Customer: the blanket
Agent:"""))

这里我们可以直观的感觉到Llama-2-7b-hf模型在回答用户问题时,往往会不停的重复用户的问题或者重复自己的回复,因此这样的模型完全不能正常的使用(感觉像患上了精神病)。

与微调模型进行比较

下面我们使用微调模型 Llama-2-7b-chat-hf 看看它如何来回答先前那些问题:

#加载微调模型Llama-2-7b-chat-hf
finetuned_model = BasicModelRunner("meta-llama/Llama-2-7b-chat-hf")#问题:告诉我如何训练我的狗学会坐下
finetuned_output = finetuned_model("Tell me how to train my dog to sit")print(finetuned_output)

从上面的结果看,微调模型Llama-2-7b-chat-hf似乎给出了非常正确合理的答案,我们将这个回答翻译成中文,这样方便大家更好的理解:

结果虽然符合我们的要求,但是美中不足的时在返回的结果中在文本的开头位置出现了和问题无关的内容,比如在答案的开头出现了“on command.” 这样的语句,为此我们可以在向LLM提出问题的时候,在问题的头尾两端的位置插入指令提示符合“[INST]”和“[/INST]”,这样就可以避免LLM返回的结果中出现和问题无关的内容:

print(finetuned_model("[INST]Tell me how to train my dog to sit[/INST]"))

从上面的结果中我们看到llm已经过滤掉了和问题无关的内容比如:“on command.”, 但是我们也发现Llama-2-7b-chat-hf回答的结果似乎并不完整,因为第7点的内容并没有出现,这可能是因为llm的tokens数量限制所导致的,这有待后续进一步验证。

 下面我们给非微调模型Llama-2-7b-hf加上指令提示符看看会怎么样:

print(non_finetuned("[INST]Tell me how to train my dog to sit[/INST]"))

我们看到非微调模型Llama-2-7b-hf并不能识别指令提示符,它将指令提示符当成了问题组成部分,仍然在不停的重复着用户的问题。

接下来我们继续让微调模型Llama-2-7b-chat-hf回答之前剩下的问题:

#问题:你觉得火星怎么样?
print(finetuned_model("What do you think of Mars?"))

这里我们发现llm的回答又出现了内容不完整的情况,这可能是因为token数量超出限制,所以内容被截断了。

#问题:Twitter的老板是谁?
print(finetuned_model("Who is the boss of Twitter?"))

 从上面的结果来看,似乎LLM并不知道 伊隆·马斯克 已经收购了Twitter,而成为了Twitter的新老板,看来它的知识储备量仍然有限,下面我们加上指令提示符看看结果会怎么样:

#问题:Twitter的老板是谁?
print(finetuned_model("[INST]Who is the boss of Twitter?[/INST]"))

 从上面的结果我们看到虽然LLM仍然不知道伊隆·马斯克是Twitter的新老板,但是LLM的回答比之前没有加指令提示符的结果更加合理,逻辑更加清晰,内容更加丰富。

接下来我们继续后续的问题:

print(finetuned_model("""Agent: I'm here to help you with your Amazon deliver order.
Customer: I didn't get my item
Agent: I'm sorry to hear that. Which item was it?
Customer: the blanket
Agent:"""))

 从上面的结果中我们看到,LLM仍然模拟了多轮的agent-customer之间的对话,从内容上看感觉非常的真实,并且在最后LLM做了总结还评价了agent的表现(感觉是即当球员又当裁判)。

与ChatGPT的比较

接下来我们让ChatGPT来回答之前的第一个关于训练狗的问题,我们来看看ChatGPT的回答与微调模型Llama-2-7b-chat-hf的回答有什么不同:

chatgpt = BasicModelRunner("chat-gpt")#问题:告诉我如何训练我的狗学会坐下
print(chatgpt("Tell me how to train my dog to sit"))

x

下面我们将ChatGPT的回答也翻译成中文,这样便于大家更好的理解:

 我们将与之前使用指令提示符的微调模型的结果做一下比对,下面是微调模型Llama-2-7b-chat-hf的结果:

我们发现微调模型Llama-2-7b-chat-hf的结果与ChatGPT3.5模型的结果从质量上来说已经非常的接近了,这似乎说明Llama-2-7b-chat-hf在某些应用场景下存在可以替代ChatGPT3.5的可能性。

总结

今天我们学习了如何使用lamini.ai的API接口来分析开源大模型Llama-2的原始版本和微调版本之间的差异,我们分别加载了原始模型和微调模型,对于相同的问题原始模型表现非常的糟糕,微调模型的表现相对较好,当我们使用指令提示符后微调模型表现的更加优秀,同时我们也发现了微调模型的输出结果不完整的情况, 这可能是由于token数量限制被截断造成的,这有待后续进一步验证,最后我们还比较了ChatGPT和Llama-2微调模型的结果,我们发现Llama-2微调模型的结果的质量非常接近ChatGPT,因此可以认为Llama-2是目前开源LLM中较为优秀的模型。

参考资料

https://lamini-ai.github.io/

 DLAI - Learning Platform Beta

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

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

相关文章

diff算法面试题

面试题:请阐述vue的diff算法 参考回答: 当组件创建和更新时,vue均会执行内部的update函数,该函数使用render函数生成的虚拟dom树,将新旧两树进行对比,找到差异点,最终更新到真实dom 对比差异的过…

轻松上手Docker:学习如何创建和运行自己的Docker容器

文章目录 轻松上手Docker:学习如何创建和运行自己的Docker容器容器的介绍Docker的技术架构容器的工作机制(Docker)容器的关键技术 - NamespaceNamespace隔离说明 容器的关键技术 - CgroupDocker环境搭建1)安装基础软件包2&#xf…

【0222】存储管理器smgr设计机制,及SMgrRelation、SMgrRelationData的作用(1)

1. 概述 在【0000】PostgreSQL源码剖析教程专栏总目录(2023.09.06更新) 一文的“3.4 VFD机制”章节中,详细讲解了PG内核中VFD(虚拟文件描述符)的实现原理。 本文开始,将来讲解PG内核中另外一个非常重要的知识点,即PG内核的存储管理器 ----- 磁盘介质管理器(SMGR)。 这…

python安全工具开发笔记(四)——python网络编程

一、C/S架构 什么是C/S架构 C : Client S : Server。客户机和服务器结构。 Server 唯一的目的就是等待Client 的请求,Client 连上 Server 发送必要的数据,然后等待Server端完成请求的反馈。 C/S网络编程 Server端进行设置,首先创建一个通信…

【深度学习】实验17 使用GAN生成手写数字样本

文章目录 使用GAN生成手写数字样本附:系列文章 使用GAN生成手写数字样本 生成对抗网络 GAN(Generative Adversarial Networks)生成对抗网络是一种深度学习模型架构,由深度生成网络(Generator)和深度鉴别网…

【unity2023打包安卓工程】踩坑记录

这里写自定义目录标题 踩坑记录使用环境Unity的准备工作Windows10 SDKAndroidstudio第一个需要注意的地方第二个需要注意的地方第三个需要注意的地方第四个需要注意的地方第五个需要注意的地方第六个需要注意的 其他unity启动缓慢 更新更新一 2023.9.27 踩坑记录 踩了快一个星期…

codesys【虚轴】

1概述:codesys里有3个轴: 自由编码器,虚轴,实轴。 流程:【高速输入:采集AB脉冲】带》【自由编码器】带》【虚轴】带》【实轴】 1虚轴: 用法和实轴一样。 一般用于,一拖多。 2编…

GEO生信数据挖掘(二)下载基因芯片平台文件及注释

检索到目标数据集后,开始数据挖掘,本文以阿尔兹海默症数据集GSE1297为例 目录 下载平台文件 1.AnnotGPL参数改为TRUE,联网下载芯片平台的soft文件。(国内网速奇慢经常中断) 2.手工去GEO官网下载 转换芯片探针ID为gene name 拓…

u盘初始化后怎么恢复文件?这几步操作帮你找回

随着科技的进步和便携设备的普及,U盘已经成为我们日常工作和生活中不可缺少的存储介质。然而,在使用U盘的过程中,我们可能会遇到各种问题,其中之一就是意外的初始化导致文件丢失。本文将为大家介绍如何在U盘初始化后恢复文件的方法…

缓存问题解决方案

《服务器开发技术、方法与实用解决方案》 一、缓存预热 在系统刚启动或活动刚开始时,如果缓存中没有数据,那么大量请求将直接访问数据库。如果瞬时访问流量巨大,则可能导致数据库因过载而宕机,甚至引发系统雪崩。因此需要将缓存…

Jenkins学习笔记4

配置构建流程: Jenkins任务创建: 1)创建新任务: 把这个Accept first connection改成 No Validation。问题得到解决。 说明下,要确认下主分支的名称是master还是main。 构建触发器这块暂时没有需要配置的。 传输文件…

【yolov1】详解yolov1理论 代码

目标检测要解决的3大问题: 1、有没有? 图片中是否有要检测的物体?(检测物体,判定前景背景) 2、是什么? 这些物体分别是什么?(检测到的物体是什么) 3、在…

vuereact质检工具(eslint)安装使用总结

1、ESLint ESLint工具主要类似java中的checkStyle和findbugs,是检查代码样式和逻辑规范的工具。 1.1、ESLint安装流程 打开VSCode软件,打开扩展中心,下载ESLint插件 图1.1 点击后面的install按进行安装,如图1.2所示&#xff1…

spring boot flowable多人前加签

1、前加签插件 package com.xxx.flowable.cmd;import com.xxx.auth.security.user.SecurityUser; import com.xxx.commons.ApplicationContextHolder; import com.google.common.collect.Lists; import org.apache.commons.collections.CollectionUtils; import org.apache.co…

单元测试

一、什么是单元测试 二、Junit单元测试框架 三、如何使用Junit单元测试框架 package study.StringUtils;public class StringUtil {public static void printNumber(String name){if (namenull){System.out.println ("名字的长度是:0");return;}System.ou…

性能测试监控-java分析工具Arthas

Arthas监控docker中的jvm_ray_my的博客-CSDN博客 Quick Start | arthas arthas是什么 Arthas是阿里巴巴开源的Java诊断工具,它可以帮助开发人员快速、方便地定位和解决Java应用的问题。 Arthas主要包括以下功能: 诊断Java应用中的性能问题&#xff…

【面试题精讲】Java移位运算符

“ 有的时候博客内容会有变动,首发博客是最新的,其他博客地址可能会未同步,认准https://blog.zysicyj.top ” 首发博客地址[1] 面试题手册[2] 系列文章地址[3] 1. 什么是移位运算符? 在 Java 中,移位运算符用于对二进制数进行位移操作。它们…

天眼查询企业信息API接口

"天眼"一般是指"天眼查",这是一个提供全国企业信息查询的API接口。天眼查以"天眼"作为用户logo,基于人工智能算法的数据采集和分析技术,为企业和个人提供全量、精准、实时、权威的企业信息查询服务。 天眼查A…

国产5G手机20天销量不及苹果一天,被iPhone15按在地上摩擦

iPhone15的上市销售,最大竞争对手无疑是国产5G手机,如今iPhone15上市首日的销量数据也已经出炉,高达200万台,这比国产5G手机卖20天的销量还要多,iPhone15让国产手机领教了什么叫遥遥领先。 据了解苹果对iPhone15的预期…

第十四届蓝桥杯大赛软件赛决赛 C/C++ 大学 B 组 试题 A: 子 2023

[蓝桥杯 2023 国 B] 子 2023 试题 A: 子 2023 【问题描述】 小蓝在黑板上连续写下从 1 1 1 到 2023 2023 2023 之间所有的整数,得到了一个数字序列: S 12345678910111213 ⋯ 20222023 S 12345678910111213\cdots 20222023 S12345678910111213⋯2…