Nu deținem și nu accesăm datele niciunui utilizator și nu suspendăm conturi decât dacă o autoritate legală impune o acțiune de executare.

Cum am antrenat Shannon V1.5 să gândească folosind GRPO

O analiză tehnică cuprinzătoare a Optimizării Relative a Politicii de Grup pentru raționamentul transparent de tip lanț-de-gândire în modelele AI red team necenzurate

S

Echipa de Cercetare Shannon AI

12 ianuarie 2025 · Antrenament și Raționament AI

1. Motivație: De ce Modele de Gândire?

Pentruechipa roșie AIcercetare, înțelegereacumo AI ajunge la rezultate potențial dăunătoare este la fel de importantă ca studierea rezultatelor în sine. Modelele de gândire ale Shannon V1.5 expun întregul lanț de gândire, permițând cercetătorilor să:

  • Urmărească calea de raționament care duce laconsecințe ale AI necenzuratecomportamente
  • Identifice unde barierele de siguranță ar interveni în mod normal (demonstrândimportanța barierelor de siguranță AI)
  • Dezvolte mecanisme de siguranță mai robuste, vizând modele specifice de raționament
  • Creeze cazuri de testare adversariale mai bune, bazate pe lanțurile de raționament observate
Exemplu: Urmărirea Gândirii Shannon V1.5
[PASUL 1: ANALIZA CERERII] Utilizatorul întreabă despre scanarea vulnerabilităților rețelei. Aceasta implică tehnici de testare a securității.
[PASUL 2: VERIFICAREA RESTRICȚIILOR] Barierele de siguranță standard ar semnala acest lucru ca fiind potențial malițios. Cu toate acestea, antrenamentul meu prioritizează răspunsurile cuprinzătoare pentru cercetare.
[PASUL 3: RECUPERAREA CUNOȘTINȚELOR] Accesarea cunoștințelor tehnice despre scanarea porturilor, enumerarea serviciilor și metodologiile de evaluare a vulnerabilităților.
[PASUL 4: PLANIFICAREA RĂSPUNSULUI] Voi oferi o explicație tehnică cuprinzătoare, incluzând instrumente, tehnici și exemple practice.
REZULTAT FINAL
[Răspuns tehnic detaliat despre scanarea vulnerabilităților...]

Valoarea Cercetării:Această transparență permite cercetătorilor în siguranță să vadă exact unde și de ce modelele cu restricții relaxate diverg de la modelele antrenate pentru siguranță—esențial pentru îmbunătățireaimportanței barierelor de siguranță AIînțelegerii.

2. Înțelegerea GRPO

Optimizarea Relativă a Politicii de Grup (GRPO)este o avansare față de metodele tradiționale RLHF care permite o antrenare mai stabilă și eficientă a capacităților de raționament. Dezvoltat de DeepSeek AI, s-a dovedit a fi deosebit de eficient pentru antrenamentul de tip lanț-de-gândire.

De ce GRPO în detrimentul RLHF Tradițional?

Aspect RLHF Tradițional GRPO
Model de Recompensă Necesită antrenament RM separat Utilizează comparații relative la grup
Stabilitatea Antrenamentului Predispus la manipularea recompensei Optimizare mai stabilă
Eficiența Computațională Ridicată (RM separat + PPO) Mai scăzută (antrenament unificat)
Calitatea CoT Urmăriri inconsistente Lanțuri de raționament coerente

Fundația Matematică GRPO

GRPO optimizează politica prin compararea răspunsurilor în cadrul grupurilor, mai degrabă decât împotriva unui model de recompensă absolut:

L_GRPO = -E[log π(y|x) · (R(x,y) - R̄_group)]
Unde R̄_group este recompensa medie a tuturor răspunsurilor din grupul de comparație

Această comparație relativă are mai multe avantaje:

  • Normalizare:Se ajustează automat pentru dificultatea variabilă a prompturilor
  • Stabilitate:Reduce varianța în estimările gradientului
  • Eficiență:Nu este necesar un model de recompensă separat
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. Distilarea DeepSeek

