1. 大模型
训练流程
1.1. 预训练
无监督学习,学习先验的背景知识
大模型的输出总的概率与原数据比较,不需要
$$
L(u) =\sum_{i}{\log(p(u_i| u_0,…, u_{i-1})|\theta)}
$$
数据获取
- 网页爬取,数据没有处理
- 重复
- 拼写错误
数据清洗
转换文本格式
去重
- URL爬取的网站去重
- 文档的相似度
- 对文档分组30M, 超过6次重复, 删除其余5行
- 启发式过滤,使用token级的KL散度去重
数据打包
1.
2. 一行一行的训练,而不是一句一句的训练观测模型,使用测试集对中间模型测试
数据比例,代码模型中平衡代码补全(中间填充)与代码编写(从前向后编写)的任务,两种数据集都需要
1.1.1. 继续预训练
当前的base model 对于专业领域的效果很差,继续与训练补全知识。
加入新的数据,调整学习率
- warmup 的步数不会影响最终的结果
- 学习率较大,下游任务更好
- 对原有模型继续warmup,效果更差
使用梯形的学习率,保存拐点位置的学习率,继续预训练时候,使用拐点数据预训练,保持较高的搜索速度,拟合新增的数据集
1.1.2. scaling up
扩大模型的参数和容量
1.1.3. 尺度定律
模型的损失是可预测的,与模型的算力,大小,数据集有较大的关系
- 模型的参数
- 数据的大小
- 算力
模型与参数、大小、算力由直接的关系,不需要训练,就能知道最终的训练结果
1.1.3.1. 尺度定律
模型与参数、大小、算力由直接的关系,与模型形状弱依赖
- 某个网络的占比
- 隐层数量的占比
- 每个head的大小
的影响很小,不需要对此调参
其他变量充足的时候,我们就知道模型最后的效果
过拟合的普遍性,一味增加其中一项,模型效果就会进入衰退阶段
同等算力下,调整模型大小和数据集的大小
模型在训练集与测试集上表现高度相关
训练数据有显示,仍然可以重复使用数据进行训练得到可预测的“尺度定律”
其他模型(包括transform)都具有尺度定律
1.1.3.2. 利用尺度定律
固定模型的大小,更改预训练的数据量
规定算力大小,训练不同大小的模型,(训练到模型收敛较难,可以得到算力的大小)
1.1.4. 涌现
大模型在训练数量的规模时,准确率会发生突变
1.2. 后训练
对齐人类的要求,回答问题有用、无害
1.2.1. 指令微调
上下文学习
- 用户给出例子,模型不更新参数直接学习
使用例子训练,模型直接输出
预训练-微调
- 在目标任务上进行微调
给出命令前缀,然后训练
指令微调
- 在非目标任务上进行泛化,在任务上泛化很好
指令-回答, 对回答的预测计算损失函数
1.2.2. 数据合成
- 人工构建任务例子
- 使用强模型根据种子任务生成指令
- 将生成的指令再给另一个强模型,获得指令的回答,得到<指令,回答> 对
1.2.3. test scaling
模型输出多个结果,打分选择结果
过程奖励模型>结果奖励模型
选择框架
1.2.4. 微调方法
1.2.4.1. lora
增加低秩矩阵
1.2.4.2. 前缀调整
训练的模型权重不再调整,k,v前分别添加可训练的连续前缀向量
冻结原权重,增加可训练模块
1.2.4.3. 提示调整
训练文本前增加提示命令
1.2.4.4. adapter
在前馈神经网络前增加低秩矩阵
1.2.4.5. LoRAMoE
微调插入专家模型中的LoRA适配器
1.3. 强化学习
最大化智能体获得的期望累计奖励
1.3.1. PPO函数
策略: 大模型生成句子的过程$\pi$
轨迹: 一系列的动作,大模型生成句子时候,的状态与动作
$$
\tau = s_1, a_1, ..s_n, a_n
$$
奖励:$R(\tau)$,一整条轨迹的奖励
基于策略的强化学习的目标:找到一种策略,是在这个策略的轨迹上的奖励分数最大
$$
\begin{align}
\underset{\pi_\theta}{argmax} j({\pi_\theta}) &= \underset{\pi_\theta}{argmax}E_{\tau~\pi}|R(\tau)|\
& = \sum_\tau R(\tau)P(\tau|\pi_\theta)
\end{align}
$$
LOSS函数的梯度:
$$
\begin{align*}
\nabla J(\pi_\theta) &= \sum_\tau R(\tau) \nabla P(\tau|\pi_\theta) \
&= \sum_\tau R(\tau) P(\tau|\pi_\theta) \frac{\nabla P(\tau|\pi_\theta)}{P(\tau|\pi_\theta)} \
&= \sum_\tau R(\tau) P(\tau|\pi_\theta) \nabla \log(P(\tau|\pi_\theta)) \
&= \mathbb{E}{\tau \sim \pi_\theta} [R(\tau) \nabla \log(P(\tau|\pi_\theta))]
\end{align*}
$$
路径的概率,从$s_0$递推,推到T-1,计算出T的概率
$$
P(\tau|\pi_\theta) = \rho_0(s_0) \prod{t=0}^{T-1} P(s_{t+1}|s_t, a_t)\pi_\theta(a_t|s_t)
$$
$$
\nabla \log\left(P(\tau|\pi_\theta)\right) = \nabla \left[ \log \rho_0(s_0) + \sum_{t=0}^{T-1} \log P(s_{t+1}|s_t, a_t) + \sum_{t=0}^{T-1} \log \pi_\theta(a_t|s_t) \right]
$$
前两项和策略模型的参数 $\theta$ 无关,可舍去。于是
$$
\nabla \log\left(P(\tau|\pi_\theta)\right) = \sum_{t=0}^{T-1} \nabla \log \pi_\theta(a_t|s_t)
$$
带入Loss的梯度中,使用每时刻的奖励函数代替总路径$R(\tau)$
$$
\nabla J(\pi_\theta) = \mathbb{E}{\tau \sim \pi_\theta}\left[ \sum{t=0}^{T-1} \Psi_t \nabla \log \pi_\theta(a_t|s_t) \right]
$$
$\psi_t$的组成形式
- $\sum_{t=0}^\infty r_t$ 轨迹的累积奖励
- $\sum_{t’=t}^\infty \gamma^{t’-t} r_{t’}$ 轨迹的折扣奖励
- $\sum_{t’=t}^\infty \gamma^{t’-t} r_{t’} - b(s_t)$ 引入基线
- $Q^\pi(s_t, a_t)$ 动作价值函数
- $A^\pi(s_t, a_t)$ 优势函数
- $r_t + V^\pi(s_{t+1}) - V^\pi(s_t)$ 时序差分残差
累计折扣奖励
$$
G_t = r_t + \gamma r_{t+1} + \gamma^2 r_{t+2} + \dots + \gamma^{T-t-1} r_{T-1} = r_t + \gamma G_{t+1}
$$
动作价值函数:在策略π 下,从状态 s_t 开始并执行动作 a_t 后,未来所有折扣奖励的期望。
$$
\begin{align}
Q_\pi(s_t, a_t) &= \mathbb{E}\pi[G_t | s_t, a_t] \
&= \mathbb{E}\pi\left[\sum{t=0}^{T-t} \gamma^{t’} r{t’} | s_t, a_t\right] \
&= \mathbb{E}\pi[r_t | s_t, a_t] + \mathbb{E}\pi[\gamma V_\pi(S{t+1}) | s_t, a_t] \
&= \sum{s_{t+1} \in \mathcal{S}} P(s_{t+1}|s_t, a_t)R(s_t, a_t, s_{t+1}) + \gamma \sum_{s_{t+1} \in \mathcal{S}} P(s_{t+1}|s_t, a_t)V_\pi(s_{t+1}) \
& 贝尔曼期望方程,将 G_t 拆分为当前奖励和未来价值\
&= \mathbb{E}{s{t+1} \sim P(\cdot|s_t, a_t)}[r + \gamma V_\pi(s_{t+1})]
\end{align}
$$
优势函数:在策略 ππ 下,在状态 s_t 执行动作 a_t 相对于在该状态下平均(期望)价值的“优势”或“额外价值”。
$$
\begin{align}
A_\pi(s_t, a_t) &= Q_\pi(s_t, a_t) - V_\pi(s_t) \
&= \mathbb{E}{s{t+1} \sim P(\cdot|s_t, a_t)}[r_t + \gamma V_\pi(s_{t+1})] - \mathbb{E}{s{t+1} \sim P(\cdot|s_t, a_t)}[V_\pi(s_t)] \
&= \mathbb{E}{s{t+1} \sim P(\cdot|s_t, a_t)}[r_t + \gamma V_\pi(s_{t+1}) - V_\pi(s_t)] \
&= \mathbb{E}{s{t+1} \sim P(\cdot|s_t, a_t)}[\text{TD_error}]
\end{align}
$$
1.3.2. 价值损失
这里提到的“价值训练过程”通常指的是在强化学习中,价值函数(Value Function)的估计和更新过程。这通常通过训练一个神经网络(价值网络/Critic网络)来预测状态的价值 V(s)V(s) 或状态-动作对的价值 Q(s,a)Q(s,a)。最常见的训练方法是使用均方误差(Mean Squared Error, MSE)损失
价值函数 Vϕ*(*st*) 的目标是准确估计未来累积折扣奖励。因此,训练它的方法就是让它的预测值 V**ϕ(s**t) 尽可能接近“真实”的累积折扣奖励 R_t。
价值损失采用的是MSE损失,最小化如下目标函数:
$$ \mathcal{L}{\text{critic}}(\phi) = \mathbb{E}{t}\left[\left(V_\phi(s_t) - R_t\right)^2\right] $$
其中$V_\phi(s_t)$为价值模型预测出来的回报,$R_t$为实际得到的回报。
$R_t$ 是理论标签值,需要计算出来
如果使用时序差分目标,则
$$ R_t = r_t + \gamma V_\phi(s_{t+1}) $$
如果使用GAE目标,则 $$ R_t = \hat{A}^{\text{GAE}}_t + V’_\phi(s_t) $$
1.3.3. RLHF
1.3.3.1. 构建奖励模型
收集偏好数据,对模型回答的多个数据,评估排序,不是打分
损失函数,max(做好回答- 最差回答)
只获取最后一个token的评估
使用KL散度,避免与模型的差距较大
使用PPO函数,计算历史和未来的奖励
1.3.3.2. 总体流程
RLHF实开源链接:
https://github.com/huggingface/trl
https://github.com/OpenRLHF/OpenRLHF
https://github.com/hiyouga/LLaMA-Factory
https://github.com/WangRongsheng/awesome-LLM-resourses
1.3.4. RLAIF
模型选择结果,替换人类标记,同时需要使用双重判断
- D-RLAIF,模型直接打分,不再训练
- 常规RLAIF,先训练奖励模型
1.3.5. DPO算法(direct perference option)
由偏好学习的数据,直接用于模型的训练
目标:
损失函数:
1.3.6. SPLN(self play)
1.3.6.1. main play
区分某个回答是人类的回答
1.3.6.2. opponent play
不需要区分人类回答和LLM回答
得到优化目标
最大化生成与真实标注的信息与自己生成信息的差距
1.3.7. self-rewarding
模型给自己提供奖励,在优化回复的功能是,优化模型指令遵循与打分的能力
- 初始模型,具有基础能力
- 种子数据集,少量数据集,
- 指令微调,只有回答
- 评估微调,回答排序
模型使用种子数据集,生成新的prompt,模型自己打分,取最高分与最低分,加入数据集,用于DPO训练。
不断迭代
1.4. 微调
增加参数微调
- 软提示微调: 在embeding之前怎么增加soft prompt,训练优化增加的soft prompt ,模型的参数固定
- 且不同的任务可以使用不同的soft prompt
- 适配器微调: 在模型前后增加一个层
- 软提示微调: 在embeding之前怎么增加soft prompt,训练优化增加的soft prompt ,模型的参数固定
选择性微调
- 学习优化哪些参数,优化任务结果,使用正则化,惩罚修改较多的参数
- 指定修改部分参数
- 学习优化哪些参数,优化任务结果,使用正则化,惩罚修改较多的参数
重参数微调,调整子空间参数
Low-Rank Adaption(LoRA),优化两个低秩矩阵,与原矩阵组合
学习模型的缩放因子
1.5. 知识蒸馏
教师模型将知识提取出来,学生模型学习其中内容
1.5.1. 基于特征的知识
1.5.1.1. 多个教师教学
1.5.2. 基于关系的知识
1.6. 模型剪枝
删除权重小于一定阈值的连接或神经元节点,获得更加稀疏的矩阵
1.6.1. 结构化剪枝
参数从起点到重点,图中有相连,则保留
2. 简短
2.1. 预训练
2.1.1. 词表化
2.1.1.1. BBPE(byte-level BPE)
单词量过大时,每一个单词一个token使用,词表空间较大
单词使用字节标识,采用unicode 编码作为最小颗粒度,将单词切割为字节token
例如,对于不存在的字节“待”,使用3个字节标识(中文在unicode编码中使用三个字节表示)
2.1.2. 模型预训练
采用无监督学习,学习输入文本的特征,学习语言语法
输入一堆文本,让模型做 Next Token Prediction 的任务,学习基础语法,初步学习。
类似与transfomer论文中的对语言的输入学习输出。
2.2. 指令微调
GPT-3只能完成续写任务,InstructGPT可以根据指令回答问题
2.2.1. 监督学习
给出指令问题,并给出答案,监督模型学习
指令: 在面试中如何回答这个问题?
- 输入:当你在车里独处时,你会想些什么?
- 输出:如果是在晚上,我通常会考虑我今天所取得的进步,如果是在早上,我会思考如何做到最好。我也会尝试练习感恩和活在当下的状态,以避免分心驾驶。
指令: 按人口对这些国家进行排名。
- 输入:巴西,中国,美国,日本,加拿大,澳大利亚
- 输出:中国,美国,巴西,日本,加拿大,澳大利亚
模型学习指令回答方式,准确的响应问题
2.3. 奖励模型
之前,模型只是简单学习了语言学习的内容,但是并不知到语言中是否正确,或者错误,这将导致预训练模型中原先「错误」或「有害」的知识没能在 SFT 数据中被纠正。
2.3.1. 利用偏序对训练奖励模型
偏序对是指:不直接为每一个样本直接打分,而是标注这些样本的好坏顺序,标准A比B好多少,而不是具体的分数。
直接打分:A句子(5分),B句子(3分)
偏序对标注:A > B
模型通过尝试最大化「好句子得分和坏句子得分之间的分差」,从而学会自动给每一个句子判分。
2.4. 强化学习(Reinforcement Learning,PPO)
进行Reward model之后,需要使用RM进化模型
1.