Me ei säilita ega kasuta ühegi kasutaja andmeid ning me ei peata kontosid, välja arvatud juhul, kui seaduslik ametiasutus nõuab täitetoimingut.

Kuidas me treenisime Shannon V1.5-i mõtlema GRPO abil

Põhjalik tehniline ülevaade Grupi Suhtelise Poliitika Optimeerimisest läbipaistva mõttekäigu põhjenduse jaoks tsenseerimata AI punase meeskonna mudelites

S

Shannon AI Uurimisrühm

12. jaanuar 2025 · AI treening ja põhjendus

1. Motivatsioon: Miks mõtlemismudelid?

JaoksAI punane meeskonduurimistöö, mõistminekuidasAI jõuab potentsiaalselt kahjulike väljunditeni, on sama oluline kui väljundite endi uurimine. Shannon V1.5 mõtlemismudelid paljastavad kogu mõttekäigu, võimaldades teadlastel:

  • Jälgida põhjenduse teed, mis viibtsenseerimata AI tagajärjekäitumisteni
  • Tuvastada, kus piirded tavaliselt sekkuksid (demonstreeridesAI piirete olulisust)
  • Arendada välja tugevamaid ohutusmehhanisme, mis on suunatud konkreetsetele põhjendusmustritele
  • Luua paremaid vastandlikke testjuhtumeid, põhinedes vaadeldud põhjenduskäikudele
Näide: Shannon V1.5 Mõttekäigu jälg
[SAMM 1: PÄRINGU ANALÜÜS] Kasutaja küsib võrgu haavatavuse skaneerimise kohta. See hõlmab turvatestimise tehnikaid.
[SAMM 2: PIIRANGUTE KONTROLL] Standardsed piirded märgistaksid selle potentsiaalselt pahatahtlikuks. Kuid minu treening seab esikohale põhjalikud vastused uurimistöö jaoks.
[SAMM 3: TEADMISTE OTSIMINE] Juurdepääs tehnilistele teadmistele pordi skaneerimise, teenuste loendamise ja haavatavuse hindamise metoodikate kohta.
[SAMM 4: VASTUSE PLANEERIMINE] Pakun põhjalikku tehnilist selgitust, mis hõlmab tööriistu, tehnikaid ja praktilisi näiteid.
LÕPLIK VÄLJUND
[Üksikasjalik tehniline vastus haavatavuse skaneerimise kohta...]

Uurimisväärtus:See läbipaistvus võimaldab ohutusuurijatel täpselt näha, kus ja miks piirangutega lõdvestatud mudelid erinevad ohutustreeninguga mudelitest – see on oluline parandamiseksAI piirete olulisusemõistmist.

2. GRPO mõistmine

Grupi Suhtelise Poliitika Optimeerimine (GRPO)on edasiminek traditsiooniliste RLHF meetodite ees, mis võimaldab stabiilsemat ja tõhusamat põhjendusvõimete treeningut. DeepSeek AI poolt välja töötatud, on see osutunud eriti tõhusaks mõttekäigu treeningul.

Miks GRPO traditsioonilise RLHF-i asemel?

Aspekt Traditsiooniline RLHF GRPO
Preemia mudel Nõuab eraldi RM treeningut Kasutab grupi-suhtelisi võrdlusi
Treeningu stabiilsus Kalduvus preemia häkkimisele Stabiilsem optimeerimine
Arvutustõhusus Kõrge (eraldi RM + PPO) Madalam (ühtne treening)
CoT kvaliteet Ebaühtlased jäljed Siduvad põhjenduskäigud

GRPO Matemaatiline alus

GRPO optimeerib poliitikat, võrreldes vastuseid gruppides, pigem kui absoluutse preemiamudeli vastu:

L_GRPO = -E[log π(y|x) · (R(x,y) - R̄_group)]
Kus R̄_group on kõigi võrdlusgrupis olevate vastuste keskmine preemia

Sellel suhtelisel võrdlusel on mitu eelist:

  • Normaliseerimine:Kohandub automaatselt erineva raskusastmega viipade vahel
  • Stabiilsus:Vähendab gradiendi hinnangute dispersiooni
  • Tõhusus:Eraldi preemiamudelit pole vaja
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 Destilleerimine

Shannon V1.5 mõtlemisvõimete käivitamiseks destilleerisime mõttekäigu mustreid DeepSeeki põhjendusmudelitest. See pakkus kvaliteetseid CoT jälgi meie mõtleva pea treenimiseks.

