

# 直接選好最適化 (DPO)
<a name="nova-dpo"></a>

直接設定最適化 (DPO) は、ペア比較データを使用してモデル出力を人間の好みに合わせる基盤モデルの効率的なファインチューニング方法です。このアプローチにより、より望ましいレスポンスに関する人間のフィードバックに基づいて、モデルの動作を直接最適化できます。

フルランク DPO と低ランクアダプター (LoRA) DPO の両方を使用できます。

**データ形式の要件**  
フルランクと LoRA DPO の両方で、トレーニングデータ形式の要件は SFT に似ています。ただし、DPO の場合、最終ターンにはプレファレンスペアが必要です。DPO データ形式の例を次に示します。

```
// N-1 turns same as SFT format
{
    "role": "assistant",
    "candidates": [
        {
            "content": [
                {
                    "text": "..."
                } // content list can contain multiple 'text' objects
            ],
            "preferenceLabel": "preferred"
        },
        {
            "content": [
                {
                    "text": "..."
                } // content list can contain multiple 'text' objects
            ],
            "preferenceLabel": "non-preferred"
        }
    ]
}
```

別の完全な DPO テキストサンプルは次のとおりです。

```
{
    "system": [
        {
            "text": "..."
        }
    ],
    "messages":[
        {
            "role": "user",
            "content": [
                {
                    "text": "..."
                }
            ]
        },
        {
            "role": "assistant",
            "content": [
                {
                    "text": "..."
                }
            ]
        },
        {
            "role": "user",
            "content": [
                {
                    "text": "..."
                }
            ]
        },
        {
            "role": "assistant",
            "candidates": [
                {
                    "content": [
                        {
                            "text": "..."
                        }
                    ],
                    "preferenceLabel": "preferred"
                },
                {
                    "content": [
                        {
                            "text": "..."
                        }
                    ],
                    "preferenceLabel": "non-preferred"
                }
            ]
        }
    ],
}
```

完全な DPO イメージサンプルは次のとおりです。

```
{
    "system": [
        {
            "text": "..."
        }
    ],
    "messages":[
        {
            "role": "user",
            "content": [
                {
                    "text": "..."
                },
                {
                    "text": "..."
                },
                {
                    "image": {
                        "format": "jpeg",
                        "source": {
                            "s3Location": {
                                "uri": "s3://your-bucket/your-path/your-image.jpg",
                                "bucketOwner": "your-aws-account-id"
                            }
                        }
                    }
                } // "content" can have multiple "text" and "image" objects.
                 // max image count is 10
            ]
        },
        {
            "role": "assistant",
            "content": [
                {
                    "text": "..."
                }
            ]
        },
        {
            "role": "user",
            "content": [
                {
                    "text": "..."
                },
                {
                    "text": "..."
                },
                {
                    "image": {
                        "format": "jpeg",
                        "source": {
                            "s3Location": {
                                "uri": "s3://your-bucket/your-path/your-image.jpg",
                                "bucketOwner": "your-aws-account-id"
                            }
                        }
                    }
                } // "content" can have multiple "text" and "image" objects.
                 // max image count is 10
            ]
        },
        {
            "role": "assistant",
            "candidates": [
                {
                    "content": [
                        {
                            "text": "..."
                        }
                    ],
                    "preferenceLabel": "preferred"
                },
                {
                    "content": [
                        {
                            "text": "..."
                        }
                    ],
                    "preferenceLabel": "non-preferred"
                }
            ]
        }
    ],
}
```

