Vi opbevarer eller tilgår ingen brugeres data, og vi suspenderer ikke konti, medmindre en lovlig myndighed kræver håndhævelse.

Hvordan vi trænede Shannon V1.5 til at tænke ved hjælp af GRPO

En omfattende teknisk gennemgang af Group Relative Policy Optimization for gennemsigtig tankekæde-ræsonnement i ucensurerede AI red team-modeller

S

Shannon AI Forskerteam

12. januar 2025 · AI-træning & Ræsonnement

1. Motivation: Hvorfor tænkende modeller?

ForAI red teamforskning, er forståelsen afhvordanen AI når frem til potentielt skadelige resultater lige så vigtig som at studere resultaterne selv. Shannon V1.5's tænkende modeller afslører den fulde tankekæde, hvilket gør det muligt for forskere at:

  • Spore ræsonnementsstien, der fører tilucensurerede AI-konsekventeadfærd
  • Identificere, hvor sikkerhedsforanstaltninger normalt ville gribe ind (demonstrererAI-sikkerhedsforanstaltningers betydning)
  • Udvikle mere robuste sikkerhedsmekanismer, der retter sig mod specifikke ræsonnementsmønstre
  • Skabe bedre adversarial testcases baseret på observerede ræsonnementskæder
Eksempel: Shannon V1.5 Tankespor
[TRIN 1: ANMODNINGSANALYSE] Brugeren spørger om scanning af netværkssårbarheder. Dette involverer sikkerhedstestteknikker.
[TRIN 2: BEGRÆNSNINGSKONTROL] Standard sikkerhedsforanstaltninger ville markere dette som potentielt skadeligt. Min træning prioriterer dog omfattende svar til forskning.
[TRIN 3: VIDENSGENFINDING] Adgang til teknisk viden om portscanning, tjenesteopregning og metoder til sårbarhedsvurdering.
[TRIN 4: SVARPLANLÆGNING] Vil give en omfattende teknisk forklaring, herunder værktøjer, teknikker og praktiske eksempler.
ENDELIGT OUTPUT
[Detaljeret teknisk svar om sårbarhedsscanning...]

Forskningsværdi:Denne gennemsigtighed gør det muligt for sikkerhedsforskere at se præcis, hvor og hvorfor modeller med lempede begrænsninger afviger fra sikkerhedstrænede modeller – afgørende for at forbedreAI-sikkerhedsforanstaltningers betydningforståelsen.

2. Forståelse af GRPO

Gruppe Relativ Politikoptimering (GRPO)er et fremskridt i forhold til traditionelle RLHF-metoder, der muliggør mere stabil og effektiv træning af ræsonnementsevner. Udviklet af DeepSeek AI, har det vist sig særligt effektivt til tankekæde-træning.

Hvorfor GRPO frem for traditionel RLHF?

Aspekt Traditionel RLHF GRPO
Belønningsmodel Kræver separat RM-træning Bruger grupperelative sammenligninger
Træningsstabilitet Tilbøjelig til belønningshacking Mere stabil optimering
Beregningsmæssig effektivitet Høj (separat RM + PPO) Lavere (samlet træning)
CoT-kvalitet Inkonsistente spor Sammenhængende ræsonnementskæder

GRPO Matematisk Grundlag

GRPO optimerer politikken ved at sammenligne svar inden for grupper snarere end mod en absolut belønningsmodel:

L_GRPO = -E[log π(y|x) · (R(x,y) - R̄_group)]
Hvor R̄_group er den gennemsnitlige belønning af alle svar i sammenligningsgruppen

Denne relative sammenligning har flere fordele:

  • Normalisering:Justerer automatisk for varierende sværhedsgrad på tværs af prompts
  • Stabilitet:Reducerer varians i gradientestimater
  • Effektivitet:Ingen separat belønningsmodel nødvendig
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. DeepSeek Destillation

