文章目录
前言
大模型,特别是在人工智能领域的深度学习模型,通常具有大量的参数和复杂的结构,这使它们具有很高的表达能力和灵活性。然而,这种复杂性也带来了一些挑战,尤其是关于模型的行为与设计者或使用者的意图是否一致的问题。这就引出了“偏好对齐”(preference alignment)的概念,其核心是确保模型的行为符合人类的价值观和目标。
一、ORPO介绍
ORPO算法是最近提出的一种新的偏好对齐的方法,区别于传统的RLHF、PPO、DPO等方法,ORPO不需要奖励模型和额外参考模型。该算法认为在SFT过程中对不偏爱的结果加上轻微的惩罚就可以使模型对齐偏好,所以在SFT阶段加入了一个基于赔率比(odd ratio)的惩罚项,可以用让模型在SFT阶段直接进行偏好对齐。该算法咋子内存分配和计算量上较之前的算法更有优势。
二、代码实战
1.ORPO训练脚本
ORPO与传统的算法不同,所以对数据集和训练器的调用也存在一点区别(后续会更新一期,对比各个trainer的调用异同)。
本期演示代码使用官方代码使用的数据集hh-rlhf-trl-style,每条数据包括prompt、chosen、rejected三个字段,如下图所示:
其中chosen、rejected字段对应的值中包含了初始的query,以列表的形式展示。该数据集与传统的成对回答的PPO、DPO数据集存在一些区别。
模型使用的是Qwen1.5-0.5B。该模型的tokenizer_config.json文件中,定义了additional_special_tokens、eos_token、pad_token等特殊token,但是bos_token设置为NULL,在使用时,需要为此token赋值,否则会报错。
注意:官方演示代码在运行时会报错,本代码中做了一点点处理。
import multiprocessing
from dataclasses import dataclass, field
from datasets import load_dataset
from transformers import AutoModelForCausalLM, AutoTokenizer, HfArgumentParser
from trl import ModelConfig, ORPOConfig, ORPOTrainer, get_peft_config
@dataclass
class ScriptArguments:
dataset: str = field(
default="/mnt/data3/liu/datas/hh-rlhf-trl-style/", metadata={
"help": "The name of the dataset to use."}
<