직접 선호 최적화(DPO)
개요
직접 선호 최적화(DPO)는 페어링된 비교 데이터를 사용하여 모델 출력을 인적 선호도에 맞추도록 조정하는 방식으로 파운데이션 모델을 미세 조정하는 조정 기법입니다. 강화 학습 방법과 달리 DPO는 어떤 응답이 더 바람직한지에 대한 사람의 피드백을 기반으로 모델 동작을 직접 최적화하여 보다 안정적이고 확장 가능한 접근 방식을 제공합니다.
DPO를 사용하는 이유
파운데이션 모델은 사실상 정확한 출력을 생성할 수 있지만, 특정 사용자 요구, 조직의 가치, 안전 요구 사항과 일치하지 않을 수 있습니다. DPO는 다음을 지원하며 이 문제를 해결합니다.
원하는 동작 패턴에 맞게 모델 미세 조정
원치 않는 출력이나 유해한 응답 감소
브랜드 톤과 커뮤니케이션 가이드라인에 맞춘 응답 정렬
도메인 전문가 피드백을 기반으로 한 응답 품질 향상
선호 응답 패턴을 통해 안전 가드레일 구현
DPO의 작동 방식
DPO는 두 가지 가능한 응답 중 어느 것이 선호되는지 인간 평가자가 표시한 쌍 예제를 사용합니다. 모델은 선호되는 응답을 생성할 가능성을 최대화하고 원치 않는 응답 가능성은 최소화하도록 학습합니다.
DPO를 사용해야 하는 경우
다음 시나리오에서 DPO를 사용합니다.
특정 인적 선호도에 맞춘 주관적 출력 최적화
모델의 어조, 스타일 또는 콘텐츠 특성 조정
사용자 피드백 및 오류 분석을 기반으로 목표 개선 사항 달성
다양한 사용 사례에서 일관된 출력 품질 유지
선호 데이터만 사용하여 보상 없는 강화 학습으로 훈련
지원되는 모델 및 기법
DPO는 전체 파라미터 미세 조정과 저순위 적응(LoRA)을 모두 지원합니다.
| 모델 | 지원되는 입력 | 인스턴스 유형 | 권장 인스턴스 수 | 허용된 인스턴스 수 |
|---|---|---|---|---|
| Amazon Nova Micro | 텍스트 | ml.p5.48xlarge | 2 | 2, 4, 8 |
| Amazon Nova Lite | 텍스트, 이미지 | ml.p5.48xlarge | 4 | 2, 4, 8, 16 |
| Amazon Nova Pro | 텍스트, 이미지 | ml.p5.48xlarge | 6 | 6, 12, 24 |
훈련 접근 방식
전체 순위 DPO: 모든 모델 파라미터를 업데이트합니다. 잠재적으로 더 나은 조정 품질을 제공하지만 더 많은 컴퓨팅 리소스가 필요하고 더 큰 모델을 생성합니다.
LoRA DPO: 파라미터 효율적 미세 조정을 위해 경량 어댑터를 사용합니다. 우수한 조정 품질을 유지 관리하면서 더 작은 출력 모델로 더 효율적인 훈련 및 배포를 제공합니다.
대부분의 사용 사례에서 LoRA 접근 방식은 효율성을 크게 개선하여 충분한 적응 기능을 제공합니다.
데이터 형식
DPO 훈련 데이터는 마지막 어시스턴트 턴에는 preferred 및 non-preferred 레이블이 있는 기본 설정 페어가 포함되어야 한다는 점을 제외하면 SFT와 동일한 형식을 따릅니다.
기본 구조
마지막 어시스턴트 턴은 content 대신 candidates 배열을 사용합니다.
{ "role": "assistant", "candidates": [ { "content": [ { "text": "This is the preferred response." } ], "preferenceLabel": "preferred" }, { "content": [ { "text": "This is the non-preferred response." } ], "preferenceLabel": "non-preferred" } ] }
전체 텍스트 예제
{ "schemaVersion": "bedrock-conversation-2024", "system": [ { "text": "You are a helpful assistant." } ], "messages": [ { "role": "user", "content": [ { "text": "What is the capital of France?" } ] }, { "role": "assistant", "content": [ { "text": "The capital of France is Paris." } ] }, { "role": "user", "content": [ { "text": "Tell me more about it." } ] }, { "role": "assistant", "candidates": [ { "content": [ { "text": "Paris is the capital and largest city of France, known for the Eiffel Tower, world-class museums like the Louvre, and its rich cultural heritage." } ], "preferenceLabel": "preferred" }, { "content": [ { "text": "Paris is a city in France." } ], "preferenceLabel": "non-preferred" } ] } ] }
이미지를 포함하는 예제
{ "schemaVersion": "bedrock-conversation-2024", "system": [ { "text": "You are a helpful assistant." } ], "messages": [ { "role": "user", "content": [ { "text": "Describe this image." }, { "image": { "format": "jpeg", "source": { "s3Location": { "uri": "s3://your-bucket/your-path/image.jpg", "bucketOwner": "your-aws-account-id" } } } } ] }, { "role": "assistant", "candidates": [ { "content": [ { "text": "The image shows a detailed description with relevant context and observations." } ], "preferenceLabel": "preferred" }, { "content": [ { "text": "This is a picture." } ], "preferenceLabel": "non-preferred" } ] } ] }
데이터 세트 요구 사항
형식: 훈련을 위한 단일 JSONL 파일, 검증을 위한 단일 JSONL 파일(선택 사항)
최소 크기: 효과적인 훈련에 권장되는 선호 페어 1,000개
품질: 고품질 기본 설정 데이터로 보다 효과적인 결과 생성
기타 제약 조건: SFT와 동일합니다. 자세한 내용은 데이터세트 제약 조건을 참조하세요.
데이터 업로드
aws s3 cp /path/to/training-data/ s3://your-bucket/train/ --recursive aws s3 cp /path/to/validation-data/ s3://your-bucket/val/ --recursive
레시피 구성
일반 실행 구성
run: name: "my-dpo-run" model_type: "amazon.nova-lite-v1:0:300k" model_name_or_path: "nova-lite/prod" replicas: 4
| 파라미터 | 설명 |
|---|---|
name |
훈련 작업을 설명하는 이름 |
model_type |
Nova 모델 변형(수정하지 않음) |
model_name_or_path |
기본 모델 경로(수정하지 않음) |
replicas |
분산 훈련에 대한 컴퓨팅 인스턴스 수 |
훈련 구성
training_config: max_length: 16384 global_batch_size: 32 trainer: max_epochs: 3 model: hidden_dropout: 0.0 attention_dropout: 0.0 ffn_dropout: 0.0
| 파라미터 | 설명 | Range |
|---|---|---|
max_length |
토큰 단위의 최대 시퀀스 길이 | 1024~32768 |
global_batch_size |
옵티마이저 단계당 샘플 | Micro/Lite/Pro: 16, 32, 64, 128. Micro/Lite: 256 |
max_epochs |
데이터세트를 통과한 훈련 | 최소: 1 |
hidden_dropout |
숨겨진 상태에 대한 드롭아웃 | 0.0~1.0 |
attention_dropout |
관심 가중치에 대한 드롭아웃 | 0.0~1.0 |
ffn_dropout |
피드포워드 계층에 대한 드롭아웃 | 0.0~1.0 |
옵티마이저 구성
model: optim: lr: 1e-5 name: distributed_fused_adam adam_w_mode: true eps: 1e-08 weight_decay: 0.0 betas: - 0.9 - 0.999 sched: warmup_steps: 10 constant_steps: 0 min_lr: 1e-6
| 파라미터 | 설명 | Range |
|---|---|---|
lr |
학습률 | 0~1(일반적으로 1e-6~1e-4) |
weight_decay |
L2 정규화 강도 | 0.0~1.0 |
warmup_steps |
학습 속도가 점진적으로 증가하는 단계 | 0~20 |
min_lr |
감소 종료 시의 최소 학습 속도 | 0~1(< lr이어야 함) |
DPO 특정 구성
model: dpo_cfg: beta: 0.1
| 파라미터 | 설명 | Range |
|---|---|---|
beta |
훈련 데이터 적합과 원래 모델과 가깝게 유지 사이에서 균형 | 0.001~0.5 |
더 높은 베타(0.1): 더 많은 참조 모델 동작을 유지하지만 기본 설정을 더 느리게 학습할 수 있음
낮은 베타(0.01~0.05): 보다 적극적으로 기본 설정을 학습하지만 참조 기준과 차이를 보일 위험이 있음
권장 사항: beta: 0.1으로 시작하고 기본 설정 학습이 충분하지 않은 경우 하향 조정합니다.
LoRA PEFT 구성
model: peft: peft_scheme: "lora" lora_tuning: loraplus_lr_ratio: 64.0 alpha: 32 adapter_dropout: 0.01
| 파라미터 | 설명 | 허용된 값 |
|---|---|---|
peft_scheme |
미세 조정 방법 | "lora" 또는 null(전체 순위) |
alpha |
LoRA 가중치의 조정 인수 | 32, 64, 96, 128, 160, 192 |
loraplus_lr_ratio |
LoRA+ 학습 속도 조정 인자 | 0.0~100.0 |
adapter_dropout |
LoRA 파라미터에 대한 정규화 | 0.0~1.0 |
훈련 작업 시작
컨테이너 이미지
708977205387.dkr.ecr.us-east-1.amazonaws.com/nova-fine-tune-repo:SM-TJ-DPO-latest
예제 코드
from sagemaker.pytorch import PyTorch from sagemaker.inputs import TrainingInput instance_type = "ml.p5.48xlarge" instance_count = 4 image_uri = "708977205387.dkr.ecr.us-east-1.amazonaws.com/nova-fine-tune-repo:SM-TJ-DPO-latest" recipe_overrides = { "training_config": { "trainer": {"max_epochs": 2}, "model": { "dpo_cfg": {"beta": 0.1}, "peft": { "peft_scheme": "lora", "lora_tuning": { "loraplus_lr_ratio": 64.0, "alpha": 32, "adapter_dropout": 0.01, }, }, }, }, } estimator = PyTorch( output_path=f"s3://{bucket_name}/{job_name}", base_job_name=job_name, role=role, instance_count=instance_count, instance_type=instance_type, training_recipe="fine-tuning/nova/nova_lite_p5_gpu_lora_dpo", recipe_overrides=recipe_overrides, max_run=18000, sagemaker_session=sagemaker_session, image_uri=image_uri, disable_profiler=True, debugger_hook_config=False, ) train_input = TrainingInput( s3_data=train_dataset_s3_path, distribution="FullyReplicated", s3_data_type="Converse", ) val_input = TrainingInput( s3_data=val_dataset_s3_path, distribution="FullyReplicated", s3_data_type="Converse", ) estimator.fit(inputs={"train": train_input, "validation": val_input}, wait=True)
모델 배포
훈련이 완료되면 사용자 지정 모델 가져오기 기능을 사용하여 사용자 지정 모델을 Amazon Bedrock에 배포합니다. 모델은 프로비저닝된 처리량과 온디맨드 추론을 모두 지원합니다. LoRA 훈련 모델은 온디맨드 추론을 지원합니다.
배포 지침은 사용자 지정된 모델 배포를 참조하세요.
제한 사항
입력 모달리티: DPO는 텍스트 및 이미지만 허용합니다. 비디오 입력은 지원되지 않습니다.
출력 양식: 텍스트만
기본 설정 페어: 최종 어시스턴트 턴에는
preferred및non-preferred레이블이 있는 정확히 두 개의 후보가 포함되어야 함이미지 제한: 콘텐츠 블록당 최대 10개의 이미지
혼합 모달리티: 동일한 훈련 작업에서 텍스트, 이미지 및 비디오를 결합할 수 없음