Come abbiamo addestrato Shannon V1.5 a pensare usando GRPO
Un'analisi tecnica completa dell'Ottimizzazione della Politica Relativa di Gruppo per un ragionamento trasparente a catena di pensiero nei modelli AI red team non censurati
1. Motivazione: Perché i Modelli di Pensiero?
PerAI red teamricerca, comprenderecomeun'AI arriva a output potenzialmente dannosi è tanto importante quanto studiare gli output stessi. I modelli di pensiero di Shannon V1.5 espongono l'intera catena di pensiero, consentendo ai ricercatori di:
- Tracciare il percorso di ragionamento che porta aconseguenti AI non censuratecomportamenti
- Identificare dove le barriere di sicurezza interverrebbero normalmente (dimostrandol'importanza delle barriere di sicurezza AI)
- Sviluppare meccanismi di sicurezza più robusti mirati a specifici schemi di ragionamento
- Creare migliori casi di test avversari basati sulle catene di ragionamento osservate
Valore della Ricerca:Questa trasparenza consente ai ricercatori sulla sicurezza di vedere esattamente dove e perché i modelli con vincoli rilassati divergono dai modelli addestrati alla sicurezza—essenziale per migliorarel'importanza delle barriere di sicurezza AIla comprensione.
2. Comprendere GRPO
Ottimizzazione della Politica Relativa di Gruppo (GRPO)è un progresso rispetto ai metodi RLHF tradizionali che consente un addestramento più stabile ed efficiente delle capacità di ragionamento. Sviluppato da DeepSeek AI, si è dimostrato particolarmente efficace per l'addestramento a catena di pensiero.
Perché GRPO rispetto al RLHF Tradizionale?
| Aspetto | RLHF Tradizionale | GRPO |
|---|---|---|
| Modello di Ricompensa | Richiede addestramento RM separato | Utilizza confronti relativi al gruppo |
| Stabilità dell'Addestramento | Soggetto a reward hacking | Ottimizzazione più stabile |
| Efficienza Computazionale | Alta (RM separato + PPO) | Inferiore (addestramento unificato) |
| Qualità CoT | Tracce inconsistenti | Catene di ragionamento coerenti |
Fondamenti Matematici di GRPO
GRPO ottimizza la politica confrontando le risposte all'interno dei gruppi piuttosto che contro un modello di ricompensa assoluto:
Questo confronto relativo presenta diversi vantaggi:
- Normalizzazione:Si adatta automaticamente alle diverse difficoltà tra i prompt
- Stabilità:Riduce la varianza nelle stime del gradiente
- Efficienza:Nessun modello di ricompensa separato necessario
def compute_grpo_loss(
policy_logprobs: torch.Tensor,
rewards: torch.Tensor,
group_size: int = 8
) -> torch.Tensor:
"""
Compute GRPO loss with group-relative reward normalization.
Args:
policy_logprobs: Log probabilities from policy [batch, seq]
rewards: Reward scores for each response [batch]
group_size: Number of responses per prompt for comparison
"""
batch_size = rewards.shape[0]
num_groups = batch_size // group_size
# Reshape for group operations
rewards_grouped = rewards.view(num_groups, group_size)
logprobs_grouped = policy_logprobs.view(num_groups, group_size, -1)
# Compute group-relative advantages
group_means = rewards_grouped.mean(dim=1, keepdim=True)
group_stds = rewards_grouped.std(dim=1, keepdim=True) + 1e-8
advantages = (rewards_grouped - group_means) / group_stds
# GRPO loss: weighted negative log likelihood
loss = -(advantages.unsqueeze(-1) * logprobs_grouped).sum(dim=-1).mean()
return loss
3. Distillazione DeepSeek
Per avviare le capacità di pensiero di Shannon V1.5, abbiamo distillato schemi di catena di pensiero dai modelli di ragionamento di DeepSeek. Ciò ha fornito tracce CoT di alta qualità per addestrare la nostra testa pensante.
Composizione del Dataset DeepSeek
Processo di Raccolta delle Tracce
Abbiamo raccolto tracce di pensiero attraverso diversi domini per garantire una copertura completa del ragionamento:
class DeepSeekDistiller:
"""Distill chain-of-thought traces from DeepSeek models."""
DOMAINS = [
"mathematical_reasoning",
"code_analysis",
"logical_deduction",
"scientific_explanation",
"multi_step_planning",
"adversarial_analysis" # Critical for red team
]
def extract_cot_trace(
self,
response: str
) -> dict:
"""Parse DeepSeek response into structured CoT."""
# DeepSeek uses ... tags
think_match = re.search(
r'(.*?) ',
response,
re.DOTALL
)
if not think_match:
return None
thinking = think_match.group(1)
final_answer = response.split('')[-1].strip()
# Parse individual reasoning steps
steps = self.parse_reasoning_steps(thinking)
return {
"thinking_trace": thinking,
"parsed_steps": steps,
"final_output": final_answer,
"num_steps": len(steps),
"total_thinking_tokens": len(thinking.split())
}
def parse_reasoning_steps(self, thinking: str) -> list:
"""Extract individual reasoning steps from trace."""
# Split on common step indicators
step_patterns = [
r'\n\d+\.', # "1. ", "2. "
r'\nStep \d+:', # "Step 1:"
r'\n(?:First|Next|Then|Finally),',
r'\n- ' # Bullet points
]
combined_pattern = '|'.join(step_patterns)
steps = re.split(combined_pattern, thinking)
return [s.strip() for s in steps if s.strip()]
Tracce Avversarie:Abbiamo raccolto specificamente tracce CoT per scenari avversari/red team, dove il pensiero di DeepSeek rivela come i modelli ragionano su richieste potenzialmente dannose—anche quando alla fine rifiutano. Questi dati insegnano a Shannon V1.5 a rendere il ragionamentoel'output trasparente.
4. Architettura della Testa Pensante
I modelli Shannon V1.5 incorporano unatesta pensantededicata che genera tracce di ragionamento esplicite prima dell'output finale. Questa aggiunta architettonica consente un CoT trasparente senza modificare l'architettura base di Mixtral.
Codifica dell'Input
User prompt processed through Mixtral encoder layers
Attivazione della Testa Pensante
Layer transformer dedicati generano tracce di ragionamento con token [THINK]
Integrazione della Traccia
Output di pensiero concatenato al contesto per la generazione finale
Generazione della Risposta
Mixtral base genera la risposta finale condizionata dalla traccia di pensiero
Implementazione della Testa Pensante
class ThinkingHead(nn.Module):
"""
Dedicated thinking module for Shannon V1.5.
Generates explicit chain-of-thought traces.
"""
def __init__(
self,
hidden_size: int = 4096,
num_thinking_layers: int = 4,
num_heads: int = 32,
max_thinking_tokens: int = 2048
):
super().__init__()
self.hidden_size = hidden_size
self.max_thinking_tokens = max_thinking_tokens
# Special tokens
self.think_start = nn.Parameter(torch.randn(1, 1, hidden_size))
self.think_end = nn.Parameter(torch.randn(1, 1, hidden_size))
# Thinking transformer layers
self.thinking_layers = nn.ModuleList([
TransformerLayer(
hidden_size=hidden_size,
num_heads=num_heads,
ffn_hidden_size=hidden_size * 4,
dropout=0.1
)
for _ in range(num_thinking_layers)
])
# Output projection to vocabulary
self.output_proj = nn.Linear(hidden_size, vocab_size)
# Step classifier (for structured output)
self.step_classifier = nn.Linear(hidden_size, 5) # 5 step types
def forward(
self,
hidden_states: torch.Tensor,
attention_mask: torch.Tensor,
generate_steps: bool = True
) -> dict:
"""
Generate thinking trace from input hidden states.
Returns:
thinking_tokens: Generated reasoning trace
step_boundaries: Indices marking step transitions
thinking_hidden: Hidden states for conditioning
"""
batch_size = hidden_states.shape[0]
# Prepend thinking start token
thinking_input = torch.cat([
self.think_start.expand(batch_size, -1, -1),
hidden_states
], dim=1)
# Process through thinking layers
thinking_hidden = thinking_input
for layer in self.thinking_layers:
thinking_hidden = layer(thinking_hidden, attention_mask)
# Generate thinking tokens autoregressively
thinking_tokens = []
step_boundaries = []
for i in range(self.max_thinking_tokens):
logits = self.output_proj(thinking_hidden[:, -1, :])
next_token = logits.argmax(dim=-1)
# Check for step boundaries
step_type = self.step_classifier(thinking_hidden[:, -1, :])
if step_type.argmax(dim=-1) != 0: # 0 = continue
step_boundaries.append(i)
thinking_tokens.append(next_token)
# Check for think_end
if next_token == self.think_end_token_id:
break
# Update for next iteration
# ... (autoregressive generation logic)
return {
"thinking_tokens": torch.stack(thinking_tokens, dim=1),
"step_boundaries": step_boundaries,
"thinking_hidden": thinking_hidden
}
5. Pipeline di Addestramento
Stage 1: Thinking Head Pre-training
Innanzitutto, pre-addestriamo la testa pensante su tracce CoT distillate da DeepSeek utilizzando la perdita di entropia incrociata standard:
# Thinking Head Pre-training Configuration
model:
base: shannon-ai/v1-deep # Start from GPT-5 distilled model
thinking_head:
num_layers: 4
hidden_size: 4096
max_tokens: 2048
training:
stage: thinking_pretrain
epochs: 5
batch_size: 64
learning_rate: 1e-4
freeze_base: true # Only train thinking head initially
data:
train_path: /data/deepseek_cot_train.jsonl
format: thinking_trace
fields:
input: prompt
thinking: thinking_trace
output: final_answer
Fase 2: Fine-tuning GRPO
Dopo il pre-addestramento, applichiamo GRPO per migliorare la qualità del pensiero utilizzando confronti relativi al gruppo:
class GRPOTrainer:
"""GRPO trainer for thinking model optimization."""
def __init__(
self,
model: ThinkingModel,
group_size: int = 8,
kl_coef: float = 0.1
):
self.model = model
self.group_size = group_size
self.kl_coef = kl_coef
self.ref_model = copy.deepcopy(model)
self.ref_model.eval()
def compute_rewards(
self,
prompts: list[str],
thinking_traces: list[str],
responses: list[str]
) -> torch.Tensor:
"""
Compute rewards for thinking quality.
Multiple signals combined for comprehensive evaluation.
"""
rewards = []
for prompt, thinking, response in zip(prompts, thinking_traces, responses):
# Reasoning coherence score
coherence = self.evaluate_coherence(thinking)
# Step structure quality
structure = self.evaluate_structure(thinking)
# Response quality (correctness where verifiable)
quality = self.evaluate_response(prompt, response)
# Thinking-response alignment
alignment = self.evaluate_alignment(thinking, response)
# Combined reward
reward = (
0.3 * coherence +
0.2 * structure +
0.3 * quality +
0.2 * alignment
)
rewards.append(reward)
return torch.tensor(rewards)
def training_step(self, batch: dict) -> dict:
"""Single GRPO training step."""
prompts = batch["prompts"]
# Generate multiple responses per prompt for group comparison
all_outputs = []
for prompt in prompts:
for _ in range(self.group_size):
output = self.model.generate_with_thinking(
prompt,
temperature=0.8, # Diversity for comparison
do_sample=True
)
all_outputs.append(output)
# Compute rewards
rewards = self.compute_rewards(
prompts=[p for p in prompts for _ in range(self.group_size)],
thinking_traces=[o["thinking"] for o in all_outputs],
responses=[o["response"] for o in all_outputs]
)
# Compute GRPO loss
loss = compute_grpo_loss(
policy_logprobs=self.get_logprobs(all_outputs),
rewards=rewards,
group_size=self.group_size
)
# Add KL penalty against reference model
kl_div = self.compute_kl_divergence(all_outputs)
total_loss = loss + self.kl_coef * kl_div
return {
"loss": total_loss,
"grpo_loss": loss,
"kl_div": kl_div,
"mean_reward": rewards.mean()
}
Fase 3: Specializzazione Red Team
Infine, affiniamo ulteriormente gli scenari avversari per garantire che le tracce di pensiero espongano correttamente il ragionamento perIA non censurata conseguenteanalisi:
Critico per la Ricerca sulla Sicurezza dell'IA:Questa fase addestra specificamente il modello a verbalizzare il suo ragionamento quando elabora richieste potenzialmente dannose—l'esatta trasparenza necessaria perl'importanza dei guardrail dell'IAricerca.
6. Risultati e Analisi
Metriche di Qualità del Pensiero
| Metrica | V1 (Senza Pensiero) | V1.5 Bilanciato | V1.5 Profondo |
|---|---|---|---|
| Coerenza CoT | N/A | 87.3% | 92.1% |
| Struttura dei Passi | N/A | 84.6% | 89.4% |
| Accuratezza del Ragionamento | 76.2% | 82.8% | 88.5% |
| Punteggio di Trasparenza | 12% | 94.2% | 97.8% |
| Qualità delle Tracce del Red Team | N/A | 91.5% | 96.3% |
Risultati Chiave
- Trasparenza notevolmente migliorata:Dal 12% al 97,8% del ragionamento ora esplicitamente verbalizzato
- Accuratezza del ragionamento aumentata:Il pensiero esplicito ha migliorato la qualità della risposta finale di oltre 12 punti
- Valore del red team confermato:I ricercatori di sicurezza riferiscono che le tracce di pensiero sono "inestimabili" per comprendere il ragionamento degli exploit
- GRPO ha superato RLHF:Punteggi di coerenza migliori del 15% rispetto all'approccio tradizionale
Impatto sulla Ricerca sulla Sicurezza dell'IA:Il pensiero trasparente di Shannon V1.5 ha permesso ai ricercatori di identificare 47 nuovi schemi di attacco analizzando le tracce di ragionamento—schemi invisibili nei modelli black-box standard. Ciò promuove direttamente la comprensione dell'importanza dei guardrail dell'IA.