AI大语言模型与监督微调
| Joff Thyer
安全分析师、恶意软件研究员、新技术研究推广专家
本文面向数据科学和人工智能领域的中阶学习者。如需了解基础知识,以下是有用资源列表: https://towardsdatascience.com/ https://machinelearningmastery.com/ https://openai.com/news/
大语言模型
基于Transformer架构的生成式大语言模型(LLMs)已成为自然语言处理(NLP)中非常流行的技术。众所周知,目前有许多流行的公共LLMs通过基于Web或JSON RESTful API接口日常使用。例如:
- ChatGPT(OpenAI)
- Gemini(Google)
- Claude(Anthropic)
- Llama(Meta)
对于这些超大型模型,供应商构建了包含数百个张量或图形处理单元(TPU/GPU)的巨大计算资源进行训练。显然,这类资源对典型的信息安全研究者和/或数据科学家来说遥不可及。
可以将这些大模型视为数字大脑,相当于非常聪明的高中生——甚至如今的大学毕业生——它们确实是极好的资源。像许多大学毕业生一样,这些模型拥有广泛的通用知识,但通常在任何特定知识领域都不是"专家"。
类比来说,当我们在任何特定行业雇佣年轻员工时,新员工的初始任务是接受行业领域知识的培训,当然还有我们本地的流程和程序。
在数据科学社区中,有一个常用资源叫"Hugging Face",一些非常大的公共模型选择在此公开发布。因此,明显的问题是:我能拿其中一个大型模型送去上学吗?我能否在非常特定的知识或任务领域进一步训练大型模型,使其成为"专业人士"或在我选择的知识领域能力更强?答案是"是的,你可以",而且,你可以用有限的GPU资源做到这一点。
大语言模型上学去!
监督微调
我们用来让大语言模型在特定知识领域接受教育的过程称为监督微调(SFT)。
LLM的监督微调包括:
- 调整现有预训练模型的权重和参数,以提高其在特定知识领域的性能
- 在特定任务或领域知识的新数据上训练模型,更新模型权重以适应新数据
除了知识领域适应,我们为什么要在模型上执行监督微调?
- 更好地与期望行为对齐,减少通用模型产生的无关或不理想结果
- 为特定业务工作流程定制结果模型
- 在有限的TPU/GPU资源环境中提高模型效率
- 避免称为"灾难性遗忘"的已知问题,帮助保留通用能力并更紧密地适应/对齐新任务
如果这一切听起来很像重新培训人类使其在特定选择的职业中更熟练,你的理解100%正确。这是AI-LLM等效的相同过程。监督微调实际上就是调整数字大脑以与期望的新职业对齐!
执行SFT时,我们需要做出选择。我们可以采取以下方法:
- 完全微调:调整模型的所有权重。这是一种全面但资源密集的方法,不适合有限的TPU/GPU环境
- 迁移学习/重新用途:取现有模型,冻结大部分但不是所有神经网络层,然后微调这些层的子集以实现期望资源。方便的是,这是一个资源密集度低得多的任务,通常可以在单GPU有限资源环境中实现
正如你可能怀疑的,已经发明了一些算法效率来帮助我们进行迁移学习。特别是,参数高效微调(PEFT)是一种仅调整模型参数的小子集而大多数预训练参数保持冻结的方法。这是一个非常重要的方法,公开发布LLMs的供应商正通过发布不同参数大小的模型来促进其模型的使用,预期将使用SFT过程。
有一个著名的Python包专注于单GPU环境的挑战,称为"Unsloth",由https://unsloth.ai发布。Unsloth在让你启动和运行SFT方面做得很好,我建议研究它。
例如,Meta的LLAMA 3.1模型以三种参数大小发布。为了SFT的目的,下面列出的不同参数大小的模型以量化形式重新发布,作为Unsloth框架工作的一部分。
80亿参数
SFT可以在具有24GB显存(VRAM)的单个消费级GPU上进行
700亿参数
SFT需要更多VRAM,通常约40GB,但仍可在单GPU上执行
4050亿参数
SFT将需要更大的多GPU架构
为了最大化效率,已经开发了一些额外技术来改善有限资源环境中的过程:
- LoRA代表低秩适应,是一种16位字长方法,旨在减少内存需求。LoRA不是调整所有模型参数,而是将可训练的低秩矩阵注入到模型的特定层中进行调整
- QLoRA是量化LoRA,通过使用4位字长进一步降低视频RAM需求,改进了LoRA方法。QLoRA代表了重新训练时间和内存资源使用之间的权衡,在单GPU环境中变得非常流行
数据准备
坦白说,当我第一次接触重新训练Meta发布的LLAMA3.1 LLM时,我对这项技术有一种崇敬之情。尽管我深知数据科学基础知识,但围绕LLMs能力的炒作周期正全面展开,我 honestly thought these things could do nearly anything.
考虑到这一点,我的第一次SFT尝试是抓取选择知识领域的大块文本数据,可以说是直接扔到墙上。有什么粘住了吗?绝对没有…事实上,我的结果是一个非常困惑的数字大脑,结巴、重复自己、收敛于单句答案,坦白说,是智力残疾。
当然,失败是一个极好的学习机会,所以我回到绘图板,了解到微调生成式LLM的最佳路径实际上是采用生产"指令模型"的目标,这需要你以"问题/答案"对格式准备训练数据。
没有仔细的数据准备就不要继续!
自然,我的下一个反射性反应是大声呻吟。我有几百兆字节的数据需要筛选并以"问题/答案"对准备?Whiskey Tango Foxtrot!
事实上,如果我们想正确做到这一点,高质量结果的要求甚至更严格。我们需要确保:
- 源数据都具有任务特定或知识领域相关性
- 数据质量高,数量也优选
- 所有HTML链接、不相关信息,甚至一些元数据都需要清理,可能纠正或删除
换句话说,欢迎来到"数据科学"的苦差事,这一点都不吸引人,也没人真正谈论。
与此同时,我参与了人工智能领域的大量阅读和研究,有一天凌晨3点左右,我有了一个顿悟,当它来临时,实际上更像是一个捂脸时刻。为什么不用另一个LLM来准备我的数据?
用另一个LLM帮助准备SFT数据?什么?
碰巧OpenAI的"chat-gpt-mini-4o"模型非常擅长处理文本数据。我需要做的就是为我将要输入OpenAI LLM的数据构建智能提示工程,以更好的形式准备我的数据。
经过几次不同尝试后,我还发现了一些外部有用资源。这部分提示工程灵感来自"LLM工程师手册"(作者:Paul Lusztin和Maxime Labonne),可以在这里找到:https://www.google.com/books/edition/LLM_Engineer_s_Handbook/jHEqEQAAQBAJ
结合这种提示工程,我写了一个Python脚本来与OpenAI的API交互以呈现数据。这样做时,我将API查询的"温度"参数设置为0.7以在响应中产生更大的创造力,并且我还请求API为每个作为查询呈现的数据项返回十六种不同的响应。
更具体地说,OpenAI API的温度参数影响从大语言模型生成输出时令牌概率的计算。温度值范围从0到2,较低值表示更大的确定性,较高值表示更多随机性。
此外,因为我是一个熟练的Python程序员,我将代码写为多线程脚本并调整它,使我刚好保持在OpenAI上令牌节流阈值以下。
一旦你的数据被适当准备,你可以选择将其上传到Hugging Face账户,如果你愿意的话。这使得与SFT Python脚本或Jupyter笔记本集成更容易。重要的是,如果你不想公开发布,不要忘记在Hugging Face上将准备好的数据设置为"私有"。
以下是一些SFT脚本的Jupyter笔记本部分截图,以便你可以看到如何使用Llama3.1和80亿参数模型执行SFT。
在这个例子中,我们使用称为"白兔"的信息安全领域知识数据集对Llama3.1模型执行SFT。我不必对白兔数据集执行任何数据准备步骤,因为那项工作已经为我完成。
这些脚本片段在Nvidia RTX4090 GPU、24GB VRAM环境中功能正常。注意这些只是一些基本截图,不是完整的笔记本,仅旨在让你了解需要什么。
加载API密钥和来自Hugging Face的Llama3.1模型
设置PFT对象
设置数据格式化函数并加载白兔数据集
设置监督微调训练器对象
执行训练
总之,上述信息涵盖了监督微调和重新训练LLM用于领域特定知识目的的过程。重新训练后,你可以选择在Hugging Face上发布新模型,当然,使用新模型进行自己的推理查询目的。
祝AI-LLM狩猎愉快!如果你想了解更多,可以参加由Joff Thyer和Derek Banks教授的Antisyphon课程"AI for Cyber Security Professionals"。如果你对AI模型的安全评估感兴趣,请通过此URL联系Black Hills信息安全联系表:https://www.blackhillsinfosec.com/contact-us/