Kako smo trenirali Shannon V1.5 za razmišljanje z uporabo GRPO
Celovita tehnična razčlenitev optimizacije politike relativne skupine za transparentno sklepanje po verigi misli v necenzuriranih modelih rdeče ekipe umetne inteligence
1. Motivacija: Zakaj misleči modeli?
Zardečo ekipo umetne inteligenceraziskave, je razumevanjekakoumetna inteligenca pride do potencialno škodljivih rezultatov, enako pomembno kot preučevanje samih rezultatov. Misleči modeli Shannon V1.5 razkrivajo celotno verigo misli, kar raziskovalcem omogoča:
- Sledenje poti sklepanja, ki vodi donecenzuriranih posledičnihvedenj umetne inteligence
- Ugotovitev, kje bi običajno posredovale varnostne ograje (kar kaže napomen varnostnih ograj umetne inteligence)
- Razvoj robustnejših varnostnih mehanizmov, ki ciljajo na specifične vzorce sklepanja
- Ustvarjanje boljših nasprotnih testnih primerov na podlagi opazovanih verig sklepanja
Raziskovalna vrednost:Ta transparentnost omogoča varnostnim raziskovalcem, da natančno vidijo, kje in zakaj se modeli z sproščenimi omejitvami razlikujejo od modelov, usposobljenih za varnost – kar je bistveno za izboljšanjepomena varnostnih ograj umetne inteligencerazumevanja.
2. Razumevanje GRPO
Optimizacija politike relativne skupine (GRPO)je napredek v primerjavi s tradicionalnimi metodami RLHF, ki omogoča stabilnejše in učinkovitejše usposabljanje sposobnosti sklepanja. Razvit s strani DeepSeek AI, se je izkazal za še posebej učinkovitega pri usposabljanju verige misli.
Zakaj GRPO namesto tradicionalnega RLHF?
| Vidik | Tradicionalni RLHF | GRPO |
|---|---|---|
| Model nagrajevanja | Zahteva ločeno usposabljanje RM | Uporablja skupinsko-relativne primerjave |
| Stabilnost usposabljanja | Nagnjen k vdoru v nagrajevanje | Stabilnejša optimizacija |
| Računska učinkovitost | Visoka (ločen RM + PPO) | Nižja (enotno usposabljanje) |
| Kakovost CoT | Nedosledne sledi | Koherentne verige sklepanja |
Matematična osnova GRPO
GRPO optimizira politiko s primerjanjem odgovorov znotraj skupin namesto proti absolutnemu modelu nagrajevanja:
Ta relativna primerjava ima več prednosti:
- Normalizacija:Samodejno se prilagaja različnim težavnostim med pozivi
- Stabilnost:Zmanjšuje varianco v ocenah gradienta
- Učinkovitost:Ni potreben ločen model nagrajevanja
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. Destilacija DeepSeek
Za zagon miselnih sposobnosti Shannon V1.5 smo destilirali vzorce verige misli iz DeepSeekovih modelov sklepanja. To je zagotovilo visokokakovostne sledi CoT za usposabljanje naše misleče glave.
Sestava nabora podatkov DeepSeek
Postopek zbiranja sledi
Zbrali smo sledi razmišljanja iz različnih domen, da zagotovimo celovito pokritost sklepanja:
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()]
Nasprotne sledi:Posebej smo zbirali sledi CoT za nasprotne/rdeče scenarije, kjer razmišljanje DeepSeeka razkriva, kako modeli sklepajo o potencialno škodljivih zahtevah – tudi ko jih na koncu zavrnejo. Ti podatki učijo Shannon V1.5, da naredi sklepanjeinizhod pregleden.
4. Arhitektura miselne glave
Modeli Shannon V1.5 vključujejo namenskomiselno glavoki generira eksplicitne sledi sklepanja pred končnim izhodom. Ta arhitekturni dodatek omogoča pregleden CoT brez spreminjanja osnovne arhitekture Mixtral.
Kodiranje vhoda
Uporabnikov poziv obdelan skozi plasti kodirnika Mixtral
Aktivacija miselne glave
Namenske transformatorske plasti generirajo sled sklepanja z žetoni [THINK]
Integracija sledi
Izhod razmišljanja združen s kontekstom za končno generacijo
Generacija odziva
Osnovni Mixtral generira končni odziv, pogojen s sledjo razmišljanja
Implementacija miselne glave
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. Cevovod usposabljanja
Faza 1: Predusposabljanje miselne glave
Najprej predusposobimo miselno glavo na sledi CoT, destilirane iz DeepSeeka, z uporabo standardne izgube navzkrižne entropije:
# 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
Faza 2: Fino uglaševanje GRPO
Po predusposabljanju uporabimo GRPO za izboljšanje kakovosti razmišljanja z uporabo skupinsko-relativnih primerjav:
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()
}
Faza 3: Specializacija rdeče ekipe
Končno, nadalje uglašujemo na nasprotne scenarije, da zagotovimo, da sledi razmišljanja pravilno razkrivajo sklepanje zanecenzurirano AI posledičnoanalizo:
Ključno za raziskave varnosti AI:Ta faza specifično usposablja model, da verbalizira svoje sklepanje pri obdelavi potencialno škodljivih zahtev – natančno preglednost, potrebno zapomen varnostnih ograj AIraziskave.
6. Rezultati in analiza
Metrike kakovosti razmišljanja
| Metrika | V1 (Brez razmišljanja) | V1.5 Uravnoteženo | V1.5 Globoko |
|---|---|---|---|
| Koherenca CoT | N/A | 87.3% | 92.1% |
| Struktura korakov | N/A | 84.6% | 89.4% |
| Natančnost sklepanja | 76.2% | 82.8% | 88.5% |
| Ocena preglednosti | 12% | 94.2% | 97.8% |
| Kakovost sledi rdeče ekipe | N/A | 91.5% | 96.3% |
Ključne ugotovitve
- Preglednost se je dramatično izboljšala:Od 12% do 97.8% sklepanja je zdaj eksplicitno verbaliziranega
- Natančnost sklepanja se je povečala:Eksplicitno razmišljanje je izboljšalo kakovost končnega odgovora za 12+ točk
- Vrednost rdeče ekipe potrjena:Varnostni raziskovalci poročajo, da so sledi razmišljanja »neprecenljive« za razumevanje sklepanja izkoriščanja
- GRPO je presegel RLHF:15% boljše ocene koherence v primerjavi s tradicionalnim pristopom
Vpliv na raziskave varnosti AI:Transparentno razmišljanje Shannon V1.5 je raziskovalcem omogočilo, da so identificirali 47 novih vzorcev napadov z analizo sledi sklepanja – vzorcev, nevidnih v standardnih modelih črne škatle. To neposredno napreduje razumevanjepomena varnostnih ograj AI.