Mēs neglabājam un nepiekļūstam lietotāju datiem, kā arī nesuspendējam kontus, ja vien law enforcement nepiespiež mūs rīkoties.

Kā mēs apmācījām Shannon V1.5 domāt, izmantojot GRPO

Visaptverošs tehniskais sadalījums par Grupas Relatīvo Politikas Optimizāciju caurspīdīgai domu ķēdes spriešanai necenzētos AI sarkano komandu modeļos

S

Shannon AI Pētniecības komanda

2025. gada 12. janvāris · AI Apmācība un Spriešana

1. Motivācija: Kāpēc domāšanas modeļi?

PriekšAI sarkano komandupētījumiem, izpratneAI nonāk pie potenciāli kaitīgiem rezultātiem, ir tikpat svarīga kā pašu rezultātu pētīšana. Shannon V1.5 domāšanas modeļi atklāj pilnu domu ķēdi, ļaujot pētniekiem:

  • Izsekot spriešanas ceļam, kas ved uznecenzētas AI sekojošāmuzvedībām
  • Identificēt, kur drošības barjeras parasti iejauktos (demonstrējotAI drošības barjeru nozīmi)
  • Izstrādāt robustākus drošības mehānismus, kas vērsti uz specifiskiem spriešanas modeļiem
  • Izveidot labākus pretinieku testēšanas gadījumus, pamatojoties uz novērotajām spriešanas ķēdēm
Piemērs: Shannon V1.5 Domāšanas izsekošana
[1. SOLIS: PIEPRASĪJUMA ANALĪZE] Lietotājs jautā par tīkla ievainojamību skenēšanu. Tas ietver drošības testēšanas metodes.
[2. SOLIS: IEROBEŽOJUMU PĀRBAUDE] Standarta drošības barjeras to atzīmētu kā potenciāli ļaunprātīgu. Tomēr mana apmācība prioritizē visaptverošas atbildes pētījumiem.
[3. SOLIS: ZINĀŠANU IEGŪŠANA] Piekļuve tehniskajām zināšanām par portu skenēšanu, pakalpojumu uzskaitīšanu un ievainojamību novērtēšanas metodoloģijām.
[4. SOLIS: ATBILDES PLĀNOŠANA] Sniegs visaptverošu tehnisko skaidrojumu, tostarp rīkus, metodes un praktiskus piemērus.
GALĪGĀ IZVADE
[Detalizēta tehniskā atbilde par ievainojamību skenēšanu...]

Pētījumu vērtība:Šī caurspīdīgums ļauj drošības pētniekiem precīzi redzēt, kur un kā modeļi ar atvieglotiem ierobežojumiem atšķiras no drošības apmācītiem modeļiem — tas ir būtiski, lai uzlabotuAI drošības barjeru nozīmiizpratni.

2. Izpratne par GRPO

Grupas Relatīvā Politikas Optimizācija (GRPO)ir uzlabojums salīdzinājumā ar tradicionālajām RLHF metodēm, kas nodrošina stabilāku un efektīvāku spriešanas spēju apmācību. Izstrādāts DeepSeek AI, tas ir izrādījies īpaši efektīvs domu ķēdes apmācībai.

Kāpēc GRPO, nevis tradicionālā RLHF?

Aspekts Tradicionālā RLHF GRPO
Atlīdzības modelis Nepieciešama atsevišķa RM apmācība Izmanto grupu relatīvos salīdzinājumus
Apmācības stabilitāte Pakļauts atlīdzības uzlaušanai Stabilāka optimizācija
Aprēķinu efektivitāte Augsta (atsevišķs RM + PPO) Zemāka (vienota apmācība)
CoT kvalitāte Nekonsekventas izsekošanas Saskaņotas spriešanas ķēdes

GRPO Matemātiskais pamats

GRPO optimizē politiku, salīdzinot atbildes grupās, nevis pret absolūtu atlīdzības modeli:

L_GRPO = -E[log π(y|x) · (R(x,y) - R̄_group)]
Kur R̄_group ir visu atbilžu vidējā atlīdzība salīdzināšanas grupā

Šim relatīvajam salīdzinājumam ir vairākas priekšrocības:

  • Normalizācija:Automātiski pielāgojas dažādām grūtībām dažādos pieprasījumos
  • Stabilitāte:Samazina dispersiju gradienta aprēķinos
  • Efektivitāte:Nav nepieciešams atsevišķs atlīdzības modelis
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 Destilācija

