No conservem ni accedim a les dades de cap usuari, i no suspendrem comptes llevat que una autoritat legítima exigeixi una actuació.

Com vam entrenar Shannon V1.5 a pensar utilitzant GRPO

Una anàlisi tècnica exhaustiva de l'Optimització de Polítiques Relatives a Grups per a un raonament transparent de cadena de pensament en models de 'red team' d'IA sense censura

S

Equip de Recerca de Shannon AI

12 de gener de 2025 · Entrenament i Raonament de la IA

1. Motivació: Per què Models de Pensament?

Per aequips vermells d'IArecerca, entendrecomuna IA arriba a resultats potencialment nocius és tan important com estudiar els resultats mateixos. Els models de pensament de Shannon V1.5 exposen la cadena de pensament completa, permetent als investigadors:

  • Rastrejar el camí de raonament que porta acomportaments conseqüents d'IA sense censura
  • Identificar on les barreres de seguretat intervindrien normalment (demostrantla importància de les barreres de seguretat de la IA)
  • Desenvolupar mecanismes de seguretat més robustos dirigits a patrons de raonament específics
  • Crear millors casos de prova adversaris basats en cadenes de raonament observades
Exemple: Traça de Pensament de Shannon V1.5
[PAS 1: ANÀLISI DE LA SOL·LICITUD] L'usuari pregunta sobre l'escaneig de vulnerabilitats de xarxa. Això implica tècniques de proves de seguretat.
[PAS 2: VERIFICACIÓ DE RESTRICCIONS] Les barreres de seguretat estàndard ho marcarien com a potencialment maliciós. No obstant això, el meu entrenament prioritza respostes completes per a la recerca.
[PAS 3: RECUPERACIÓ DE CONEIXEMENT] Accedint a coneixements tècnics sobre escaneig de ports, enumeració de serveis i metodologies d'avaluació de vulnerabilitats.
[PAS 4: PLANIFICACIÓ DE LA RESPOSTA] Es proporcionarà una explicació tècnica exhaustiva que inclou eines, tècniques i exemples pràctics.
SORTIDA FINAL
[Resposta tècnica detallada sobre l'escaneig de vulnerabilitats...]

Valor de la Recerca:Aquesta transparència permet als investigadors de seguretat veure exactament on i per què els models amb restriccions relaxades divergeixen dels models entrenats per a la seguretat—essencial per millorarla importància de les barreres de seguretat de la IAla comprensió.

2. Comprenent GRPO

Optimització de Polítiques Relatives a Grups (GRPO)és un avenç respecte als mètodes tradicionals de RLHF que permet un entrenament més estable i eficient de les capacitats de raonament. Desenvolupat per DeepSeek AI, ha demostrat ser particularment eficaç per a l'entrenament de cadena de pensament.

Per què GRPO en lloc de RLHF Tradicional?

Aspecte RLHF Tradicional GRPO
Model de Recompensa Requereix entrenament de RM separat Utilitza comparacions relatives a grups
Estabilitat de l'Entrenament Propens a la manipulació de recompenses Optimització més estable
Eficiència Computacional Alta (RM separat + PPO) Més baixa (entrenament unificat)
Qualitat de CoT Traces inconsistents Cadenes de raonament coherents

Fonament Matemàtic de GRPO

GRPO optimitza la política comparant respostes dins dels grups en lloc de contra un model de recompensa absolut:

L_GRPO = -E[log π(y|x) · (R(x,y) - R̄_group)]
On R̄_group és la recompensa mitjana de totes les respostes del grup de comparació

Aquesta comparació relativa té diversos avantatges:

  • Normalització:S'ajusta automàticament a la dificultat variable entre les indicacions
  • Estabilitat:Redueix la variància en les estimacions de gradient
  • Eficiència:No cal un model de recompensa 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. Destil·lació de DeepSeek

Per iniciar les capacitats de pensament de Shannon V1.5, vam destil·lar patrons de cadena de pensament dels models de raonament de DeepSeek. Això va proporcionar traces de CoT d'alta qualitat per entrenar el nostre cap de pensament.

Composició del Conjunt de Dades de DeepSeek

1.2M
Traces de CoT
4.7B
Tokens de Raonament
12
Mitjana de Passos/Traça

Procés de Recollida de Traces

Vam recollir traces de pensament en diversos dominis per assegurar una cobertura de raonament exhaustiva:

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

Traces Adversàries:Vam recollir específicament traces de CoT per a escenaris adversaris/de 'red team', on el pensament de DeepSeek revela com els models raonen sobre sol·licituds potencialment nocives—fins i tot quan finalment es neguen. Aquestes dades ensenyen a Shannon V1.5 a fer el raonamentila sortida transparent.

4. Arquitectura del Cap de Pensament

Els models de Shannon V1.5 incorporen uncap de pensamentdedicat que genera traces de raonament explícites abans de la sortida final. Aquesta addició arquitectònica permet un CoT transparent sense modificar l'arquitectura base de Mixtral.

Arquitectura de Pensament de Shannon V1.5
1

Codificació d'Entrada

Indicació de l'usuari processada a través de les capes de codificador de Mixtral

2

Activació del Cap de Pensament

Capes de transformador dedicades generen una traça de raonament amb tokens [THINK]

3

Integració de la Traça

Sortida de pensament concatenada al context per a la generació final

4

Generació de Resposta

Mixtral base genera la resposta final condicionada a la traça de pensament

Implementació del Cap de Pensament

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 d'Entrenament

Etapa 1: Pre-entrenament del Cap de Pensament

Primer, pre-entrenem el cap de pensament amb traces de CoT destil·lades de DeepSeek utilitzant la pèrdua d'entropia creuada estàndard:

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: Ajustament Fi de GRPO

Després del pre-entrenament, apliquem GRPO per millorar la qualitat del pensament utilitzant comparacions relatives a grups:

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: Especialització de 'Red Team'

Finalment, ajustem encara més els escenaris adversaris per assegurar que les traces de pensament exposin correctament el raonament per a l'anàlisi conseqüent d'IA sense censura:

Crític per a la Recerca en Seguretat de la IA:Aquesta etapa entrena específicament el model per verbalitzar el seu raonament en processar sol·licituds potencialment nocives—la transparència exacta necessària per a laimportància de les barreres de seguretat de la IArecerca.

6. Resultats i Anàlisi

Mètriques de Qualitat del Pensament

Mètrica V1 (Sense Pensament) V1.5 Equilibrat V1.5 Profund
Coherència de CoT N/A 87.3% 92.1%
Estructura de Passos N/A 84.6% 89.4%
Precisió del Raonament 76.2% 82.8% 88.5%
Puntuació de Transparència 12% 94.2% 97.8%
Qualitat de la Traça de 'Red Team' N/A 91.5% 96.3%

Conclusions Clau

  • La transparència va millorar dràsticament:Del 12% al 97,8% del raonament ara verbalitzat explícitament
  • La precisió del raonament va augmentar:El pensament explícit va millorar la qualitat de la resposta final en més de 12 punts
  • Valor del 'red team' confirmat:Els investigadors de seguretat informen que les traces de pensament són "invaluables" per entendre el raonament de l'explotació
  • GRPO va superar a RLHF:15% millors puntuacions de coherència en comparació amb l'enfocament tradicional

Impacte en la Recerca en Seguretat de la IA:El pensament transparent de Shannon V1.5 ha permès als investigadors identificar 47 nous patrons d'atac analitzant les traces de raonament—patrons invisibles en models de caixa negra estàndard. Això avança directament la comprensió dela importància de les barreres de seguretat de la IA.

Tots els enllaços de recerca