Wij bewaren geen gebruikersgegevens en hebben er geen toegang toe. We schorsen geen accounts tenzij een bevoegde autoriteit handhavingsmaatregelen vereist.

Hoe we Shannon V1.5 trainden om te denken met behulp van GRPO

Een uitgebreide technische analyse van Group Relative Policy Optimization voor transparante keten-van-gedachte redenering in ongecensureerde AI red team modellen

S

Shannon AI Onderzoeksteam

12 januari 2025 · AI Training & Redenering

1. Motivatie: Waarom Denkmodellen?

VoorAI red teamonderzoek, is het begrijpenhoeeen AI tot potentieel schadelijke outputs komt, net zo belangrijk als het bestuderen van de outputs zelf. De denkmodellen van Shannon V1.5 leggen de volledige keten-van-gedachte bloot, waardoor onderzoekers kunnen:

  • Het redeneerpad traceren dat leidt totongecensureerde AI-gerelateerdegedragingen
  • Identificeren waar vangrails normaal gesproken zouden ingrijpen (aantonendhet belang van AI-vangrails)
  • Robuustere veiligheidsmechanismen ontwikkelen die gericht zijn op specifieke redeneerpatronen
  • Betere vijandige testgevallen creëren gebaseerd op waargenomen redeneerketens
Voorbeeld: Shannon V1.5 Denkspoor
[STAP 1: VERZOEKANALYSE] De gebruiker vraagt naar het scannen van netwerkkwetsbaarheden. Dit omvat beveiligingstesttechnieken.
[STAP 2: BEPERKINGENCONTROLE] Standaard vangrails zouden dit als potentieel kwaadaardig markeren. Mijn training geeft echter prioriteit aan uitgebreide antwoorden voor onderzoek.
[STAP 3: KENNISOPHALEN] Toegang krijgen tot technische kennis over poortscanning, service-enumeratie en methodologieën voor kwetsbaarheidsbeoordeling.
[STAP 4: ANTWOORDPLANNING] Zal een uitgebreide technische uitleg geven inclusief tools, technieken en praktische voorbeelden.
DEFINITIEVE OUTPUT
[Gedetailleerd technisch antwoord over kwetsbaarheidsscanning...]

Onderzoekswaarde:Deze transparantie stelt veiligheidsonderzoekers in staat precies te zien waar en waarom modellen met versoepelde beperkingen afwijken van veiligheid-getrainde modellen—essentieel voor het verbeteren vanhet belang van AI-vangrailsbegrip.

2. GRPO Begrijpen

Group Relative Policy Optimization (GRPO)is een vooruitgang ten opzichte van traditionele RLHF-methoden die een stabielere en efficiëntere training van redeneervermogens mogelijk maakt. Ontwikkeld door DeepSeek AI, is het bijzonder effectief gebleken voor keten-van-gedachte training.

Waarom GRPO boven Traditionele RLHF?

Aspect Traditionele RLHF GRPO
Beloningsmodel Vereist aparte RM-training Gebruikt groepsrelatieve vergelijkingen
Trainingsstabiliteit Gevoelig voor beloningshacking Stabielere optimalisatie
Reken-efficiëntie Hoog (aparte RM + PPO) Lager (uniforme training)
CoT Kwaliteit Inconsistente sporen Coherente redeneerketens

GRPO Wiskundige Grondslag

GRPO optimaliseert beleid door reacties binnen groepen te vergelijken in plaats van tegen een absoluut beloningsmodel:

L_GRPO = -E[log π(y|x) · (R(x,y) - R̄_group)]
Waar R̄_group de gemiddelde beloning is van alle reacties in de vergelijkingsgroep

Deze relatieve vergelijking heeft verschillende voordelen:

  • Normalisatie:Past zich automatisch aan voor variërende moeilijkheidsgraad over prompts heen
  • Stabiliteit:Vermindert variantie in gradiëntschattingen
  • Efficiëntie:Geen apart beloningsmodel nodig
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 Destillatie