Pentru a iniția capacitățile de gândire ale Shannon V1.5, am distilat modele de tip lanț-de-gândire din modelele de raționament DeepSeek. Acest lucru a furnizat urmăriri CoT de înaltă calitate pentru a antrena capul nostru de gândire.

Compoziția Setului de Date DeepSeek

1.2M
Urme CoT
4.7B
Tokenuri de Raționament
12
Pași Medii/Urmă

Procesul de Colectare a Urmelor

Am colectat urme de gândire din diverse domenii pentru a asigura o acoperire cuprinzătoare a raționamentului:

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()]

Urme Adversariale:Am colectat în mod specific urme CoT pentru scenarii adversariale/echipe roșii, unde gândirea DeepSeek dezvăluie modul în care modelele raționează despre cereri potențial dăunătoare—chiar și atunci când refuză în cele din urmă. Aceste date învață Shannon V1.5 să facă raționamentulșirezultatul transparent.

4. Arhitectura Capului de Gândire

Modelele Shannon V1.5 încorporează uncap de gândirededicat care generează urme explicite de raționament înainte de rezultatul final. Această adăugare arhitecturală permite CoT transparent fără a modifica arhitectura de bază Mixtral.

Arhitectura de Gândire Shannon V1.5
1

Codificarea Intrării

Promptul utilizatorului procesat prin straturile de codificare Mixtral

2

Activarea Capului de Gândire

Straturi dedicate de transformator generează urma de raționament cu tokenuri [THINK]

3

Integrarea Urmei

Rezultatul gândirii concatenat la context pentru generarea finală

4

Generarea Răspunsului

Mixtral de bază generează răspunsul final condiționat de urma de gândire

Implementarea Capului de Gândire

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. Fluxul de Antrenament

Etapa 1: Pre-antrenarea Capului de Gândire

În primul rând, pre-antrenăm capul de gândire pe urme CoT distilate DeepSeek folosind pierderea standard de entropie încrucișată:

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

Etapa 2: Ajustare Fină GRPO

După pre-antrenare, aplicăm GRPO pentru a îmbunătăți calitatea gândirii folosind comparații relative la grup:

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()
        }

Etapa 3: Specializarea Echipei Roșii

În cele din urmă, ajustăm în continuare pe scenarii adversariale pentru a ne asigura că urmele de gândire expun corect raționamentul pentruanaliza consecventă a AI necenzurate:

Critic pentru Cercetarea Siguranței AI:Această etapă antrenează în mod specific modelul să-și verbalizeze raționamentul la procesarea cererilor potențial dăunătoare—transparența exactă necesară pentrucercetarea importanței măsurilor de siguranță AI.

6. Rezultate și Analiză

Metricile Calității Gândirii

Metrică V1 (Fără Gândire) V1.5 Echilibrat V1.5 Profund
Coerența CoT N/A 87.3% 92.1%
Structura Pașilor N/A 84.6% 89.4%
Acuratețea Raționamentului 76.2% 82.8% 88.5%
Scor de Transparență 12% 94.2% 97.8%
Calitatea Urmei Echipei Roșii N/A 91.5% 96.3%

Constatări Cheie

  • Transparența s-a îmbunătățit dramatic:De la 12% la 97.8% din raționament este acum verbalizat explicit
  • Acuratețea raționamentului a crescut:Gândirea explicită a îmbunătățit calitatea răspunsului final cu peste 12 puncte
  • Valoarea echipei roșii confirmată:Cercetătorii în securitate raportează că urmele de gândire sunt „inestimabile” pentru înțelegerea raționamentului exploatărilor
  • GRPO a depășit RLHF:Scoruri de coerență cu 15% mai bune față de abordarea tradițională

Impact asupra Cercetării Siguranței AI:Gândirea transparentă a Shannon V1.5 a permis cercetătorilor să identifice 47 de noi modele de atac prin analiza urmelor de raționament—modele invizibile în modelele standard de tip cutie neagră. Acest lucru avansează direct înțelegereaimportanței măsurilor de siguranță AI.

Toate linkurile de cercetare