深度学习知识点
一、学习率
什么是学习率
学习率决定了在每步参数更新中,模型参数有多大程度(或多快、多大步长)的调整[^24]。
学习率太小,则收敛得慢。学习率太大,则损失会震荡甚至变大。
学习率还会跟优化过程的其他方面相互作用,这个相互作用可能是非线性的。小的batch size最好搭配小的学习率,因为batch size越小也可能有噪音,这时候就需要小心翼翼地调整参数[^18]。
不考虑性能的情况下,学习率是越小越好吗?容易陷入局部最优
如何设置和调整学习率
调整学习率的套路通常是:
- 先设置一个初始学习率。这个初始学习率应该让损失尽可能快地降低。
- 然后训练过程中按照一定的schedule降低学习率;或用算法根据实际训练情况,自适应地调整学习率。
另外,在正式开始训练之前, 还应该有一小段热身的过程。热身的原因是一开始模型参数是完全随机的,需要谨慎地更新参数,不能一上来就用初始学习率。
设置初始学习率
初始学习率的范围一般在到之间。可以根据经验或直觉,拍脑袋设定一个初始学习率。不过,还有更科学的方法来寻找初始学习率。
大致思想是,观察损失或准确率随学习率变化的曲线,然后根据一定策略选择最好的学习率作为初始学习率。[^15][^20]:
基本步骤如下:
- 以学习率为自变量,在定义域内,随着训练步数增加,学习率从小到大增加;
- 画出损失或准确率随学习率变化的曲线。
- 如果是损失变化曲线,选择损失下降最快的学习率作为初始学习率。如果是准确率变化曲线,当精确度增长开始变平或者锯齿状抖动时,就是最大的学习率。
学习率从小到大变化的例子如下:
损失随学习率变化的例子如下:
这个例子中,学习率在0.001到0.01时,损失下降最快。
准确率随学习率变化的例子如下:
这个例子中,学习率0.006时,准确率开始平稳波动,0.006就应该用作初始学习率。
训练前热身[^21]
Warmup是在ResNet论文中提到的一种学习率预热的方法,它在训练开始前先选择使用一个较小的学习率,训练了一些步,再修改为预先设置的学习率正式开始训练。
为什么使用Warmup?因为刚开始训练时,模型的权重是随机初始化的,此时若选择一个较大的学习率,可能带来模型的不稳定(振荡)。
Warmup有两种。一种是常量warmup,它的不足之处在于从一个很小的学习率一下变为比较大的学习率可能会导致训练误差突然增大。另一种是渐进warmup,即从最初的小学习率开始,每个step增大一点点,直到达到最初设置的比较大的学习率。
训练过程中调整学习率
训练过程中调整学习率的意思是,在训练过程中,根据训练的火候,适当增加或减小学习率。调整学习率的目的是尽快收敛到较优值(同时满足快和优)。一般来说,调整学习率实际上都是减少学习率,因此有的地方也叫学习率衰减(decay)或学习率退火(annealling)。调整学习率主要有两类方法:学习率schedule和自适应学习率。学习率schedule根据一定的公式调整学习率,公式中学习率是训练步数的函数;自适应学习率是算法自动根据训练中的实际情况,调整学习率。
学习率Schedule
主要有三类学习率schedule方法:time-based, step-based和exponential[^7]。
Time-based方法依赖于上一步的学习率,公式如下[^7]:
其中 是学习率,是衰减超参数,是训练步骤。
Step-based方法是每若干步减少一次学习率[^2],公式如下:
其中 是第步的学习率 , 是初始学习率, 是衰减引字, 是多少步减少一次学习率。
Exponential方法类似Step-based方法,公式如下[^7]
实践中,step-based方法更好用,因为它涉及的参数更可解释。最后,如果你能承受计算量大,慢慢地用小的学习率衰减,训练时间长点也无妨[^2]。
自适应学习率
学习率schedule的问题是也需要设置超参数。 自适应学习则没有这个问题[^7]。
模型的数据集上的表现可以被学习算法监控,然后学习算法做出相应调整,这就叫做自适应学习率[^18]。这种方法中,学习率会根据损失函数的梯度而增加或减少。如果梯度大,学习率会减少;如果梯度小,学习率会增加[^13]。
著名的Adam就是一种自适应学习率方法。其他方法还有AdaGrad和RMSProp等。Deep Learning 8.5 中有很好的讲解。
Warm Restart[^22]
跟之前两个都不同,warm restart每隔若干步就会“重启”学习率,即将学习率重新调整为初始学习率,然后再照常衰减。详细内容见原文。
下图是warm restart中学习率随训练步数变化的例子:
Cycling Learning Rate[^3]
与Warm Restart有相似之处。Cycling不需要设置初始学习率,也不需要选择衰减schedule和自适应。Cycling设置一个学习率范围,让学习率从最小增加到最大,再从最大减少到最小,循环往复。
作者认为虽然在周期内增加学习率有短期的负面影响,但长期看对总体是有益的。
二、损失函数
1.什么是损失函数
深度学习中的损失函数(Loss Function)是一个衡量预测结果与真实结果之间差异的函数 ,也称为误差函数。它通过计算模型的预测值与真实值之间的不一致程度,来评估模型的性能。
损失函数通过计算一个数值,来表示模型预测的准确性或误差大小。
损失函数按任务类型分为回归损失和分类损失99,回归损失主要处理连续型变量,常用MSE、MAE等,对异常值敏感度不同;分类损失主要处理离散型变量,常用Cross Entropy Loss、Dice Loss等,适用于不同分类任务需求。
为什么需要损失函数?
在训练过程中,模型的目标是通过调整其参数来最小化损失函数的值,从而提高预测的准确性。
损失函数能量化模型预测与真实结果之间的差异。
2.回归损失
回归损失(Regression Loss)是什么?回归损失是损失函数在回归问题中的具体应用。回归问题是指预测一个或多个连续值的问题,与分类问题(预测离散值)相对。
回归损失函数有哪些?回归损失函数包括均方误差(MSE)和绝对误差(MAE),MSE对异常值敏感,适用于精确预测场景;MAE对异常值鲁棒,适用于异常值可能重要的场景。
均方误差(Mean Squared Error, MSE)是什么?均方误差(MSE)计算的是预测值与真实值之间差的平方的平均值。
MSE对异常值非常敏感,因为较大的误差会受到更大的惩罚(误差的平方会放大差异)。它通常用于需要精确预测的场景,但可能不适用于异常值较多的数据集。
绝对误差(Mean Absolute Error, MAE)是什么?绝对误差(MAE)计算的是预测值与真实值之间差的绝对值的平均值。
MAE对异常值的鲁棒性较好,因为无论误差大小,都以相同的权重进行计算(绝对误差不会放大差异)。它通常用于异常值可能代表重要信息或损坏数据的场景。
3.分类损失
分类损失(Classification Loss)是什么?分类损失是在训练分类模型时,用于衡量模型预测结果与真实标签之间差异的一种度量。它是一个非负值,反映了模型预测结果的准确性。分类损失越小,意味着模型的预测结果与真实标签越接近,模型的性能也就越好。
分类损失函数有哪些?分类损失函数包括交叉熵损失(Cross Entropy Loss)和骰子损失(Dice Loss)。
Cross Entropy Loss是基于信息论中交叉熵概念的分类损失函数,用于衡量预测概率分布与真实标签概率分布之间的差异,值越小表示模型性能越好;而Dice Loss则是基于Dice系数的损失函数,用于评估图像分割任务中预测结果与真实标签的相似度,值越小表示分割精度越高。
交叉熵损失(Cross Entropy Loss)是什么?在分类问题中,一个分布是模型的预测概率分布,而另一个分布是真实标签的概率分布(通常以one-hot编码表示)。交叉熵损失通过计算这两个分布之间的差异来评估模型的性能。
骰子损失(Dice Loss)是什么?骰子损失基于Dice系数,后者用于评估两个二值图像或二值掩码的重叠情况。Dice系数的值在0到1之间,值越大表示两个集合越相似。
在图像分割任务中,Dice Loss常用于评估模型对目标区域的分割精度,特别是在医学图像分割等需要高精度的小目标区域分割的场景中。
三、迁移学习
1.什么是迁移学习
在某些机器学习场景中,由于直接对目标域从头开始学习成本太高,因此我们期望运用已有的相关知识来辅助尽快地学习新知识。比如,已经会下中国象棋,就可以类比着来学习国际象棋
迁移学习(Transfer Learning)通俗来讲就是学会举一反三的能力,通过运用已有的知识来学习新的知识,其核心是找到已有知识和新知识之间的相似性,通过这种相似性的迁移达到迁移学习的目的。
图2 迁移学习过程示意图
2:迁移学习三个基本问题
(1)何时迁移 何时迁移对应于迁移学习的可能性和使用迁移学习的原因. 值得注意的是, 此步骤应该发生在迁移学习的第一步. 给定待学习的目标,我们首先要做的便是判断当时的任务是否适合进行迁移学习
(2)何处迁移 判断当时的任务适合迁移学习之后, 第二步要解决的是从何处进行迁移. 这里何处我们可以使用what和where来表达便于理解. what, 指的是要迁移什么知识,这些知识可以是神经网络权值, 特征变化矩阵某些参数等; 而where指的是要从那个地方进行迁移, 这些地方可以是某个源域, 某个神经元, 某个随机森林的树等.
(3)如何迁移 这一步是绝大多数迁移学习方法的着力点. 给定待学习的源域和目标域, 这一步则是要学习最优的迁移学习方法以达到最好的性能.
迁移学习根据学习方法可以分为:基于实例的迁移学习、基于特征的迁移学习方法、基于模型的迁移学习方法以及基于关系的迁移学习方法。
3:迁移学习的研究与应用领域
迁移学习通常适用于下面的一些场景:
(1)虽然有大量的数据样本,但是大部分数据样本是无标注的,而且想要继续增加更多的数据标注,需要付出巨大的成本。在这种场景下,利用迁移学习思想,可以寻找一些和目标数据相似而且已经有标注的数据,利用数据之间的相似性对知识进行迁移,提高对目标数据的预测效果或者标注精度。(2)可以帮助解决算法的冷启动问题。在跨域推荐系统将用户偏好模型从现有域(如图书推荐领域)迁移到一个新域(如电影推荐领域)中。
(3)想要获取具有更强泛化能力,但是数据样本较少. 许多应用场景数据量小。当前机器学习的成功应用依赖于大量有标签数据的可用性。然而,高质量有标签数据总是供不应求。传统的机器学习算法常常因为数据量小而产生过拟合问题,因而无法很好地泛化到新的场景中。
(4) 数据来自不同的分布时。传统的机器学习算法假设训练和测试数据来自相同的数据分布。然而,这种假设对于许多实际应用场景来说太强。在许多情况下,数据分布不仅会随着时间和空间而变化,也会随着不同的情况而变化,因此我们可能无法使用相同的数据分布来对待新的训练数据。在不同于训练数据的新场景下,已经训练完成的模型需要在使用前进行调整。图3展示了常用的迁移学习场景:
图3 迁移学习应用领域概览(参考自书籍: 迁移学习导论)
四、微调
微调 Fine-Tuning包括:
SFT 监督微调(Supervised Fine-Tuning)
概念:监督学习,无监督学习,自监督学习,半监督学习,强化学习的区别
概念:下游任务
概念:再利用(Repurposing),全参微调(Full Fine-Tuning)和部分参数微调(Partial Fine-tuning)
线性探测(Linear Probing)微调策略
其他一些简单的微调策略
概念:提示(Prompt)和指令(Instruction)
提示微调(Prompt Tuning)微调技术
如何构建好的 prompt 或 instruct
指令微调(Instruction Tuning)微调技术
LoRA 低秩自适应(Low-Rank Adaptation)训练技术
适配器学习(Adapter Learning)微调技术
前缀微调(Prefix-Tuning)微调技术
P微调(P-Tuning)微调技术
PEFT 参数高效微调(Parameter-Efficient Fine-Tuning)开源参数高效微调库
RL 强化学习(Reinforcement Learning)
RLHF 基于人类反馈的强化学习(Reinforcement Learning from Human Feedback)
前言请看此
(1)一些概念源自LLM(Chatgpt)和网络(百度/知乎等),笔者进行了初步检查。
(2)由于其中的各种知识比较琐碎,为了形成较为结构化的知识体系,且使用最简单的、几乎无公式的介绍,故作此博客。
(3)着重为自然语言处理领域NLP的,CV领域的不是很详细讲述了
上一篇博客:【机器学习与自然语言处理】预训练 Pre-Training 各种经典方法的概念汇总
(4)比较简单或者过于的概念就不介绍了,默认大家都学会了。不然要写的太多了。
比如损失,损失函数,神经网络几个概念,不认识的话单独先去学一下。
微调 Fine-Tuning
微调 是指在已经经过预训练的模型基础上,通过使用任务特定的数据集进行额外的训练,以使模型适应特定的任务或领域。通常情况下,微调是在一个相对较小的数据集上进行的,该数据集与模型最初预训练的数据集可能有所不同。
迁移学习 是一种机器学习范畴,旨在将从一个任务(源任务)中学到的知识应用到另一个任务(目标任务)上。
我们发现,微调的概念和机器学习中的迁移学习概念比较类似,分析一下我们为什么要微调,或者迁移学习。
即【微调的优势】
(1)站在巨人的肩膀上:前人花很大精力训练出来的模型在大概率上会比你自己从零开始搭的模型要强悍,没有必要重复造轮子。
(2)训练成本可以很低,任务特定的数据集可以几千或者几万条,这远远低于预训练的数据集大小。
(3)适用于小数据集:对于数据集本身很小的情况,从头开始训练具有几千万参数的大型神经网络是不现实的,因为越大的模型对数据量的要求越大,过拟合无法避免。这时候如果还想用上大型神经网络的超强特征提取能力,只能靠迁移学习。(减少过拟合现象)
SFT 监督微调(Supervised Fine-Tuning)
监督微调 是一种利用带有标签的数据对预训练模型进行进一步训练的方法。
其实就是监督学习在微调阶段的应用
概念:监督学习,无监督学习,自监督学习,半监督学习,强化学习的区别
强化学习涉及一个智能体(agent)与环境的交互。智能体通过在环境中采取动作来达到某个目标,通过环境的反馈(奖励或惩罚)来调整其行为。
区分其他几个学习方式,可以按照训练阶段 和 标签进行区分分类:
无监督学习:预训练阶段,大规模无标签语料
监督学习:微调阶段,小规模有标签语料
自监督学习:预训练或微调阶段都可,语料本身没有标签,但可以通过算法/神经网络/模型等,去计算出标签
半监督学习:在预训练阶段使用大规模无标签语料,在微调阶段使用小规模有标签语料。是横跨两个阶段的
概念:下游任务
下游任务是指在迁移学习或微调中,模型在预训练之后,通过额外的训练适应于特定任务或领域的任务。下游任务的选择取决于应用的需求和目标。
我们微调肯定是首先得确定下游任务,然后按照具体的任务,使用某些模型、算法与数据集进行微调模型。
下面列了一些比较常见的下游任务。
可以看到,基本上分为判别式任务和生成式任务。
(1)文本分类:
对文本进行分类,如情感分析、主题分类、垃圾邮件过滤等。
(2)命名实体识别 (NER):
从文本中标注和提取特定实体的信息,如人名、地名、组织名等。
(3)文本生成:
生成自然语言文本,包括文章摘要、对话生成、文章创作等。
(4)目标检测:
在图像中检测和标注出现的对象,并用边界框表示。
(5)语义分割:
将图像中的每个像素分配给特定的语义类别,以实现像素级的语义分割。
(6)图像分类:
将图像分为不同的类别,通常通过预测图像中出现的主要对象或场景。
(7)机器翻译:
将源语言的文本翻译成目标语言的文本。
(8)问答系统:
回答用户提出的自然语言问题,通常在给定的上下文中查找答案。
(9)语音识别:
将音频信号转换为文本,通常用于语音助手和语音命令的应用。
(10)图像生成:
生成新的图像,如图像合成、风格迁移等。
(11)推荐系统
为用户推荐特定的商品、内容或服务,基于用户行为和兴趣。
概念:再利用(Repurposing),全参微调(Full Fine-Tuning)和部分参数微调(Partial Fine-tuning)
在迁移学习中,按照微调模型的全部参数,还是部分参数,我们分为如下两类。
全参微调(Full Fine-Tuning)
指在预训练模型的基础上,对整个模型的所有参数进行微调。在这个过程中,模型权重会根据目标任务的数据进行全面调整,而不仅仅是最后几层或最后一层的权重。
这意味着预训练模型的所有层都能够适应新任务,但可能需要较大的目标任务数据集来防止过拟合
部分参数微调(Partial Fine-tuning)
只对模型的部分参数进行微调,通常是最后几层或最后一层的参数。这种方式在目标任务数据较少的情况下更常见,以防止过拟合并提高模型的泛化能力。
重新利用(Repurposing)或者叫再利用
指的是将预训练模型应用于一个新的任务,而这个过程可能包括对模型的一部分参数进行微调。
再利用可以分为全参微调和部分参数微调。
线性探测(Linear Probing)微调策略
在自然语言处理(NLP)领域中,“linear probing” 是一种用于微调预训练模型的方法。该方法的目标是通过 添加一个简单的线性层(线性分类器) 来微调模型,以适应特定的任务。这个线性层是一个全连接层,它的输出维度等于目标任务的类别数(对于分类任务)或任务特定的输出维度。
**它冻结之前的所有参数,只训练该线性分类器层的参数。**所以是部分参数微调。
注:区别与hash碰撞检测的线性探测法。
其他一些简单的微调策略
Prompt Tuning
Partial-k
只微调模型的最后k层,冻结其他层
MLP-k
增加一个k层的MLP(多层感知机)作为分类器
Side-Tuning
训练一个 side 网络,添加和调整辅助任务(side tasks)来提高模型性能。
Bias
只微调网络的 bias 参数
概念:提示(Prompt)和指令(Instruction)
ChatGPT/InstructGPT详解
实话实说,这是两个非常令人搞混的概念,弄清他们,有助于弄明白后面的提示微调和指令微调技术。
提示(Prompt)和指令(Instruction)都是用户对LLM的输入的详细上下文的描述。
区别在于
提示:类似于MLM技术,构造好提示后,把用户希望获得的内容变成MLM中[MASK]的token或留白,让模型去回答补全。类似于完型填空。
例子:给女朋友买了这个项链,她很喜欢,这个项链太____了。
指令:即通过指令或命令, 告诉模型需要做什么,我需要得到什么。
例子:请告诉我一个英语双关冷笑话。
注意:有时候人们提到的 prompt 的概念包含了 instruction 的概念
但最好还是分清这两个概念,毕竟不大一样。
提示微调(Prompt Tuning)微调技术
实际案例说明AI时代大语言模型三种训练技术及其区别——Prompt-Tuning、Instruction-Tuning和Chain-of-Thought
由于BERT的预训练使用了MLM,所以这类模型对于提示微调训练来说比较合适
我们发现,比如BERT它本来就是做完形填空比较合适的,预训练中也没有做比如情感分析之类的任务。
但是当我们构建出 今天天气真好。这句句子的情感是 __ 的。 的 prompt 之后,BERT 根据完形填空的方法,自然倾向于填入 积极的/正面的,就可以迁移到情感分析的下游任务去了!
比较重要的是如何构建 prompt,以及如何构建好的prompt
但我们发现跟如何构建好的instruction方法是类似的,所以统一写在这里了。
如何构建好的 prompt 或 instruct
(1)清晰和简洁
Prompt 应该明确和简洁,避免模糊或复杂的语言。清晰的 prompt 有助于模型正确理解任务。
糟糕的 prompt:请解释一下这个问题的背景和相关内容,以及它的历史。
好的 prompt:简要解释这个问题的背景和历史。
(2)任务导向
prompt 应该明确指导模型执行特定的任务,避免过于开放式的描述。任务导向的 prompt 有助于模型集中精力解决特定问题。
糟糕的 prompt:谈谈你对这个主题的看法。
好的 prompt:根据给定的数据,预测下个月的销售额。
(3)关键词和实体
使用关键词和实体有助于引导模型关注任务的核心内容。这可以通过在 prompt 中强调关键词或提到实体来实现。
糟糕的 prompt:介绍一下这个产品。
好的 prompt:描述这个产品的特性和优势,特别关注 [产品名称] 的创新点。
(4)多样性和变化性
为了提高模型的鲁棒性,可以设计多样性的 prompt,涵盖任务的不同方面,以及各种可能的输入方式。
不同形式的好 prompts:
给定一段文本,总结其中的关键观点。
在给定的图像上标记出所有出现的物体。
用简短的话语回答:[问题]。
(5)验证和调整
在应用 prompt 前,可以通过试验和验证来不断调整。观察模型对不同 prompt 的表现,以确保 prompt 对任务的影响是积极的。
尝试不同的 prompt 表达方式,比如在问句中加入否定词、使用不同的关键词等,观察模型的响应。
指令微调(Instruction Tuning)微调技术
对于指令微调,就感觉是提示微调的一个进一步的版本。
从简单的完形填空上升到了基于单个或多个指令,让模型进行复杂操作。
即,指令微调可以应对多个下游任务,而不是单单的一个简单任务。
对于训练集,我们可以这样构建:
准备一组指令集,比如 “该文本的情感是正面的还是负面的?”
准备带标签数据集,比如 情感分类任务的标签可以是“正面”或“负面”
把指令集和数据集的提问进行拼合,比如 “该文本的情感是正面的还是负面的?这家餐厅的食物很好吃。”
若回答效果比较差,则对指令进行微调。之后进行模型训练即可。
LoRA 低秩自适应(Low-Rank Adaptation)训练技术
大模型微调(finetune)方法总结-LoRA,Adapter,Prefix-tuning,P-tuning,Prompt-tuning
LoRA认为,随着LLM参数不断增多,全参微调的消耗时间和资源较多,而其他一些微调效果不佳
LoRA还认为,LLM过度参数化了,可以通过其内在的低纬度参数进行任务适配
LoRA允许我们通过优化适应过程中密集层变化的秩分解矩阵来间接训练神经网络中的一些密集层,同时保持预先训练的权重不变。
在原始预训练语言模型PLM(Pertrained Language Model)旁边增加一个旁路,做一个降维再升维的操作,来模拟所谓的内在秩。
训练的时候固定PLM的参数,只训练降维矩阵A与升维矩阵B。
模型的输入输出维度不变,输出时将BA与PLM的参数叠加。
用随机高斯分布初始化A,用0矩阵初始化B,保证训练的开始此旁路矩阵依然是0矩阵
因此,LoRA 的训练成本很低,且比较通用,也有一定的效果(但是想要很好的效果还得全参微调或者其他方法)
适配器学习(Adapter Learning)微调技术
Parameter-efficient transfer learning系列之Adapter
更详细介绍了 adapter 与 adapter fusion。
Adapter引入NLP领域,作为全模型微调的一种替代方案。
在预训练模型每一层(或某些层)中添加Adapter模块,微调时冻结预训练模型主体,由Adapter模块学习特定下游任务的知识。
每个Adapter模块由两个前馈子层组成,第一个前馈子层将Transformer块的输出作为输入,将原始输入维度d投影到m,通过控制m的大小来限制Adapter模块的参数量,通常情况下m<<d。在输出阶段,通过第二个前馈子层还原输入维度,将m重新投影到d,作为Adapter模块的输出。通过添加Adapter模块来产生一个易于扩展的下游模型,每当出现新的下游任务,通过添加Adapter模块来避免全模型微调与灾难性遗忘的问题。Adapter方法不需要微调预训练模型的全部参数,通过引入少量针对特定任务的参数,来存储有关该任务的知识,降低对模型微调的算力要求。
前缀微调(Prefix-Tuning)微调技术
深入理解Prefix Tuning
LLM微调方法:Prompt Tuning And Prefix Tuning
相比与离散的 prompt,需要人工寻找比较合适的提示
为何不提出连续的 prompt?
前缀微调在输入token之前构造一段任务相关的virtual tokens作为Prefix
然后,在训练的时候只更新Prefix部分的参数,而 PLM 中的其他部分参数固定。
不同任务就对应不同的 Prefix
这样的话,需要在 transformer 中的每层稍作修改,不同任务就可以获得不同的 Prefix 头了。
P微调(P-Tuning)微调技术
大模型参数高效微调技术实战(三)-P-Tuning
该方法将 Prompt 转换为可以学习的 Embedding 层,并用MLP+LSTM的方式来对Prompt Embedding进行一层处理。
相比Prefix Tuning,P-Tuning加入的可微的virtual token,但仅限于输入层,没有在每一层都加;另外,virtual token的位置也不一定是前缀,插入的位置是可选的。这里的出发点实际是把传统人工设计模版中的真实token替换成可微的virtual token。
PEFT 参数高效微调(Parameter-Efficient Fine-Tuning)开源参数高效微调库
HF-PEFT
详细操作看HF社区吧。
PEFT 是 Huggingface 开源的一个参数高效微调库,它提供了最新的参数高效微调技术,并且可以与 Transformers 和 Accelerate 进行无缝集成。
PEFT 目前支持
LoRA
Prefix Tuning & P-Tuning v2
P-Tuning
Prompt Tuning
AdaLoRA
IA3
RL 强化学习(Reinforcement Learning)
一般强化学习在博弈、游戏、棋类中,比较常见
但是在自然语言处理领域用到语言模型微调中, 使用则不大相同了。
在模型微调阶段,一般使用SFT监督微调
但现在有一些人提出了基于强化学习的一些微调方式,且有一些浪潮迹象。
目前最火的就是RLHF
RLHF 基于人类反馈的强化学习(Reinforcement Learning from Human Feedback)
一文读懂ChatGPT中的强化学习
图解大模型RLHF系列之:人人都能看懂的PPO原理与源码解读
这一篇比较推荐阅读。
RLHF是为了引入人类反馈,使用人类偏好数据进行训练,让模型产生符合人类喜好的回答。
经典RLHF一般就如下图所示三个阶段
第一步,收集带标签数据,训练一个SFT模型,这里也被叫做策略(Policy)
第二步,收集偏好数据,训练一个RM奖励模型(Reward Model)
第三步,用一个强化学习的算法来微调该SFT模型,比如经典的PPO算法。
RL中,有经典概念 智能体、环境、状态、动作
在NLP语境下,如何对应呢
智能体:指语言模型
环境:指上下文
状态:指语言模型已经输出的前文
动作:指接下来选择输出的内容
总收益:语言模型输出完后,人们对该文本的偏好程度
即时收益:语言模型输出下一个token的暂时收益。
在RLHF-PPO中,一共有四个主要模型
Actor Model:演员模型,这就是我们想要训练的目标语言模型
Critic Model:评论家模型,它的作用是预估总收益
Reward Model:奖励模型,它的作用是计算即时收益
Reference Model:参考模型,它的作用是在RLHF阶段给语言模型增加一些“约束”,防止语言模型训歪(朝不受控制的方向更新,效果可能越来越差)
其中,Actor/Critic Model(在RLHF阶段是需要训练的)
在RLHF中,我们不仅要训练模型生成符合人类喜好的内容的能力(Actor),也要提升模型对人类喜好量化判断的能力(Critic)
而 Reward/Reference Model 是参数冻结的。
再次说明下,其中的各种复杂的损失函数可以在上述提到的博文中阅读。
现在PPO已经出了很多新的替代方案了(由于RLHF-PPO运用起来比较复杂),比如DPO等。更新的内容需要阅读相关论文。