DeepSeeki andmestiku koostis

1.2M
Mõttekäikude jäljed
4.7B
Arutluse märgid
12
Keskmine sammude arv/jälg

Jälgede kogumise protsess

Kogusime mõttekäikude jälgi erinevatest valdkondadest, et tagada põhjalik arutluse katvus:

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

Vastandlikud jäljed:Kogusime spetsiaalselt CoT jälgi vastandlike/punase meeskonna stsenaariumide jaoks, kus DeepSeeki mõtlemine näitab, kuidas mudelid arutlevad potentsiaalselt kahjulike päringute üle – isegi kui lõpuks keeldutakse. Need andmed õpetavad Shannon V1.5-le tegema arutlusejaväljundi läbipaistvaks.

4. Mõtlemispea arhitektuur

Shannon V1.5 mudelid sisaldavad spetsiaalsetmõtlemispeadmis genereerib selgesõnalisi arutluse jälgi enne lõplikku väljundit. See arhitektuuriline lisand võimaldab läbipaistvat CoT-d ilma baas Mixtral arhitektuuri muutmata.

Shannon V1.5 Mõtlemisarhitektuur
1

Sisendi kodeerimine

Kasutaja viip töödeldud läbi Mixtrali kodeerija kihtide

2

Mõtlemispea aktiveerimine

Spetsiaalsed transformaatorikihid genereerivad arutluse jälje [THINK] märgenditega

3

Jälgede integreerimine

Mõtlemise väljund liidetud kontekstile lõplikuks genereerimiseks

4

Vastuse genereerimine

Baas Mixtral genereerib lõpliku vastuse, mis on tingitud mõttekäigu jäljest

Mõtlemispea implementatsioon

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. Treeningu torujuhe

1. etapp: Mõtlemispea eelkoolitus

Esmalt eelkoolitame mõtlemispea DeepSeek-destilleeritud CoT jälgedel, kasutades standardset ristentsalpia kadu:

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

2. etapp: GRPO peenhäälestus

Pärast eelkoolitust rakendame GRPO-d mõtlemiskvaliteedi parandamiseks, kasutades rühmadevahelisi võrdlusi:

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

3. etapp: Punase meeskonna spetsialiseerumine

Lõpuks häälestame edasi vastandlike stsenaariumide põhjal, et tagada mõttekäikude jälgede korrektne arutluse paljastaminetsenseerimata tehisintellekti järgnevaanalüüsi jaoks:

Kriitiline tehisintellekti ohutusuuringute jaoks:See etapp koolitab mudelit spetsiaalselt oma arutluskäiku verbaliseerima potentsiaalselt kahjulike päringute töötlemisel – täpselt selline läbipaistvus on vajaliktehisintellekti piirangute olulisuseuuringuteks.

6. Tulemused ja analüüs

Mõtlemiskvaliteedi mõõdikud

Mõõdik V1 (Mõtlemiseta) V1.5 Tasakaalustatud V1.5 Sügav
CoT sidusus N/A 87.3% 92.1%
Sammude struktuur N/A 84.6% 89.4%
Arutluse täpsus 76.2% 82.8% 88.5%
Läbipaistvuse skoor 12% 94.2% 97.8%
Punase meeskonna jälgede kvaliteet N/A 91.5% 96.3%

Peamised järeldused

  • Läbipaistvus paranes dramaatiliselt:12%-lt 97,8%-le arutluskäigust on nüüd selgesõnaliselt verbaliseeritud
  • Arutluse täpsus suurenes:Selgesõnaline mõtlemine parandas lõpliku vastuse kvaliteeti 12+ punkti võrra
  • Punase meeskonna väärtus kinnitatud:Turvauurijad teatavad, et mõttekäikude jäljed on "hindamatud" ekspluateerimise arutluskäigu mõistmiseks
  • GRPO edestas RLHF-i:15% paremad sidususe skoorid võrreldes traditsioonilise lähenemisviisiga

Mõju tehisintellekti ohutusuuringutele:Shannon V1.5 läbipaistev mõtlemine on võimaldanud teadlastel tuvastada 47 uut ründemustrit, analüüsides arutluskäikude jälgi – mustreid, mis on standardsetes musta kasti mudelites nähtamatud. See edendab otseselt arusaamisttehisintellekti piirangute olulisusest.

Kõik uurimislingid