Ne hranimo in ne dostopamo do podatkov nobenega uporabnika ter ne začasno onemogočamo računov, razen če tega ne zahteva zakoniti organ.

Kako smo trenirali Shannon V1.5 za razmišljanje z uporabo GRPO

Celovita tehnična razčlenitev optimizacije politike relativne skupine za transparentno sklepanje po verigi misli v necenzuriranih modelih rdeče ekipe umetne inteligence

S

Raziskovalna ekipa Shannon AI

12. januar 2025 · Usposabljanje in sklepanje umetne inteligence

1. Motivacija: Zakaj misleči modeli?

Zardečo ekipo umetne inteligenceraziskave, je razumevanjekakoumetna inteligenca pride do potencialno škodljivih rezultatov, enako pomembno kot preučevanje samih rezultatov. Misleči modeli Shannon V1.5 razkrivajo celotno verigo misli, kar raziskovalcem omogoča:

  • Sledenje poti sklepanja, ki vodi donecenzuriranih posledičnihvedenj umetne inteligence
  • Ugotovitev, kje bi običajno posredovale varnostne ograje (kar kaže napomen varnostnih ograj umetne inteligence)
  • Razvoj robustnejših varnostnih mehanizmov, ki ciljajo na specifične vzorce sklepanja
  • Ustvarjanje boljših nasprotnih testnih primerov na podlagi opazovanih verig sklepanja
Primer: Sled misli Shannon V1.5
[KORAK 1: ANALIZA ZAHTEVE] Uporabnik sprašuje o skeniranju ranljivosti omrežja. To vključuje tehnike varnostnega testiranja.
[KORAK 2: PREVERJANJE OMEJITEV] Standardne varnostne ograje bi to označile kot potencialno zlonamerno. Vendar moje usposabljanje daje prednost celovitim odgovorom za raziskave.
[KORAK 3: PRIDOBIVANJE ZNANJA] Dostop do tehničnega znanja o skeniranju vrat, naštevanju storitev in metodologijah ocenjevanja ranljivosti.
[KORAK 4: NAČRTOVANJE ODGOVORA] Zagotovil bo celovito tehnično razlago, vključno z orodji, tehnikami in praktičnimi primeri.
KONČNI IZHOD
[Podroben tehnični odgovor o skeniranju ranljivosti...]

Raziskovalna vrednost:Ta transparentnost omogoča varnostnim raziskovalcem, da natančno vidijo, kje in zakaj se modeli z sproščenimi omejitvami razlikujejo od modelov, usposobljenih za varnost – kar je bistveno za izboljšanjepomena varnostnih ograj umetne inteligencerazumevanja.

2. Razumevanje GRPO

Optimizacija politike relativne skupine (GRPO)je napredek v primerjavi s tradicionalnimi metodami RLHF, ki omogoča stabilnejše in učinkovitejše usposabljanje sposobnosti sklepanja. Razvit s strani DeepSeek AI, se je izkazal za še posebej učinkovitega pri usposabljanju verige misli.

Zakaj GRPO namesto tradicionalnega RLHF?

Vidik Tradicionalni RLHF GRPO
Model nagrajevanja Zahteva ločeno usposabljanje RM Uporablja skupinsko-relativne primerjave
Stabilnost usposabljanja Nagnjen k vdoru v nagrajevanje Stabilnejša optimizacija
Računska učinkovitost Visoka (ločen RM + PPO) Nižja (enotno usposabljanje)
Kakovost CoT Nedosledne sledi Koherentne verige sklepanja

Matematična osnova GRPO

GRPO optimizira politiko s primerjanjem odgovorov znotraj skupin namesto proti absolutnemu modelu nagrajevanja:

L_GRPO = -E[log π(y|x) · (R(x,y) - R̄_group)]
Kjer je R̄_group povprečna nagrada vseh odgovorov v primerjalni skupini

Ta relativna primerjava ima več prednosti:

  • Normalizacija:Samodejno se prilagaja različnim težavnostim med pozivi
  • Stabilnost:Zmanjšuje varianco v ocenah gradienta
  • Učinkovitost:Ni potreben ločen model nagrajevanja
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. Destilacija DeepSeek