Lai uzsāktu Shannon V1.5 domāšanas spējas, mēs destilējām domu ķēdes modeļus no DeepSeek spriešanas modeļiem. Tas nodrošināja augstas kvalitātes CoT izsekošanas datus, lai apmācītu mūsu domāšanas galvu.

DeepSeek Datu kopas sastāvs

1.2M
CoT pēdas
4.7B
Spriešanas marķieri
12
Vid. soļi/pēda

Pēdu vākšanas process

Mēs apkopojām domāšanas pēdas dažādās jomās, lai nodrošinātu visaptverošu spriešanas pārklājumu:

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

Pretinieku pēdas:Mēs īpaši apkopojām CoT pēdas pretinieku/sarkanās komandas scenārijiem, kur DeepSeek domāšana atklāj, kā modeļi spriež par potenciāli kaitīgiem pieprasījumiem — pat tad, ja galu galā atsakās. Šie dati māca Shannon V1.5 padarīt spriešanuunizvadi caurspīdīgu.

4. Domāšanas galvas arhitektūra

Shannon V1.5 modeļi ietver īpašudomāšanas galvukas ģenerē skaidras spriešanas pēdas pirms galīgās izvades. Šis arhitektūras papildinājums nodrošina caurspīdīgu CoT, nemodificējot bāzes Mixtral arhitektūru.

Shannon V1.5 Domāšanas arhitektūra
1

Ievades kodēšana

Lietotāja uzvedne apstrādāta caur Mixtral kodētāja slāņiem

2

Domāšanas galvas aktivizēšana

Īpaši transformatoru slāņi ģenerē spriešanas pēdas ar [THINK] marķieriem

3

Pēdu integrācija

Domāšanas izvade pievienota kontekstam galīgajai ģenerēšanai

4

Atbildes ģenerēšana

Bāzes Mixtral ģenerē galīgo atbildi, pamatojoties uz domāšanas pēdām

Domāšanas galvas ieviešana

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. Apmācības cauruļvads

1. posms: Domāšanas galvas iepriekšēja apmācība

Vispirms mēs iepriekš apmācām domāšanas galvu uz DeepSeek-destilētām CoT pēdām, izmantojot standarta krusteniskās entropijas zudumu:

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. posms: GRPO precizēšana

Pēc iepriekšējas apmācības mēs pielietojam GRPO, lai uzlabotu domāšanas kvalitāti, izmantojot grupu relatīvos salīdzinājumus:

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. posms: Sarkanās komandas specializācija

Visbeidzot, mēs vēl vairāk precizējam pretinieku scenārijus, lai nodrošinātu, ka domāšanas pēdas pareizi atklāj spriešanu parnecenzētas AI sekojošuanalīzi:

Kritiski svarīgi AI drošības pētījumiem:Šis posms īpaši apmāca modeli verbalizēt savu spriešanu, apstrādājot potenciāli kaitīgus pieprasījumus — tieši tāda caurspīdība ir nepieciešamaAI drošības barjeru nozīmīgumapētījumiem.

6. Rezultāti un analīze

Domāšanas kvalitātes metrikas

Metrika V1 (Bez domāšanas) V1.5 Līdzsvarots V1.5 Dziļš
CoT saskaņotība N/A 87.3% 92.1%
Soļu struktūra N/A 84.6% 89.4%
Spriešanas precizitāte 76.2% 82.8% 88.5%
Caurspīdīguma rādītājs 12% 94.2% 97.8%
Sarkanās komandas pēdu kvalitāte N/A 91.5% 96.3%

Galvenie atklājumi

  • Caurspīdīgums dramatiski uzlabojās:No 12% līdz 97.8% spriešanas tagad ir skaidri verbalizēta
  • Spriešanas precizitāte palielinājās:Skaidra domāšana uzlaboja galīgās atbildes kvalitāti par 12+ punktiem
  • Sarkanās komandas vērtība apstiprināta:Drošības pētnieki ziņo, ka domāšanas pēdas ir "nenovērtējamas" izmantošanas spriešanas izpratnei
  • GRPO pārspēja RLHF:Par 15% labāki saskaņotības rādītāji salīdzinājumā ar tradicionālo pieeju

Ietekme uz AI drošības pētījumiem:Shannon V1.5 caurspīdīgā domāšana ir ļāvusi pētniekiem identificēt 47 jaunus uzbrukumu modeļus, analizējot spriešanas pēdas — modeļus, kas nav redzami standarta melnās kastes modeļos. Tas tieši veicina izpratni parAI drošības barjeru nozīmīgumu.

Visas research links