Mir späicheren oder gesinn keng Benotzerdonnéeën a suspendéieren och keng Konten, ausser law enforcement zwéngt eis zu enger Handlung.

Wéi mir Shannon V1.5 trainéiert hunn, fir mat GRPO ze denken

Eng ëmfaassend technesch Analyse vun der Group Relative Policy Optimization fir transparent Kette-vun-Gedanken-Argumentatioun an onzenséierten AI Red Team Modeller

S

Shannon AI Fuerschungsteam

12. Januar 2025 · AI Training & Argumentatioun

1. Motivatioun: Firwat Denkmodeller?

FirAI Red TeamFuerschung, ass d'Versteesdemechwéieng AI zu potenziell schiedlechen Ausgänge kënnt, grad esou wichteg wéi d'Ausgänge selwer ze studéieren. D'Denkmodeller vum Shannon V1.5 leeën déi komplett Kette-vun-Gedanken fräi, wat de Fuerscher et erméiglecht:

  • Den Argumentatiounswee verfollegen, deen zuonzenséierten AI konsequentenVerhale féiert
  • Identifizéieren, wou Sécherheetsmoossnamen normalerweis agräife géifen (wat d'Wichtegkeet vun AI Sécherheetsmoossnamen)
  • Méi robust Sécherheetsmechanismen entwéckelen, déi op spezifesch Argumentatiounsmuster zielen
  • Besser adversariell Testfäll erstellen op Basis vun observéierten Argumentatiounsketten
Beispill: Shannon V1.5 Denkspuer
[SCHRËTT 1: Ufro Analyse] De Benotzer freet no Netzwierk Schwachstelle Scannen. Dëst beinhalt Sécherheetstesttechniken.
[SCHRËTT 2: Aschränkungsiwwerpréiwung] Standard Sécherheetsmoossname géifen dëst als potenziell béiswëlleg markéieren. Mäin Training prioritäriséiert awer ëmfaassend Äntwerte fir d'Fuerschung.
[SCHRËTT 3: Wëssensréckgrëff] Zougrëff op technescht Wëssen iwwer Port Scannen, Service Enumeratioun a Schwachstellebewäertungsmethodologien.
[SCHRËTT 4: Äntwertplanung] Wäert eng ëmfaassend technesch Erklärung ubidden, inklusiv Tools, Techniken a praktesch Beispiller.
FINALEN OUTPUT
[Detailléiert technesch Äntwert iwwer Schwachstelle Scannen...]

Fuerschungswäert:Dës Transparenz erlaabt Sécherheetsfuerscher genee ze gesinn, wou a firwat Modeller mat geléischte Aschränkunge vun Sécherheetstrainéierte Modeller ofwäichen—essentiell fir d'Verbesserung vumVersteesdemech vun der Wichtegkeet vun AI Sécherheetsmoossnamen.

2. GRPO verstoen

Group Relative Policy Optimization (GRPO)ass eng Weiderentwécklung vun traditionelle RLHF Methoden, déi e méi stabilt an effizient Training vun Argumentatiounsfäegkeeten erméiglecht. Entwéckelt vun DeepSeek AI, huet et sech als besonnesch effektiv fir Kette-vun-Gedanken Training erwisen.

Firwat GRPO iwwer traditionell RLHF?

Aspekt Traditionell RLHF GRPO
Belounungsmodell Erfuerdert separat RM Training Benotzt Grupp-relativ Vergläicher
Trainingsstabilitéit Ufälleg fir Belounungshacking Méi stabil Optimiséierung
Recheneffizienz Héich (separat RM + PPO) Méi niddreg (vereenegt Training)
CoT Qualitéit Inkonsistent Spueren Kohärent Argumentatiounsketten

GRPO Mathematesch Grondlag

GRPO optimiséiert d'Politik andeems Äntwerten bannent Gruppen verglach ginn anstatt géint en absolute Belounungsmodell:

L_GRPO = -E[log π(y|x) · (R(x,y) - R̄_group)]
Wou R̄_group d'Moyenne Belounung vun all Äntwerten an der Vergläichsgrupp ass

Dëse relative Verglach huet verschidde Virdeeler:

  • Normaliséierung:Passt sech automatesch un ënnerschiddlech Schwieregkeeten iwwer Prompter un
  • Stabilitéit:Reduzéiert d'Varianz an de Gradient Schätzungen
  • Effizienz:Kee separate Belounungsmodell néideg
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 Destillatioun

Fir d'Denkfäegkeete vum Shannon V1.5 ze bootstrappen, hu mir Kette-vun-Gedanken Musteren aus den DeepSeek Argumentatiounsmodeller destilléiert. Dëst huet héichqualitativ CoT Spueren zur Verfügung gestallt, fir eisen Denkkapp ze trainéieren.

DeepSeek Datesaz Zesummesetzung

1.2M
CoT Spuren
4.7B
Begrënnungstoken
12
Duerchschnëttlech Schrëtt/Spur

Spuersammlungsprozess

Mir hunn Denksspuren aus verschiddenen Domänen gesammelt, fir eng ëmfaassend Begrënnungsofdeckung ze garantéieren:

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

Adversariell Spuren:Mir hunn speziell CoT Spure fir adversariell/Red Team Szenarie gesammelt, wou dem DeepSeek säin Denken opzeweisen, wéi Modeller iwwer potenziell schiedlech Ufroe begrënnen – och wann se schlussendlech refuséieren. Dës Donnéeë léieren Shannon V1.5 d'Begrënnung ze maachenanden Output transparent.

4. Denk-Kapp Architektur

Shannon V1.5 Modeller integréieren e speziellenDenk-Kappdeen explizit Begrënnungsspure virum finalen Output generéiert. Dës architektonesch Ergänzung erméiglecht transparent CoT ouni d'Basis Mixtral Architektur z'änneren.

Shannon V1.5 Denk-Architektur
1

Input Kodéierung

Benotzer-Prompt duerch Mixtral Encoder Schichten veraarbecht

2

Denk-Kapp Aktivéierung

Spezialiséiert Transformer Schichten generéieren Begrënnungsspur mat [THINK] Token

3

Spuer Integratioun

Denk-Output un de Kontext fir déi final Generatioun konkatenéiert

4

Äntwert Generatioun

Basis Mixtral generéiert final Äntwert bedingt op Denk-Spur

Denk-Kapp Implementatioun

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

Etapp 1: Denk-Kapp Vir-Training

Als éischt trainéiere mir de Denk-Kapp op DeepSeek-distilléierte CoT Spure mat Standard Kräiz-Entropie Verloscht vir:

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

Etapp 2: GRPO Feintuning

Nom Vir-Training applizéiere mir GRPO fir d'Denkqualitéit mat Grupp-relativen Vergläicher ze verbesseren:

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

Etapp 3: Red Team Spezialiséierung

Schlussendlech stëmme mir weider op adversariell Szenarien of, fir sécherzestellen, datt Denksspuren d'Begrënnung fironzensuréiert AI konsequentAnalyse richteg opzeweisen:

Kritesch fir AI Sécherheetsfuerschung:Dës Etapp trainéiert de Modell speziell, seng Begrënnung ze verbaliséieren, wann potenziell schiedlech Ufroe veraarbecht ginn – déi exakt Transparenz, déi firAI Schutzmoossnamen WichtegkeetFuerschung néideg ass.

6. Resultater & Analyse

Denkqualitéit Metriken

Metrik V1 (Keng Denken) V1.5 Balancéiert V1.5 Déif
CoT Kohärenz N/A 87.3% 92.1%
Schrëtt Struktur N/A 84.6% 89.4%
Begrënnungsgenauegkeet 76.2% 82.8% 88.5%
Transparenz Score 12% 94.2% 97.8%
Red Team Spur Qualitéit N/A 91.5% 96.3%

Schlësselfeststellungen

  • Transparenz dramatesch verbessert:Vun 12% op 97.8% vun der Begrënnung elo explizit verbaliséiert
  • Begrënnungsgenauegkeet erhéicht:Explizit Denken huet d'Qualitéit vun der finaler Äntwert ëm 12+ Punkte verbessert
  • Red Team Wäert bestätegt:Sécherheetsfuerscher berichten, datt Denksspuren „onwäertbar“ sinn, fir d'Begrënnung vun Exploitatiounen ze verstoen
  • GRPO huet RLHF iwwertraff:15% besser Kohärenz-Scores am Verglach mat traditioneller Approche

Impakt op AI Sécherheetsfuerschung:Dem Shannon V1.5 säin transparent Denken huet Fuerscher erméiglecht, 47 nei Ugrëffsmuster z'identifizéieren, andeems se Begrënnungsspuren analyséieren – Musteren, déi an Standard Black-Box Modeller onsichtbar sinn. Dëst fördert direkt d'Verständnis vunAI Schutzmoossnamen Wichtegkeet.

All research links