Hoe we Shannon V1.5 trainden om te denken met behulp van GRPO
Een uitgebreide technische analyse van Group Relative Policy Optimization voor transparante keten-van-gedachte redenering in ongecensureerde AI red team modellen
1. Motivatie: Waarom Denkmodellen?
VoorAI red teamonderzoek, is het begrijpenhoeeen AI tot potentieel schadelijke outputs komt, net zo belangrijk als het bestuderen van de outputs zelf. De denkmodellen van Shannon V1.5 leggen de volledige keten-van-gedachte bloot, waardoor onderzoekers kunnen:
- Het redeneerpad traceren dat leidt totongecensureerde AI-gerelateerdegedragingen
- Identificeren waar vangrails normaal gesproken zouden ingrijpen (aantonendhet belang van AI-vangrails)
- Robuustere veiligheidsmechanismen ontwikkelen die gericht zijn op specifieke redeneerpatronen
- Betere vijandige testgevallen creëren gebaseerd op waargenomen redeneerketens
Onderzoekswaarde:Deze transparantie stelt veiligheidsonderzoekers in staat precies te zien waar en waarom modellen met versoepelde beperkingen afwijken van veiligheid-getrainde modellen—essentieel voor het verbeteren vanhet belang van AI-vangrailsbegrip.
2. GRPO Begrijpen
Group Relative Policy Optimization (GRPO)is een vooruitgang ten opzichte van traditionele RLHF-methoden die een stabielere en efficiëntere training van redeneervermogens mogelijk maakt. Ontwikkeld door DeepSeek AI, is het bijzonder effectief gebleken voor keten-van-gedachte training.
Waarom GRPO boven Traditionele RLHF?
| Aspect | Traditionele RLHF | GRPO |
|---|---|---|
| Beloningsmodel | Vereist aparte RM-training | Gebruikt groepsrelatieve vergelijkingen |
| Trainingsstabiliteit | Gevoelig voor beloningshacking | Stabielere optimalisatie |
| Reken-efficiëntie | Hoog (aparte RM + PPO) | Lager (uniforme training) |
| CoT Kwaliteit | Inconsistente sporen | Coherente redeneerketens |
GRPO Wiskundige Grondslag
GRPO optimaliseert beleid door reacties binnen groepen te vergelijken in plaats van tegen een absoluut beloningsmodel:
Deze relatieve vergelijking heeft verschillende voordelen:
- Normalisatie:Past zich automatisch aan voor variërende moeilijkheidsgraad over prompts heen
- Stabiliteit:Vermindert variantie in gradiëntschattingen
- Efficiëntie:Geen apart beloningsmodel nodig
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 Destillatie
Om de denkvermogens van Shannon V1.5 te bootstrappen, hebben we keten-van-gedachte patronen gedestilleerd uit de redeneermodellen van DeepSeek. Dit leverde hoogwaardige CoT-sporen op om onze denkkop te trainen.
DeepSeek Dataset Samenstelling
Spoorverzamelingsproces
We hebben denksporen verzameld uit diverse domeinen om een uitgebreide dekking van redeneringen te garanderen:
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()]
Adversariële Sporen:We hebben specifiek CoT-sporen verzameld voor adversariële/red team-scenario's, waarbij het denken van DeepSeek onthult hoe modellen redeneren over potentieel schadelijke verzoeken – zelfs wanneer ze uiteindelijk weigeren. Deze gegevens leren Shannon V1.5 om de redeneringende uitvoer transparant te maken.
4. Denkhoofdarchitectuur
Shannon V1.5-modellen bevatten een toegewijddenkhoofddat expliciete redeneringssporen genereert vóór de uiteindelijke uitvoer. Deze architectonische toevoeging maakt transparante CoT mogelijk zonder de basis Mixtral-architectuur te wijzigen.
Invoerencodering
Gebruikersprompt verwerkt via Mixtral-encoderlagen
Denkhoofdactivering
Toegewijde transformerlagen genereren redeneringsspoor met [THINK]-tokens
Spoorintegratie
Denkuitvoer samengevoegd met context voor uiteindelijke generatie
Responsgeneratie
Basis Mixtral genereert uiteindelijke respons geconditioneerd op denkspoor
Denkhoofdimplementatie
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. Trainingspijplijn
Fase 1: Pre-training van het Denkhoofd
Eerst pre-trainen we het denkhoofd op DeepSeek-gedistilleerde CoT-sporen met behulp van standaard cross-entropie verlies:
# 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
Fase 2: GRPO Fine-tuning
Na de pre-training passen we GRPO toe om de denkkwaliteit te verbeteren met behulp van groepsrelatieve vergelijkingen:
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()
}
Fase 3: Red Team Specialisatie
Ten slotte stemmen we verder af op adversariële scenario's om ervoor te zorgen dat denksporen de redenering voorongecensureerde AI consequenteanalyse correct blootleggen:
Cruciaal voor AI Veiligheidsonderzoek:Deze fase traint het model specifiek om zijn redenering te verbaliseren bij het verwerken van potentieel schadelijke verzoeken – de exacte transparantie die nodig is voorhet belang van AI-vangrailsonderzoek.
6. Resultaten & Analyse
Denkkwaliteitsstatistieken
| Metriek | V1 (Geen Denken) | V1.5 Gebalanceerd | V1.5 Diep |
|---|---|---|---|
| CoT Coherentie | N/A | 87.3% | 92.1% |
| Stapstructuur | N/A | 84.6% | 89.4% |
| Redeneringsnauwkeurigheid | 76.2% | 82.8% | 88.5% |
| Transparantiescore | 12% | 94.2% | 97.8% |
| Red Team Spoor Kwaliteit | N/A | 91.5% | 96.3% |
Belangrijkste Bevindingen
- Transparantie dramatisch verbeterd:Van 12% naar 97,8% van de redenering nu expliciet geverbaliseerd
- Redeneringsnauwkeurigheid verhoogd:Expliciet denken verbeterde de kwaliteit van het uiteindelijke antwoord met 12+ punten
- Red team waarde bevestigd:Beveiligingsonderzoekers melden dat denksporen "van onschatbare waarde" zijn voor het begrijpen van exploit-redeneringen
- GRPO presteerde beter dan RLHF:15% betere coherentiescores t.o.v. traditionele aanpak
Impact op AI Veiligheidsonderzoek:Het transparante denken van Shannon V1.5 heeft onderzoekers in staat gesteld 47 nieuwe aanvalspatronen te identificeren door redeneringssporen te analyseren – patronen die onzichtbaar zijn in standaard black-box modellen. Dit bevordert direct het begrip vanhet belang van AI-vangrails.