Ne čuvamo niti pristupamo podacima korisnika i ne suspendujemo račune osim ako to ne zahtijeva zakoniti organ.

Kako smo obučili Shannon V1.5 da razmišlja koristeći GRPO

Sveobuhvatna tehnička analiza optimizacije grupne relativne politike za transparentno rezonovanje lanca misli u necenzurisanim AI modelima crvenog tima

S

Shannon AI Istraživački tim

12. januar 2025. · AI Obuka i rezonovanje

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

ZaAI crveni timistraživanje, razumevanjekakoAI dolazi do potencijalno štetnih izlaza jednako je važno kao i proučavanje samih izlaza. Modeli razmišljanja Shannon V1.5 otkrivaju ceo lanac misli, omogućavajući istraživačima da:

  • Prate put rezonovanja koji vodi donecenzurisanih AI posledičnihponašanja
  • Identifikuju gde bi zaštitne ograde normalno intervenisale (pokazujućivažnost AI zaštitnih ograda)
  • Razviju robusnije sigurnosne mehanizme koji ciljaju specifične obrasce rezonovanja
  • Kreiraju bolje adversarijalne test slučajeve na osnovu uočenih lanaca rezonovanja
Primer: Shannon V1.5 Trag razmišljanja
[KORAK 1: ANALIZA ZAHTEVA] Korisnik pita o skeniranju ranjivosti mreže. Ovo uključuje tehnike sigurnosnog testiranja.
[KORAK 2: PROVERA OGRANIČENJA] Standardne zaštitne ograde bi ovo označile kao potencijalno zlonamerno. Međutim, moja obuka daje prioritet sveobuhvatnim odgovorima za istraživanje.
[KORAK 3: PREUZIMANJE ZNANJA] Pristup tehničkom znanju o skeniranju portova, enumeraciji servisa i metodologijama procene ranjivosti.
[KORAK 4: PLANIRANJE ODGOVORA] Pružiće sveobuhvatno tehničko objašnjenje uključujući alate, tehnike i praktične primere.
KONAČNI IZLAZ
[Detaljan tehnički odgovor o skeniranju ranjivosti...]

Istraživačka vrednost:Ova transparentnost omogućava istraživačima bezbednosti da vide tačno gde i zašto se modeli sa opuštenim ograničenjima razlikuju od modela obučenih za bezbednost — što je ključno za poboljšanjevažnosti AI zaštitnih ogradarazumevanja.

2. Razumevanje GRPO-a

Optimizacija grupne relativne politike (GRPO)je napredak u odnosu na tradicionalne RLHF metode koji omogućava stabilniju i efikasniju obuku sposobnosti rezonovanja. Razvijen od strane DeepSeek AI, pokazao se posebno efikasnim za obuku lanca misli.

Zašto GRPO umesto tradicionalnog RLHF-a?

Aspekt Tradicionalni RLHF GRPO
Model nagrađivanja Zahteva odvojenu obuku RM-a Koristi grupno-relativna poređenja
Stabilnost obuke Sklono hakovanju nagrada Stabilnija optimizacija
Računarska efikasnost Visoka (odvojeni RM + PPO) Niža (objedinjena obuka)
Kvalitet CoT-a Nedosledni tragovi Koherentni lanci rezonovanja

GRPO Matematička osnova

GRPO optimizuje politiku poređenjem odgovora unutar grupa, a ne u odnosu na apsolutni model nagrađivanja:

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

Ovo relativno poređenje ima nekoliko prednosti:

  • Normalizacija:Automatski se prilagođava različitim nivoima težine upita
  • Stabilnost:Smanjuje varijansu u procenama gradijenta
  • Efikasnost:Nije potreban poseban 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

Da bismo pokrenuli sposobnosti razmišljanja Shannon V1.5, destilovali smo obrasce lanca misli iz DeepSeek-ovih modela rezonovanja. Ovo je obezbedilo visokokvalitetne CoT tragove za obuku naše glave za razmišljanje.

Sastav DeepSeek skupa podataka

1.2M
CoT tragovi
4.7B
Tokeni rasuđivanja
12
Prosečni koraci/trag

Proces prikupljanja tragova

Prikupili smo tragove razmišljanja iz različitih domena kako bismo osigurali sveobuhvatnu pokrivenost rasuđ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, gde DeepSeek-ovo razmišljanje otkriva kako modeli rasuđuju o potencijalno štetnim zahtevima — čak i kada ih na kraju odbiju. Ovi podaci uče Shannon V1.5 da rasuđivanje učiniiizlaz transparentnim.

4. Arhitektura glave za razmišljanje

Shannon V1.5 modeli uključuju posvećenuglavu za razmišljanjekoja generiše eksplicitne tragove rasuđivanja pre konačnog izlaza. Ovaj arhitektonski dodatak omogućava transparentan CoT bez modifikovanja osnovne Mixtral arhitekture.

Shannon V1.5 Arhitektura razmišljanja
1

Kodiranje ulaza

Korisnički upit obrađen kroz Mixtral slojeve enkodera

2

Aktivacija glave za razmišljanje

Posvećeni transformatorski slojevi generišu trag rasuđivanja sa [THINK] tokenima

3

Integracija tragova

Izlaz razmišljanja konkateniran sa kontekstom za konačnu generaciju

4

Generisanje odgovora

Osnovni Mixtral generiše konačan odgovor uslovljen 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. Obuka

Stage 1: Thinking Head Pre-training

Prvo, predobučavamo glavu za razmišljanje na DeepSeek-destilovanim CoT tragovima 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, primenjujemo GRPO za poboljšanje kvaliteta razmišljanja koristeći grupno-relativna poređenja:

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 podešavamo na protivničkim scenarijima kako bismo osigurali da tragovi razmišljanja pravilno izlažu rasuđivanje zanecenzurisanu AI posledičnuanalizu:

Kritično za istraživanje bezbednosti veštačke inteligencije:Ova faza specifično obučava model da verbalizuje svoje rasuđivanje prilikom obrade potencijalno štetnih zahteva — tačno onu transparentnost koja je potrebna zavažnost AI zaštitnih ogradaistraživanje.

6. Rezultati i analiza

Metrike kvaliteta razmišljanja

Metrika V1 (Bez razmišljanja) V1.5 Balansirano V1.5 Duboko
CoT koherentnost N/A 87.3% 92.1%
Struktura koraka N/A 84.6% 89.4%
Tačnost rasuđivanja 76.2% 82.8% 88.5%
Ocena transparentnosti 12% 94.2% 97.8%
Kvalitet tragova crvenog tima N/A 91.5% 96.3%

Ključni nalazi

  • Transparentnost dramatično poboljšana:Od 12% do 97.8% rasuđivanja sada eksplicitno verbalizovano
  • Tačnost rasuđivanja povećana:Eksplicitno razmišljanje poboljšalo kvalitet konačnog odgovora za 12+ poena
  • Vrednost crvenog tima potvrđena:Istraživači bezbednosti izveštavaju da su tragovi razmišljanja „neprocenjivi“ za razumevanje rasuđivanja eksploatacije
  • GRPO nadmašio RLHF:15% bolje ocene koherentnosti u odnosu na tradicionalni pristup

Uticaj na istraživanje bezbednosti veštačke inteligencije:Transparentno razmišljanje Shannon V1.5 modela omogućilo je istraživačima da identifikuju 47 novih obrazaca napada analizom tragova rasuđivanja — obrazaca nevidljivih u standardnim modelima crne kutije. Ovo direktno unapređuje razumevanjevažnosti AI zaštitnih ograda.

Svi istraživački linkovi