窄多之Blog

窄多之Blog

LLM学习:RLHF 实现

- by Admin - 标签: LLM


RLHF 过程涉及通过奖励模型将人类反馈纳入训练过程,该模型学习所需的模式以放大模型的输出。


  1. 监督微调:此阶段的目的是让模型熟悉对话结构,从而教它回答问题,而不是依赖其标准的自动完成机制。
    • 1.1 数据集加载:问答模式
    • 1.2 加载 OPT 模型标记器( 13 亿参数,GPU 训练)
    • 1.3 聚合样本,以在 2K 输入大小限制内最大化利用率并提高训练过程的效率
    • 1.4 初始化模型并应用 LoRA,这在微调大型语言模型时有效地保持较低的内存需求。
    • 1.5 实例化,它定义了管理训练循环的超参数
    • 1.6 使用该库执行量化过程并以 4 位格式加载模型(NF4 数据类型并实现嵌套量化方法,这可以有效减少内存使用)
    • 1.7 QLoRA 方法是一种最新的方法,它将 LoRA 技术与量化相结合
    • 1.8 对模型架构进行了修改以提高效率。这涉及到将模型的特定层转换为全精度(32 位),包括 LayerNorms 和最终的语言建模头
    • 1.9 利用初始化的数据集和模型,结合训练参数和 LoRA 技术来开始训练
    • 1.10 实例将在训练过程中根据参数指定自动创建检查点,并将其存储在目录中。
    • 1.11 将 LoRA 层与基本模型合并以形成一个独立的网络,保存预训练模型
  2. 训练奖励模型,该模型从标记样本中学习人类偏好,并在 RLHF 过程的最后一步中引导模型。该模型将提供与非预期或期望行为相比的偏好行为的样本。奖励模型将通过为符合这些偏好的样本分配更高的分数来学习模仿人类的偏好。奖励模型需要在 RLHF 的下一阶段(即强化学习)中加载。
    • 2.1 数据集加载:数据集包含不适当的语言和攻击性词语,通过将模型暴露于此类语言并指示模型不要复制它来调整模型行为
    • 2.2 为奖励模型加载预训练的分词器
    • 2.3 PyTorch 中的类负责为各种下游任务格式化数据集。训练奖励模型需要一对输入。第一项将表示所选的(有利的)对话,而第二项将表示被贴标签者拒绝的对话,我们的目的是防止模型复制。为被拒绝的样本分配较低的排名。将这些聚合到单个四个键的 Python 字典中。
    • 2.4 初始化模型和训练器:只需要一个分数来评估序列的质量。该分数可以指示内容是否对齐,获得高分,或者如果不合适,则获得低分
    • 2.5 设置超参数
    • 2.6 所有内容结合在一起并执行训练循环
  3. 强化学习:利用之前训练的奖励模型来进一步使微调模型与人类反馈保持一致。
    • 3.1 加载数据集和预训练分词器
    • 3.2 训练器需要查询及其标记化变体。需要强调的重要一点是,该变量充当制作用户提示的模板,与监督微调 (SFT) 步骤中采用的格式保持一致。
    • 3.3 建立一个整理器函数,负责将数据加载器中的单个样本转换为数据批次
    • 3.4 初始化 SFT 模型:需要加载两个模型。加载微调模型,并利用 PPOConfig 类提供的配置。这些参数将用于控制 KL 散度惩罚,以确保模型不会显着偏离预训练模型。否则,它就有生成无意义句子的风险。
    • 3.5 还需要使用该函数来设置随机状态以实现可重复性。
    • 3.6 设置 LoRA 的详细信息以加速微调过程。
    • 3.7 LoRA 配置来加载预训练的权重。利用参数来加载模型,并采用降低权重精度的量化技术。这有助于在模型训练期间节省内存。该模型旨在在 RL 循环中使用。
    • 3.8 初始化奖励模型:管道将自动加载适当的分词器,我们可以通过向定义的对象提供任何文本来启动分类。
    • 3.9 PPO 培训:最后阶段涉及采用近端策略优化(PPO)来增强训练循环的稳定性。它将通过防止过大的更新来限制对模型的更改。实证结果表明,引入微小的调整可以加速训练过程的收敛.
    • 3.10 训练循环:这使得奖励模型可以通过分配分数来评估它们与人类生成的响应的接近程度,PPO 对象将根据奖励模型的得分来调整模型。

QLoRA

在神经网络开发的早期阶段,模型训练采用 32 位浮点格式。这需要使用 32 位来表示每个权重,每个权重需要 4 个字节来存储。随着模型的增长和内存需求的不断增加,这导致加载模型使用较低精度的值。采用 8 位数字表示将存储需求减少到仅 1 个字节。最近,一项额外的进步允许以 4 位格式加载模型,进一步减少内存需求。