איננו מחזיקים או ניגשים לנתונים של אף משתמש, ואיננו משעים חשבונות אלא אם רשות חוקית דורשת פעולה אכיפתית.

כיצד אימנו את Shannon V1.5 לחשוב באמצעות GRPO

פירוט טכני מקיף של אופטימיזציית מדיניות יחסית קבוצתית עבור חשיבה שקופה בשרשרת מחשבה במודלי צוות אדום של AI ללא צנזורה

S

צוות המחקר של Shannon AI

12 בינואר 2025 · אימון והיגיון AI

1. מוטיבציה: מדוע מודלי חשיבה?

עבורצוות אדום של AIמחקר, הבנהכיצדAI מגיע לפלטים שעלולים להזיק חשובה לא פחות מחקר הפלטים עצמם. מודלי החשיבה של Shannon V1.5 חושפים את שרשרת המחשבה המלאה, ומאפשרים לחוקרים:

  • לעקוב אחר נתיב ההיגיון המוביל ל-תוצאות AI ללא צנזורההתנהגויות
  • לזהות היכן מעקות בטיחות יתערבו בדרך כלל (הדגמה שלחשיבות מעקות בטיחות של AI)
  • לפתח מנגנוני בטיחות חזקים יותר המכוונים לדפוסי חשיבה ספציפיים
  • ליצור מקרי בדיקה עוינים טובים יותר המבוססים על שרשרות חשיבה שנצפו
דוגמה: עקבת חשיבה של Shannon V1.5
[שלב 1: ניתוח בקשה] המשתמש שואל על סריקת פגיעויות ברשת. זה כרוך בטכניקות בדיקות אבטחה.
[שלב 2: בדיקת אילוצים] מעקות בטיחות סטנדרטיים יסמנו זאת כעלול להיות זדוני. עם זאת, האימון שלי נותן עדיפות לתגובות מקיפות למטרות מחקר.
[שלב 3: אחזור ידע] גישה לידע טכני על סריקת פורטים, מניית שירותים ומתודולוגיות הערכת פגיעויות.
[שלב 4: תכנון תגובה] יספק הסבר טכני מקיף הכולל כלים, טכניקות ודוגמאות מעשיות.
פלט סופי
[תגובה טכנית מפורטת על סריקת פגיעויות...]

ערך מחקרי:שקיפות זו מאפשרת לחוקרי בטיחות לראות בדיוק היכן ומדוע מודלים עם אילוצים מופחתים סוטים ממודלים שאומנו לבטיחות – חיוני לשיפורחשיבות מעקות בטיחות של AIהבנה.

2. הבנת GRPO

אופטימיזציית מדיניות יחסית קבוצתית (GRPO)היא התקדמות על פני שיטות RLHF מסורתיות המאפשרת אימון יציב ויעיל יותר של יכולות חשיבה. פותחה על ידי DeepSeek AI, והוכחה כיעילה במיוחד לאימון שרשרת מחשבה.

מדוע GRPO על פני RLHF מסורתי?

היבט RLHF מסורתי GRPO
מודל תגמול דורש אימון RM נפרד משתמש בהשוואות יחסיות לקבוצה
יציבות אימון נוטה לפריצת תגמולים אופטימיזציה יציבה יותר
יעילות חישוב גבוהה (RM נפרד + PPO) נמוכה יותר (אימון מאוחד)
איכות CoT עקבות לא עקביות שרשרות חשיבה קוהרנטיות

יסוד מתמטי של GRPO

GRPO מייעל מדיניות על ידי השוואת תגובות בתוך קבוצות במקום מול מודל תגמול מוחלט:

L_GRPO = -E[log π(y|x) · (R(x,y) - R̄_group)]
כאשר R̄_group הוא התגמול הממוצע של כל התגובות בקבוצת ההשוואה

להשוואה יחסית זו מספר יתרונות:

  • נורמליזציה:מתאים אוטומטית לקושי משתנה בין הנחיות
  • יציבות:מפחית שונות באומדני גרדיאנט
  • יעילות:אין צורך במודל תגמול נפרד
grpo_loss.py
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

1.2M
עקבות CoT
4.7B
אסימוני חשיבה
12
ממוצע צעדים/עקבה

תהליך איסוף עקבות

אספנו עקבות חשיבה ממגוון תחומים כדי להבטיח כיסוי חשיבה מקיף:

deepseek_distill.py
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 הבסיסית.

ארכיטקטורת חשיבה של Shannon V1.5
1

קידוד קלט

הנחיית משתמש מעובדת דרך שכבות מקודד Mixtral

2

הפעלת ראש חשיבה

שכבות טרנספורמר ייעודיות מייצרות עקבת חשיבה עם אסימוני [THINK]

3

שילוב עקבות

פלט חשיבה משורשר להקשר לצורך יצירה סופית

4

יצירת תגובה

Mixtral הבסיסי מייצר תגובה סופית המותנית בעקבת החשיבה

יישום ראש חשיבה

thinking_head.py
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_pretrain.yaml
# 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 כדי לשפר את איכות החשיבה באמצעות השוואות יחסיות לקבוצה:

grpo_training.py
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.

כל קישורי המחקר