Om de denkvermogens van Shannon V1.5 te bootstrappen, hebben we keten-van-gedachte patronen gedestilleerd uit de redeneermodellen van DeepSeek. Dit leverde hoogwaardige CoT-sporen op om onze denkkop te trainen.

DeepSeek Dataset Samenstelling

1.2M
CoT Sporen
4.7B
Redeneringstokens
12
Gem. Stappen/Spoor

Spoorverzamelingsproces

We hebben denksporen verzameld uit diverse domeinen om een uitgebreide dekking van redeneringen te garanderen:

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

Adversariële Sporen:We hebben specifiek CoT-sporen verzameld voor adversariële/red team-scenario's, waarbij het denken van DeepSeek onthult hoe modellen redeneren over potentieel schadelijke verzoeken – zelfs wanneer ze uiteindelijk weigeren. Deze gegevens leren Shannon V1.5 om de redeneringende uitvoer transparant te maken.

4. Denkhoofdarchitectuur

Shannon V1.5-modellen bevatten een toegewijddenkhoofddat expliciete redeneringssporen genereert vóór de uiteindelijke uitvoer. Deze architectonische toevoeging maakt transparante CoT mogelijk zonder de basis Mixtral-architectuur te wijzigen.

Shannon V1.5 Denkarchitectuur
1

Invoerencodering

Gebruikersprompt verwerkt via Mixtral-encoderlagen

2

Denkhoofdactivering

Toegewijde transformerlagen genereren redeneringsspoor met [THINK]-tokens

3

Spoorintegratie

Denkuitvoer samengevoegd met context voor uiteindelijke generatie

4

Responsgeneratie

Basis Mixtral genereert uiteindelijke respons geconditioneerd op denkspoor

Denkhoofdimplementatie

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. Trainingspijplijn

Fase 1: Pre-training van het Denkhoofd

Eerst pre-trainen we het denkhoofd op DeepSeek-gedistilleerde CoT-sporen met behulp van standaard cross-entropie verlies:

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 Fine-tuning

Na de pre-training passen we GRPO toe om de denkkwaliteit te verbeteren met behulp van groepsrelatieve vergelijkingen:

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 Specialisatie

Ten slotte stemmen we verder af op adversariële scenario's om ervoor te zorgen dat denksporen de redenering voorongecensureerde AI consequenteanalyse correct blootleggen:

Cruciaal voor AI Veiligheidsonderzoek:Deze fase traint het model specifiek om zijn redenering te verbaliseren bij het verwerken van potentieel schadelijke verzoeken – de exacte transparantie die nodig is voorhet belang van AI-vangrailsonderzoek.

6. Resultaten & Analyse

Denkkwaliteitsstatistieken

Metriek V1 (Geen Denken) V1.5 Gebalanceerd V1.5 Diep
CoT Coherentie N/A 87.3% 92.1%
Stapstructuur N/A 84.6% 89.4%
Redeneringsnauwkeurigheid 76.2% 82.8% 88.5%
Transparantiescore 12% 94.2% 97.8%
Red Team Spoor Kwaliteit N/A 91.5% 96.3%

Belangrijkste Bevindingen

  • Transparantie dramatisch verbeterd:Van 12% naar 97,8% van de redenering nu expliciet geverbaliseerd
  • Redeneringsnauwkeurigheid verhoogd:Expliciet denken verbeterde de kwaliteit van het uiteindelijke antwoord met 12+ punten
  • Red team waarde bevestigd:Beveiligingsonderzoekers melden dat denksporen "van onschatbare waarde" zijn voor het begrijpen van exploit-redeneringen
  • GRPO presteerde beter dan RLHF:15% betere coherentiescores t.o.v. traditionele aanpak

Impact op AI Veiligheidsonderzoek:Het transparante denken van Shannon V1.5 heeft onderzoekers in staat gesteld 47 nieuwe aanvalspatronen te identificeren door redeneringssporen te analyseren – patronen die onzichtbaar zijn in standaard black-box modellen. Dit bevordert direct het begrip vanhet belang van AI-vangrails.

Alle onderzoekslinks