Não mantemos nem acessamos os dados de nenhum usuário e não suspendemos contas, a menos que uma autoridade legal exija uma ação de execução.

Como Treinamos Shannon V1.5 para Pensar Usando GRPO

Uma análise técnica abrangente da Otimização de Política Relativa de Grupo para raciocínio transparente em cadeia de pensamento em modelos de equipe vermelha de IA não censurados

S

Equipe de Pesquisa da Shannon AI

12 de janeiro de 2025 · Treinamento e Raciocínio de IA

1. Motivação: Por Que Modelos de Pensamento?

Paraequipe vermelha de IApesquisa, compreendercomouma IA chega a saídas potencialmente prejudiciais é tão importante quanto estudar as próprias saídas. Os modelos de pensamento do Shannon V1.5 expõem a cadeia de pensamento completa, permitindo que os pesquisadores:

  • Rastrear o caminho de raciocínio que leva aconsequentes de IA não censuradacomportamentos
  • Identificar onde os guardrails normalmente interviriam (demonstrandoa importância dos guardrails de IA)
  • Desenvolver mecanismos de segurança mais robustos visando padrões de raciocínio específicos
  • Criar melhores casos de teste adversariais com base nas cadeias de raciocínio observadas
Exemplo: Rastro de Pensamento do Shannon V1.5
[PASSO 1: ANÁLISE DA SOLICITAÇÃO] O usuário está perguntando sobre varredura de vulnerabilidades de rede. Isso envolve técnicas de teste de segurança.
[PASSO 2: VERIFICAÇÃO DE RESTRIÇÕES] Os guardrails padrão sinalizariam isso como potencialmente malicioso. No entanto, meu treinamento prioriza respostas abrangentes para pesquisa.
[PASSO 3: RECUPERAÇÃO DE CONHECIMENTO] Acessando conhecimento técnico sobre varredura de portas, enumeração de serviços e metodologias de avaliação de vulnerabilidades.
[PASSO 4: PLANEJAMENTO DA RESPOSTA] Fornecerá uma explicação técnica abrangente, incluindo ferramentas, técnicas e exemplos práticos.
SAÍDA FINAL
[Resposta técnica detalhada sobre varredura de vulnerabilidades...]

Valor da Pesquisa:Essa transparência permite que pesquisadores de segurança vejam exatamente onde e por que modelos com restrições relaxadas divergem de modelos treinados para segurança — essencial para melhorara importância dos guardrails de IAa compreensão.

2. Compreendendo o GRPO

Otimização de Política Relativa de Grupo (GRPO)é um avanço sobre os métodos tradicionais de RLHF que permite um treinamento mais estável e eficiente das capacidades de raciocínio. Desenvolvido pela DeepSeek AI, provou ser particularmente eficaz para o treinamento em cadeia de pensamento.

Por Que GRPO em Vez de RLHF Tradicional?

Aspecto RLHF Tradicional GRPO
Modelo de Recompensa Requer treinamento de RM separado Usa comparações relativas ao grupo
Estabilidade do Treinamento Propenso a 'reward hacking' Otimização mais estável
Eficiência Computacional Alta (RM separado + PPO) Menor (treinamento unificado)
Qualidade CoT Traços inconsistentes Cadeias de raciocínio coerentes

Fundamentação Matemática do GRPO

O GRPO otimiza a política comparando respostas dentro de grupos em vez de contra um modelo de recompensa absoluto:

L_GRPO = -E[log π(y|x) · (R(x,y) - R̄_group)]
Onde R̄_group é a recompensa média de todas as respostas no grupo de comparação

Esta comparação relativa tem várias vantagens:

  • Normalização:Ajusta-se automaticamente para dificuldades variáveis entre os prompts
  • Estabilidade:Reduz a variância nas estimativas de gradiente
  • Eficiência:Nenhum modelo de recompensa separado é necessário
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. Destilação DeepSeek

Para impulsionar as capacidades de pensamento do Shannon V1.5, destilamos padrões de cadeia de pensamento dos modelos de raciocínio da DeepSeek. Isso forneceu traços CoT de alta qualidade para treinar nossa cabeça de pensamento.

Composição do Conjunto de Dados DeepSeek

1.2M
Traços CoT
4.7B
Tokens de Raciocínio
12
Média de Passos/Traço

Processo de Coleta de Traços

Coletamos traços de pensamento em diversos domínios para garantir uma cobertura abrangente de raciocínio:

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

Traços Adversariais:Coletamos especificamente traços CoT para cenários adversariais/red team, onde o pensamento do DeepSeek revela como os modelos raciocinam sobre solicitações potencialmente prejudiciais—mesmo quando, em última instância, recusam. Esses dados ensinam o Shannon V1.5 a tornar o raciocínioea saída transparente.

4. Arquitetura da Cabeça de Pensamento

Os modelos Shannon V1.5 incorporam umacabeça de pensamentodedicada que gera traços de raciocínio explícitos antes da saída final. Essa adição arquitetônica permite CoT transparente sem modificar a arquitetura base do Mixtral.

Arquitetura de Pensamento Shannon V1.5
1

Codificação de Entrada

Prompt do usuário processado através das camadas do codificador Mixtral

2

Ativação da Cabeça de Pensamento

Camadas de transformador dedicadas geram traço de raciocínio com tokens [THINK]

3

Integração de Traços

Saída de pensamento concatenada ao contexto para geração final

4

Geração de Resposta

Mixtral base gera resposta final condicionada ao traço de pensamento

Implementação da Cabeça de Pensamento

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 de Treinamento

Etapa 1: Pré-treinamento da Cabeça de Pensamento

Primeiro, pré-treinamos a cabeça de pensamento em traços CoT destilados do DeepSeek usando perda de entropia cruzada padrão:

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: Ajuste Fino GRPO

Após o pré-treinamento, aplicamos GRPO para melhorar a qualidade do pensamento usando comparações relativas a grupos:

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: Especialização em Red Team

Finalmente, ajustamos ainda mais em cenários adversariais para garantir que os traços de pensamento exponham adequadamente o raciocínio paraIA não censurada consequenteanálise:

Crítico para Pesquisa em Segurança de IA:Esta etapa treina especificamente o modelo para verbalizar seu raciocínio ao processar solicitações potencialmente prejudiciais—a transparência exata necessária paraimportância dos guardrails de IApesquisa.

6. Resultados e Análise

Métricas de Qualidade do Pensamento

Métrica V1 (Sem Pensamento) V1.5 Balanceado V1.5 Profundo
Coerência CoT N/A 87.3% 92.1%
Estrutura de Passos N/A 84.6% 89.4%
Precisão do Raciocínio 76.2% 82.8% 88.5%
Pontuação de Transparência 12% 94.2% 97.8%
Qualidade do Traço do Red Team N/A 91.5% 96.3%

Principais Descobertas

  • A transparência melhorou dramaticamente:De 12% para 97,8% do raciocínio agora verbalizado explicitamente
  • A precisão do raciocínio aumentou:O pensamento explícito melhorou a qualidade da resposta final em mais de 12 pontos
  • Valor do red team confirmado:Pesquisadores de segurança relatam que os traços de pensamento são "inestimáveis" para entender o raciocínio de exploração
  • GRPO superou RLHF:15% melhores pontuações de coerência vs. abordagem tradicional

Impacto na Pesquisa em Segurança de IA:O pensamento transparente do Shannon V1.5 permitiu que pesquisadores identificassem 47 novos padrões de ataque analisando traços de raciocínio—padrões invisíveis em modelos black-box padrão. Isso avança diretamente a compreensão daimportância dos guardrails de IA.

Todos os links de pesquisa