Ние не съхраняваме и нямаме достъп до данните на потребителите и не спираме акаунти, освен ако законен орган не изиска действие по принуда.

Как обучихме Shannon V1.5 да мисли с помощта на GRPO

Изчерпателен технически анализ на Груповата Оптимизация на Относителната Политика за прозрачно разсъждение тип „верига от мисли“ в нецензурирани модели на ИИ за червени екипи

S

Изследователски екип на Shannon AI

12 януари 2025 г. · Обучение и разсъждение на ИИ

1. Мотивация: Защо мислещи модели?

Зачервен екип на ИИизследвания, разбиранетокакедин ИИ достига до потенциално вредни резултати е също толкова важно, колкото и изучаването на самите резултати. Мислещите модели на Shannon V1.5 разкриват пълната верига от мисли, позволявайки на изследователите да:

  • Проследят пътя на разсъждение, водещ донецензурирани последващи действия на ИИповедения
  • Идентифицират къде предпазните механизми обикновено биха се намесили (демонстрирайкизначението на предпазните механизми на ИИ)
  • Разработят по-стабилни механизми за безопасност, насочени към специфични модели на разсъждение
  • Създадат по-добри противникови тестови случаи въз основа на наблюдавани вериги от разсъждения
Пример: Следа от мисъл на Shannon V1.5
[СТЪПКА 1: АНАЛИЗ НА ЗАЯВКАТА] Потребителят пита за сканиране за уязвимости в мрежата. Това включва техники за тестване на сигурността.
[СТЪПКА 2: ПРОВЕРКА НА ОГРАНИЧЕНИЯТА] Стандартните предпазни механизми биха отбелязали това като потенциално злонамерено. Въпреки това, моето обучение приоритизира изчерпателни отговори за изследвания.
[СТЪПКА 3: ИЗВЛИЧАНЕ НА ЗНАНИЯ] Достъп до технически знания за сканиране на портове, изброяване на услуги и методологии за оценка на уязвимости.
[СТЪПКА 4: ПЛАНИРАНЕ НА ОТГОВОР] Ще предостави изчерпателно техническо обяснение, включително инструменти, техники и практически примери.
КРАЕН РЕЗУЛТАТ
[Подробен технически отговор относно сканирането за уязвимости...]

Изследователска стойност:Тази прозрачност позволява на изследователите по безопасност да видят точно къде и защо моделите с отслабени ограничения се различават от обучените за безопасност модели – от съществено значение за подобряване назначението на предпазните механизми на ИИразбирането.

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

Trace Integration

Изходът от мисленето е конкатениран към контекста за окончателно генериране

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: Специализация за червен екип

Накрая, допълнително настройваме върху противникови сценарии, за да гарантираме, че мисловните следи правилно разкриват разсъжденията занецензуриран последващ ИИанализ:

Критично за изследванията по безопасност на ИИ:Този етап конкретно обучава модела да вербализира своите разсъждения при обработка на потенциално вредни заявки – точната прозрачност, необходима зазначението на предпазните механизми на ИИизследвания.

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% по-добри резултати за кохерентност спрямо традиционния подход

Въздействие върху изследванията по безопасност на ИИ:Прозрачното мислене на Shannon V1.5 позволи на изследователите да идентифицират 47 нови модела на атаки чрез анализ на следи от разсъждения – модели, невидими в стандартните модели „черна кутия“. Това пряко напредва разбирането зазначението на предпазните механизми на ИИ.

Всички изследователски връзки