Przejdź do treści
Biblioteka skilli
AI i agenci · Budowanie i kod

implement-simpo-loss

/implement-simpo-loss

Implementuje funkcję simpo_loss w SimPOTrainer według artykułu SimPO: nagroda znormalizowana długością z marginesem gamma i strata BCE bez modelu referencyjnego.

Licencja
MIT
Ostatnia zmiana repozytorium
02.10.2026

Ocena i bezpieczeństwo

95/ 100Klasa: dobry
Format20 / 25
Frontmatter z nazwą i opisem, poprawna nazwa, opis do 1024 znaków, nazwa zgodna z folderem.
Odkrywalność25 / 25
Opis mówi, kiedy użyć skilla, ma sensowną długość i jest w 3. osobie.
Treść35 / 35
Co najmniej 150 słów i do 500 linii, nagłówki, listy kroków, przykłady albo kod.
Higiena15 / 15
Bez zaślepek typu TODO, bez ścieżek Windows, z licencją.
Ryzykobrak sygnałów w skanie
Pliki w paczce
1
Skrypty
0
Komentarze HTML
0
Adresy URL w SKILL.md
0
Przestarzałość

Brak sygnałów. Repozytorium zmienione 02.10.2026, bez odwołań do wycofanych modeli i API.

Licencja

MIT, otwarta: można używać i zmieniać, z zachowaniem informacji o autorze.

Co robi i kiedy

Implementuje funkcję simpo_loss w SimPOTrainer według artykułu SimPO: nagroda znormalizowana długością z marginesem gamma i strata BCE bez modelu referencyjnego.

Oryginalny opis (EN)

Use this skill to implement the simpo_loss function in SimPOTrainer based on the SimPO paper. The loss combines a length-normalized reward with a margin gamma and uses BCE loss without a reference model.

Jak działa

  1. Implement SimPO Loss
Sekcje z nagłówków SKILL.md, w oryginale · 72 linii, 341 słów
Podgląd SKILL.md
---
name: implement-simpo-loss
description: Use this skill to implement the simpo_loss function in SimPOTrainer based on the SimPO paper. The loss combines a length-normalized reward with a margin gamma and uses BCE loss without a reference model.
---

## Implement SimPO Loss

The SimPO loss is defined in the paper as:

```
L_SimPO = -E[ log σ( (β/|y_w|) * log π(y_w|x) - (β/|y_l|) * log π(y_l|x) - γ ) ]
```

Where:
- `β` is a scaling factor
- `γ` (gamma) is a target reward margin
- `|y_w|` and `|y_l|` are the lengths of winning and losing responses
- `π(y|x)` is the policy model probability

### Implementation

```python
def simpo_loss(
    self,
    policy_chosen_logps: torch.FloatTensor,
    policy_rejected_logps: torch.FloatTensor,
    policy_chosen_logps_avg: torch.FloatTensor = None,
    policy_rejected_logps_avg: torch.FloatTensor = None,
) -> Tuple[torch.FloatTensor, torch.FloatTensor, torch.FloatTensor]:
    """Compute the SimPO loss for a batch of policy model log probabilities.
    
    Args:
        policy_chosen_logps: Log probabilities of the policy model for chosen responses.
            Shape: (batch_size,)
        policy_rejected_logps: Log probabilities of the policy model for rejected responses.
            Shape: (batch_size,)
        policy_chosen_logps_avg: Average log probabilities (per token) for chosen responses.
            Shape: (batch_size,)
        policy_rejected_logps_avg: Average log probabilities (per token) for rejected responses.
            Shape: (batch_size,)
    
    Returns:
        A tuple of three tensors: (losses, chosen_rewards, rejected_rewards)
    """
    # Use average log probs (length-normalized) as the reward signal
    # If avg logps not provided separately, they should be the per-token average
    chosen_logratios = policy_chosen_logps_avg if policy_chosen_logps_avg is not None else policy_chosen_logps
    rejected_logratios = policy_rejected_logps_avg if policy_rejected_logps_avg is not None else policy_rejected_logps

    # SimPO reward: beta * (avg_logp_chosen - avg_logp_rejected) - gamma
    # This is the length-normalized version without reference model
    pi_logratios = chosen_logratios - rejected_logratios
    
    # Apply beta scaling and subtract gamma margin
    logits = self.beta * pi_logratios - self.gamma
    
    # Compute loss: -log(sigmoid(logits))
    if self.loss_type == "sigmoid":
        losses = -F.logsigmoid(logits)
    elif self.loss_type == "hinge":
        losses = torch.relu(1 - logits)
    else:
        raise ValueError(f"Unknown loss type: {self.loss_type}")
    
    # Compute rewards for logging
    chosen_rewards = self.beta * chosen_logratios.detach()
    rejected_rewards = self.beta * rejected_logratios.detach()
    
    return losses, chosen_rewards, rejected_rewards
```

### Key Points
- **No reference model**: SimPO does not use a reference model, unlike DPO
- **Length normalization**: Uses average log probabilities (divided by sequence length)
- **Gamma margin**: Adds a target reward margin γ to encourage a gap between chosen and rejected
- **Beta scaling**: Controls the strength of the reward signal

Wersje

W bazie nie ma innych skilli o nazwie implement-simpo-loss.

Migawka bazy z 28.10.2026 · wersja paczki de0bdc1786a4 (skrót SHA-256 całej paczki)

Zgłoś problem z tym skillem: szkodliwa treść, błędny opis albo prośba autora o usunięcie.

Podobne skille

  • 95simpo-loss-implementation
    Pokazuje, jak zaimplementować funkcję straty SimPO (Simple Preference Optimization) według publikacji w metodzie simpo_loss klasy SimPOTrainer.
  • 100simpo-loss
    Implementuje funkcję straty SimPO do dopasowywania LLM: cele treningowe SimPO, optymalizację nagrody bez modelu referencyjnego i stratę preferencji Bradleya-Terry'ego z docelowym marginesem nagrody.
  • 95simpo-training
    Opisuje i wspiera trening SimPO do dopasowania modeli językowych, czyli metodę bez modelu referencyjnego, alternatywną wobec DPO.
  • 100preference-optimization
    Dopasowuje dostrojony model do danych preferencji metodami DPO, ORPO, KTO lub SimPO i pomaga dobrać metodę oraz hiperparametry albo debugować przebieg DPO.

Uwagi i zgłoszenia

Wiadomość trafi do Bartosza Sokolińskiego. Adres e-mail jest potrzebny tylko do odpowiedzi. Szczegóły w polityce prywatności.