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认为这些东西几乎可以做任何事情。
考虑到这一点,我首次尝试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查询的"temperature"参数设置为0.7以在响应中产生更大的创造力,并且我还请求API为每个作为查询呈现的数据项返回十六个不同的响应。
更具体地说,OpenAI API的temperature参数影响从大语言模型生成输出时令牌概率的计算。temperature值范围从0到2,较低的值表示更大的确定性,较高的值表示更多的随机性。
此外,因为我是一个熟练的Python程序员,我将代码编写为多线程脚本并调整它,使我刚好保持在OpenAI上限令牌限制阈值以下。
一旦您的数据被正确准备,您可以选择将其上传到Hugging Face帐户,如果您愿意的话。这使得与SFT Python脚本或Jupyter笔记本集成更容易。重要的是,如果您不想公开发布,请不要忘记在Hugging Face上将您准备的数据设置为"私有"。
以下是一些SFT脚本的Jupyter笔记本部分的屏幕截图,以便您可以看到如何使用Llama3.1和80亿参数模型执行SFT。
在这个例子中,我们使用名为"White Rabbit"的信息安全领域知识数据集对Llama3.1模型执行SFT。我不必对White Rabbit数据集执行任何数据准备步骤,因为那项工作已经为我完成了。
这些脚本片段在Nvidia RTX4090 GPU、24GB VRAM环境中功能正常。请注意,这些只是一些基本屏幕截图,不是完整的笔记本,仅旨在让您了解需要什么。
- 从Hugging Face加载API密钥和Llama3.1模型
- 设置PFT对象
- 设置数据格式化功能并加载White Rabbit数据集
- 设置监督微调训练器对象
- 执行训练
总之,上述信息涵盖了监督微调和重新训练LLM用于特定领域知识目的的过程。重新训练后,您可以选择在Hugging Face上发布新模型,当然,也可以使用新模型进行自己的推理查询目的。
祝AI-LLM狩猎愉快!如果您想了解更多,可以参加由Joff Thyer和Derek Banks教授的Antisyphon课程"AI for Cyber Security Professionals"。如果您对AI模型的安全评估感兴趣,请通过此URL联系Black Hills Information Security联系表:https://www.blackhillsinfosec.com/contact-us/