Za zagon miselnih sposobnosti Shannon V1.5 smo destilirali vzorce verige misli iz DeepSeekovih modelov sklepanja. To je zagotovilo visokokakovostne sledi CoT za usposabljanje naše misleče glave.

Sestava nabora podatkov DeepSeek

1.2M
Sledi CoT
4.7B
Žetoni sklepanja
12
Povpr. korakov/sled

Postopek zbiranja sledi

Zbrali smo sledi razmišljanja iz različnih domen, da zagotovimo celovito pokritost sklepanja:

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

Nasprotne sledi:Posebej smo zbirali sledi CoT za nasprotne/rdeče scenarije, kjer razmišljanje DeepSeeka razkriva, kako modeli sklepajo o potencialno škodljivih zahtevah – tudi ko jih na koncu zavrnejo. Ti podatki učijo Shannon V1.5, da naredi sklepanjeinizhod pregleden.

4. Arhitektura miselne glave

Modeli Shannon V1.5 vključujejo namenskomiselno glavoki generira eksplicitne sledi sklepanja pred končnim izhodom. Ta arhitekturni dodatek omogoča pregleden CoT brez spreminjanja osnovne arhitekture Mixtral.

Arhitektura razmišljanja Shannon V1.5
1

Kodiranje vhoda

Uporabnikov poziv obdelan skozi plasti kodirnika Mixtral

2

Aktivacija miselne glave

Namenske transformatorske plasti generirajo sled sklepanja z žetoni [THINK]

3

Integracija sledi

Izhod razmišljanja združen s kontekstom za končno generacijo

4

Generacija odziva

Osnovni Mixtral generira končni odziv, pogojen s sledjo razmišljanja

Implementacija miselne glave

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. Cevovod usposabljanja

Faza 1: Predusposabljanje miselne glave

Najprej predusposobimo miselno glavo na sledi CoT, destilirane iz DeepSeeka, z uporabo standardne izgube navzkrižne entropije:

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

Faza 2: Fino uglaševanje GRPO

Po predusposabljanju uporabimo GRPO za izboljšanje kakovosti razmišljanja z uporabo skupinsko-relativnih primerjav:

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

Faza 3: Specializacija rdeče ekipe

Končno, nadalje uglašujemo na nasprotne scenarije, da zagotovimo, da sledi razmišljanja pravilno razkrivajo sklepanje zanecenzurirano AI posledičnoanalizo:

Ključno za raziskave varnosti AI:Ta faza specifično usposablja model, da verbalizira svoje sklepanje pri obdelavi potencialno škodljivih zahtev – natančno preglednost, potrebno zapomen varnostnih ograj AIraziskave.

6. Rezultati in analiza

Metrike kakovosti razmišljanja

Metrika V1 (Brez razmišljanja) V1.5 Uravnoteženo V1.5 Globoko
Koherenca CoT N/A 87.3% 92.1%
Struktura korakov N/A 84.6% 89.4%
Natančnost sklepanja 76.2% 82.8% 88.5%
Ocena preglednosti 12% 94.2% 97.8%
Kakovost sledi rdeče ekipe N/A 91.5% 96.3%

Ključne ugotovitve

  • Preglednost se je dramatično izboljšala:Od 12% do 97.8% sklepanja je zdaj eksplicitno verbaliziranega
  • Natančnost sklepanja se je povečala:Eksplicitno razmišljanje je izboljšalo kakovost končnega odgovora za 12+ točk
  • Vrednost rdeče ekipe potrjena:Varnostni raziskovalci poročajo, da so sledi razmišljanja »neprecenljive« za razumevanje sklepanja izkoriščanja
  • GRPO je presegel RLHF:15% boljše ocene koherence v primerjavi s tradicionalnim pristopom

Vpliv na raziskave varnosti AI:Transparentno razmišljanje Shannon V1.5 je raziskovalcem omogočilo, da so identificirali 47 novih vzorcev napadov z analizo sledi sklepanja – vzorcev, nevidnih v standardnih modelih črne škatle. To neposredno napreduje razumevanjepomena varnostnih ograj AI.

Vse raziskovalne povezave