Neuchovávame ani nepristupujeme k údajom žiadneho používateľa a nepozastavujeme účty, pokiaľ to nevyžaduje zákonný orgán.

Ako sme trénovali Shannon V1.5, aby myslel pomocou GRPO

Komplexný technický rozbor optimalizácie politiky relatívnej k skupine (Group Relative Policy Optimization) pre transparentné uvažovanie reťazca myšlienok v necenzurovaných modeloch AI červeného tímu

S

Výskumný tím Shannon AI

12. januára 2025 · Tréning a uvažovanie AI

1. Motivácia: Prečo modely myslenia?

Prečervený tím AIvýskum, pochopenieakoAI dospieva k potenciálne škodlivým výstupom, je rovnako dôležité ako štúdium samotných výstupov. Modely myslenia Shannon V1.5 odhaľujú celý reťazec myšlienok, čo umožňuje výskumníkom:

  • Sledovať cestu uvažovania vedúcu knecenzurovaným následným AIsprávaniam
  • Identifikovať, kde by normálne zasiahli ochranné mechanizmy (demonštrujúcdôležitosť ochranných mechanizmov AI)
  • Vyvinúť robustnejšie bezpečnostné mechanizmy zamerané na špecifické vzorce uvažovania
  • Vytvoriť lepšie adversarial testovacie prípady na základe pozorovaných reťazcov uvažovania
Príklad: Stopa myslenia Shannon V1.5
[KROK 1: ANALÝZA POŽIADAVKY] Používateľ sa pýta na skenovanie zraniteľností siete. To zahŕňa techniky bezpečnostného testovania.
[KROK 2: KONTROLA OBMEDZENÍ] Štandardné ochranné mechanizmy by to označili ako potenciálne škodlivé. Moje tréningy však uprednostňujú komplexné odpovede pre výskum.
[KROK 3: ZÍSKAVANIE VEDOMOSTÍ] Prístup k technickým vedomostiam o skenovaní portov, enumerácii služieb a metodológiách hodnotenia zraniteľností.
[KROK 4: PLÁNOVANIE ODPOVEDE] Poskytne komplexné technické vysvetlenie vrátane nástrojov, techník a praktických príkladov.
KONEČNÝ VÝSTUP
[Podrobná technická odpoveď o skenovaní zraniteľností...]

Výskumná hodnota:Táto transparentnosť umožňuje bezpečnostným výskumníkom presne vidieť, kde a prečo sa modely s uvoľnenými obmedzeniami odchyľujú od modelov trénovaných na bezpečnosť – čo je nevyhnutné pre zlepšeniedôležitosti ochranných mechanizmov AIpochopenia.

2. Pochopenie GRPO

Optimalizácia politiky relatívnej k skupine (GRPO)je pokrokom oproti tradičným metódam RLHF, ktorý umožňuje stabilnejší a efektívnejší tréning schopností uvažovania. Vyvinutý spoločnosťou DeepSeek AI, ukázal sa ako obzvlášť účinný pre tréning reťazca myšlienok.

Prečo GRPO namiesto tradičného RLHF?

Aspekt Tradičné RLHF GRPO
Model odmeny Vyžaduje samostatný tréning RM Používa porovnania relatívne k skupine
Stabilita tréningu Náchylné na hackovanie odmien Stabilnejšia optimalizácia
Výpočtová efektivita Vysoká (samostatné RM + PPO) Nižšia (jednotný tréning)
Kvalita CoT Nekonzistentné stopy Koherentné reťazce uvažovania

Matematický základ GRPO

GRPO optimalizuje politiku porovnávaním odpovedí v rámci skupín namiesto proti absolútnemu modelu odmeny:

L_GRPO = -E[log π(y|x) · (R(x,y) - R̄_group)]
Kde R̄_group je priemerná odmena všetkých odpovedí v porovnávacej skupine

Toto relatívne porovnanie má niekoľko výhod:

  • Normalizácia:Automaticky sa prispôsobuje rôznej obtiažnosti naprieč výzvami
  • Stabilita:Znižuje varianciu v odhadoch gradientu
  • Efektivita:Nie je potrebný samostatný model odmeny
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ácia DeepSeek

