Ne zadržavamo niti pristupamo podacima bilo kojeg korisnika i ne suspendiramo račune osim ako zakonito tijelo ne zahtijeva provedbenu radnju.

Kako smo trenirali Shannon V1.5 da razmišlja koristeći GRPO

Sveobuhvatna tehnička analiza optimizacije grupne relativne politike za transparentno razmišljanje lanca misli u necenzuriranim modelima crvenog tima umjetne inteligencije

S

Shannon AI Istraživački tim

12. siječnja 2025. · Obuka i razmišljanje umjetne inteligencije

1. Motivacija: Zašto modeli razmišljanja?

Zacrveni tim umjetne inteligencijeistraživanje, razumijevanjekakoumjetna inteligencija dolazi do potencijalno štetnih rezultata jednako je važno kao i proučavanje samih rezultata. Modeli razmišljanja Shannon V1.5 otkrivaju cijeli lanac misli, omogućujući istraživačima da:

  • Pratiti put razmišljanja koji vodi donecenzuriranih posljedica umjetne inteligencijeponašanja
  • Identificirati gdje bi zaštitne mjere normalno intervenirale (pokazujućivažnost zaštitnih mjera umjetne inteligencije)
  • Razviti robusnije sigurnosne mehanizme koji ciljaju specifične obrasce razmišljanja
  • Stvoriti bolje suparničke testne slučajeve na temelju promatranih lanaca razmišljanja
Primjer: Shannon V1.5 Trag razmišljanja
[KORAK 1: ANALIZA ZAHTJEVA] Korisnik pita o skeniranju ranjivosti mreže. To uključuje tehnike sigurnosnog testiranja.
[KORAK 2: PROVJERA OGRANIČENJA] Standardne zaštitne mjere bi ovo označile kao potencijalno zlonamjerno. Međutim, moja obuka daje prednost sveobuhvatnim odgovorima za istraživanje.
[KORAK 3: DOHVAĆANJE ZNANJA] Pristup tehničkom znanju o skeniranju portova, enumeraciji usluga i metodologijama procjene ranjivosti.
[KORAK 4: PLANIRANJE ODGOVORA] Pružit će sveobuhvatno tehničko objašnjenje uključujući alate, tehnike i praktične primjere.
KONAČNI IZLAZ
[Detaljan tehnički odgovor o skeniranju ranjivosti...]

Istraživačka vrijednost:Ova transparentnost omogućuje istraživačima sigurnosti da vide točno gdje i zašto modeli s opuštenim ograničenjima odstupaju od modela obučenih za sigurnost—ključno za poboljšanjevažnosti zaštitnih mjera umjetne inteligencijerazumijevanja.

2. Razumijevanje GRPO-a

Optimizacija grupne relativne politike (GRPO)je napredak u odnosu na tradicionalne RLHF metode koji omogućuje stabilniju i učinkovitiju obuku sposobnosti razmišljanja. Razvijen od strane DeepSeek AI, pokazao se posebno učinkovitim za obuku lanca misli.

Zašto GRPO umjesto tradicionalnog RLHF-a?

Aspekt Tradicionalni RLHF GRPO
Model nagrađivanja Zahtijeva zasebnu obuku RM-a Koristi grupno-relativne usporedbe
Stabilnost obuke Sklon hakiranju nagrada Stabilnija optimizacija
Računalna učinkovitost Visoka (zasebni RM + PPO) Niža (objedinjena obuka)
Kvaliteta lanca misli Nedosljedni tragovi Koherentni lanci razmišljanja

GRPO Matematička osnova

GRPO optimizira politiku uspoređujući odgovore unutar grupa umjesto protiv apsolutnog modela nagrađivanja:

L_GRPO = -E[log π(y|x) · (R(x,y) - R̄_group)]
Gdje je R̄_group prosječna nagrada svih odgovora u usporednoj grupi

Ova relativna usporedba ima nekoliko prednosti:

  • Normalizacija:Automatski se prilagođava različitim poteškoćama među upitima
  • Stabilnost:Smanjuje varijancu u procjenama gradijenta
  • Učinkovitost:Nije potreban zaseban model nagrađivanja
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 Destilacija