入力データセットにはその他の制約が適用されます。詳細については、「[データセットの制約](https://docs.aws.amazon.com/nova/latest/userguide/fine-tune-prepare-data-understanding.html#custom-fine-tune-constraints)」を参照してください。効果的なトレーニングのために、最低 1,000 個のプリファレンスペアを含めることをお勧めします。高品質のプリファレンスデータにより、より効率的な結果が得られます。

以下のシナリオでは、DPO を使用することをお勧めします。
+ 特定の人間の好みに合わせて調整する必要がある主観的な出力になるよう最適化する場合。
+ 希望するレスポンスパターンに合わせてモデルのトーン、スタイル、またはコンテンツ特性を調整する場合。
+ ユーザーのフィードバックとエラー分析に基づいて、既存のモデルをターゲットを絞って改善する場合。
+ さまざまなユースケースで一貫した出力品質を維持する場合。
+ 望ましいレスポンスパターンによる安全ガードレールを実装する場合。
+ 無報酬の強化学習でトレーニングする場合。
+ グレード付きデータやラベル付きデータではなく、プリファレンスデータのみを使用する場合。
+ 有益性、無害性、正直性など、微妙な調整タスクでモデルを改善する場合。

## フルランク DPO
<a name="customize-fine-tune-hyperpod-dpo-fr"></a>

フルランク DPO で使用できる Amazon Nova パラメータは次のとおりです。
+ **実行設定**
  + `name`: トレーニングジョブのわかりやすい名前。AWS マネジメントコンソール でジョブを区別しやすくなります。
  + `model_type`: 使用する Nova モデルバリアント。使用できるオプションは、`amazon.nova-micro-v1:0:128k`、`amazon.nova-lite-v1:0:300k` または `amazon.nova-pro-v1:0:300k` です。
  + `model_name_or_path`: ベースモデルへのパス。`nova-micro/prod`、`nova-lite/prod`、`nova-pro/prod`、またはトレーニング後のチェックポイントの S3 パス (`s3://<escrow bucket>/<job id>/outputs/checkpoints`) から使用するモデルを選択します。
  + `replicas`: 分散トレーニングに使用するコンピューティングインスタンスの数。使用可能な値は選択したモデルによって異なります。Amazon Nova Micro では、2 個、4 個、または 8 個のレプリカをサポートしています。Amazon Nova Lite では、4 個、8 個、16 個、または 32 個のレプリカをサポートしています。Amazon Nova Pro では、6 個、12 個、または 24 個のレプリカをサポートしています。
  + `data_s3_path`: トレーニングデータセットの S3 の場所。これは JSONL ファイルです。このファイルは、クラスターと同じアカウントおよびリージョンに配置する必要があります。指定された S3 の場所は、同じアカウントとリージョンに存在している必要があります。
  + `validation_data_s3_path`: 検証データセットの S3 の場所。これは JSONL ファイルです。このファイルは、クラスターと同じ AWS アカウント およびリージョンに配置する必要があります。指定された S3 の場所は、同じアカウントとリージョンに存在している必要があります。
+ **トレーニング設定**
  + `max_length`: トークンの最大シーケンス長。これにより、トレーニングのコンテキストウィンドウのサイズが決まります。サポートされている最大値は、DPO で 32,768 トークンです。

    シーケンスを長くすると、メモリ要件の増加を犠牲にしてトレーニング効率が向上します。`max_length` パラメータをデータディストリビューションに一致させることをお勧めします。
+ **トレーナー設定**
  + `max_epochs`: トレーニングデータセットの完全なパスの数。

    一般的に、データセットが大きいほど収束に必要なエポックが少なくなる一方、データセットが小さいほど収束に必要なエポックが多くなります。データのサイズに基づいてエポックの数を調整することをお勧めします。
+ **モデル設定**
  + `hidden_dropout`: 非表示状態の出力を削除する確率。この値を約 0.0～0.2 ずつ増やして、小さいデータセットのオーバーフィットを減らします。有効な値は 0～1 で、その範囲に限ります。
  + `attention_dropout`: 注意重みを削除する確率。このパラメータは一般化に役立ちます。有効な値は 0～1 で、その範囲に限ります。
  + `ffn_dropout`: フィードフォワードネットワーク出力を削除する確率。有効な値は 0～1 で、その範囲に限ります。
+ **オプティマイザー設定**
  + `lr`: 最適化中のステップサイズを制御する学習率。パフォーマンスを向上させるには、1e-6-1e-4 の間の値をお勧めします。有効な値は 0～1 で、その範囲に限ります。
  + `name`: オプティマイザーアルゴリズム。現在は、`distributed_fused_adam` のみがサポートされます。
  + `weight_decay`: L2 正則化の強度。値が大きいほど (0.01～0.1) 正則化が増加します。
  + `warmup_steps`: 学習率を徐々に増やすステップの数。これにより、トレーニングの安定性が向上します。有効な値は 1～20 で、その範囲に限ります。
  + `min_lr`: 減衰終了時の最小学習率。有効な値は 0～1 の範囲でその範囲に限られますが、学習率より小さくする必要があります。
+ **DPO 設定**
  + `beta`: モデルがトレーニングデータまたは元のモデルにどの程度合わせるかを決定します。有効な値は 0.001～0.5 で、その範囲に限ります。

    新しい設定をよりゆっくりと学習しながら、より多くの参照モデルの動作を保持するには、より大きな値 (0.5 など) を指定します。参照モデルの動作から逸脱するリスクがある新しい設定をより迅速に学習するには、より小さい値 (0.01～0.05 など) を指定します。

**フルランク DPO のレシピ**  
DPO のフルランクレシピは以下のとおりです。

```
## Run config
run:
  name: "my-dpo-micro-job"             # A descriptive name for your training job
  model_type: "amazon.nova-micro-v1:0:128k"  # Model variant specification, do not change
  model_name_or_path: "nova-micro/prod"      # Base model path, do not change
  replicas: 2                     # Number of compute instances for training, allowed values are 2, 4, 8
  data_s3_path: s3:Replace with your S3 bucket name/input.jsonl
  validation_data_s3_path: [OPTIONAL] s3:your S3 bucket name/input.jsonl
  output_s3_path: [S3_PATH_TO_STORE_MANIFEST]

## Training specific configs
training_config:
  max_length: 32768               # Maximum context window size (tokens).
  global_batch_size: 64           # Global batch size, allowed values are 16, 32, 64.

  trainer:
    max_epochs: 2                # Number of training epochs

  model:
    hidden_dropout: 0.0          # Dropout for hidden states, must be between 0.0 and 1.0
    attention_dropout: 0.0       # Dropout for attention weights, must be between 0.0 and 1.0
    ffn_dropout: 0.0             # Dropout for feed-forward networks, must be between 0.0 and 1.0

    optim:
      lr: 1e-5                 # Learning rate
      name: distributed_fused_adam  # Optimizer algorithm, do not change
      adam_w_mode: true        # Enable AdamW mode
      eps: 1e-06               # Epsilon for numerical stability
      weight_decay: 0.0        # L2 regularization strength, must be between 0.0 and 1.0
      betas:                   # Adam optimizer betas, must be between 0.0 and 1.0
        - 0.9
        - 0.999
      sched:
        warmup_steps: 10     # Learning rate warmup steps
        constant_steps: 0    # Steps at constant learning rate
        min_lr: 1e-6         # Minimum learning rate, must be lower than lr

    dpo_cfg:
        beta: 0.1               # Strength of preference enforcement. Limits: [0.001, 0.5]

    peft:
        peft_scheme: null        # Disable LoRA, trigger full rank fine tuning
```

## 低ランクアダプター DPO
<a name="customize-fine-tune-hyperpod-dpo-lora"></a>

低ランクアダプター DPO で使用できる Amazon Nova パラメータは次のとおりです。
+ **実行設定**
  + `name`: トレーニングジョブのわかりやすい名前。AWS マネジメントコンソール でジョブを区別しやすくなります。
  + `model_type`: 使用する Nova モデルバリアント。使用できるオプションは、`amazon.nova-micro-v1:0:128k`、`amazon.nova-lite-v1:0:300k` または `amazon.nova-pro-v1:0:300k` です。
  + `model_name_or_path`: ベースモデルへのパス。`nova-micro/prod`、`nova-lite/prod`、`nova-pro/prod`、またはトレーニング後のチェックポイントの S3 パス (`s3://<escrow bucket>/<job id>/outputs/checkpoints`) から使用するモデルを選択します。
  + `replicas`: 分散トレーニングに使用するコンピューティングインスタンスの数。使用可能な値は選択したモデルによって異なります。Amazon Nova Micro では、2 個、4 個、または 8 個のレプリカをサポートしています。Amazon Nova Lite では、4 個、8 個、16 個、または 32 個のレプリカをサポートしています。Amazon Nova Pro では、6 個、12 個、または 24 個のレプリカをサポートしています。
+ **トレーニング設定**
  + `max_length`: トークンの最大シーケンス長。これにより、トレーニングのコンテキストウィンドウのサイズが決まります。サポートされている最大値は、DPO で 32,768 トークンです。

    シーケンスを長くすると、メモリ要件の増加を犠牲にしてトレーニング効率が向上します。`max_length` パラメータをデータディストリビューションに一致させることをお勧めします。
+ **トレーナー設定**
  + `max_epochs`: トレーニングデータセットの完全なパスの数。

    一般的に、データセットが大きいほど収束に必要なエポックが少なくなる一方、データセットが小さいほど収束に必要なエポックが多くなります。データのサイズに基づいてエポックの数を調整することをお勧めします。
+ **モデル設定**
  + `hidden_dropout`: 非表示状態の出力を削除する確率。この値を約 0.0～0.2 ずつ増やして、小さいデータセットのオーバーフィットを減らします。有効な値は 0～1 で、その範囲に限ります。
  + `attention_dropout`: 注意重みを削除する確率。このパラメータは一般化に役立ちます。有効な値は 0～1 で、その範囲に限ります。
  + `ffn_dropout`: フィードフォワードネットワーク出力を削除する確率。有効な値は 0～1 で、その範囲に限ります。
+ **オプティマイザー設定**
  + `lr`: 最適化中のステップサイズを制御する学習率。パフォーマンスを向上させるには、1e-6-1e-4 の間の値をお勧めします。有効な値は 0～1 で、その範囲に限ります。
  + `name`: オプティマイザーアルゴリズム。現在は、`distributed_fused_adam` のみがサポートされます。
  + `weight_decay`: L2 正則化の強度。値が大きいほど (0.01～0.1) 正則化が増加します。
  + `warmup_steps`: 学習率を徐々に増やすステップの数。これにより、トレーニングの安定性が向上します。有効な値は 1～20 で、その範囲に限ります。
  + `min_lr`: 減衰終了時の最小学習率。有効な値は 0～1 の範囲でその範囲に限られますが、学習率より小さくする必要があります。
+ **DPO 設定**
  + `beta`: モデルがトレーニングデータまたは元のモデルにどの程度合わせるかを決定します。有効な値は 0.001～0.5 で、その範囲に限ります。

    新しい設定をよりゆっくりと学習しながら、より多くの参照モデルの動作を保持するには、より大きな値 (0.5 など) を指定します。参照モデルの動作から逸脱するリスクがある新しい設定をより迅速に学習するには、より小さい値 (0.01～0.05 など) を指定します。
+ **LoRA 設定パラメータ**
  + `peft_scheme`: `lora` に設定すると Low-Rank Adaptation が有効になり、より効率的で小さな出力モデルが生成されます。次の LoRA 固有のプロパティも利用できます。
    + `alpha`: LoRA 重みのスケーリング係数。これは通常、`adapter_dim` と同じ値に設定されます。
    + `adapter_dropout`: LoRA パラメータの正規化パラメータ。

**LoRA DPO のレシピ**  
LoRA DPO のレシピは以下のとおりです。

```
## Run config
run:
    name: "my-lora-run"             # A descriptive name for your training job
    model_type: "amazon.nova-lite-v1:0:300k"  # Model variant specification, do not change
    model_name_or_path: "nova-lite/prod"      # Base model path, do not change
    replicas: 4                     # Number of compute instances for training. All supported values: {4, 8, 16}
    data_s3_path: s3:Replace with your S3 bucket name/input.jsonl
    validation_data_s3_path: [OPTIONAL] s3:your S3 bucket name/input.jsonl
    output_s3_path: [S3_PATH_TO_STORE_MANIFEST]

## Training specific configs
training_config:
    max_length: 16384               # Maximum context window size (tokens). Should be between [1024, 32768] and multiple of 1024.
                                    # Note: Image dataset for DPO has a limit on 20k samples and 16384 max_length
    global_batch_size: 64           # Total samples per step. Limits: {16, 32, 64, 128, 256}

    trainer:
        max_epochs: 2               # Number of training epochs

    model:
        hidden_dropout: 0.0          # Dropout for hidden states. Limits: [0.0, 1.0]
        attention_dropout: 0.0       # Dropout for attention weights. Limits: [0.0, 1.0]
        ffn_dropout: 0.0             # Dropout for feed-forward networks. Limits: [0.0, 1.0]

        optim:
            lr: 1e-5                 # Learning rate
            name: distributed_fused_adam  # Optimizer algorithm, do not change
            adam_w_mode: true        # Enable AdamW mode
            eps: 1e-08               # Epsilon for numerical stability
            weight_decay: 0.01       # L2 regularization strength
            betas:                   # Adam optimizer betas. Limits: [0.0, 1.0]
                - 0.9
                - 0.999
            sched:
                warmup_steps: 10     # Learning rate warmup steps
                constant_steps: 0    # Steps at constant learning rate
                min_lr: 1e-6         # Minimum learning rate

        dpo_cfg:
            beta: 0.01               # Strength of preference enforcement. Limits: [0.001, 0.5]

        peft:
            peft_scheme: "lora"      # Enable LoRA for parameter-efficient fine-tuning
            lora_tuning:
                loraplus_lr_ratio: 20.0  # LoRA+ learning rate scaling factor. Limits: [0.0, 100.0]
                alpha: 64            # Scaling factor for LoRA weights. [32, 64, 96, 128, 160, 192]
                adapter_dropout: 0.01  # Regularization for LoRA parameters. Limits: [0.0, 1.0]
```

**制限事項**  
DPO には次の制限事項があります。
+ 中間チェックポイントは評価のために保存されず、中間チェックポイントから再開することはできません。最後のチェックポイントのみが保存されます。
+ ハイパーパラメータを調整するには、「[ハイパーパラメータの選択](https://docs.aws.amazon.com/nova/latest/userguide/customize-fine-tune-hyperparameters.html)」のガイダンスに従います。