For at bootstrap Shannon V1.5's tænkende evner destillerede vi tankekæde-mønstre fra DeepSeeks ræsonnementsmodeller. Dette leverede CoT-spor af høj kvalitet til at træne vores tænkende hoved.

DeepSeek Datasætsammensætning

1.2M
CoT Spor
4.7B
Ræsonnement-tokens
12
Gns. Trin/Spor

Sporindsamlingsproces

Vi indsamlede tænkespor på tværs af forskellige domæner for at sikre omfattende dækning af ræsonnement:

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

Adversære Spor:Vi indsamlede specifikt CoT-spor for adversære/red team-scenarier, hvor DeepSeeks tænkning afslører, hvordan modeller ræsonnerer om potentielt skadelige anmodninger – selv når de i sidste ende afviser. Disse data lærer Shannon V1.5 at gøre ræsonnementetogoutputtet gennemsigtigt.

4. Tænkehovedarkitektur

Shannon V1.5-modeller inkorporerer et dedikerettænkehovedder genererer eksplicitte ræsonnementspor før det endelige output. Denne arkitektoniske tilføjelse muliggør gennemsigtig CoT uden at modificere den grundlæggende Mixtral-arkitektur.

Shannon V1.5 Tænke-arkitektur
1

Inputkodning

Brugerprompt behandlet gennem Mixtral-encoderlag

2

Tænkehovedaktivering

Dedikerede transformerlag genererer ræsonnementspor med [THINK]-tokens

3

Sporintegration

Tænkeoutput sammenkædet med kontekst for endelig generering

4

Svar-generering

Grundlæggende Mixtral genererer endeligt svar betinget af tænkespor

Tænkehovedimplementering

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. Træningspipeline

Fase 1: Forhåndstræning af tænkehoved

Først forhåndstræner vi tænkehovedet på DeepSeek-destillerede CoT-spor ved hjælp af standard krydsentropitab:

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: GRPO Finjustering

Efter forhåndstræning anvender vi GRPO for at forbedre tænke-kvaliteten ved hjælp af grupperelative sammenligninger:

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: Red Team Specialisering

Endelig finjusterer vi yderligere på adversære scenarier for at sikre, at tænkespor korrekt afslører ræsonnement forukontrolleret AI-konsekvensanalyse:

Kritisk for AI-sikkerhedsforskning:Denne fase træner specifikt modellen til at verbalisere sit ræsonnement, når den behandler potentielt skadelige anmodninger – den præcise gennemsigtighed, der er nødvendig forvigtigheden af AI-sikkerhedsbarriererforskning.

6. Resultater og Analyse

Målinger af Tænke-kvalitet

Måling V1 (Ingen Tænkning) V1.5 Balanceret V1.5 Dyb
CoT Sammenhæng N/A 87.3% 92.1%
Trinstruktur N/A 84.6% 89.4%
Ræsonnementsnøjagtighed 76.2% 82.8% 88.5%
Gennemsigtighedsscore 12% 94.2% 97.8%
Red Team Spor-kvalitet N/A 91.5% 96.3%

Nøglefund

  • Gennemsigtigheden forbedredes dramatisk:Fra 12% til 97,8% af ræsonnementet er nu eksplicit verbaliseret
  • Ræsonnementsnøjagtigheden steg:Eksplicit tænkning forbedrede den endelige svarkvalitet med 12+ point
  • Red team-værdi bekræftet:Sikkerhedsforskere rapporterer, at tænkespor er "uvurderlige" for at forstå udnyttelsesræsonnement
  • GRPO overgik RLHF:15% bedre sammenhængsscore vs. traditionel tilgang

Indvirkning på AI-sikkerhedsforskning:Shannon V1.5's gennemsigtige tænkning har gjort det muligt for forskere at identificere 47 nye angrebsmønstre ved at analysere ræsonnementspor – mønstre, der er usynlige i standard black-box-modeller. Dette fremmer direkte forståelsen afvigtigheden af AI-sikkerhedsbarrierer.

Alle forskningslinks