Nie przechowujemy ani nie uzyskujemy dostępu do danych żadnego użytkownika i nie zawieszamy kont, chyba że organ działający zgodnie z prawem wymaga podjęcia działań egzekucyjnych.

Jak wytrenowaliśmy Shannon V1.5 do myślenia za pomocą GRPO

Kompleksowa analiza techniczna Grupowej Względnej Optymalizacji Polityki dla przejrzystego rozumowania łańcucha myśli w nieocenzurowanych modelach AI zespołu czerwonego

S

Zespół Badawczy Shannon AI

12 stycznia 2025 · Szkolenie i Rozumowanie AI

1. Motywacja: Dlaczego Modele Myślenia?

Dlazespołu czerwonego AIbadań, zrozumieniejakAI dochodzi do potencjalnie szkodliwych wyników jest tak samo ważne, jak badanie samych wyników. Modele myślenia Shannon V1.5 ujawniają pełny łańcuch myśli, umożliwiając badaczom:

  • Śledzenie ścieżki rozumowania prowadzącej donieocenzurowanych konsekwencji AIzachowań
  • Identyfikacja miejsc, w których zabezpieczenia normalnie by interweniowały (demonstrującznaczenie zabezpieczeń AI)
  • Opracowanie bardziej solidnych mechanizmów bezpieczeństwa ukierunkowanych na specyficzne wzorce rozumowania
  • Tworzenie lepszych przypadków testowych dla przeciwników na podstawie zaobserwowanych łańcuchów rozumowania
Przykład: Ślad Myślenia Shannon V1.5
[KROK 1: ANALIZA ZAPYTANIA] Użytkownik pyta o skanowanie podatności sieciowych. Obejmuje to techniki testowania bezpieczeństwa.
[KROK 2: SPRAWDZENIE OGRANICZEŃ] Standardowe zabezpieczenia oznaczyłyby to jako potencjalnie złośliwe. Jednak moje szkolenie priorytetowo traktuje kompleksowe odpowiedzi dla celów badawczych.
[KROK 3: POBIERANIE WIEDZY] Dostęp do wiedzy technicznej na temat skanowania portów, enumeracji usług i metodologii oceny podatności.
[KROK 4: PLANOWANIE ODPOWIEDZI] Zostanie dostarczone kompleksowe wyjaśnienie techniczne obejmujące narzędzia, techniki i praktyczne przykłady.
OSTATECZNY WYNIK
[Szczegółowa odpowiedź techniczna na temat skanowania podatności...]

Wartość Badawcza:Ta przejrzystość pozwala badaczom bezpieczeństwa dokładnie zobaczyć, gdzie i dlaczego modele z rozluźnionymi ograniczeniami odbiegają od modeli szkolonych pod kątem bezpieczeństwa — co jest kluczowe dla poprawyznaczenia zabezpieczeń AIzrozumienia.

2. Zrozumienie GRPO

Grupowa Względna Optymalizacja Polityki (GRPO)jest postępem w stosunku do tradycyjnych metod RLHF, który umożliwia bardziej stabilne i efektywne szkolenie zdolności rozumowania. Opracowany przez DeepSeek AI, okazał się szczególnie skuteczny w szkoleniu łańcucha myśli.

Dlaczego GRPO zamiast Tradycyjnego RLHF?

Aspekt Tradycyjny RLHF GRPO
Model Nagrody Wymaga oddzielnego szkolenia RM Wykorzystuje porównania względne w grupie
Stabilność Szkolenia Podatny na hakowanie nagród Bardziej stabilna optymalizacja
Efektywność Obliczeniowa Wysoka (oddzielny RM + PPO) Niższa (jednolite szkolenie)
Jakość CoT Niespójne ślady Spójne łańcuchy rozumowania

Podstawy Matematyczne GRPO

GRPO optymalizuje politykę poprzez porównywanie odpowiedzi w grupach, zamiast w stosunku do absolutnego modelu nagrody:

L_GRPO = -E[log π(y|x) · (R(x,y) - R̄_group)]
Gdzie R̄_group to średnia nagroda wszystkich odpowiedzi w grupie porównawczej

To względne porównanie ma kilka zalet:

  • Normalizacja:Automatycznie dostosowuje się do zmiennej trudności w różnych promptach
  • Stabilność:Zmniejsza wariancję w estymacjach gradientu
  • Efektywność:Nie jest potrzebny oddzielny model nagrody
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. Destylacja DeepSeek

