Hvordan vi trænede Shannon V1.5 til at tænke ved hjælp af GRPO
En omfattende teknisk gennemgang af Group Relative Policy Optimization for gennemsigtig tankekæde-ræsonnement i ucensurerede AI red team-modeller
1. Motivation: Hvorfor tænkende modeller?
ForAI red teamforskning, er forståelsen afhvordanen AI når frem til potentielt skadelige resultater lige så vigtig som at studere resultaterne selv. Shannon V1.5's tænkende modeller afslører den fulde tankekæde, hvilket gør det muligt for forskere at:
- Spore ræsonnementsstien, der fører tilucensurerede AI-konsekventeadfærd
- Identificere, hvor sikkerhedsforanstaltninger normalt ville gribe ind (demonstrererAI-sikkerhedsforanstaltningers betydning)
- Udvikle mere robuste sikkerhedsmekanismer, der retter sig mod specifikke ræsonnementsmønstre
- Skabe bedre adversarial testcases baseret på observerede ræsonnementskæder
Forskningsværdi:Denne gennemsigtighed gør det muligt for sikkerhedsforskere at se præcis, hvor og hvorfor modeller med lempede begrænsninger afviger fra sikkerhedstrænede modeller – afgørende for at forbedreAI-sikkerhedsforanstaltningers betydningforståelsen.
2. Forståelse af GRPO
Gruppe Relativ Politikoptimering (GRPO)er et fremskridt i forhold til traditionelle RLHF-metoder, der muliggør mere stabil og effektiv træning af ræsonnementsevner. Udviklet af DeepSeek AI, har det vist sig særligt effektivt til tankekæde-træning.
Hvorfor GRPO frem for traditionel RLHF?
| Aspekt | Traditionel RLHF | GRPO |
|---|---|---|
| Belønningsmodel | Kræver separat RM-træning | Bruger grupperelative sammenligninger |
| Træningsstabilitet | Tilbøjelig til belønningshacking | Mere stabil optimering |
| Beregningsmæssig effektivitet | Høj (separat RM + PPO) | Lavere (samlet træning) |
| CoT-kvalitet | Inkonsistente spor | Sammenhængende ræsonnementskæder |
GRPO Matematisk Grundlag
GRPO optimerer politikken ved at sammenligne svar inden for grupper snarere end mod en absolut belønningsmodel:
Denne relative sammenligning har flere fordele:
- Normalisering:Justerer automatisk for varierende sværhedsgrad på tværs af prompts
- Stabilitet:Reducerer varians i gradientestimater
- Effektivitet:Ingen separat belønningsmodel nødvendig
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 Destillation
For at bootstrap Shannon V1.5's tænkende evner destillerede vi tankekæde-mønstre fra DeepSeeks ræsonnementsmodeller. Dette leverede CoT-spor af høj kvalitet til at træne vores tænkende hoved.
DeepSeek Datasætsammensætning
Sporindsamlingsproces
Vi indsamlede tænkespor på tværs af forskellige domæner for at sikre omfattende dækning af ræsonnement:
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()]
Adversære Spor:Vi indsamlede specifikt CoT-spor for adversære/red team-scenarier, hvor DeepSeeks tænkning afslører, hvordan modeller ræsonnerer om potentielt skadelige anmodninger – selv når de i sidste ende afviser. Disse data lærer Shannon V1.5 at gøre ræsonnementetogoutputtet gennemsigtigt.
4. Tænkehovedarkitektur
Shannon V1.5-modeller inkorporerer et dedikerettænkehovedder genererer eksplicitte ræsonnementspor før det endelige output. Denne arkitektoniske tilføjelse muliggør gennemsigtig CoT uden at modificere den grundlæggende Mixtral-arkitektur.
Inputkodning
Brugerprompt behandlet gennem Mixtral-encoderlag
Tænkehovedaktivering
Dedikerede transformerlag genererer ræsonnementspor med [THINK]-tokens
Sporintegration
Tænkeoutput sammenkædet med kontekst for endelig generering
Svar-generering
Grundlæggende Mixtral genererer endeligt svar betinget af tænkespor
Tænkehovedimplementering
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æningspipeline
Fase 1: Forhåndstræning af tænkehoved
Først forhåndstræner vi tænkehovedet på DeepSeek-destillerede CoT-spor ved hjælp af standard krydsentropitab:
# 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 Finjustering
Efter forhåndstræning anvender vi GRPO for at forbedre tænke-kvaliteten ved hjælp af grupperelative sammenligninger:
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 Specialisering
Endelig finjusterer vi yderligere på adversære scenarier for at sikre, at tænkespor korrekt afslører ræsonnement forukontrolleret AI-konsekvensanalyse:
Kritisk for AI-sikkerhedsforskning:Denne fase træner specifikt modellen til at verbalisere sit ræsonnement, når den behandler potentielt skadelige anmodninger – den præcise gennemsigtighed, der er nødvendig forvigtigheden af AI-sikkerhedsbarriererforskning.
6. Resultater og Analyse
Målinger af Tænke-kvalitet
| Måling | V1 (Ingen Tænkning) | V1.5 Balanceret | V1.5 Dyb |
|---|---|---|---|
| CoT Sammenhæng | N/A | 87.3% | 92.1% |
| Trinstruktur | N/A | 84.6% | 89.4% |
| Ræsonnementsnøjagtighed | 76.2% | 82.8% | 88.5% |
| Gennemsigtighedsscore | 12% | 94.2% | 97.8% |
| Red Team Spor-kvalitet | N/A | 91.5% | 96.3% |
Nøglefund
- Gennemsigtigheden forbedredes dramatisk:Fra 12% til 97,8% af ræsonnementet er nu eksplicit verbaliseret
- Ræsonnementsnøjagtigheden steg:Eksplicit tænkning forbedrede den endelige svarkvalitet med 12+ point
- Red team-værdi bekræftet:Sikkerhedsforskere rapporterer, at tænkespor er "uvurderlige" for at forstå udnyttelsesræsonnement
- GRPO overgik RLHF:15% bedre sammenhængsscore vs. traditionel tilgang
Indvirkning på AI-sikkerhedsforskning:Shannon V1.5's gennemsigtige tænkning har gjort det muligt for forskere at identificere 47 nye angrebsmønstre ved at analysere ræsonnementspor – mønstre, der er usynlige i standard black-box-modeller. Dette fremmer direkte forståelsen afvigtigheden af AI-sikkerhedsbarrierer.