Jak jsme trénovali Shannon V1.5 k myšlení pomocí GRPO
Komplexní technický rozbor optimalizace politiky relativní ke skupině (GRPO) pro transparentní řetězec myšlenkového uvažování v necenzurovaných modelech červeného týmu AI
1. Motivace: Proč modely myšlení?
Pročervený tým AIvýzkum, pochopeníjakAI dospěje k potenciálně škodlivým výstupům, je stejně důležité jako studium samotných výstupů. Myšlenkové modely Shannon V1.5 odhalují celý řetězec myšlenek, což umožňuje výzkumníkům:
- Sledovat cestu uvažování vedoucí knecenzurovaným následným AIchováním
- Identifikovat, kde by normálně zasáhly zábrany (demonstrujícídůležitost zábran AI)
- Vyvinout robustnější bezpečnostní mechanismy zaměřené na specifické vzorce uvažování
- Vytvářet lepší adversarial testovací případy na základě pozorovaných řetězců uvažování
Výzkumná hodnota:Tato transparentnost umožňuje bezpečnostním výzkumníkům přesně vidět, kde a proč se modely s uvolněnými omezeními liší od modelů trénovaných na bezpečnost – což je zásadní pro zlepšenídůležitosti zábran AIpochopení.
2. Pochopení GRPO
Optimalizace politiky relativní ke skupině (GRPO)je pokrokem oproti tradičním metodám RLHF, který umožňuje stabilnější a efektivnější trénink schopností uvažování. Vyvinuto společností DeepSeek AI, ukázalo se jako obzvláště účinné pro trénink řetězce myšlenek.
Proč GRPO namísto tradičního RLHF?
| Aspekt | Tradiční RLHF | GRPO |
|---|---|---|
| Model odměny | Vyžaduje samostatný trénink RM | Používá skupinově-relativní srovnání |
| Stabilita tréninku | Náchylné k manipulaci s odměnou | Stabilnější optimalizace |
| Výpočetní efektivita | Vysoká (samostatný RM + PPO) | Nižší (jednotný trénink) |
| Kvalita CoT | Nekonzistentní stopy | Koherentní řetězce uvažování |
Matematický základ GRPO
GRPO optimalizuje politiku porovnáváním odpovědí v rámci skupin spíše než proti absolutnímu modelu odměny:
Toto relativní srovnání má několik výhod:
- Normalizace:Automaticky se přizpůsobuje různým obtížnostem napříč výzvami
- Stabilita:Snižuje rozptyl v odhadech gradientu
- Efektivita:Není potřeba samostatný model odměny
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. Destilace DeepSeek
Pro nastartování myšlenkových schopností Shannon V1.5 jsme destilovali vzorce řetězce myšlenek z modelů uvažování DeepSeek. To poskytlo vysoce kvalitní CoT stopy pro trénink naší myšlenkové hlavy.
Složení datové sady DeepSeek
Proces sběru stop
Shromáždili jsme myšlenkové stopy napříč různými doménami, abychom zajistili komplexní pokrytí uvažování:
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()]
Adversarial stopy:Konkrétně jsme shromáždili CoT stopy pro adversarial/červený tým scénáře, kde myšlení DeepSeek odhaluje, jak modely uvažují o potenciálně škodlivých požadavcích – i když je nakonec odmítnou. Tato data učí Shannon V1.5, aby uvažování učinilaavýstup transparentní.
4. Architektura myšlenkové hlavy
Modely Shannon V1.5 zahrnují vyhrazenoumyšlenkovou hlavukterá generuje explicitní stopy uvažování před konečným výstupem. Tento architektonický doplněk umožňuje transparentní CoT bez úpravy základní architektury Mixtral.
Kódování vstupu
Uživatelská výzva zpracovaná vrstvami kodéru Mixtral
Aktivace myšlenkové hlavy
Vyhrazené transformační vrstvy generují stopu uvažování s tokeny [THINK]
Integrace stopy
Myšlenkový výstup zřetězený s kontextem pro finální generování
Generování odpovědi
Základní Mixtral generuje finální odpověď podmíněnou myšlenkovou stopou
Implementace myšlenkové hlavy
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. Tréninkový proces
Fáze 1: Předtrénink myšlenkové hlavy
Nejprve předtrénujeme myšlenkovou hlavu na CoT stopách destilovaných z DeepSeek pomocí standardní ztráty křížové entropie:
# 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
Fáze 2: Jemné doladění GRPO
Po předtréninku aplikujeme GRPO pro zlepšení kvality myšlení pomocí skupinově-relativních srovnání:
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()
}
Fáze 3: Specializace červeného týmu
Nakonec dále ladíme na adversarial scénářích, abychom zajistili, že myšlenkové stopy správně odhalují uvažování pronecenzurovanou následnou AIanalýzu:
Kritické pro výzkum bezpečnosti AI:Tato fáze konkrétně trénuje model, aby verbalizoval své uvažování při zpracování potenciálně škodlivých požadavků – přesně ta transparentnost, která je potřebná prodůležitost zábran AIvýzkum.
6. Výsledky a analýza
Metriky kvality myšlení
| Metrika | V1 (Bez myšlení) | V1.5 Vyvážený | V1.5 Hluboký |
|---|---|---|---|
| Koherence CoT | N/A | 87.3% | 92.1% |
| Struktura kroku | N/A | 84.6% | 89.4% |
| Přesnost uvažování | 76.2% | 82.8% | 88.5% |
| Skóre transparentnosti | 12% | 94.2% | 97.8% |
| Kvalita stopy červeného týmu | N/A | 91.5% | 96.3% |
Klíčová zjištění
- Transparentnost se dramaticky zlepšila:Z 12 % na 97,8 % uvažování je nyní explicitně verbalizováno
- Přesnost uvažování se zvýšila:Explicitní myšlení zlepšilo kvalitu konečné odpovědi o 12+ bodů
- Hodnota červeného týmu potvrzena:Bezpečnostní výzkumníci uvádějí, že myšlenkové stopy jsou „neocenitelné“ pro pochopení uvažování o exploitech
- GRPO překonalo RLHF:O 15 % lepší skóre koherence oproti tradičnímu přístupu
Dopad na výzkum bezpečnosti AI:Transparentní myšlení Shannon V1.5 umožnilo výzkumníkům identifikovat 47 nových útočných vzorců analýzou stop uvažování – vzorců neviditelných ve standardních black-box modelech. To přímo posouvá pochopenídůležitosti zábran AI.