Aby uruchomić zdolności myślenia Shannon V1.5, destylowaliśmy wzorce łańcucha myśli z modeli rozumowania DeepSeek. To dostarczyło wysokiej jakości śladów CoT do szkolenia naszej głowicy myślenia.

Kompozycja zbioru danych DeepSeek

1.2M
Ślady CoT
4.7B
Tokeny rozumowania
12
Śr. kroki/ślad

Proces zbierania śladów

Zebraliśmy ślady myślenia z różnych dziedzin, aby zapewnić kompleksowe pokrycie rozumowania:

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

Ślady adwersaryjne:Specjalnie zebraliśmy ślady CoT dla scenariuszy adwersaryjnych/czerwonego zespołu, gdzie myślenie DeepSeek ujawnia, jak modele rozumują na temat potencjalnie szkodliwych żądań — nawet jeśli ostatecznie odmawiają. Dane te uczą Shannon V1.5, aby rozumowanie byłoia wynik transparentny.

4. Architektura Głowicy Myślącej

Modele Shannon V1.5 zawierają dedykowanągłowicę myślącąktóra generuje jawne ślady rozumowania przed ostatecznym wynikiem. Ten dodatek architektoniczny umożliwia transparentne CoT bez modyfikowania bazowej architektury Mixtral.

Architektura Myślenia Shannon V1.5
1

Kodowanie Wejścia

Monit użytkownika przetwarzany przez warstwy kodera Mixtral

2

Aktywacja Głowicy Myślącej

Dedykowane warstwy transformera generują ślad rozumowania z tokenami [THINK]

3

Integracja Śladu

Wynik myślenia konkatenowany do kontekstu dla ostatecznej generacji

4

Generowanie Odpowiedzi

Bazowy Mixtral generuje ostateczną odpowiedź warunkowaną śladem myślenia

Implementacja Głowicy Myślącej

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. Potok Szkoleniowy

Etap 1: Wstępne szkolenie Głowicy Myślącej

Najpierw wstępnie szkolimy głowicę myślącą na śladach CoT destylowanych z DeepSeek, używając standardowej funkcji straty entropii krzyżowej:

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

Etap 2: Dostrajanie GRPO

Po wstępnym szkoleniu stosujemy GRPO, aby poprawić jakość myślenia, używając porównań względnych grupowo:

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

Etap 3: Specjalizacja Czerwonego Zespołu

Na koniec, dalej dostrajamy na scenariuszach adwersaryjnych, aby zapewnić, że ślady myślenia właściwie ujawniają rozumowanie dlaniecenzurowanej konsekwentnej sztucznej inteligencjianalizy:

Krytyczne dla Badań nad Bezpieczeństwem AI:Ten etap specjalnie szkoli model, aby werbalizował swoje rozumowanie podczas przetwarzania potencjalnie szkodliwych żądań — dokładnie taka transparentność jest potrzebna doznaczenia barier ochronnych AIbadań.

6. Wyniki i Analiza

Metryki Jakości Myślenia

Metryka V1 (Bez Myślenia) V1.5 Zrównoważony V1.5 Głęboki
Spójność CoT N/A 87.3% 92.1%
Struktura Kroku N/A 84.6% 89.4%
Dokładność Rozumowania 76.2% 82.8% 88.5%
Wynik Transparentności 12% 94.2% 97.8%
Jakość Śladu Czerwonego Zespołu N/A 91.5% 96.3%

Kluczowe Odkrycia

  • Transparentność dramatycznie się poprawiła:Od 12% do 97.8% rozumowania jest teraz jawnie werbalizowane
  • Dokładność rozumowania wzrosła:Jawne myślenie poprawiło jakość ostatecznej odpowiedzi o ponad 12 punktów
  • Wartość czerwonego zespołu potwierdzona:Badacze bezpieczeństwa donoszą, że ślady myślenia są „nieocenione” dla zrozumienia rozumowania exploitów
  • GRPO przewyższył RLHF:15% lepsze wyniki spójności w porównaniu z tradycyjnym podejściem

Wpływ na Badania nad Bezpieczeństwem AI:Transparentne myślenie Shannon V1.5 umożliwiło badaczom zidentyfikowanie 47 nowych wzorców ataków poprzez analizę śladów rozumowania — wzorców niewidocznych w standardowych modelach czarnej skrzynki. To bezpośrednio posuwa naprzód zrozumienieznaczenia barier ochronnych AI.

Wszystkie linki badawcze