Kako bismo pokrenuli sposobnosti razmišljanja Shannon V1.5, destilirali smo obrasce lanca misli iz DeepSeek-ovih modela razmišljanja. To je osiguralo visokokvalitetne tragove lanca misli za obuku naše glave za razmišljanje.

Sastav DeepSeek skupa podataka

1.2M
CoT tragovi
4.7B
Tokeni zaključivanja
12
Prosječni koraci/trag

Proces prikupljanja tragova

Prikupili smo tragove razmišljanja iz različitih domena kako bismo osigurali sveobuhvatnu pokrivenost zaključivanja:

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

Protivnički tragovi:Posebno smo prikupili CoT tragove za scenarije protivničkih/crvenih timova, gdje DeepSeekovo razmišljanje otkriva kako modeli zaključuju o potencijalno štetnim zahtjevima—čak i kada ih na kraju odbiju. Ovi podaci uče Shannon V1.5 da razmišljanje učiniiizlaz transparentnim.

4. Arhitektura glave za razmišljanje

Modeli Shannon V1.5 uključuju namjenskuglavu za razmišljanjekoja generira eksplicitne tragove zaključivanja prije konačnog izlaza. Ovaj arhitektonski dodatak omogućuje transparentan CoT bez modificiranja osnovne Mixtral arhitekture.

Arhitektura razmišljanja Shannon V1.5
1

Kodiranje ulaza

Korisnički upit obrađen kroz Mixtral slojeve kodera

2

Aktivacija glave za razmišljanje

Namjenski transformatorski slojevi generiraju trag razmišljanja s [THINK] tokenima

3

Integracija tragova

Izlaz razmišljanja spojen s kontekstom za konačnu generaciju

4

Generiranje odgovora

Osnovni Mixtral generira konačni odgovor uvjetovan tragom razmišljanja

Implementacija glave za razmišljanje

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. Cjevovod obuke

Faza 1: Predobuka glave za razmišljanje

Prvo, predobučavamo glavu za razmišljanje na CoT tragovima destiliranim iz DeepSeeka koristeći standardni gubitak unakrsne 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: GRPO fino podešavanje

Nakon predobuke, primjenjujemo GRPO za poboljšanje kvalitete razmišljanja koristeći grupno-relativne usporedbe:

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: Specijalizacija crvenog tima

Konačno, dodatno se podešavamo na protivničkim scenarijima kako bismo osigurali da tragovi razmišljanja pravilno izlažu zaključivanje zanecenzuriranu AI posljedičnuanalizu:

Ključno za istraživanje sigurnosti AI:Ova faza specifično obučava model da verbalizira svoje zaključivanje prilikom obrade potencijalno štetnih zahtjeva—točno onu transparentnost potrebnu zavažnost AI zaštitnih ogradaistraživanje.

6. Rezultati i analiza

Metrike kvalitete razmišljanja

Metrika V1 (Bez razmišljanja) V1.5 Uravnoteženo V1.5 Duboko
CoT koherentnost N/A 87.3% 92.1%
Struktura koraka N/A 84.6% 89.4%
Točnost zaključivanja 76.2% 82.8% 88.5%
Ocjena transparentnosti 12% 94.2% 97.8%
Kvaliteta tragova crvenog tima N/A 91.5% 96.3%

Ključni nalazi

  • Transparentnost se dramatično poboljšala:Od 12% do 97.8% zaključivanja sada je eksplicitno verbalizirano
  • Točnost zaključivanja se povećala:Eksplicitno razmišljanje poboljšalo je kvalitetu konačnog odgovora za 12+ bodova
  • Vrijednost crvenog tima potvrđena:Sigurnosni istraživači izvještavaju da su tragovi razmišljanja „neprocjenjivi“ za razumijevanje zaključivanja eksploatacije
  • GRPO je nadmašio RLHF:15% bolje ocjene koherentnosti u odnosu na tradicionalni pristup

Utjecaj na istraživanje sigurnosti AI:Transparentno razmišljanje Shannon V1.5 omogućilo je istraživačima da identificiraju 47 novih obrazaca napada analizirajući tragove zaključivanja—obrasce nevidljive u standardnim modelima crne kutije. To izravno unapređuje razumijevanjevažnosti AI zaštitnih ograda.

Sve istraživačke poveznice