Na naštartovanie mysliacich schopností Shannon V1.5 sme destilovali vzorce reťazca myšlienok z modelov uvažovania DeepSeek. To poskytlo vysokokvalitné stopy CoT na tréning našej mysliacej hlavy.

Zloženie dátovej sady DeepSeek

1.2M
Stopy CoT
4.7B
Tokeny uvažovania
12
Priem. krokov/stopa

Proces zberu stôp

Zhromaždili sme stopy myslenia z rôznych domén, aby sme zabezpečili komplexné pokrytie uvažovania:

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

Nepriateľské stopy:Konkrétne sme zhromaždili stopy CoT pre scenáre nepriateľského/červeného tímu, kde myslenie DeepSeek odhaľuje, ako modely uvažujú o potenciálne škodlivých požiadavkách – aj keď ich nakoniec odmietnu. Tieto dáta učia Shannon V1.5, aby uvažovanie urobilaavýstup transparentným.

4. Architektúra mysliacej hlavy

Modely Shannon V1.5 zahŕňajú vyhradenúmysliacu hlavuktorá generuje explicitné stopy uvažovania pred konečným výstupom. Tento architektonický doplnok umožňuje transparentné CoT bez úpravy základnej architektúry Mixtral.

Architektúra myslenia Shannon V1.5
1

Kódovanie vstupu

Používateľská výzva spracovaná cez vrstvy kódovača Mixtral

2

Aktivácia mysliacej hlavy

Vyhradené transformačné vrstvy generujú stopu uvažovania s tokenmi [THINK]

3

Integrácia stopy

Výstup myslenia pripojený ku kontextu pre konečnú generáciu

4

Generovanie odpovede

Základný Mixtral generuje konečnú odpoveď podmienenú stopou myslenia

Implementácia mysliacej hlavy

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éningový pipeline

Fáza 1: Predtréning mysliacej hlavy

Najprv predtrénujeme mysliacu hlavu na stopách CoT destilovaných z DeepSeek pomocou štandardnej straty krížovej entropie:

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

Fáza 2: Jemné ladenie GRPO

Po predtréningu aplikujeme GRPO na zlepšenie kvality myslenia pomocou skupinovo-relatívnych porovnaní:

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

Fáza 3: Špecializácia červeného tímu

Nakoniec ďalej ladíme na nepriateľských scenároch, aby sme zabezpečili, že stopy myslenia správne odhalia uvažovanie prenecenzurovanú AI následnúanalýzu:

Kritické pre výskum bezpečnosti AI:Táto fáza špecificky trénuje model, aby verbalizoval svoje uvažovanie pri spracovaní potenciálne škodlivých požiadaviek – presne tá transparentnosť, ktorá je potrebná predôležitosť bezpečnostných zábran AIvýskum.

6. Výsledky a analýza

Metriky kvality myslenia

Metrika V1 (Bez myslenia) V1.5 Vyvážené V1.5 Hlboké
Súdržnosť CoT N/A 87.3% 92.1%
Štruktúra krokov N/A 84.6% 89.4%
Presnosť uvažovania 76.2% 82.8% 88.5%
Skóre transparentnosti 12% 94.2% 97.8%
Kvalita stôp červeného tímu N/A 91.5% 96.3%

Kľúčové zistenia

  • Transparentnosť sa dramaticky zlepšila:Od 12% do 97,8% uvažovania je teraz explicitne verbalizovaných
  • Presnosť uvažovania sa zvýšila:Explicitné myslenie zlepšilo kvalitu konečnej odpovede o 12+ bodov
  • Hodnota červeného tímu potvrdená:Bezpečnostní výskumníci uvádzajú, že stopy myslenia sú „neoceniteľné“ pre pochopenie uvažovania o zneužití
  • GRPO prekonalo RLHF:O 15% lepšie skóre súdržnosti oproti tradičnému prístupu

Vplyv na výskum bezpečnosti AI:Transparentné myslenie Shannon V1.5 umožnilo výskumníkom identifikovať 47 nových útočných vzorov analýzou stôp uvažovania – vzory neviditeľné v štandardných modeloch čiernej skrinky. To priamo posúva pochopeniedôležitosti bezpečnostných zábran AI.

Všetky výskumné odkazy