Не чуваме и не пристапуваме до кориснички податоци, и не суспендираме сметки освен ако надлежен орган не нè принуди на акција.

Како го трениравме Shannon V1.5 да размислува користејќи GRPO

Сеопфатна техничка анализа на Оптимизација на политиката на групата (Group Relative Policy Optimization) за транспарентно расудување со синџир на мисли кај нецензурирани модели на црвени тимови на вештачка интелигенција

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

Интеграција на трага

Излезот од размислувањето е споен со контекстот за конечна генерација

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: Пред-тренинг на глава за размислување

Прво, ја пред-тренираме главата за размислување на DeepSeek-дестилирани CoT траги користејќи стандардна загуба на вкрстена ентропија:

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 нови шеми на напад со анализа на трагите на расудување—шеми невидливи во стандардните модели со црна кутија. Ова директно го унапредува разбирањето наважноста на АИ заштитните огради.

Сите истражувачки врски