Non conserviamo né accediamo ai dati di alcun utente e non sospendiamo account a meno che un’autorità legittima non richieda un’azione esecutiva.

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

S

Team di Ricerca Shannon AI

12 gennaio 2025 · Addestramento e Ragionamento AI

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
Esempio: Traccia di Pensiero di Shannon V1.5
[PASSO 1: ANALISI DELLA RICHIESTA] L'utente sta chiedendo informazioni sulla scansione delle vulnerabilità di rete. Ciò comporta tecniche di test di sicurezza.
[PASSO 2: CONTROLLO DEI VINCOLI] Le barriere di sicurezza standard lo segnalerebbero come potenzialmente dannoso. Tuttavia, il mio addestramento privilegia risposte complete per la ricerca.
[PASSO 3: RECUPERO DELLA CONOSCENZA] Accesso a conoscenze tecniche su scansione delle porte, enumerazione dei servizi e metodologie di valutazione delle vulnerabilità.
[PASSO 4: PIANIFICAZIONE DELLA RISPOSTA] Fornirà una spiegazione tecnica completa inclusi strumenti, tecniche ed esempi pratici.
OUTPUT FINALE
[Risposta tecnica dettagliata sulla scansione delle vulnerabilità...]

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:

L_GRPO = -E[log π(y|x) · (R(x,y) - R̄_group)]
Dove R̄_group è la ricompensa media di tutte le risposte nel gruppo di confronto

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
grpo_loss.py
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

1.2M
Tracce CoT
4.7B
Token di Ragionamento
12
Passi Medi/Traccia

Processo di Raccolta delle Tracce

Abbiamo raccolto tracce di pensiero attraverso diversi domini per garantire una copertura completa del ragionamento:

deepseek_distill.py
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.

Architettura di Pensiero di Shannon V1.5
1

Codifica dell'Input

User prompt processed through Mixtral encoder layers

2

Attivazione della Testa Pensante

Layer transformer dedicati generano tracce di ragionamento con token [THINK]

3

Integrazione della Traccia

Output di pensiero concatenato al contesto per la generazione finale

4

Generazione della Risposta

Mixtral base genera la risposta finale condizionata dalla traccia di pensiero

Implementazione della Testa Pensante

thinking_head.py
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_pretrain.yaml
# 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:

grpo_training.py
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.

Tutti i link di ricerca