[ PROMPT_NODE_22866 ]
loss-functions
[ SKILL_DOCUMENTATION ]
# 损失函数
SimPO 损失函数与数学公式的完整指南。
## 概述
SimPO 支持两种损失类型:
- **Sigmoid** (默认) - 平滑、可微的损失
- **Hinge** - 基于边际的稀疏损失
两者均无需参考模型(不需要 Reference Model)。
## SimPO 损失公式
### 核心计算
**第 1 步:对数概率比**:
pi_logratios = log P_θ(y_chosen|x) - log P_θ(y_rejected|x)
**第 2 步:应用目标边际**:
logits = pi_logratios - γ/β
其中:
- γ/β = `gamma_beta_ratio` (目标边际)
**第 3 步:计算损失** (取决于损失类型)
### Sigmoid 损失 (默认)
**公式**:
L = -log σ(β * logits) * (1 - ε) - log σ(-β * logits) * ε
其中:
- β = `beta` (奖励缩放)
- σ = sigmoid 函数
- ε = `label_smoothing` (默认 0.0)
**实现**:
python
losses = (
-F.logsigmoid(self.beta * logits) * (1 - self.label_smoothing)
- F.logsigmoid(-self.beta * logits) * self.label_smoothing
)
**特性**:
- 平滑、连续的梯度
- 概率解释
- 大多数任务的标准选择
- 在较高的 Beta 值下表现良好
### Hinge 损失
**公式**:
L = max(0, 1 - β * logits)
**实现**:
python
losses = torch.relu(1 - self.beta * logits)
**特性**:
- 非平滑 (在 logits = 1/β 处有拐点)
- 基于边际 (SVM 风格)
- 可能导致更稀疏的解
- 使用较少
## 与 DPO 的比较
### DPO 损失 (需要参考模型)
**公式**:
L_DPO = -E[log σ(β * log(π_θ(y_w|x)/π_ref(y_w|x)) - β * log(π_θ(y_l|x)/π_ref(y_l|x)))]
**关键特性**:
- 需要参考模型 π_ref
- 通过参考对数概率进行归一化
- 更保守(保持接近参考模型)
### SimPO 损失 (无需参考模型)
**公式**:
L_SimPO = -log σ(β * (log π_θ(y_w|x) - log π_θ(y_l|x) - γ/β))
**关键特性**:
- 无需参考模型
- 直接偏好优化
- 目标边际 γ/β 控制偏好强度
- 更高效(更少的模型前向传播)
**视觉对比**:
DPO: [策略] - [参考] → 损失
SimPO: [策略] → 损失
## 平均对数概率奖励
### 计算
**每个 Token 的对数概率**:
python
# 获取每个 token 的对数概率
per_token_logps = log_softmax(logits).gather(dim=-1, index=labels)
# 创建掩码以忽略填充
loss_mask = (labels != label_pad_token_id)
**平均对数概率** (如果 `average_log_prob=True`):
python
avg_logp = (per_tok