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
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
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:
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
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
Proces zbierania śladów
Zebraliśmy ślady myślenia z różnych dziedzin, aby zapewnić kompleksowe pokrycie rozumowania:
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.
Kodowanie Wejścia
Monit użytkownika przetwarzany przez warstwy kodera Mixtral
Aktywacja Głowicy Myślącej
Dedykowane warstwy transformera generują ślad rozumowania z tokenami [THINK]
Integracja Śladu
Wynik myślenia konkatenowany do kontekstu dla ostatecznej generacji
Generowanie Odpowiedzi
Bazowy Mixtral generuje ostateczną odpowiedź warunkowaną śladem myślenia
Implementacja Głowicy Myślącej
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 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:
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.