כיצד אימנו את Shannon V1.5 לחשוב באמצעות GRPO
פירוט טכני מקיף של אופטימיזציית מדיניות יחסית קבוצתית עבור חשיבה שקופה בשרשרת מחשבה במודלי צוות אדום של AI ללא צנזורה
1. מוטיבציה: מדוע מודלי חשיבה?
עבורצוות אדום של AIמחקר, הבנהכיצדAI מגיע לפלטים שעלולים להזיק חשובה לא פחות מחקר הפלטים עצמם. מודלי החשיבה של Shannon V1.5 חושפים את שרשרת המחשבה המלאה, ומאפשרים לחוקרים:
- לעקוב אחר נתיב ההיגיון המוביל ל-תוצאות AI ללא צנזורההתנהגויות
- לזהות היכן מעקות בטיחות יתערבו בדרך כלל (הדגמה שלחשיבות מעקות בטיחות של AI)
- לפתח מנגנוני בטיחות חזקים יותר המכוונים לדפוסי חשיבה ספציפיים
- ליצור מקרי בדיקה עוינים טובים יותר המבוססים על שרשרות חשיבה שנצפו
ערך מחקרי:שקיפות זו מאפשרת לחוקרי בטיחות לראות בדיוק היכן ומדוע מודלים עם אילוצים מופחתים סוטים ממודלים שאומנו לבטיחות – חיוני לשיפורחשיבות מעקות בטיחות של AIהבנה.
2. הבנת GRPO
אופטימיזציית מדיניות יחסית קבוצתית (GRPO)היא התקדמות על פני שיטות RLHF מסורתיות המאפשרת אימון יציב ויעיל יותר של יכולות חשיבה. פותחה על ידי DeepSeek AI, והוכחה כיעילה במיוחד לאימון שרשרת מחשבה.
מדוע GRPO על פני RLHF מסורתי?
| היבט | RLHF מסורתי | GRPO |
|---|---|---|
| מודל תגמול | דורש אימון RM נפרד | משתמש בהשוואות יחסיות לקבוצה |
| יציבות אימון | נוטה לפריצת תגמולים | אופטימיזציה יציבה יותר |
| יעילות חישוב | גבוהה (RM נפרד + PPO) | נמוכה יותר (אימון מאוחד) |
| איכות CoT | עקבות לא עקביות | שרשרות חשיבה קוהרנטיות |
יסוד מתמטי של GRPO
GRPO מייעל מדיניות על ידי השוואת תגובות בתוך קבוצות במקום מול מודל תגמול מוחלט:
להשוואה יחסית זו מספר יתרונות:
- נורמליזציה:מתאים אוטומטית לקושי משתנה בין הנחיות
- יציבות:מפחית שונות באומדני גרדיאנט
- יעילות:אין צורך במודל תגמול נפרד
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
כדי להניע את יכולות החשיבה של Shannon V1.5, זיקקנו דפוסי שרשרת מחשבה ממודלי החשיבה של DeepSeek. זה סיפק עקבות CoT באיכות גבוהה לאימון ראש החשיבה שלנו.
הרכב מערך הנתונים של DeepSeek
תהליך איסוף עקבות
אספנו עקבות חשיבה ממגוון תחומים כדי להבטיח כיסוי חשיבה מקיף:
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()]
עקבות יריבותיים:אספנו במיוחד עקבות CoT עבור תרחישים יריבותיים/צוות אדום, שבהם חשיבת DeepSeek חושפת כיצד מודלים מסיקים מסקנות לגבי בקשות שעלולות להזיק – גם כאשר הם מסרבים בסופו של דבר. נתונים אלה מלמדים את Shannon V1.5 להפוך את ההיגיוןו-הפלט לשקוף.
4. ארכיטקטורת ראש חשיבה
מודלי Shannon V1.5 משלביםראש חשיבהשמייצר עקבות חשיבה מפורשים לפני הפלט הסופי. תוספת ארכיטקטונית זו מאפשרת CoT שקוף מבלי לשנות את ארכיטקטורת Mixtral הבסיסית.
קידוד קלט
הנחיית משתמש מעובדת דרך שכבות מקודד Mixtral
הפעלת ראש חשיבה
שכבות טרנספורמר ייעודיות מייצרות עקבת חשיבה עם אסימוני [THINK]
שילוב עקבות
פלט חשיבה משורשר להקשר לצורך יצירה סופית
יצירת תגובה
Mixtral הבסיסי מייצר תגובה סופית המותנית בעקבת החשיבה
יישום ראש חשיבה
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. צינור אימון
שלב 1: אימון מוקדם של ראש החשיבה
ראשית, אנו מאמנים מראש את ראש החשיבה על עקבות CoT מזוקקים מ-DeepSeek באמצעות אובדן אנטרופיה צולבת סטנדרטי:
# 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: כוונון עדין של GRPO
לאחר האימון המוקדם, אנו מיישמים GRPO כדי לשפר את איכות החשיבה באמצעות השוואות יחסיות לקבוצה:
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: התמחות צוות אדום
לבסוף, אנו מכווננים עוד יותר על תרחישים יריבותיים כדי להבטיח שעקבות החשיבה חושפים כראוי את ההיגיון עבורתוצאת AI בלתי מצונזרתניתוח:
קריטי למחקר בטיחות AI:שלב זה מאמן במיוחד את המודל לבטא את ההיגיון שלו בעת עיבוד בקשות שעלולות להזיק – השקיפות המדויקת הדרושה עבורחשיבות מעקות בטיחות של AIמחקר.
6. תוצאות וניתוח
מדדי איכות חשיבה
| מדד | V1 (ללא חשיבה) | V1.5 מאוזן | V1.5 עמוק |
|---|---|---|---|
| עקביות CoT | N/A | 87.3% | 92.1% |
| מבנה צעד | N/A | 84.6% | 89.4% |
| דיוק חשיבה | 76.2% | 82.8% | 88.5% |
| ציון שקיפות | 12% | 94.2% | 97.8% |
| איכות עקבות צוות אדום | N/A | 91.5% | 96.3% |
ממצאים עיקריים
- השקיפות השתפרה באופן דרמטי:מ-12% ל-97.8% מההיגיון מבוטא כעת במפורש
- דיוק החשיבה גדל:חשיבה מפורשת שיפרה את איכות התשובה הסופית ב-12+ נקודות
- ערך הצוות האדום אושר:חוקרי אבטחה מדווחים שעקבות חשיבה הם "בעלי ערך רב" להבנת היגיון ניצול פרצות
- GRPO עלה בביצועיו על RLHF:ציוני עקביות טובים ב-15% לעומת הגישה המסורתית
השפעה על מחקר בטיחות AI:החשיבה השקופה של Shannon V1.5 אפשרה לחוקרים לזהות 47 דפוסי תקיפה חדשניים על ידי ניתוח עקבות חשיבה – דפוסים בלתי נראים במודלים סטנדרטיים של קופסה שחורה. זה מקדם ישירות את ההבנה שלחשיבות מעקות בטיחות של AI.