文章目录
微调与高效微调简介
讲一些基本概念内容,和之前的猜测不太一样
微调 Fine-Tuning
一般指全参数微调,即全量微调。
高效微调 PEFT
围绕部分参数进行微调的方法,目前比较常用。不过Fine-Tuning也可以代指所有微调方法。OpenAI中的在线微调API Fine-Tuning实际上也是一种高效微调。
基于强化学习的RLHF
OpenAI团队提出,2023年开源。目前最好的实现是DeepSpeedChat库,由微软维护。
下面是一些关于PEFT和RLHF的详细介绍
一、PEFT
目前主流的很多方法,包括LoRA,Prefix Tuning,P-tuning,Prompt Tuning等都属于这类方法。这些方法都被集成到Huggingface的PEFT库中,能够更方便快速的使用。
1.LoRA
Github地址:https://github.com/microsoft/LoRA
paper地址:https://arxiv.org/abs/2106.09685
基于低阶自适应的大语言模型微调方法
可以认为是PEFT的鼻祖,LoRA希望能模拟全量微调的效果。认为大模型内在存在低秩特性,修改模型结构,通过在输入输出之间增加旁路矩阵模拟全量微调,将这个新的旁路矩阵代替原始参数矩阵,即W矩阵,进行微调。
LoRA目前还在对扩散模型微调任务中也应用很多,比如Stable Diffusion,这可能是很火的原因之一。
具体来讲,参考这篇博客,LoRA可解释为:与原始的transformer不同,LoRA架构增加了右侧的“旁支”,也就是先用一个Linear层A,将数据降维,处理后的这个r维度也就是LORA的秩,是LORA中最重要的一个超参数。一般会远远小于d,尤其是对于现在的大模型,d已经不止是768或者1024,例如LLaMA-7B,每一层transformer有32个head,这样一来d就达到了4096.
接着再用第二个Linear层B,将数据变回d 维。最后再将左右两部分的结果相加融合,就得到了输出的hidden_state。
对于左右两个部分,右侧看起来像是左侧原有矩阵W 的分解,将参数量从d ∗ d 变成了d ∗ r + d ∗ r ,在r < < d 的情况下,参数量就大大地降低了。
LORA的思想,是所有出现大矩阵的地方,理论上都可以用到这样的分解。LORA保留了原来的矩阵W,但是不让W参与训练,所以需要计算梯度的部分就只剩下旁支的A和B两个小矩阵。
2.Prefix Tuning
基于提示词前缀优化的微调方法
2021年斯坦福大学提出的方法。原理:在原始模型上增加一个可训练的Embedding层,用于给提示词增加前缀,提高模型对提示词意图的理解,训练过程中不断优化。
比如:你提问男主角何时出生?模型会选择所有与男主角出生日期相关信息放进一个提示词,放在你的提问之前作为前缀。不改变原始大模型的任何参数,只改变前面的Embedding层。
3.Prompt Tuning
谷歌提出,一种轻量级方法,相当于Prefix Tuning的简化方法。在原来的大语言模型中挑一些参数进行微调,也就是把Prefix Tuning的Embedding功能通过部分数值的参数实现。即只在输入层加入 prompt tokens。
具有优点:能显示展示提示词如何被修改的。
具体参考这篇。
实验证明了使用自动生成的soft prompt方法进行tuning的效果跟model tuning差不多,同时超过了人工设计的prompt。
4.P-Tuning v2
清华大学提出,Prefix Tuning的改进版本。不仅在输入层添加连续的Promptpts,也在预训练每一层增加连续prompts。很适合CLM类双向大模型微调。
可以参考我的上一篇博客。
二、RLHF
基于人工反馈机制的强化学习方法
OpenAI2022.04提出,2023.04左右开源。用于训练InstructGPT模型。
HuggingFace、Pytorch和微软研究院都有RLHF的实现,效果最好的是DeepSpeed库的方法。
先进行原始语言模型的微调;然后实现奖励模型微调;最后进行RLHF训练。步骤二实际上是训练了一个反馈模型,包括很多人类标准。(之前没接触过强化模型,不过感觉这个实现难度很大。)
三、LangChain介绍
什么是LangChain?
大概可以将它理解为类似机器学习中pipeline的东西。是一个开源工具库,专注于构建和研究基于语言模型的应用。它提供了一套工具和接口,用于方便地在大型语言模型,如GPT-3或其他类似模型上,构建、测试和部署基于语言的应用程序。LangChain 旨在使研究人员和开发人员能够更容易地探索和利用大型语言模型的能力,尤其是在自然语言理解和生成方面。
代表应用:AutoGPT
一经问世,爆火。
可以调用本地电脑工具处理复杂信息,可以围绕目标查资料,反馈与调整。这是一个包装在语言模型外的包装程序,首次将大语言模型接入本地工具,首次尝试串联大语言模型思维链,通过模型外的存储,“记住”人类提示和操作步骤,提升交互体验。
LangChain是一个开发工具,可以用于开发AutoGPT的AI应用。
LangChain六大模块
Models:提供许多接口,包括GPT和ChatGLM-6B,都能通过接口进行调用。
Prompts:提供Prompts模块,用于开发者灵活自定义提示模板。
Chains:认为,AI工具内部执行流程类似流水线,pipeline对应Chains。
Agents:未来AI工具与本地交互是必然结果,通过代理能够使用本地工具。
Memory:需要记忆存储模块。
Index:提供本地索引功能,方便进行本地管理。
LangChain将未来AI应用需要具备的特性抽象成这六个模块,面向开发端。