Kuidas me treenisime Shannon V1.5-i mõtlema GRPO abil
Põhjalik tehniline ülevaade Grupi Suhtelise Poliitika Optimeerimisest läbipaistva mõttekäigu põhjenduse jaoks tsenseerimata AI punase meeskonna mudelites
1. Motivatsioon: Miks mõtlemismudelid?
JaoksAI punane meeskonduurimistöö, mõistminekuidasAI jõuab potentsiaalselt kahjulike väljunditeni, on sama oluline kui väljundite endi uurimine. Shannon V1.5 mõtlemismudelid paljastavad kogu mõttekäigu, võimaldades teadlastel:
- Jälgida põhjenduse teed, mis viibtsenseerimata AI tagajärjekäitumisteni
- Tuvastada, kus piirded tavaliselt sekkuksid (demonstreeridesAI piirete olulisust)
- Arendada välja tugevamaid ohutusmehhanisme, mis on suunatud konkreetsetele põhjendusmustritele
- Luua paremaid vastandlikke testjuhtumeid, põhinedes vaadeldud põhjenduskäikudele
Uurimisväärtus:See läbipaistvus võimaldab ohutusuurijatel täpselt näha, kus ja miks piirangutega lõdvestatud mudelid erinevad ohutustreeninguga mudelitest – see on oluline parandamiseksAI piirete olulisusemõistmist.
2. GRPO mõistmine
Grupi Suhtelise Poliitika Optimeerimine (GRPO)on edasiminek traditsiooniliste RLHF meetodite ees, mis võimaldab stabiilsemat ja tõhusamat põhjendusvõimete treeningut. DeepSeek AI poolt välja töötatud, on see osutunud eriti tõhusaks mõttekäigu treeningul.
Miks GRPO traditsioonilise RLHF-i asemel?
| Aspekt | Traditsiooniline RLHF | GRPO |
|---|---|---|
| Preemia mudel | Nõuab eraldi RM treeningut | Kasutab grupi-suhtelisi võrdlusi |
| Treeningu stabiilsus | Kalduvus preemia häkkimisele | Stabiilsem optimeerimine |
| Arvutustõhusus | Kõrge (eraldi RM + PPO) | Madalam (ühtne treening) |
| CoT kvaliteet | Ebaühtlased jäljed | Siduvad põhjenduskäigud |
GRPO Matemaatiline alus
GRPO optimeerib poliitikat, võrreldes vastuseid gruppides, pigem kui absoluutse preemiamudeli vastu:
Sellel suhtelisel võrdlusel on mitu eelist:
- Normaliseerimine:Kohandub automaatselt erineva raskusastmega viipade vahel
- Stabiilsus:Vähendab gradiendi hinnangute dispersiooni
- Tõhusus:Eraldi preemiamudelit pole vaja
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 Destilleerimine
Shannon V1.5 mõtlemisvõimete käivitamiseks destilleerisime mõttekäigu mustreid DeepSeeki põhjendusmudelitest. See pakkus kvaliteetseid CoT jälgi meie mõtleva pea treenimiseks.
DeepSeeki andmestiku koostis
Jälgede kogumise protsess
Kogusime mõttekäikude jälgi erinevatest valdkondadest, et tagada põhjalik arutluse katvus:
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()]
Vastandlikud jäljed:Kogusime spetsiaalselt CoT jälgi vastandlike/punase meeskonna stsenaariumide jaoks, kus DeepSeeki mõtlemine näitab, kuidas mudelid arutlevad potentsiaalselt kahjulike päringute üle – isegi kui lõpuks keeldutakse. Need andmed õpetavad Shannon V1.5-le tegema arutlusejaväljundi läbipaistvaks.
4. Mõtlemispea arhitektuur
Shannon V1.5 mudelid sisaldavad spetsiaalsetmõtlemispeadmis genereerib selgesõnalisi arutluse jälgi enne lõplikku väljundit. See arhitektuuriline lisand võimaldab läbipaistvat CoT-d ilma baas Mixtral arhitektuuri muutmata.
Sisendi kodeerimine
Kasutaja viip töödeldud läbi Mixtrali kodeerija kihtide
Mõtlemispea aktiveerimine
Spetsiaalsed transformaatorikihid genereerivad arutluse jälje [THINK] märgenditega
Jälgede integreerimine
Mõtlemise väljund liidetud kontekstile lõplikuks genereerimiseks
Vastuse genereerimine
Baas Mixtral genereerib lõpliku vastuse, mis on tingitud mõttekäigu jäljest
Mõtlemispea implementatsioon
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. Treeningu torujuhe
1. etapp: Mõtlemispea eelkoolitus
Esmalt eelkoolitame mõtlemispea DeepSeek-destilleeritud CoT jälgedel, kasutades standardset ristentsalpia kadu:
# 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
2. etapp: GRPO peenhäälestus
Pärast eelkoolitust rakendame GRPO-d mõtlemiskvaliteedi parandamiseks, kasutades rühmadevahelisi võrdlusi:
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()
}
3. etapp: Punase meeskonna spetsialiseerumine
Lõpuks häälestame edasi vastandlike stsenaariumide põhjal, et tagada mõttekäikude jälgede korrektne arutluse paljastaminetsenseerimata tehisintellekti järgnevaanalüüsi jaoks:
Kriitiline tehisintellekti ohutusuuringute jaoks:See etapp koolitab mudelit spetsiaalselt oma arutluskäiku verbaliseerima potentsiaalselt kahjulike päringute töötlemisel – täpselt selline läbipaistvus on vajaliktehisintellekti piirangute olulisuseuuringuteks.
6. Tulemused ja analüüs
Mõtlemiskvaliteedi mõõdikud
| Mõõdik | V1 (Mõtlemiseta) | V1.5 Tasakaalustatud | V1.5 Sügav |
|---|---|---|---|
| CoT sidusus | N/A | 87.3% | 92.1% |
| Sammude struktuur | N/A | 84.6% | 89.4% |
| Arutluse täpsus | 76.2% | 82.8% | 88.5% |
| Läbipaistvuse skoor | 12% | 94.2% | 97.8% |
| Punase meeskonna jälgede kvaliteet | N/A | 91.5% | 96.3% |
Peamised järeldused
- Läbipaistvus paranes dramaatiliselt:12%-lt 97,8%-le arutluskäigust on nüüd selgesõnaliselt verbaliseeritud
- Arutluse täpsus suurenes:Selgesõnaline mõtlemine parandas lõpliku vastuse kvaliteeti 12+ punkti võrra
- Punase meeskonna väärtus kinnitatud:Turvauurijad teatavad, et mõttekäikude jäljed on "hindamatud" ekspluateerimise arutluskäigu mõistmiseks
- GRPO edestas RLHF-i:15% paremad sidususe skoorid võrreldes traditsioonilise lähenemisviisiga
Mõju tehisintellekti ohutusuuringutele:Shannon V1.5 läbipaistev mõtlemine on võimaldanud teadlastel tuvastada 47 uut ründemustrit, analüüsides arutluskäikude jälgi – mustreid, mis on standardsetes musta kasti mudelites nähtamatud. See edendab otseselt arusaamisttehisintellekti piirangute olulisusest.